Skip to content

Commit 3827238

Browse files
committed
Sync with chapter 21
1 parent 91ecca6 commit 3827238

File tree

3 files changed

+54
-33
lines changed

3 files changed

+54
-33
lines changed

chapter-20/src/main/java/org/lwjglb/engine/graph/SceneRender.java

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

chapter-20/src/main/java/org/lwjglb/engine/graph/ShadowRender.java

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public class ShadowRender {
1212

1313
private static final int COMMAND_SIZE = 5 * 4;
1414
private ArrayList<CascadeShadow> cascadeShadows;
15+
private Map<String, Integer> entitiesIdxMap;
1516
private ShaderProgram shaderProgram;
1617
private ShadowBuffer shadowBuffer;
1718
private int staticDrawCount;
@@ -32,6 +33,7 @@ public ShadowRender() {
3233
}
3334

3435
createUniforms();
36+
entitiesIdxMap = new HashMap<>();
3537
}
3638

3739
public void cleanup() {
@@ -85,6 +87,18 @@ public void render(Scene scene, RenderBuffers renderBuffers) {
8587
}
8688

8789
// Static meshes
90+
int drawElement = 0;
91+
List<Model> modelList = scene.getModelMap().values().stream().filter(m -> !m.isAnimated()).toList();
92+
for (Model model : modelList) {
93+
List<Entity> entities = model.getEntitiesList();
94+
for (RenderBuffers.MeshDrawData meshDrawData : model.getMeshDrawDataList()) {
95+
for (Entity entity : entities) {
96+
String name = "drawElements[" + drawElement + "]";
97+
uniformsMap.setUniform(name + ".modelMatrixIdx", entitiesIdxMap.get(entity.getId()));
98+
drawElement++;
99+
}
100+
}
101+
}
88102
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, staticRenderBufferHandle);
89103
glBindVertexArray(renderBuffers.getStaticVaoId());
90104
for (int i = 0; i < CascadeShadow.SHADOW_MAP_CASCADE_COUNT; i++) {
@@ -102,27 +116,31 @@ public void render(Scene scene, RenderBuffers renderBuffers) {
102116
}
103117

104118
public void setupData(Scene scene) {
119+
setupEntitiesData(scene);
105120
setupStaticCommandBuffer(scene);
106121
}
107122

108-
private void setupStaticCommandBuffer(Scene scene) {
109-
List<Model> modelList = scene.getModelMap().values().stream().filter(m -> !m.isAnimated()).toList();
110-
Map<String, Integer> entitiesIdxMap = new HashMap<>();
123+
private void setupEntitiesData(Scene scene) {
124+
entitiesIdxMap.clear();
111125
int entityIdx = 0;
112-
int numMeshes = 0;
113126
for (Model model : scene.getModelMap().values()) {
114127
List<Entity> entities = model.getEntitiesList();
115-
numMeshes += model.getMeshDrawDataList().size();
116128
for (Entity entity : entities) {
117129
entitiesIdxMap.put(entity.getId(), entityIdx);
118130
entityIdx++;
119131
}
120132
}
133+
}
134+
135+
private void setupStaticCommandBuffer(Scene scene) {
136+
List<Model> modelList = scene.getModelMap().values().stream().filter(m -> !m.isAnimated()).toList();
137+
int numMeshes = 0;
138+
for (Model model : modelList) {
139+
numMeshes += model.getMeshDrawDataList().size();
140+
}
121141

122142
int firstIndex = 0;
123143
int baseInstance = 0;
124-
int drawElement = 0;
125-
shaderProgram.bind();
126144
ByteBuffer commandBuffer = MemoryUtil.memAlloc(numMeshes * COMMAND_SIZE);
127145
for (Model model : modelList) {
128146
List<Entity> entities = model.getEntitiesList();
@@ -139,16 +157,9 @@ private void setupStaticCommandBuffer(Scene scene) {
139157

140158
firstIndex += meshDrawData.vertices();
141159
baseInstance += entities.size();
142-
143-
for (Entity entity : entities) {
144-
String name = "drawElements[" + drawElement + "]";
145-
uniformsMap.setUniform(name + ".modelMatrixIdx", entitiesIdxMap.get(entity.getId()));
146-
drawElement++;
147-
}
148160
}
149161
}
150162
commandBuffer.flip();
151-
shaderProgram.unbind();
152163

153164
staticDrawCount = commandBuffer.remaining() / COMMAND_SIZE;
154165

chapter-21/src/main/java/org/lwjglb/engine/graph/ShadowRender.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import java.nio.ByteBuffer;
77
import java.util.*;
88

9-
import static org.lwjgl.opengl.GL15.glBindBuffer;
109
import static org.lwjgl.opengl.GL43.*;
1110

1211
public class ShadowRender {

0 commit comments

Comments
 (0)