Parcourir la source

Merge pull request #615 from riccardobl/FixMeshCollisionShapeJ3oReadv3.1

Fix bullet crash when MeshCollisionShape is loaded from j3o [v3.1]
empirephoenix il y a 8 ans
Parent
commit
2761bc3677

+ 9 - 15
jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/MeshCollisionShape.java

@@ -122,7 +122,7 @@ public class MeshCollisionShape extends CollisionShape {
         this.vertexStride = 12;
         this.triangleIndexStride = 12;
         this.memoryOptimized = memoryOptimized;
-        this.createShape(true);
+        this.createShape(null);
     }
     
     private void createCollisionMesh(Mesh mesh) {
@@ -150,7 +150,7 @@ public class MeshCollisionShape extends CollisionShape {
         vertices.rewind();
         vertices.clear();
 
-        this.createShape(true);
+        this.createShape(null);
     }
 
     @Override
@@ -191,25 +191,19 @@ public class MeshCollisionShape extends CollisionShape {
         this.vertexBase = BufferUtils.createByteBuffer(capsule.readByteArray(MeshCollisionShape.VERTEX_BASE, null));
 
         byte[] nativeBvh = capsule.readByteArray(MeshCollisionShape.NATIVE_BVH, null);
-        if (nativeBvh == null) {
-            // Either using non memory optimized BVH or old J3O file
-            memoryOptimized = false;
-            createShape(true);
-        } else {
-            // Using memory optimized BVH, load from J3O, then assign it.
-            memoryOptimized = true;
-            createShape(false);
-            nativeBVHBuffer = setBVH(nativeBvh, this.objectId);
-        }
+        memoryOptimized=nativeBvh != null;
+        createShape(nativeBvh);
     }
 
-    private void createShape(boolean buildBvt) {
+    private void createShape(byte bvh[]) {
+        boolean buildBvh=bvh==null||bvh.length==0;
         this.meshId = NativeMeshUtil.createTriangleIndexVertexArray(this.triangleIndexBase, this.vertexBase, this.numTriangles, this.numVertices, this.vertexStride, this.triangleIndexStride);
         Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Mesh {0}", Long.toHexString(this.meshId));
-        this.objectId = createShape(memoryOptimized, buildBvt, this.meshId);
+        this.objectId = createShape(memoryOptimized, buildBvh, this.meshId);
         Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Shape {0}", Long.toHexString(this.objectId));
+        if(!buildBvh)   nativeBVHBuffer = setBVH(bvh, this.objectId);                
         this.setScale(this.scale);
-        this.setMargin(this.margin);
+        this.setMargin(this.margin);        
     }
 
     /**