Skip to content

Commit ebf9528

Browse files
committed
split Vulkan and OpenGL APIs on GeometryBatch
1 parent ab514b7 commit ebf9528

32 files changed

Lines changed: 662 additions & 513 deletions

jme3-core/src/main/java/com/jme3/light/DefaultLightFilter.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,9 @@ public void setCamera(Camera camera) {
6363
}
6464

6565
@Override
66-
public void filterLights(Geometry geometry, LightList filteredLightList) {
66+
public void filterLights(Geometry geometry, LightList worldLights, LightList filteredLightList) {
6767
TempVars vars = TempVars.get();
6868
try {
69-
LightList worldLights = geometry.getWorldLightList();
7069

7170
for (int i = 0; i < worldLights.size(); i++) {
7271
Light light = worldLights.get(i);

jme3-core/src/main/java/com/jme3/light/LightFilter.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@ public interface LightFilter {
4444

4545
/**
4646
* Sets the camera for which future filtering is to be done against in
47-
* {@link #filterLights(com.jme3.scene.Geometry, com.jme3.light.LightList)}.
47+
* {@link #filterLights(com.jme3.scene.Geometry, com.jme3.light.LightList, com.jme3.light.LightList)}.
4848
*
4949
* @param camera The camera to perform light filtering against.
5050
*/
51-
public void setCamera(Camera camera);
51+
void setCamera(Camera camera);
5252

5353
/**
5454
* Determine which lights on the {@link Geometry#getWorldLightList() world
@@ -68,5 +68,5 @@ public interface LightFilter {
6868
* @param geometry The geometry for which the light filtering is performed.
6969
* @param filteredLightList The results are to be stored here.
7070
*/
71-
public void filterLights(Geometry geometry, LightList filteredLightList);
71+
void filterLights(Geometry geometry, LightList lights, LightList filteredLightList);
7272
}

jme3-core/src/main/java/com/jme3/light/NullLightFilter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ public void setCamera(Camera camera) {
4747
}
4848

4949
@Override
50-
public void filterLights(Geometry geometry, LightList filteredLightList) {
50+
public void filterLights(Geometry geometry, LightList lights, LightList filteredLightList) {
5151

5252
}
53+
5354
}

jme3-core/src/main/java/com/jme3/material/GlMaterial.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import com.jme3.renderer.TextureUnitException;
5555
import com.jme3.renderer.queue.RenderQueue.Bucket;
5656
import com.jme3.scene.Geometry;
57+
import com.jme3.scene.GlMesh;
5758
import com.jme3.shader.*;
5859
import com.jme3.shader.bufferobject.BufferObject;
5960
import com.jme3.texture.*;
@@ -64,7 +65,6 @@
6465
import com.jme3.vulkan.commands.CommandBuffer;
6566
import com.jme3.vulkan.frames.VersionedResource;
6667
import com.jme3.vulkan.pipelines.Pipeline;
67-
import org.lwjgl.opengl.GL45;
6868

6969
import java.io.IOException;
7070
import java.util.Collection;
@@ -837,7 +837,15 @@ public void setVector4(String name, Vector4f value) {
837837
* @throws UnsupportedOperationException If no candidate technique supports
838838
* the system capabilities.
839839
*/
840-
public void selectTechnique(String name, final RenderManager renderManager) {
840+
public Technique selectTechnique(String name, final RenderManager renderManager) {
841+
// if null, use the currently selected technique, or the default technique
842+
if (name == null || technique == null) {
843+
if (technique != null) {
844+
return technique;
845+
} else {
846+
name = TechniqueDef.DEFAULT_TECHNIQUE_NAME;
847+
}
848+
}
841849
// check if already created
842850
Technique tech = techniques.get(name);
843851
// When choosing technique, we choose one that
@@ -876,14 +884,16 @@ public void selectTechnique(String name, final RenderManager renderManager) {
876884
} else if (technique == tech) {
877885
// attempting to switch to an already
878886
// active technique.
879-
return;
887+
return technique;
880888
}
881889

882890
technique = tech;
883891
tech.notifyTechniqueSwitched();
884892

885893
// shader was changed
886894
sortingId = -1;
895+
896+
return technique;
887897
}
888898

889899
private void applyOverrides(Renderer renderer, Shader shader, SafeArrayList<MatParamOverride> overrides, BindUnits bindUnits) {
@@ -947,8 +957,9 @@ private void updateShaderMaterialParameter(Renderer renderer, VarType type, Shad
947957
}
948958
}
949959

950-
private BindUnits updateShaderMaterialParameters(Renderer renderer, Shader shader,
951-
SafeArrayList<MatParamOverride> worldOverrides, SafeArrayList<MatParamOverride> forcedOverrides) {
960+
public BindUnits updateShaderMaterialParameters(Renderer renderer, Shader shader,
961+
SafeArrayList<MatParamOverride> worldOverrides,
962+
SafeArrayList<MatParamOverride> forcedOverrides) {
952963

953964
bindUnits.textureUnit = 0;
954965
bindUnits.bufferUnit = 0;
@@ -1015,6 +1026,7 @@ private boolean isNormalsBackward(Vector3f scalar) {
10151026
* @param renderManager The render manager to preload for
10161027
* @param geometry to determine the applicable parameter overrides, if any
10171028
*/
1029+
@Deprecated // this isn't used anywhere...
10181030
public void preload(RenderManager renderManager, Geometry geometry) {
10191031
if (technique == null) {
10201032
selectTechnique(TechniqueDef.DEFAULT_TECHNIQUE_NAME, renderManager);
@@ -1153,7 +1165,7 @@ public void render(Geometry geometry, LightList lights, RenderManager renderMana
11531165
resetUniformsNotSetByCurrent(shader);
11541166

11551167
// Delegate rendering to the technique
1156-
technique.render(renderManager, shader, geometry, lights, units);
1168+
technique.render(renderManager, shader, geometry, (GlMesh)geometry.getMesh(), lights, units);
11571169
}
11581170

11591171
@Override

jme3-core/src/main/java/com/jme3/material/Material.java

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,14 @@
3636
import com.jme3.math.*;
3737
import com.jme3.renderer.RenderManager;
3838
import com.jme3.scene.Geometry;
39+
import com.jme3.scene.Mesh;
3940
import com.jme3.texture.Texture;
4041
import com.jme3.vulkan.buffers.GpuBuffer;
4142
import com.jme3.vulkan.commands.CommandBuffer;
4243
import com.jme3.vulkan.frames.SingleResource;
4344
import com.jme3.vulkan.frames.VersionedResource;
4445
import com.jme3.vulkan.pipelines.Pipeline;
46+
import com.jme3.vulkan.pipelines.PipelineCache;
4547

4648
/**
4749
* <code>Material</code> describes the rendering style for a given
@@ -58,24 +60,12 @@ public interface Material extends Savable {
5860

5961
String DEFAULT_UNIFORM_BUFFER = "DefaultUniformBuffer";
6062

61-
void render(Geometry geometry, LightList lights, RenderManager renderManager);
62-
63-
void render(Geometry geometry, LightList lights, CommandBuffer cmd, Pipeline pipeline);
64-
6563
void setUniform(String name, VersionedResource<? extends GpuBuffer> buffer);
6664

6765
void setTexture(String name, VersionedResource<? extends Texture> texture);
6866

6967
void setParam(String uniform, String param, Object value);
7068

71-
default void render(Geometry geometry, RenderManager renderManager) {
72-
render(geometry, geometry.getWorldLightList(), renderManager);
73-
}
74-
75-
default void render(Geometry geometry, CommandBuffer cmd, Pipeline pipeline) {
76-
render(geometry, geometry.getWorldLightList(), cmd, pipeline);
77-
}
78-
7969
/* ----- COMPATABILITY WITH OLD MATERIAL ----- */
8070

8171
default void setParam(String param, Object value) {

jme3-core/src/main/java/com/jme3/material/Technique.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import com.jme3.renderer.Caps;
4040
import com.jme3.renderer.RenderManager;
4141
import com.jme3.scene.Geometry;
42+
import com.jme3.scene.GlMesh;
4243
import com.jme3.shader.DefineList;
4344
import com.jme3.shader.Shader;
4445
import com.jme3.shader.VarType;
@@ -134,7 +135,7 @@ private void applyOverrides(DefineList defineList, SafeArrayList<MatParamOverrid
134135
* @param rendererCaps The renderer capabilities which the shader should support.
135136
* @return A compatible shader.
136137
*/
137-
Shader makeCurrent(RenderManager renderManager, SafeArrayList<MatParamOverride> worldOverrides,
138+
public Shader makeCurrent(RenderManager renderManager, SafeArrayList<MatParamOverride> worldOverrides,
138139
SafeArrayList<MatParamOverride> forcedOverrides,
139140
LightList lights, EnumSet<Caps> rendererCaps) {
140141
TechniqueDefLogic logic = def.getLogic();
@@ -155,17 +156,18 @@ Shader makeCurrent(RenderManager renderManager, SafeArrayList<MatParamOverride>
155156

156157
/**
157158
* Render the technique according to its {@link TechniqueDefLogic}.
158-
*
159+
*
159160
* @param renderManager The render manager to perform the rendering against.
160-
* @param shader The shader that was selected in
161-
* {@link #makeCurrent(RenderManager, SafeArrayList, SafeArrayList, LightList, EnumSet)}.
162-
* @param geometry The geometry to render
163-
* @param lights Lights which influence the geometry.
161+
* @param shader The shader that was selected in
162+
* {@link #makeCurrent(RenderManager, SafeArrayList, SafeArrayList, LightList, EnumSet)}.
163+
* @param geometry The geometry to render
164+
* @param mesh The mesh to render
165+
* @param lights Lights which influence the geometry.
164166
* @param lastBindUnits the index of the most recently used texture unit
165167
*/
166-
void render(RenderManager renderManager, Shader shader, Geometry geometry, LightList lights, BindUnits lastBindUnits) {
168+
public void render(RenderManager renderManager, Shader shader, Geometry geometry, GlMesh mesh, LightList lights, BindUnits lastBindUnits) {
167169
TechniqueDefLogic logic = def.getLogic();
168-
logic.render(renderManager, shader, geometry, lights, lastBindUnits);
170+
logic.render(renderManager, shader, geometry, mesh, lights, lastBindUnits);
169171
}
170172

171173
/**

jme3-core/src/main/java/com/jme3/material/logic/DefaultTechniqueDefLogic.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@
4040
import com.jme3.renderer.RenderManager;
4141
import com.jme3.renderer.Renderer;
4242
import com.jme3.scene.Geometry;
43+
import com.jme3.scene.GlMesh;
44+
import com.jme3.scene.Mesh;
45+
import com.jme3.scene.instancing.InstancedGeometry;
4346
import com.jme3.shader.DefineList;
4447
import com.jme3.shader.Shader;
4548
import java.util.EnumSet;
@@ -58,8 +61,17 @@ public Shader makeCurrent(AssetManager assetManager, RenderManager renderManager
5861
return techniqueDef.getShader(assetManager, rendererCaps, defines);
5962
}
6063

61-
public static void renderMeshFromGeometry(Renderer renderer, Geometry geom) {
62-
geom.draw(renderer);
64+
public static void renderMeshFromGeometry(Renderer renderer, Geometry geom, GlMesh mesh) {
65+
int lodLevel = geom.getLodLevel();
66+
if (geom instanceof InstancedGeometry) {
67+
InstancedGeometry instGeom = (InstancedGeometry) geom;
68+
int numVisibleInstances = instGeom.getNumVisibleInstances();
69+
if (numVisibleInstances > 0) {
70+
renderer.renderMesh(mesh, lodLevel, numVisibleInstances, instGeom.getAllInstanceData());
71+
}
72+
} else {
73+
renderer.renderMesh(mesh, lodLevel, 1, null);
74+
}
6375
}
6476

6577
protected static ColorRGBA getAmbientColor(LightList lightList, boolean removeLights, ColorRGBA ambientLightColor) {
@@ -80,9 +92,9 @@ protected static ColorRGBA getAmbientColor(LightList lightList, boolean removeLi
8092

8193

8294
@Override
83-
public void render(RenderManager renderManager, Shader shader, Geometry geometry, LightList lights, GlMaterial.BindUnits lastBindUnits) {
95+
public void render(RenderManager renderManager, Shader shader, Geometry geometry, GlMesh mesh, LightList lights, GlMaterial.BindUnits lastBindUnits) {
8496
Renderer renderer = renderManager.getRenderer();
8597
renderer.setShader(shader);
86-
renderMeshFromGeometry(renderer, geometry);
98+
renderMeshFromGeometry(renderer, geometry, mesh);
8799
}
88100
}

jme3-core/src/main/java/com/jme3/material/logic/MultiPassLightingLogic.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import com.jme3.renderer.RenderManager;
4747
import com.jme3.renderer.Renderer;
4848
import com.jme3.scene.Geometry;
49+
import com.jme3.scene.GlMesh;
4950
import com.jme3.shader.Shader;
5051
import com.jme3.shader.Uniform;
5152
import com.jme3.shader.VarType;
@@ -68,7 +69,7 @@ public MultiPassLightingLogic(TechniqueDef techniqueDef) {
6869
}
6970

7071
@Override
71-
public void render(RenderManager renderManager, Shader shader, Geometry geometry, LightList lights, GlMaterial.BindUnits lastBindUnits) {
72+
public void render(RenderManager renderManager, Shader shader, Geometry geometry, GlMesh mesh, LightList lights, GlMaterial.BindUnits lastBindUnits) {
7273
Renderer r = renderManager.getRenderer();
7374
Uniform lightDir = shader.getUniform("g_LightDirection");
7475
Uniform lightColor = shader.getUniform("g_LightColor");
@@ -157,7 +158,7 @@ public void render(RenderManager renderManager, Shader shader, Geometry geometry
157158
}
158159
vars.release();
159160
r.setShader(shader);
160-
renderMeshFromGeometry(r, geometry);
161+
renderMeshFromGeometry(r, geometry, mesh);
161162
}
162163

163164
if (isFirstLight) {
@@ -167,7 +168,7 @@ public void render(RenderManager renderManager, Shader shader, Geometry geometry
167168
lightColor.setValue(VarType.Vector4, ColorRGBA.BlackNoAlpha);
168169
lightPos.setValue(VarType.Vector4, NULL_DIR_LIGHT);
169170
r.setShader(shader);
170-
renderMeshFromGeometry(r, geometry);
171+
renderMeshFromGeometry(r, geometry, mesh);
171172
}
172173
}
173174
}

jme3-core/src/main/java/com/jme3/material/logic/SinglePassAndImageBasedLightingLogic.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import com.jme3.math.*;
3939
import com.jme3.renderer.*;
4040
import com.jme3.scene.Geometry;
41+
import com.jme3.scene.GlMesh;
4142
import com.jme3.shader.*;
4243
import com.jme3.texture.TextureCubeMap;
4344
import com.jme3.util.TempVars;
@@ -107,15 +108,14 @@ public Shader makeCurrent(AssetManager assetManager, RenderManager renderManager
107108
* attenuation) </p>
108109
*
109110
* @param shader the Shader being used
110-
* @param g the Geometry being rendered
111111
* @param lightList the list of lights
112112
* @param numLights the number of lights to upload
113113
* @param rm to manage rendering
114114
* @param startIndex the starting index in the LightList
115115
* @param lastTexUnit the index of the most recently-used texture unit
116116
* @return the next starting index in the LightList
117117
*/
118-
protected int updateLightListUniforms(Shader shader, Geometry g, LightList lightList, int numLights, RenderManager rm, int startIndex, int lastTexUnit) {
118+
private int updateLightListUniforms(Shader shader, LightList lightList, int numLights, RenderManager rm, int startIndex, int lastTexUnit) {
119119
if (numLights == 0) { // this shader does not do lighting, ignore.
120120
return 0;
121121
}
@@ -262,24 +262,24 @@ private int setProbeData(RenderManager rm, int lastTexUnit, Uniform lightProbeDa
262262
}
263263

264264
@Override
265-
public void render(RenderManager renderManager, Shader shader, Geometry geometry, LightList lights, GlMaterial.BindUnits lastBindUnits) {
265+
public void render(RenderManager renderManager, Shader shader, Geometry geometry, GlMesh mesh, LightList lights, GlMaterial.BindUnits lastBindUnits) {
266266
int nbRenderedLights = 0;
267267
Renderer renderer = renderManager.getRenderer();
268268
int batchSize = renderManager.getSinglePassLightBatchSize();
269269
if (lights.size() == 0) {
270-
updateLightListUniforms(shader, geometry, lights, batchSize, renderManager, 0, lastBindUnits.textureUnit);
270+
updateLightListUniforms(shader, lights, batchSize, renderManager, 0, lastBindUnits.textureUnit);
271271
renderer.setShader(shader);
272-
renderMeshFromGeometry(renderer, geometry);
272+
renderMeshFromGeometry(renderer, geometry, mesh);
273273
} else {
274274
while (nbRenderedLights < lights.size()) {
275-
nbRenderedLights = updateLightListUniforms(shader, geometry, lights, batchSize, renderManager, nbRenderedLights, lastBindUnits.textureUnit);
275+
nbRenderedLights = updateLightListUniforms(shader, lights, batchSize, renderManager, nbRenderedLights, lastBindUnits.textureUnit);
276276
renderer.setShader(shader);
277-
renderMeshFromGeometry(renderer, geometry);
277+
renderMeshFromGeometry(renderer, geometry, mesh);
278278
}
279279
}
280280
}
281281

282-
protected void extractIndirectLights(LightList lightList, boolean removeLights) {
282+
private void extractIndirectLights(LightList lightList, boolean removeLights) {
283283
ambientLightColor.set(0, 0, 0, 1);
284284
useAmbientLight = false;
285285
for (int j = 0; j < lightList.size(); j++) {

jme3-core/src/main/java/com/jme3/material/logic/SinglePassLightingLogic.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import com.jme3.renderer.RenderManager;
4949
import com.jme3.renderer.Renderer;
5050
import com.jme3.scene.Geometry;
51+
import com.jme3.scene.GlMesh;
5152
import com.jme3.shader.DefineList;
5253
import com.jme3.shader.Shader;
5354
import com.jme3.shader.Uniform;
@@ -99,14 +100,13 @@ public Shader makeCurrent(AssetManager assetManager, RenderManager renderManager
99100
* attenuation)</p>
100101
*
101102
* @param shader the Shader being used
102-
* @param g the Geometry being rendered
103103
* @param lightList the list of lights
104104
* @param numLights the number of lights to upload
105105
* @param rm to manage rendering
106106
* @param startIndex the starting index in the LightList
107107
* @return the next starting index in the LightList
108108
*/
109-
protected int updateLightListUniforms(Shader shader, Geometry g, LightList lightList, int numLights, RenderManager rm, int startIndex) {
109+
private int updateLightListUniforms(Shader shader, LightList lightList, int numLights, RenderManager rm, int startIndex) {
110110
if (numLights == 0) { // this shader does not do lighting, ignore.
111111
return 0;
112112
}
@@ -207,19 +207,19 @@ protected int updateLightListUniforms(Shader shader, Geometry g, LightList light
207207
}
208208

209209
@Override
210-
public void render(RenderManager renderManager, Shader shader, Geometry geometry, LightList lights, GlMaterial.BindUnits lastBindUnits) {
210+
public void render(RenderManager renderManager, Shader shader, Geometry geometry, GlMesh mesh, LightList lights, GlMaterial.BindUnits lastBindUnits) {
211211
int nbRenderedLights = 0;
212212
Renderer renderer = renderManager.getRenderer();
213213
int batchSize = renderManager.getSinglePassLightBatchSize();
214214
if (lights.size() == 0) {
215-
updateLightListUniforms(shader, geometry, lights, batchSize, renderManager, 0);
215+
updateLightListUniforms(shader, lights, batchSize, renderManager, 0);
216216
renderer.setShader(shader);
217-
renderMeshFromGeometry(renderer, geometry);
217+
renderMeshFromGeometry(renderer, geometry, mesh);
218218
} else {
219219
while (nbRenderedLights < lights.size()) {
220-
nbRenderedLights = updateLightListUniforms(shader, geometry, lights, batchSize, renderManager, nbRenderedLights);
220+
nbRenderedLights = updateLightListUniforms(shader, lights, batchSize, renderManager, nbRenderedLights);
221221
renderer.setShader(shader);
222-
renderMeshFromGeometry(renderer, geometry);
222+
renderMeshFromGeometry(renderer, geometry, mesh);
223223
}
224224
}
225225
}

0 commit comments

Comments
 (0)