From de1918c6df48bc903f687bb8f20d6bc40155276d Mon Sep 17 00:00:00 2001 From: Dan Royer Date: Mon, 30 Dec 2024 12:21:23 -0800 Subject: [PATCH] less memory thrashing --- .../com/marginallyclever/ro3/mesh/Mesh.java | 88 ++++++++++--------- 1 file changed, 48 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/marginallyclever/ro3/mesh/Mesh.java b/src/main/java/com/marginallyclever/ro3/mesh/Mesh.java index 66b7130bf..0cafbf08d 100644 --- a/src/main/java/com/marginallyclever/ro3/mesh/Mesh.java +++ b/src/main/java/com/marginallyclever/ro3/mesh/Mesh.java @@ -57,6 +57,8 @@ public class Mesh { private final EventListenerList listeners = new EventListenerList(); + private VertexProvider vertexProvider; + public Mesh() { super(); boundingBox.setShape(this); @@ -162,6 +164,42 @@ private void updateBuffers(GL3 gl) { } gl.glBindVertexArray(0); + + createNewVertexProvider(); + } + + private void createNewVertexProvider() { + if (hasIndexes) { + vertexProvider = new VertexProvider() { + @Override + public Vector3d provideVertex(int index) { + return getVertex(indexArray.get(index)); + } + @Override + public Vector3d provideNormal(int index) { + return getNormal(indexArray.get(index)); + } + @Override + public int provideCount() { + return indexArray.size(); + } + }; + } else { + vertexProvider = new VertexProvider() { + @Override + public Vector3d provideVertex(int index) { + return getVertex(index); + } + @Override + public Vector3d provideNormal(int index) { + return getNormal(index); + } + @Override + public int provideCount() { + return getNumVertices(); + } + }; + } } private void checkBufferSizes() { @@ -393,40 +431,10 @@ public RayHit intersect(Ray ray) { return null; // no hit } - VertexProvider vp; - if (hasIndexes) { - vp = new VertexProvider() { - @Override - public Vector3d provideVertex(int index) { - return getVertex(indexArray.get(index)); - } - @Override - public Vector3d provideNormal(int index) { - return getNormal(indexArray.get(index)); - } - @Override - public int provideCount() { - return indexArray.size(); - } - }; - } else { - vp = new VertexProvider() { - @Override - public Vector3d provideVertex(int index) { - return getVertex(index); - } - @Override - public Vector3d provideNormal(int index) { - return getNormal(index); - } - @Override - public int provideCount() { - return getNumVertices(); - } - }; + if(vertexProvider==null) { + createNewVertexProvider(); } - - return intersect(ray,vp); + return intersect(ray, vertexProvider); } @@ -437,7 +445,7 @@ public int provideCount() { * @return null if no intersection, otherwise a RayHit object with the intersection point and normal. */ private RayHit intersect(Ray ray, VertexProvider provider) { - int a=0,b=0,c=0; + int a=0; double nearest = Double.MAX_VALUE; for(int i=0;i t) { nearest = t; a=i; - b=i+1; - c=i+2; } } @@ -457,13 +463,15 @@ private RayHit intersect(Ray ray, VertexProvider provider) { Vector3d normal; if(hasNormals) { normal = provider.provideNormal(a); - normal.add(provider.provideNormal(b)); - normal.add(provider.provideNormal(c)); + normal.add(provider.provideNormal(a+1)); + normal.add(provider.provideNormal(a+2)); + // average of normals normal.normalize(); } else { Vector3d v0 = provider.provideVertex(a); - Vector3d v1 = provider.provideVertex(b); - Vector3d v2 = provider.provideVertex(c); + Vector3d v1 = provider.provideVertex(a+1); + Vector3d v2 = provider.provideVertex(a+2); + // normal from face normal = IntersectionHelper.buildNormalFrom3Points(v0, v1, v2); } Point3d p = new Point3d(ray.getDirection());