//just to be backwards compatible public TriangleIndexVertexArray(int numTriangles,ObjectArray<int> triangleIndexBase,int triangleIndexStride,int numVertices,Object vertexBase,int vertexStride) { // ignore the provided stride values as we infer them from the version of the ctor called... IndexedMesh indexedMesh = new IndexedMesh(); indexedMesh.m_numTriangles = numTriangles; indexedMesh.m_triangleIndexBase = triangleIndexBase; indexedMesh.m_triangleIndexStride = 3; indexedMesh.m_numVertices = numVertices; indexedMesh.m_vertexBase = vertexBase; if (vertexBase is ObjectArray<IndexedVector3>) { indexedMesh.m_vertexStride = 1; } #if XNA else if (vertexBase is ObjectArray<Microsoft.Xna.Framework.Vector3>) { indexedMesh.m_vertexStride = 1; } #endif else if (vertexBase is ObjectArray<float>) { indexedMesh.m_vertexStride = 3; } else { Debug.Assert(false,"Unsupported vertex object base."); } AddIndexedMesh(indexedMesh,PHY_ScalarType.PHY_INTEGER); }
public override void GetLockedVertexIndexBase(out Object vertexbase, out int numverts, out PHY_ScalarType type, out int vertexStride, out Object indexbase, out int indexstride, out int numfaces, out PHY_ScalarType indicestype, int subpart) { Debug.Assert(subpart < GetNumSubParts()); IndexedMesh mesh = m_indexedMeshes[subpart]; numverts = mesh.m_numVertices; vertexbase = mesh.m_vertexBase; type = mesh.m_vertexType; vertexStride = mesh.m_vertexStride; numfaces = mesh.m_numTriangles; indexbase = mesh.m_triangleIndexBase; indexstride = mesh.m_triangleIndexStride; indicestype = mesh.m_indexType; }
public TriangleMesh(bool use32bitIndices, bool use4componentVertices) { m_use32bitIndices = use32bitIndices; m_use4componentVertices = use4componentVertices; IndexedMesh meshIndex = new IndexedMesh(); m_indexedMeshes.Add(meshIndex); if (m_use32bitIndices) { m_32bitIndices = new ObjectArray<int>(); m_indexedMeshes[0].m_numTriangles = m_32bitIndices.Count / 3; m_indexedMeshes[0].m_indexType = PHY_ScalarType.PHY_INTEGER; m_indexedMeshes[0].m_triangleIndexStride = 3; } else { m_16bitIndices = new ObjectArray<short>(); m_indexedMeshes[0].m_numTriangles = m_16bitIndices.Count / 3; m_indexedMeshes[0].m_triangleIndexBase = null; m_indexedMeshes[0].m_indexType = PHY_ScalarType.PHY_SHORT; m_indexedMeshes[0].m_triangleIndexStride = 3; } if (m_use4componentVertices) { m_4componentVertices = new ObjectArray<IndexedVector3>(); m_indexedMeshes[0].m_numVertices = m_4componentVertices.Count; m_indexedMeshes[0].m_vertexStride = 1; m_indexedMeshes[0].m_vertexBase = m_4componentVertices; } else { m_3componentVertices = new ObjectArray<float>(); m_indexedMeshes[0].m_numVertices = m_3componentVertices.Count / 3; m_indexedMeshes[0].m_vertexStride = 3; m_indexedMeshes[0].m_vertexBase = m_3componentVertices; } }
public TriangleMesh(bool use32bitIndices, bool use4componentVertices) { m_use32bitIndices = use32bitIndices; m_use4componentVertices = use4componentVertices; IndexedMesh meshIndex = new IndexedMesh(); m_indexedMeshes.Add(meshIndex); if (m_use32bitIndices) { m_32bitIndices = new ObjectArray <int>(); m_indexedMeshes[0].m_numTriangles = m_32bitIndices.Count / 3; m_indexedMeshes[0].m_indexType = PHY_ScalarType.PHY_INTEGER; m_indexedMeshes[0].m_triangleIndexStride = 3; } else { m_16bitIndices = new ObjectArray <short>(); m_indexedMeshes[0].m_numTriangles = m_16bitIndices.Count / 3; m_indexedMeshes[0].m_triangleIndexBase = null; m_indexedMeshes[0].m_indexType = PHY_ScalarType.PHY_SHORT; m_indexedMeshes[0].m_triangleIndexStride = 3; } if (m_use4componentVertices) { m_4componentVertices = new ObjectArray <IndexedVector3>(); m_indexedMeshes[0].m_numVertices = m_4componentVertices.Count; m_indexedMeshes[0].m_vertexStride = 1; m_indexedMeshes[0].m_vertexBase = m_4componentVertices; } else { m_3componentVertices = new ObjectArray <float>(); m_indexedMeshes[0].m_numVertices = m_3componentVertices.Count / 3; m_indexedMeshes[0].m_vertexStride = 3; m_indexedMeshes[0].m_vertexBase = m_3componentVertices; } }
internal static object CreateMeshShapeF(object pWorld, int pIndicesCount, int[] indices, int pVerticesCount, float[] verticesAsFloats) { ObjectArray<int> indicesarr = new ObjectArray<int>(indices); ObjectArray<float> vertices = new ObjectArray<float>(verticesAsFloats); var world = pWorld as DiscreteDynamicsWorld; IndexedMesh mesh = new IndexedMesh(); mesh.m_indexType = PHY_ScalarType.PHY_INTEGER; mesh.m_numTriangles = pIndicesCount / 3; mesh.m_numVertices = pVerticesCount; mesh.m_triangleIndexBase = indicesarr; mesh.m_vertexBase = vertices; mesh.m_vertexStride = 3; mesh.m_vertexType = PHY_ScalarType.PHY_FLOAT; mesh.m_triangleIndexStride = 3; TriangleIndexVertexArray tribuilder = new TriangleIndexVertexArray(); tribuilder.AddIndexedMesh(mesh, PHY_ScalarType.PHY_INTEGER); BvhTriangleMeshShape meshShape = new BvhTriangleMeshShape(tribuilder, false, true); //TriangleMeshShape meshShape = new TriangleMeshShape(tribuilder); //meshShape.SetMargin(world.WorldSettings.Params.collisionMargin); float margin = 0.02f; meshShape.SetMargin(margin); return meshShape; }
public void AddIndexedMesh(IndexedMesh mesh, PHY_ScalarType indexType) { m_indexedMeshes.Add(mesh); m_indexedMeshes[m_indexedMeshes.Count-1].m_indexType = indexType; }
public static void DumpRaw(int[] indices, float[] vertices, int pIndicesCount, int pVerticesCount) { String fileName = "objTest6.raw"; String completePath = System.IO.Path.Combine(Util.configDir(), fileName); StreamWriter sw = new StreamWriter(completePath); IndexedMesh mesh = new IndexedMesh(); mesh.m_indexType = PHY_ScalarType.PHY_INTEGER; mesh.m_numTriangles = pIndicesCount / 3; mesh.m_numVertices = pVerticesCount; mesh.m_triangleIndexBase = indices; mesh.m_vertexBase = vertices; mesh.m_vertexStride = 3; mesh.m_vertexType = PHY_ScalarType.PHY_FLOAT; mesh.m_triangleIndexStride = 3; TriangleIndexVertexArray tribuilder = new TriangleIndexVertexArray(); tribuilder.AddIndexedMesh(mesh, PHY_ScalarType.PHY_INTEGER); sw.WriteLine("Indices"); sw.WriteLine(string.Format("int[] indices = new int[{0}];",pIndicesCount)); for (int iter = 0; iter < indices.Length; iter++) { sw.WriteLine(string.Format("indices[{0}]={1};",iter,indices[iter])); } sw.WriteLine("VerticesFloats"); sw.WriteLine(string.Format("float[] vertices = new float[{0}];", pVerticesCount)); for (int iter = 0; iter < vertices.Length; iter++) { sw.WriteLine(string.Format("Vertices[{0}]={1};", iter, vertices[iter].ToString("0.0000"))); } // for (int i = 0; i < pVerticesCount; i++) // { // // string s = vertices[indices[i * 3]].ToString("0.0000"); // s += " " + vertices[indices[i * 3 + 1]].ToString("0.0000"); // s += " " + vertices[indices[i * 3 + 2]].ToString("0.0000"); // // sw.Write(s + "\n"); //} sw.Close(); }
public static void DumpRaw(ObjectArray<int>indices, ObjectArray<float> vertices, int pIndicesCount,int pVerticesCount ) { String fileName = "objTest3.raw"; String completePath = System.IO.Path.Combine(Util.configDir(), fileName); StreamWriter sw = new StreamWriter(completePath); IndexedMesh mesh = new IndexedMesh(); mesh.m_indexType = PHY_ScalarType.PHY_INTEGER; mesh.m_numTriangles = pIndicesCount / 3; mesh.m_numVertices = pVerticesCount; mesh.m_triangleIndexBase = indices; mesh.m_vertexBase = vertices; mesh.m_vertexStride = 3; mesh.m_vertexType = PHY_ScalarType.PHY_FLOAT; mesh.m_triangleIndexStride = 3; TriangleIndexVertexArray tribuilder = new TriangleIndexVertexArray(); tribuilder.AddIndexedMesh(mesh, PHY_ScalarType.PHY_INTEGER); for (int i = 0; i < pVerticesCount; i++) { string s = vertices[indices[i * 3]].ToString("0.0000"); s += " " + vertices[indices[i * 3 + 1]].ToString("0.0000"); s += " " + vertices[indices[i * 3 + 2]].ToString("0.0000"); sw.Write(s + "\n"); } sw.Close(); }
public override BulletShape CreateMeshShape(BulletWorld pWorld, int pIndicesCount, int[] indices, int pVerticesCount, float[] verticesAsFloats) { //DumpRaw(indices,verticesAsFloats,pIndicesCount,pVerticesCount); for (int iter = 0; iter < pVerticesCount; iter++) { if (verticesAsFloats[iter] > 0 && verticesAsFloats[iter] < 0.0001) verticesAsFloats[iter] = 0; if (verticesAsFloats[iter] < 0 && verticesAsFloats[iter] > -0.0001) verticesAsFloats[iter] = 0; } ObjectArray<int> indicesarr = new ObjectArray<int>(indices); ObjectArray<float> vertices = new ObjectArray<float>(verticesAsFloats); DumpRaw(indicesarr,vertices,pIndicesCount,pVerticesCount); DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world; IndexedMesh mesh = new IndexedMesh(); mesh.m_indexType = PHY_ScalarType.PHY_INTEGER; mesh.m_numTriangles = pIndicesCount/3; mesh.m_numVertices = pVerticesCount; mesh.m_triangleIndexBase = indicesarr; mesh.m_vertexBase = vertices; mesh.m_vertexStride = 3; mesh.m_vertexType = PHY_ScalarType.PHY_FLOAT; mesh.m_triangleIndexStride = 3; TriangleIndexVertexArray tribuilder = new TriangleIndexVertexArray(); tribuilder.AddIndexedMesh(mesh, PHY_ScalarType.PHY_INTEGER); BvhTriangleMeshShape meshShape = new BvhTriangleMeshShape(tribuilder, true,true); meshShape.SetMargin(world.WorldSettings.Params.collisionMargin); // world.UpdateSingleAabb(meshShape); return new BulletShapeXNA(meshShape, BSPhysicsShapeType.SHAPE_MESH); }
public void AddIndexedMesh(IndexedMesh mesh, PHY_ScalarType indexType) { m_indexedMeshes.Add(mesh); m_indexedMeshes[m_indexedMeshes.Count - 1].m_indexType = indexType; }