Exemplo n.º 1
0
        //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);
        }
Exemplo n.º 2
0
        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;
        }
Exemplo n.º 3
0
        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;
            }

        }
Exemplo n.º 4
0
        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;
            }
        }
Exemplo n.º 5
0
        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;
        }
Exemplo n.º 6
0
	    public void	AddIndexedMesh(IndexedMesh mesh, PHY_ScalarType indexType)
	    {
		    m_indexedMeshes.Add(mesh);
		    m_indexedMeshes[m_indexedMeshes.Count-1].m_indexType = indexType;
	    }
Exemplo n.º 7
0
    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();
    }
Exemplo n.º 8
0
    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();
    }
Exemplo n.º 9
0
    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);

    }
Exemplo n.º 10
0
 public void AddIndexedMesh(IndexedMesh mesh, PHY_ScalarType indexType)
 {
     m_indexedMeshes.Add(mesh);
     m_indexedMeshes[m_indexedMeshes.Count - 1].m_indexType = indexType;
 }