From 6e16bfb6cde9ac0751610ea892a34aa8e5961c79 Mon Sep 17 00:00:00 2001 From: Trass3r Date: Tue, 28 Jan 2025 22:57:20 +0100 Subject: [PATCH] disable LODs since they are broken and never used - JME's LodControl is not suitable, even with lowered thresholds - also sets levels independently for each submesh - a mesh split among subgroups due to number of triangles isn't handled --- .../tools/convert/KmfModelLoader.java | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/toniarts/openkeeper/tools/convert/KmfModelLoader.java b/src/toniarts/openkeeper/tools/convert/KmfModelLoader.java index 3134e347..7b782fcd 100644 --- a/src/toniarts/openkeeper/tools/convert/KmfModelLoader.java +++ b/src/toniarts/openkeeper/tools/convert/KmfModelLoader.java @@ -37,7 +37,6 @@ import com.jme3.scene.Node; import com.jme3.scene.VertexBuffer; import com.jme3.scene.VertexBuffer.Type; -import com.jme3.scene.control.LodControl; import com.jme3.texture.Texture; import com.jme3.util.BufferUtils; import com.jme3.util.mikktspace.MikktspaceTangentGenerator; @@ -220,7 +219,8 @@ private Node handleMesh(toniarts.openkeeper.tools.convert.kmf.Mesh sourceMesh, M //Set the buffers mesh.setBuffer(Type.Position, 3, BufferUtils.createFloatBuffer(vertices)); mesh.setBuffer(lodLevels[0]); - mesh.setLodLevels(lodLevels); + // LODs are broken + //mesh.setLodLevels(lodLevels); // the documentation is wrong, the renderer uses LOD 0 instead of IB mesh.setBuffer(Type.TexCoord, 2, BufferUtils.createFloatBuffer(texCoord)); mesh.setBuffer(Type.Normal, 3, BufferUtils.createFloatBuffer(normals)); mesh.setStatic(); @@ -429,14 +429,18 @@ private Node handleAnim(Anim anim, Map> materials) { var lodLevels = createIndices(subMesh.getTriangles()); //Set the buffers - mesh.setBuffer(Type.Position, 3, BufferUtils.createFloatBuffer(vertices)); mesh.setBuffer(Type.BindPosePosition, 3, BufferUtils.createFloatBuffer(vertices)); mesh.setBuffer(lodLevels[0]); - mesh.setLodLevels(lodLevels); + // LODs are broken + //mesh.setLodLevels(lodLevels); // the documentation is wrong, the renderer uses LOD 0 instead of IB mesh.setBuffer(Type.TexCoord, 2, BufferUtils.createFloatBuffer(texCoord)); - mesh.setBuffer(Type.Normal, 3, BufferUtils.createFloatBuffer(normals)); - mesh.setBuffer(Type.BindPoseNormal, 3, BufferUtils.createFloatBuffer(normals)); - mesh.setStreamed(); + var normalsBuffer = BufferUtils.createFloatBuffer(normals); + mesh.setBuffer(Type.Normal, 3, normalsBuffer); + mesh.setBuffer(Type.BindPoseNormal, 3, normalsBuffer); + + // only position buffer is dynamic + mesh.setStatic(); + mesh.setBuffer(Type.Position, 3, BufferUtils.createFloatBuffer(vertices)); // Create geometry Geometry geom = createGeometry(subMeshIndex, anim.getName(), mesh, materials, subMesh.getMaterialIndex()); @@ -515,9 +519,9 @@ private Geometry createGeometry(int subMeshIndex, String meshName, Mesh mesh, Ma //Create geometry var geom = new Geometry(meshName + '_' + subMeshIndex, mesh); - //Add LOD control - LodControl lc = new LodControl(); - geom.addControl(lc); + // LODs are broken + //var lc = new LodControl(); + //geom.addControl(lc); // Material, set the first geom.setMaterial(materials.get(materialIndex).get(0));