@@ -16,6 +16,7 @@ public class SceneRender {
1616 private static final int COMMAND_SIZE = 5 * 4 ;
1717 private static final int MAX_MATERIALS = 20 ;
1818 private static final int MAX_TEXTURES = 16 ;
19+ private Map <String , Integer > entitiesIdxMap ;
1920 private ShaderProgram shaderProgram ;
2021 private int staticDrawCount ;
2122 private int staticRenderBufferHandle ;
@@ -27,6 +28,7 @@ public SceneRender() {
2728 shaderModuleDataList .add (new ShaderProgram .ShaderModuleData ("resources/shaders/scene.frag" , GL_FRAGMENT_SHADER ));
2829 shaderProgram = new ShaderProgram (shaderModuleDataList );
2930 createUniforms ();
31+ entitiesIdxMap = new HashMap <>();
3032 }
3133
3234 public void cleanup () {
@@ -97,6 +99,19 @@ public void render(Scene scene, RenderBuffers renderBuffers, GBuffer gBuffer) {
9799 }
98100
99101 // Static meshes
102+ int drawElement = 0 ;
103+ List <Model > modelList = scene .getModelMap ().values ().stream ().filter (m -> !m .isAnimated ()).toList ();
104+ for (Model model : modelList ) {
105+ List <Entity > entities = model .getEntitiesList ();
106+ for (RenderBuffers .MeshDrawData meshDrawData : model .getMeshDrawDataList ()) {
107+ for (Entity entity : entities ) {
108+ String name = "drawElements[" + drawElement + "]" ;
109+ uniformsMap .setUniform (name + ".modelMatrixIdx" , entitiesIdxMap .get (entity .getId ()));
110+ uniformsMap .setUniform (name + ".materialIdx" , meshDrawData .materialIdx ());
111+ drawElement ++;
112+ }
113+ }
114+ }
100115 glBindBuffer (GL_DRAW_INDIRECT_BUFFER , staticRenderBufferHandle );
101116 glBindVertexArray (renderBuffers .getStaticVaoId ());
102117 glMultiDrawElementsIndirect (GL_TRIANGLES , GL_UNSIGNED_INT , 0 , staticDrawCount , 0 );
@@ -107,10 +122,23 @@ public void render(Scene scene, RenderBuffers renderBuffers, GBuffer gBuffer) {
107122 }
108123
109124 public void setupData (Scene scene ) {
125+ setupEntitiesData (scene );
110126 setupStaticCommandBuffer (scene );
111127 setupMaterialsUniform (scene .getTextureCache (), scene .getMaterialCache ());
112128 }
113129
130+ private void setupEntitiesData (Scene scene ) {
131+ entitiesIdxMap .clear ();
132+ int entityIdx = 0 ;
133+ for (Model model : scene .getModelMap ().values ()) {
134+ List <Entity > entities = model .getEntitiesList ();
135+ for (Entity entity : entities ) {
136+ entitiesIdxMap .put (entity .getId (), entityIdx );
137+ entityIdx ++;
138+ }
139+ }
140+ }
141+
114142 private void setupMaterialsUniform (TextureCache textureCache , MaterialCache materialCache ) {
115143 List <Texture > textures = textureCache .getAll ().stream ().toList ();
116144 int numTextures = textures .size ();
@@ -146,22 +174,13 @@ private void setupMaterialsUniform(TextureCache textureCache, MaterialCache mate
146174
147175 private void setupStaticCommandBuffer (Scene scene ) {
148176 List <Model > modelList = scene .getModelMap ().values ().stream ().filter (m -> !m .isAnimated ()).toList ();
149- Map <String , Integer > entitiesIdxMap = new HashMap <>();
150- int entityIdx = 0 ;
151177 int numMeshes = 0 ;
152- for (Model model : scene . getModelMap (). values () ) {
178+ for (Model model : modelList ) {
153179 numMeshes += model .getMeshDrawDataList ().size ();
154- List <Entity > entities = model .getEntitiesList ();
155- for (Entity entity : entities ) {
156- entitiesIdxMap .put (entity .getId (), entityIdx );
157- entityIdx ++;
158- }
159180 }
160181
161182 int firstIndex = 0 ;
162183 int baseInstance = 0 ;
163- int drawElement = 0 ;
164- shaderProgram .bind ();
165184 ByteBuffer commandBuffer = MemoryUtil .memAlloc (numMeshes * COMMAND_SIZE );
166185 for (Model model : modelList ) {
167186 List <Entity > entities = model .getEntitiesList ();
@@ -178,17 +197,9 @@ private void setupStaticCommandBuffer(Scene scene) {
178197
179198 firstIndex += meshDrawData .vertices ();
180199 baseInstance += entities .size ();
181-
182- for (Entity entity : entities ) {
183- String name = "drawElements[" + drawElement + "]" ;
184- uniformsMap .setUniform (name + ".modelMatrixIdx" , entitiesIdxMap .get (entity .getId ()));
185- uniformsMap .setUniform (name + ".materialIdx" , meshDrawData .materialIdx ());
186- drawElement ++;
187- }
188200 }
189201 }
190202 commandBuffer .flip ();
191- shaderProgram .unbind ();
192203
193204 staticDrawCount = commandBuffer .remaining () / COMMAND_SIZE ;
194205
0 commit comments