private void setMesh(BulletDotNETScene _parent_scene, IMesh mesh) { // TODO: Set Collision Body Mesh // This sleeper is there to moderate how long it takes between // setting up the mesh and pre-processing it when we get rapid fire mesh requests on a single object m_log.Debug("_________SetMesh"); Thread.Sleep(10); //Kill Body so that mesh can re-make the geom if (IsPhysical && Body != null && Body.Handle != IntPtr.Zero) { if (childPrim) { if (_parent != null) { BulletDotNETPrim parent = (BulletDotNETPrim)_parent; parent.ChildDelink(this); } } else { //disableBody(); } } //IMesh oldMesh = primMesh; //primMesh = mesh; //float[] vertexList = primMesh.getVertexListAsFloatLocked(); // Note, that vertextList is pinned in memory //int[] indexList = primMesh.getIndexListAsIntLocked(); // Also pinned, needs release after usage ////Array.Reverse(indexList); //primMesh.releaseSourceMeshData(); // free up the original mesh data to save memory IMesh oldMesh = primMesh; primMesh = mesh; float[] vertexList = mesh.getVertexListAsFloatLocked(); // Note, that vertextList is pinned in memory int[] indexList = mesh.getIndexListAsIntLocked(); // Also pinned, needs release after usage //Array.Reverse(indexList); mesh.releaseSourceMeshData(); // free up the original mesh data to save memory int VertexCount = vertexList.GetLength(0) / 3; int IndexCount = indexList.GetLength(0); if (btshapeArray != null && btshapeArray.Handle != IntPtr.Zero) btshapeArray.Dispose(); //Array.Reverse(indexList); btshapeArray = new btTriangleIndexVertexArray(IndexCount / 3, indexList, (3 * sizeof(int)), VertexCount, vertexList, 3 * sizeof(float)); SetCollisionShape(new btGImpactMeshShape(btshapeArray)); //((btGImpactMeshShape) prim_geom).updateBound(); ((btGImpactMeshShape)prim_geom).setLocalScaling(new btVector3(1, 1, 1)); ((btGImpactMeshShape)prim_geom).updateBound(); _parent_scene.SetUsingGImpact(); //if (oldMesh != null) //{ // oldMesh.releasePinned(); // oldMesh = null; //} }