Skip to content

Commit d3860c6

Browse files
committed
added GeometryBatch to cleanly and optimally handling renders; a lot more miscellaneous changes
1 parent 7e1f760 commit d3860c6

174 files changed

Lines changed: 2851 additions & 2284 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

VulkanDesign.txt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
Spatial: Current problems:
21

3-
* The transform refresh only works when transform setter methods are used. I propose that the world transform should be recalculated on every frame. It will make the system a lot simpler, I think.
4-
* An explicit world light list is unnecessary. All that needs to be done to capture all lights affecting a spatial is to iterate up the hierarchy and collect lights from the local light lists. Iterating up the hierarchy is extremely cheap and I want to take more advantage of it.
5-
* There should be at most one method in Spatial for iterating over an entire tree. It should use depth-first traversal. Breadth-first traversal isn't used within the engine and is obviously more expensive. collideWith() is also counted as a traversal method. If possible, I'd like to take more advantage of SceneGraphIterator, since I think it is the most powerful traversal available.
2+
Problems:
63

4+
1. VersionedResources are awkward to work through at times.
75

jme3-core/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ dependencies {
3232
api libs.lwjgl3.opencl
3333
api libs.lwjgl3.opengl
3434
api libs.lwjgl3.vulkan
35+
api libs.lwjgl3.shaderc
36+
3537
runtimeOnly(variantOf(libs.lwjgl3.base){ classifier('natives-windows') })
3638
runtimeOnly(variantOf(libs.lwjgl3.base){ classifier('natives-windows-x86') })
3739
runtimeOnly(variantOf(libs.lwjgl3.base){ classifier('natives-linux') })

jme3-core/src/main/java/com/jme3/anim/MorphControl.java

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public class MorphControl extends AbstractControl implements Savable {
7979
private float[] tmpNormArray;
8080
private float[] tmpTanArray;
8181

82-
private static final VertexBuffer.Type bufferTypes[] = VertexBuffer.Type.values();
82+
private static final GlVertexBuffer.Type bufferTypes[] = GlVertexBuffer.Type.values();
8383

8484
@Override
8585
public void setSpatial(Spatial spatial) {
@@ -237,49 +237,49 @@ private int getMaxGPUTargets(RenderManager rm, Geometry geom, Material mat, int
237237
}
238238

239239
private int bindMorphTargetBuffer(Mesh mesh, int targetNumBuffers, int boundBufferIdx, MorphTarget t) {
240-
int start = VertexBuffer.Type.MorphTarget0.ordinal();
240+
int start = GlVertexBuffer.Type.MorphTarget0.ordinal();
241241
if (targetNumBuffers >= 1) {
242-
activateBuffer(mesh, boundBufferIdx, start, t.getBuffer(VertexBuffer.Type.Position));
242+
activateBuffer(mesh, boundBufferIdx, start, t.getBuffer(GlVertexBuffer.Type.Position));
243243
boundBufferIdx++;
244244
}
245245
if (targetNumBuffers >= 2) {
246-
activateBuffer(mesh, boundBufferIdx, start, t.getBuffer(VertexBuffer.Type.Normal));
246+
activateBuffer(mesh, boundBufferIdx, start, t.getBuffer(GlVertexBuffer.Type.Normal));
247247
boundBufferIdx++;
248248
}
249249
if (!approximateTangents && targetNumBuffers == 3) {
250-
activateBuffer(mesh, boundBufferIdx, start, t.getBuffer(VertexBuffer.Type.Tangent));
250+
activateBuffer(mesh, boundBufferIdx, start, t.getBuffer(GlVertexBuffer.Type.Tangent));
251251
boundBufferIdx++;
252252
}
253253
return boundBufferIdx;
254254
}
255255

256256
private void writeCpuBuffer(int targetNumBuffers, MorphTarget mt) {
257257
if (targetNumBuffers >= 1) {
258-
FloatBuffer dest = mt.getBuffer(VertexBuffer.Type.Position);
258+
FloatBuffer dest = mt.getBuffer(GlVertexBuffer.Type.Position);
259259
dest.rewind();
260260
dest.put(tmpPosArray, 0, dest.capacity());
261261
}
262262
if (targetNumBuffers >= 2) {
263-
FloatBuffer dest = mt.getBuffer(VertexBuffer.Type.Normal);
263+
FloatBuffer dest = mt.getBuffer(GlVertexBuffer.Type.Normal);
264264
dest.rewind();
265265
dest.put(tmpNormArray, 0, dest.capacity());
266266
}
267267
if (!approximateTangents && targetNumBuffers == 3) {
268-
FloatBuffer dest = mt.getBuffer(VertexBuffer.Type.Tangent);
268+
FloatBuffer dest = mt.getBuffer(GlVertexBuffer.Type.Tangent);
269269
dest.rewind();
270270
dest.put(tmpTanArray, 0, dest.capacity());
271271
}
272272
}
273273

274274
private void mergeMorphTargets(int targetNumBuffers, float weight, MorphTarget t, boolean init) {
275275
if (targetNumBuffers >= 1) {
276-
mergeTargetBuffer(tmpPosArray, weight, t.getBuffer(VertexBuffer.Type.Position), init);
276+
mergeTargetBuffer(tmpPosArray, weight, t.getBuffer(GlVertexBuffer.Type.Position), init);
277277
}
278278
if (targetNumBuffers >= 2) {
279-
mergeTargetBuffer(tmpNormArray, weight, t.getBuffer(VertexBuffer.Type.Normal), init);
279+
mergeTargetBuffer(tmpNormArray, weight, t.getBuffer(GlVertexBuffer.Type.Normal), init);
280280
}
281281
if (!approximateTangents && targetNumBuffers == 3) {
282-
mergeTargetBuffer(tmpTanArray, weight, t.getBuffer(VertexBuffer.Type.Tangent), init);
282+
mergeTargetBuffer(tmpTanArray, weight, t.getBuffer(GlVertexBuffer.Type.Tangent), init);
283283
}
284284
}
285285

@@ -306,8 +306,8 @@ private void mergeTargetBuffer(float[] array, float weight, FloatBuffer src, boo
306306
}
307307

308308
private void activateBuffer(Mesh mesh, int idx, int start, FloatBuffer b) {
309-
VertexBuffer.Type t = bufferTypes[start + idx];
310-
VertexBuffer vb = mesh.getBuffer(t);
309+
GlVertexBuffer.Type t = bufferTypes[start + idx];
310+
GlVertexBuffer vb = mesh.getBuffer(t);
311311
// only set the buffer if it's different
312312
if (vb == null || vb.getData() != b) {
313313
mesh.setBuffer(t, 3, b);
@@ -324,30 +324,30 @@ private float[] ensureCapacity(float[] tmpArray, int size) {
324324
private MorphTarget initCpuMorphTarget(Geometry geom) {
325325
MorphTarget res = new MorphTarget();
326326
MorphTarget mt = geom.getMesh().getMorphTargets()[0];
327-
FloatBuffer b = mt.getBuffer(VertexBuffer.Type.Position);
327+
FloatBuffer b = mt.getBuffer(GlVertexBuffer.Type.Position);
328328
if (b != null) {
329-
res.setBuffer(VertexBuffer.Type.Position, BufferUtils.createFloatBuffer(b.capacity()));
329+
res.setBuffer(GlVertexBuffer.Type.Position, BufferUtils.createFloatBuffer(b.capacity()));
330330
}
331-
b = mt.getBuffer(VertexBuffer.Type.Normal);
331+
b = mt.getBuffer(GlVertexBuffer.Type.Normal);
332332
if (b != null) {
333-
res.setBuffer(VertexBuffer.Type.Normal, BufferUtils.createFloatBuffer(b.capacity()));
333+
res.setBuffer(GlVertexBuffer.Type.Normal, BufferUtils.createFloatBuffer(b.capacity()));
334334
}
335335
if (!approximateTangents) {
336-
b = mt.getBuffer(VertexBuffer.Type.Tangent);
336+
b = mt.getBuffer(GlVertexBuffer.Type.Tangent);
337337
if (b != null) {
338-
res.setBuffer(VertexBuffer.Type.Tangent, BufferUtils.createFloatBuffer(b.capacity()));
338+
res.setBuffer(GlVertexBuffer.Type.Tangent, BufferUtils.createFloatBuffer(b.capacity()));
339339
}
340340
}
341341
return res;
342342
}
343343

344344
private int getTargetNumBuffers(MorphTarget morphTarget) {
345345
int num = 0;
346-
if (morphTarget.getBuffer(VertexBuffer.Type.Position) != null) num++;
347-
if (morphTarget.getBuffer(VertexBuffer.Type.Normal) != null) num++;
346+
if (morphTarget.getBuffer(GlVertexBuffer.Type.Position) != null) num++;
347+
if (morphTarget.getBuffer(GlVertexBuffer.Type.Normal) != null) num++;
348348

349349
// if tangents are not needed we don't count the tangent buffer
350-
if (!approximateTangents && morphTarget.getBuffer(VertexBuffer.Type.Tangent) != null) {
350+
if (!approximateTangents && morphTarget.getBuffer(GlVertexBuffer.Type.Tangent) != null) {
351351
num++;
352352
}
353353
return num;
@@ -366,10 +366,10 @@ private int getTargetNumBuffers(MorphTarget morphTarget) {
366366
*/
367367
private int getRemainingBuffers(Mesh mesh, Renderer renderer) {
368368
int nbUsedBuffers = 0;
369-
for (VertexBuffer vb : mesh.getBufferList().getArray()) {
370-
boolean isMorphBuffer = vb.getBufferType().ordinal() >= VertexBuffer.Type.MorphTarget0.ordinal() && vb.getBufferType().ordinal() <= VertexBuffer.Type.MorphTarget9.ordinal();
371-
if (vb.getBufferType() == VertexBuffer.Type.Index || isMorphBuffer) continue;
372-
if (vb.getUsage() != VertexBuffer.Usage.CpuOnly) {
369+
for (GlVertexBuffer vb : mesh.getBufferList().getArray()) {
370+
boolean isMorphBuffer = vb.getBufferType().ordinal() >= GlVertexBuffer.Type.MorphTarget0.ordinal() && vb.getBufferType().ordinal() <= GlVertexBuffer.Type.MorphTarget9.ordinal();
371+
if (vb.getBufferType() == GlVertexBuffer.Type.Index || isMorphBuffer) continue;
372+
if (vb.getUsage() != GlVertexBuffer.Usage.CpuOnly) {
373373
nbUsedBuffers++;
374374
}
375375
}
@@ -478,7 +478,7 @@ public void visit(Geometry geom) {
478478
// this code makes sure that if the mesh has no hardware skinning buffers hardware skinning won't be activated.
479479
// this is important, because if HW skinning is activated the shader will declare 2 additional useless attributes,
480480
// and we desperately need all the attributes we can find for Morph animation.
481-
if (mesh.getBuffer(VertexBuffer.Type.HWBoneIndex) == null && !geom.getLocalMatParamOverrides().contains(nullNumberOfBones)) {
481+
if (mesh.getBuffer(GlVertexBuffer.Type.HWBoneIndex) == null && !geom.getLocalMatParamOverrides().contains(nullNumberOfBones)) {
482482
geom.addMatParamOverride(nullNumberOfBones);
483483
}
484484
}

jme3-core/src/main/java/com/jme3/anim/SkinningControl.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
import com.jme3.math.Matrix4f;
3838
import com.jme3.renderer.*;
3939
import com.jme3.scene.*;
40-
import com.jme3.scene.VertexBuffer.Type;
40+
import com.jme3.scene.GlVertexBuffer.Type;
4141
import com.jme3.scene.control.AbstractControl;
4242
import com.jme3.scene.mesh.IndexBuffer;
4343
import com.jme3.shader.VarType;
@@ -324,17 +324,17 @@ void resetToBind() {
324324
if (!biBuff.hasArray() || !bwBuff.hasArray()) {
325325
mesh.prepareForAnim(true); // prepare for software animation
326326
}
327-
VertexBuffer bindPos = mesh.getBuffer(Type.BindPosePosition);
328-
VertexBuffer bindNorm = mesh.getBuffer(Type.BindPoseNormal);
329-
VertexBuffer pos = mesh.getBuffer(Type.Position);
327+
GlVertexBuffer bindPos = mesh.getBuffer(Type.BindPosePosition);
328+
GlVertexBuffer bindNorm = mesh.getBuffer(Type.BindPoseNormal);
329+
GlVertexBuffer pos = mesh.getBuffer(Type.Position);
330330
FloatBuffer pb = (FloatBuffer) pos.getData();
331331
FloatBuffer bpb = (FloatBuffer) bindPos.getData();
332332
pb.clear();
333333
bpb.clear();
334334

335335
// reset bind normals if there is a BindPoseNormal buffer
336336
if (bindNorm != null) {
337-
VertexBuffer norm = mesh.getBuffer(Type.Normal);
337+
GlVertexBuffer norm = mesh.getBuffer(Type.Normal);
338338
FloatBuffer nb = (FloatBuffer) norm.getData();
339339
FloatBuffer bnb = (FloatBuffer) bindNorm.getData();
340340
nb.clear();
@@ -343,9 +343,9 @@ void resetToBind() {
343343
}
344344

345345
//resetting bind tangents if there is a bind tangent buffer
346-
VertexBuffer bindTangents = mesh.getBuffer(Type.BindPoseTangent);
346+
GlVertexBuffer bindTangents = mesh.getBuffer(Type.BindPoseTangent);
347347
if (bindTangents != null) {
348-
VertexBuffer tangents = mesh.getBuffer(Type.Tangent);
348+
GlVertexBuffer tangents = mesh.getBuffer(Type.Tangent);
349349
FloatBuffer tb = (FloatBuffer) tangents.getData();
350350
FloatBuffer btb = (FloatBuffer) bindTangents.getData();
351351
tb.clear();
@@ -444,7 +444,7 @@ public Mesh[] getTargets() {
444444
*/
445445
private void softwareSkinUpdate(Mesh mesh, Matrix4f[] offsetMatrices) {
446446

447-
VertexBuffer tb = mesh.getBuffer(Type.Tangent);
447+
GlVertexBuffer tb = mesh.getBuffer(Type.Tangent);
448448
if (tb == null) {
449449
//if there are no tangents use the classic skinning
450450
applySkinning(mesh, offsetMatrices);
@@ -471,11 +471,11 @@ private void applySkinning(Mesh mesh, Matrix4f[] offsetMatrices) {
471471

472472
// NOTE: This code assumes the vertex buffer is in bind pose
473473
// resetToBind() has been called this frame
474-
VertexBuffer vb = mesh.getBuffer(Type.Position);
474+
GlVertexBuffer vb = mesh.getBuffer(Type.Position);
475475
FloatBuffer fvb = (FloatBuffer) vb.getData();
476476
fvb.rewind();
477477

478-
VertexBuffer nb = mesh.getBuffer(Type.Normal);
478+
GlVertexBuffer nb = mesh.getBuffer(Type.Normal);
479479
FloatBuffer fnb = (FloatBuffer) nb.getData();
480480
fnb.rewind();
481481

@@ -569,7 +569,7 @@ private void applySkinning(Mesh mesh, Matrix4f[] offsetMatrices) {
569569
* @param offsetMatrices the offsetMatrices to apply
570570
* @param tb the tangent vertexBuffer
571571
*/
572-
private void applySkinningTangents(Mesh mesh, Matrix4f[] offsetMatrices, VertexBuffer tb) {
572+
private void applySkinningTangents(Mesh mesh, Matrix4f[] offsetMatrices, GlVertexBuffer tb) {
573573
int maxWeightsPerVert = mesh.getMaxNumWeights();
574574

575575
if (maxWeightsPerVert <= 0) {
@@ -580,11 +580,11 @@ private void applySkinningTangents(Mesh mesh, Matrix4f[] offsetMatrices, VertexB
580580

581581
// NOTE: This code assumes the vertex buffer is in bind pose
582582
// resetToBind() has been called this frame
583-
VertexBuffer vb = mesh.getBuffer(Type.Position);
583+
GlVertexBuffer vb = mesh.getBuffer(Type.Position);
584584
FloatBuffer fvb = (FloatBuffer) vb.getData();
585585
fvb.rewind();
586586

587-
VertexBuffer nb = mesh.getBuffer(Type.Normal);
587+
GlVertexBuffer nb = mesh.getBuffer(Type.Normal);
588588

589589
FloatBuffer fnb = (nb == null) ? null : (FloatBuffer) nb.getData();
590590
if (fnb != null) {

jme3-core/src/main/java/com/jme3/animation/SkeletonControl.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
import com.jme3.math.Matrix4f;
3939
import com.jme3.renderer.*;
4040
import com.jme3.scene.*;
41-
import com.jme3.scene.VertexBuffer.Type;
41+
import com.jme3.scene.GlVertexBuffer.Type;
4242
import com.jme3.scene.control.AbstractControl;
4343
import com.jme3.scene.mesh.IndexBuffer;
4444
import com.jme3.shader.VarType;
@@ -318,17 +318,17 @@ void resetToBind() {
318318
if (!biBuff.hasArray() || !bwBuff.hasArray()) {
319319
mesh.prepareForAnim(true); // prepare for software animation
320320
}
321-
VertexBuffer bindPos = mesh.getBuffer(Type.BindPosePosition);
322-
VertexBuffer bindNorm = mesh.getBuffer(Type.BindPoseNormal);
323-
VertexBuffer pos = mesh.getBuffer(Type.Position);
321+
GlVertexBuffer bindPos = mesh.getBuffer(Type.BindPosePosition);
322+
GlVertexBuffer bindNorm = mesh.getBuffer(Type.BindPoseNormal);
323+
GlVertexBuffer pos = mesh.getBuffer(Type.Position);
324324
FloatBuffer pb = (FloatBuffer) pos.getData();
325325
FloatBuffer bpb = (FloatBuffer) bindPos.getData();
326326
pb.clear();
327327
bpb.clear();
328328

329329
// reset bind normals if there is a BindPoseNormal buffer
330330
if (bindNorm != null) {
331-
VertexBuffer norm = mesh.getBuffer(Type.Normal);
331+
GlVertexBuffer norm = mesh.getBuffer(Type.Normal);
332332
FloatBuffer nb = (FloatBuffer) norm.getData();
333333
FloatBuffer bnb = (FloatBuffer) bindNorm.getData();
334334
nb.clear();
@@ -337,9 +337,9 @@ void resetToBind() {
337337
}
338338

339339
//reset bind tangents if there is a bind tangent buffer
340-
VertexBuffer bindTangents = mesh.getBuffer(Type.BindPoseTangent);
340+
GlVertexBuffer bindTangents = mesh.getBuffer(Type.BindPoseTangent);
341341
if (bindTangents != null) {
342-
VertexBuffer tangents = mesh.getBuffer(Type.Tangent);
342+
GlVertexBuffer tangents = mesh.getBuffer(Type.Tangent);
343343
FloatBuffer tb = (FloatBuffer) tangents.getData();
344344
FloatBuffer btb = (FloatBuffer) bindTangents.getData();
345345
tb.clear();
@@ -438,7 +438,7 @@ public Mesh[] getTargets() {
438438
*/
439439
private void softwareSkinUpdate(Mesh mesh, Matrix4f[] offsetMatrices) {
440440

441-
VertexBuffer tb = mesh.getBuffer(Type.Tangent);
441+
GlVertexBuffer tb = mesh.getBuffer(Type.Tangent);
442442
if (tb == null) {
443443
//if there are no tangents use the classic skinning
444444
applySkinning(mesh, offsetMatrices);
@@ -463,11 +463,11 @@ private void applySkinning(Mesh mesh, Matrix4f[] offsetMatrices) {
463463

464464
// NOTE: This code assumes the vertex buffer is in bind pose
465465
// resetToBind() has been called this frame
466-
VertexBuffer vb = mesh.getBuffer(Type.Position);
466+
GlVertexBuffer vb = mesh.getBuffer(Type.Position);
467467
FloatBuffer fvb = (FloatBuffer) vb.getData();
468468
fvb.rewind();
469469

470-
VertexBuffer nb = mesh.getBuffer(Type.Normal);
470+
GlVertexBuffer nb = mesh.getBuffer(Type.Normal);
471471
FloatBuffer fnb = (FloatBuffer) nb.getData();
472472
fnb.rewind();
473473

@@ -561,7 +561,7 @@ private void applySkinning(Mesh mesh, Matrix4f[] offsetMatrices) {
561561
* @param offsetMatrices the offset matrices to apply
562562
* @param tb the tangent vertexBuffer
563563
*/
564-
private void applySkinningTangents(Mesh mesh, Matrix4f[] offsetMatrices, VertexBuffer tb) {
564+
private void applySkinningTangents(Mesh mesh, Matrix4f[] offsetMatrices, GlVertexBuffer tb) {
565565
int maxWeightsPerVert = mesh.getMaxNumWeights();
566566

567567
if (maxWeightsPerVert <= 0) {
@@ -572,11 +572,11 @@ private void applySkinningTangents(Mesh mesh, Matrix4f[] offsetMatrices, VertexB
572572

573573
// NOTE: This code assumes the vertex buffer is in bind pose
574574
// resetToBind() has been called this frame
575-
VertexBuffer vb = mesh.getBuffer(Type.Position);
575+
GlVertexBuffer vb = mesh.getBuffer(Type.Position);
576576
FloatBuffer fvb = (FloatBuffer) vb.getData();
577577
fvb.rewind();
578578

579-
VertexBuffer nb = mesh.getBuffer(Type.Normal);
579+
GlVertexBuffer nb = mesh.getBuffer(Type.Normal);
580580

581581
FloatBuffer fnb = (nb == null) ? null : (FloatBuffer) nb.getData();
582582
if (fnb != null) {

jme3-core/src/main/java/com/jme3/app/BasicProfiler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
import com.jme3.renderer.ViewPort;
4141
import com.jme3.renderer.queue.RenderQueue.Bucket;
4242
import com.jme3.scene.Mesh;
43-
import com.jme3.scene.VertexBuffer.Type;
43+
import com.jme3.scene.GlVertexBuffer.Type;
4444
import com.jme3.util.BufferUtils;
4545
import java.nio.FloatBuffer;
4646

jme3-core/src/main/java/com/jme3/app/BasicProfilerState.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
import com.jme3.scene.Geometry;
4343
import com.jme3.scene.Mesh;
4444
import com.jme3.scene.Node;
45-
import com.jme3.scene.VertexBuffer.Type;
45+
import com.jme3.scene.GlVertexBuffer.Type;
4646

4747
/**
4848
* Provides a basic profiling visualization that shows

0 commit comments

Comments
 (0)