@@ -98,7 +98,6 @@ namespace cage
9898 struct RenderModel : private Noncopyable
9999 {
100100 UniMesh uni;
101- Frustum frustum; // object-space camera frustum used for culling
102101 RenderComponent render;
103102 std::optional<TextureAnimationComponent> textureAnimation;
104103 Holder<SkeletalAnimationPreparatorInstance> skeletalAnimation;
@@ -165,19 +164,15 @@ namespace cage
165164 Mat4 model;
166165 Mat4 view;
167166 Mat4 viewProj;
168-
169- std::vector<RenderData> renderData;
170- Holder<RenderQueue> renderQueue;
171-
172167 std::optional<CameraData> data;
173168 std::optional<ShadowmapData> shadowmap;
174-
175- bool cnfRenderMissingModels = confRenderMissingModels;
176- bool cnfRenderSkeletonBones = confRenderSkeletonBones;
177-
169+ std::vector<RenderData> renderData;
170+ Holder<RenderQueue> renderQueue;
178171 mutable std::vector<UniMesh> uniMeshes;
179172 mutable std::vector<Mat3x4> uniArmatures;
180173 mutable std::vector<float > uniCustomData;
174+ bool cnfRenderMissingModels = confRenderMissingModels;
175+ bool cnfRenderSkeletonBones = confRenderSkeletonBones;
181176
182177 // create pipeline for regular camera
183178 explicit RenderPipelineImpl (const RenderPipelineConfig &config) : RenderPipelineConfig(config)
@@ -647,7 +642,7 @@ namespace cage
647642 if (shadowmap && none (rm.mesh ->flags & MeshRenderFlags::ShadowCast))
648643 return ;
649644
650- if (!intersects (rm.mesh ->boundingBox (), rm.frustum ))
645+ if (!intersects (rm.mesh ->boundingBox (), Frustum ( rm.uni . mvpMat ) ))
651646 return ;
652647
653648 std::optional<TextureAnimationComponent> &pt = rm.textureAnimation ;
@@ -799,7 +794,6 @@ namespace cage
799794 d.e = rd.e ;
800795 RenderModel r;
801796 r.uni = rm.uni ;
802- r.frustum = rm.frustum ;
803797 r.render = rm.render ;
804798 r.textureAnimation = rm.textureAnimation ;
805799 r.skeletalAnimation = rm.skeletalAnimation .share ();
@@ -839,6 +833,9 @@ namespace cage
839833
840834 void prepareEntities ()
841835 {
836+ ProfilingScope profiling (" prepare entities" );
837+ profiling.set (Stringizer () + " entities: " + scene->count ());
838+
842839 renderData.reserve (scene->component <RenderComponent>()->count () + scene->component <TextComponent>()->count ());
843840
844841 entitiesVisitor (
@@ -851,7 +848,6 @@ namespace cage
851848 rd.e = e;
852849 RenderModel rm;
853850 rm.uni = initializeMeshUni (rd.model );
854- rm.frustum = Frustum (rm.uni .mvpMat );
855851 rm.render = rc;
856852 if (Holder<RenderObject> obj = assets->get <AssetSchemeIndexRenderObject, RenderObject>(rc.object ))
857853 {
@@ -886,8 +882,11 @@ namespace cage
886882 +scene, false );
887883 }
888884
889- void sortRenderData ()
885+ void orderRenderData ()
890886 {
887+ ProfilingScope profiling (" order render data" );
888+ profiling.set (Stringizer () + " count: " + renderData.size ());
889+
891890 std::sort (renderData.begin (), renderData.end (),
892891 [](const RenderData &a, const RenderData &b) -> bool
893892 {
@@ -933,7 +932,7 @@ namespace cage
933932 renderQueue->checkGlErrorDebug ();
934933
935934 prepareEntities ();
936- sortRenderData ();
935+ orderRenderData ();
937936 renderPass (RenderModeEnum::Shadowmap);
938937
939938 renderQueue->resetFrameBuffer ();
@@ -1017,7 +1016,7 @@ namespace cage
10171016 view = inverse (model);
10181017 viewProj = projection * view;
10191018 prepareEntities ();
1020- sortRenderData ();
1019+ orderRenderData ();
10211020 prepareCameraLights ();
10221021
10231022 TextureHandle colorTexture = provisionalGraphics->texture (Stringizer () + " colorTarget_" + name + " _" + resolution,
@@ -1367,7 +1366,5 @@ namespace cage
13671366}
13681367
13691368// todo list:
1370- // reduce size of RenderModel (remove frustum, possibly some more)
1371- // consider parallelizing frustum culling
13721369// opacity for text
13731370// consider shadows for text
0 commit comments