public void SetUp() { conf = new DefaultCollisionConfiguration(); dispatcher = new CollisionDispatcher(conf); broadphase = new AxisSweep3(new Vector3(-1000, -1000, -1000), new Vector3(1000, 1000, 1000)); world = new DiscreteDynamicsWorld(dispatcher, broadphase, null, conf); // Initialize TriangleIndexVertexArray with float array indexVertexArray = new TriangleIndexVertexArray(TorusMesh.Indices, TorusMesh.Vertices); gImpactMeshShape = new GImpactMeshShape(indexVertexArray); gImpactMeshShape.CalculateLocalInertia(1.0f); gImpactMesh = CreateBody(1.0f, gImpactMeshShape, Vector3.Zero); // Initialize TriangleIndexVertexArray with Vector3 array Vector3[] torusVertices = new Vector3[TorusMesh.Vertices.Length / 3]; for (int i = 0; i < torusVertices.Length; i++) { torusVertices[i] = new Vector3( TorusMesh.Vertices[i * 3], TorusMesh.Vertices[i * 3 + 1], TorusMesh.Vertices[i * 3 + 2]); } indexVertexArray2 = new TriangleIndexVertexArray(TorusMesh.Indices, torusVertices); triangleMeshShape = new BvhTriangleMeshShape(indexVertexArray2, true); // CalculateLocalInertia must fail for static shapes (shapes based on TriangleMeshShape) //triangleMeshShape.CalculateLocalInertia(1.0f); triangleMesh = CreateBody(0.0f, triangleMeshShape, Vector3.Zero); }
public static CompoundShape Create(GImpactMeshShape gImpactMesh, float depth) { CompoundShape colShape = new CompoundShape(); using (var cb = new MyInternalTriangleIndexCallback(colShape, gImpactMesh, depth)) { Vector3 aabbMin, aabbMax; gImpactMesh.GetAabb(Matrix.Identity, out aabbMin, out aabbMax); gImpactMesh.MeshInterface.InternalProcessAllTriangles(cb, aabbMin, aabbMax); } return colShape; }
public override void Run() { var conf = new DefaultCollisionConfiguration(); var dispatcher = new CollisionDispatcher(conf); var broadphase = new AxisSweep3(new Vector3(-1000, -1000, -1000), new Vector3(1000, 1000, 1000)); world = new DiscreteDynamicsWorld(dispatcher, broadphase, null, conf); var indexVertexArray = new TriangleIndexVertexArray(TorusMesh.Indices, TorusMesh.Vertices); foreach (var indexedMesh in indexVertexArray.IndexedMeshArray) { indexedMesh.ToString(); } AddToDisposeQueue(indexVertexArray); var gImpactMesh = new GImpactMeshShape(indexVertexArray); Vector3 aabbMin, aabbMax; gImpactMesh.GetAabb(Matrix.Identity, out aabbMin, out aabbMax); CreateBody(1.0f, gImpactMesh, Vector3.Zero); AddToDisposeQueue(gImpactMesh); gImpactMesh = null; var triangleMesh = new BvhTriangleMeshShape(indexVertexArray, true); triangleMesh.CalculateLocalInertia(1.0f); triangleMesh.GetAabb(Matrix.Identity, out aabbMin, out aabbMax); CreateBody(1.0f, triangleMesh, Vector3.Zero); AddToDisposeQueue(triangleMesh); triangleMesh = null; indexVertexArray = null; AddToDisposeQueue(conf); AddToDisposeQueue(dispatcher); AddToDisposeQueue(broadphase); AddToDisposeQueue(world); //conf.Dispose(); conf = null; //dispatcher.Dispose(); dispatcher = null; //broadphase.Dispose(); broadphase = null; for (int i = 0; i < 600; i++) { world.StepSimulation(1.0f / 60.0f); } world.Dispose(); world = null; ForceGC(); TestWeakRefs(); ClearRefs(); }
override protected BulletSharp.CollisionShape createShape () { if (mesh == null) mesh = GetComponent<MeshFilter> ().mesh; // TODO: share data using an own interface float[] vertices = new float[mesh.vertices.Length * 3]; for (int i = 0; i < mesh.vertices.Length; i++) { vertices [i * 3] = mesh.vertices [i].x; vertices [i * 3 + 1] = mesh.vertices [i].y; vertices [i * 3 + 2] = mesh.vertices [i].z; } BulletSharp.TriangleIndexVertexArray bulletMesh = new BulletSharp.TriangleIndexVertexArray (mesh.triangles, vertices); BulletSharp.GImpactMeshShape impactShape = new BulletSharp.GImpactMeshShape (bulletMesh); impactShape.UpdateBound (); return impactShape; }
public void SetUp() { conf = new DefaultCollisionConfiguration(); dispatcher = new CollisionDispatcher(conf); broadphase = new AxisSweep3(new Vector3(-1000, -1000, -1000), new Vector3(1000, 1000, 1000)); world = new DiscreteDynamicsWorld(dispatcher, broadphase, null, conf); indexVertexArray = new TriangleIndexVertexArray(TorusMesh.Indices, TorusMesh.Vertices); gImpactMeshShape = new GImpactMeshShape(indexVertexArray); triangleMeshShape = new BvhTriangleMeshShape(indexVertexArray, true); triangleMeshShape.CalculateLocalInertia(1.0f); gImpactMesh = CreateBody(1.0f, gImpactMeshShape, Vector3.Zero); triangleMesh = CreateBody(1.0f, triangleMeshShape, Vector3.Zero); }
void InitGImpactCollision() { // Create Torus Shape indexVertexArrays = new TriangleIndexVertexArray(TorusMesh.Indices, TorusMesh.Vertices); #if BULLET_GIMPACT #if BULLET_GIMPACT_CONVEX_DECOMPOSITION //GImpactConvexDecompositionShape trimesh = // new GImpactConvexDecompositionShape(indexVertexArrays, new Vector3(1), 0.01f); //trimesh.Margin = 0.07f; //trimesh.UpdateBound(); #else GImpactMeshShape trimesh = new GImpactMeshShape(indexVertexArrays); trimesh.LocalScaling = new Vector3(1); #if BULLET_TRIANGLE_COLLISION trimesh.Margin = 0.07f; //????? #else trimesh.Margin = 0; #endif trimesh.UpdateBound(); #endif trimeshShape = trimesh; #else //trimeshShape = new GImpactMeshData(indexVertexArrays); #endif CollisionShapes.Add(trimeshShape); // Create Bunny Shape indexVertexArrays2 = new TriangleIndexVertexArray(BunnyMesh.Indices, BunnyMesh.Vertices); #if BULLET_GIMPACT #if BULLET_GIMPACT_CONVEX_DECOMPOSITION //GImpactConvexDecompositionShape trimesh2 = // new GImpactConvexDecompositionShape(indexVertexArrays, new Vector3(1), 0.01f); //trimesh.Margin = 0.07f; //trimesh.UpdateBound(); //trimeshShape = trimesh2; #else GImpactMeshShape trimesh2 = new GImpactMeshShape(indexVertexArrays2); trimesh2.LocalScaling = new Vector3(1); #if BULLET_TRIANGLE_COLLISION trimesh2.Margin = 0.07f; //????? #else trimesh2.Margin = 0; #endif trimesh2.UpdateBound(); trimeshShape2 = trimesh2; #endif #else //trimeshShape2 = new GImpactMeshData(indexVertexArrays2); #endif CollisionShapes.Add(trimeshShape2); //register GIMPACT algorithm #if BULLET_GIMPACT GImpactCollisionAlgorithm.RegisterAlgorithm(Dispatcher); #else //ConcaveConcaveCollisionAlgorithm.RegisterAlgorithm(Dispatcher); #endif }
public GImpactMeshShape CreateGimpactShape(StridingMeshInterface trimesh) { GImpactMeshShape shape = new GImpactMeshShape(trimesh._native); _allocatedCollisionShapes.Add(shape); return shape; }
public static Vector3[] CreateGImpactMesh(GImpactMeshShape shape) { DataStream vertexBuffer, indexBuffer; int numVerts, numFaces; PhyScalarType vertsType, indicesType; int vertexStride, indexStride; shape.MeshInterface.GetLockedReadOnlyVertexIndexData(out vertexBuffer, out numVerts, out vertsType, out vertexStride, out indexBuffer, out indexStride, out numFaces, out indicesType); Vector3[] vertices = new Vector3[numFaces * 3 * 2]; // Need to un-index the vertex buffer to make the normals right. int v = 0; while (indexBuffer.Position < indexBuffer.Length) { uint i = indexBuffer.Read<uint>(); vertexBuffer.Position = vertexStride * i; Vector3 v0 = vertexBuffer.Read<Vector3>(); i = indexBuffer.Read<uint>(); vertexBuffer.Position = vertexStride * i; Vector3 v1 = vertexBuffer.Read<Vector3>(); i = indexBuffer.Read<uint>(); vertexBuffer.Position = vertexStride * i; Vector3 v2 = vertexBuffer.Read<Vector3>(); Vector3 v01 = v0 - v1; Vector3 v02 = v0 - v2; Vector3 normal = Vector3.Cross(v01, v02); normal.Normalize(); vertices[v++] = v0; vertices[v++] = normal; vertices[v++] = v1; vertices[v++] = normal; vertices[v++] = v2; vertices[v++] = normal; } return vertices; }
public MyInternalTriangleIndexCallback(CompoundShape colShape, GImpactMeshShape meshShape, float depth) { _colShape = colShape; _depth = depth; _meshShape = meshShape; }
Mesh CreateGImpactMeshShape(GImpactMeshShape shape) { BulletSharp.DataStream verts, indices; int numVerts, numFaces; PhyScalarType vertsType, indicesType; int vertexStride, indexStride; shape.MeshInterface.GetLockedReadOnlyVertexIndexData(out verts, out numVerts, out vertsType, out vertexStride, out indices, out indexStride, out numFaces, out indicesType); bool index32 = numVerts > 65536; Mesh mesh = new Mesh(device, numFaces, numVerts, MeshFlags.SystemMemory | (index32 ? MeshFlags.Use32Bit : 0), VertexFormat.Position | VertexFormat.Normal); SlimDX.DataStream vertexBuffer = mesh.LockVertexBuffer(LockFlags.Discard); while (vertexBuffer.Position < vertexBuffer.Length) { vertexBuffer.Write(verts.Read<Vector3>()); vertexBuffer.Position += 12; } mesh.UnlockVertexBuffer(); SlimDX.DataStream indexBuffer = mesh.LockIndexBuffer(LockFlags.Discard); if (index32) { while (indexBuffer.Position < indexBuffer.Length) indexBuffer.Write(indices.Read<int>()); } else { while (indexBuffer.Position < indexBuffer.Length) indexBuffer.Write((short)indices.Read<int>()); } mesh.UnlockIndexBuffer(); mesh.ComputeNormals(); shapes.Add(shape, mesh); return mesh; }