public unsafe static void GetLocalAabbMax(this TriangleMeshShape obj, out OpenTK.Vector3 value) { fixed(OpenTK.Vector3 *valuePtr = &value) { *(BulletSharp.Math.Vector3 *)valuePtr = obj.LocalAabbMax; } }
public unsafe static OpenTK.Vector3 LocalGetSupportingVertexWithoutMargin(this TriangleMeshShape obj, ref OpenTK.Vector3 vec) { fixed(OpenTK.Vector3 *vecPtr = &vec) { return(obj.LocalGetSupportingVertexWithoutMargin(ref *(BulletSharp.Math.Vector3 *)vecPtr).ToOpenTK()); } }
static Vector3[] CreateTriangleMesh(TriangleMeshShape shape) { StridingMeshInterface meshInterface = shape.MeshInterface; BulletSharp.DataStream vertexBuffer, indexBuffer; int numVerts, numFaces; PhyScalarType vertsType, indicesType; int vertexStride, indexStride; 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; }
/* Mesh CreateStaticPlaneShape(StaticPlaneShape shape) { // Load shader if (planeShader == null) { Assembly assembly = Assembly.GetExecutingAssembly(); Stream shaderStream = assembly.GetManifestResourceStream("DemoFramework.checker_shader.fx"); planeShader = Effect.FromStream(device, shaderStream, ShaderFlags.None); } Vector3[] vertices = new Vector3[4 * 2]; Mesh mesh = new Mesh(device, 2, 4, MeshFlags.SystemMemory, VertexFormat.Position | VertexFormat.Normal); Vector3 planeOrigin = shape.PlaneNormal * shape.PlaneConstant; Vector3 vec0, vec1; PlaneSpace1(shape.PlaneNormal, out vec0, out vec1); float size = 1000; Vector3[] verts = new Vector3[4] { planeOrigin + vec0*size, planeOrigin - vec0*size, planeOrigin + vec1*size, planeOrigin - vec1*size }; SlimDX.DataStream vertexBuffer = mesh.LockVertexBuffer(LockFlags.Discard); vertexBuffer.Write(verts[0]); vertexBuffer.Position += 12; vertexBuffer.Write(verts[1]); vertexBuffer.Position += 12; vertexBuffer.Write(verts[2]); vertexBuffer.Position += 12; vertexBuffer.Write(verts[3]); vertexBuffer.Position += 12; mesh.UnlockVertexBuffer(); SlimDX.DataStream indexBuffer = mesh.LockIndexBuffer(LockFlags.Discard); indexBuffer.Write((short)1); indexBuffer.Write((short)2); indexBuffer.Write((short)0); indexBuffer.Write((short)1); indexBuffer.Write((short)3); indexBuffer.Write((short)0); mesh.UnlockIndexBuffer(); mesh.ComputeNormals(); complexShapes.Add(shape, mesh); return mesh; } */ ShapeData CreateTriangleMeshShape(TriangleMeshShape shape) { StridingMeshInterface meshInterface = shape.MeshInterface; BulletSharp.DataStream vertexStream, indexStream; int numVerts, numFaces; PhyScalarType vertsType, indicesType; int vertexStride, indexStride; meshInterface.GetLockedReadOnlyVertexIndexData(out vertexStream, out numVerts, out vertsType, out vertexStride, out indexStream, out indexStride, out numFaces, out indicesType); ShapeData shapeData = new ShapeData(); shapeData.VertexCount = numVerts; shapeData.IndexCount = numFaces * 3; Vector3[] vertices = new Vector3[shapeData.VertexCount * 2]; int v = 0; int vStrideExtra = vertexStride - Marshal.SizeOf(typeof(Vector3)); while (vertexStream.Position < vertexStream.Length) { Vector3 v0 = vertexStream.Read<Vector3>(); vertexStream.Position += vStrideExtra; Vector3 v1 = vertexStream.Read<Vector3>(); vertexStream.Position += vStrideExtra; Vector3 v2 = vertexStream.Read<Vector3>(); vertexStream.Position += vStrideExtra; Vector3 v01 = v0 - v1; Vector3 v02 = v0 - v2; Vector3 normal = Vector3.Cross(v01, v02); vertices[v++] = v0; vertices[v++] = normal; vertices[v++] = v1; vertices[v++] = normal; vertices[v++] = v2; vertices[v++] = normal; } int i = 0; if (numVerts > 65536) { uint[] indices = new uint[shapeData.IndexCount]; while (indexStream.Position < indexStream.Length) indices[i++] = indexStream.Read<uint>(); shapeData.SetIndexBuffer(device, indices); } else { ushort[] indices = new ushort[shapeData.IndexCount]; while (indexStream.Position < indexStream.Length) indices[i++] = (ushort)indexStream.Read<int>(); shapeData.SetIndexBuffer(device, indices); } shapeData.SetVertexBuffer(device, vertices); return shapeData; }
public static OpenTK.Vector3 GetLocalAabbMin(this TriangleMeshShape obj) { OpenTK.Vector3 value; GetLocalAabbMin(obj, out value); return(value); }
Mesh CreateTriangleMeshShape(TriangleMeshShape shape) { StridingMeshInterface meshInterface = shape.MeshInterface; BulletSharp.DataStream verts, indices; int numVerts, numFaces; PhyScalarType vertsType, indicesType; int vertexStride, indexStride; 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 data = mesh.LockVertexBuffer(LockFlags.None); while (verts.Position < verts.Length) { Vector3 v = verts.Read<Vector3>(); data.Write(v); verts.Position += vertexStride - 12; // Normals will be calculated later data.Position += 12; } mesh.UnlockVertexBuffer(); data = mesh.LockIndexBuffer(LockFlags.None); while (indices.Position < indices.Length) { int index = indices.Read<int>(); if (index32) data.Write(index); else data.Write((short)index); } mesh.UnlockVertexBuffer(); mesh.ComputeNormals(); shapes.Add(shape, mesh); return mesh; }