public ObiTriangleMeshHandle GetOrCreateTriangleMesh(Mesh source) { ObiTriangleMeshHandle handle = new ObiTriangleMeshHandle(null); if (source != null && !handles.TryGetValue(source, out handle)) { var sourceTris = source.triangles; var sourceVertices = source.vertices; // Build a bounding interval hierarchy from the triangles: IBounded[] t = new IBounded[sourceTris.Length / 3]; for (int i = 0; i < t.Length; ++i) { int t1 = sourceTris[i * 3]; int t2 = sourceTris[i * 3 + 1]; int t3 = sourceTris[i * 3 + 2]; t[i] = new Triangle(t1, t2, t3, sourceVertices[t1], sourceVertices[t2], sourceVertices[t3]); } var sourceBih = BIH.Build(ref t); Triangle[] tris = Array.ConvertAll(t, x => (Triangle)x); handle = new ObiTriangleMeshHandle(source, headers.count); handles.Add(source, handle); headers.Add(new TriangleMeshHeader(bihNodes.count, sourceBih.Length, triangles.count, tris.Length, vertices.count, sourceVertices.Length)); bihNodes.AddRange(sourceBih); triangles.AddRange(tris); vertices.AddRange(sourceVertices); } return(handle); }
public override bool UpdateIfNeeded() { MeshCollider meshCollider = collider as MeshCollider; // retrieve collision world and index: var world = ObiColliderWorld.GetInstance(); int index = source.Handle.index; // decrease reference count of current handle if the mesh data it points to is different // than the mesh used by the collider: if (handle != null && handle.owner != meshCollider.sharedMesh) { if (handle.Dereference()) { world.DestroyTriangleMesh(handle); } } // get or create the mesh: if (handle == null || !handle.isValid) { handle = world.GetOrCreateTriangleMesh(meshCollider.sharedMesh); handle.Reference(); } // update collider: var shape = world.colliderShapes[index]; shape.type = ColliderShape.ShapeType.TriangleMesh; shape.phase = source.Phase; shape.flags = meshCollider.isTrigger ? 1 : 0; shape.rigidbodyIndex = source.Rigidbody != null ? source.Rigidbody.handle.index : -1; shape.materialIndex = source.CollisionMaterial != null ? source.CollisionMaterial.handle.index : -1; shape.contactOffset = source.Thickness; shape.dataIndex = handle.index; world.colliderShapes[index] = shape; // update bounds: var aabb = world.colliderAabbs[index]; aabb.FromBounds(meshCollider.bounds, shape.contactOffset); world.colliderAabbs[index] = aabb; // update transform: var trfm = world.colliderTransforms[index]; trfm.FromTransform(meshCollider.transform); world.colliderTransforms[index] = trfm; return(true); }
public void DestroyTriangleMesh(ObiTriangleMeshHandle handle) { if (handle != null && handle.isValid && handle.index < handles.Count) { var header = headers[handle.index]; // Update headers: for (int i = 0; i < headers.count; ++i) { var h = headers[i]; if (h.firstTriangle > header.firstTriangle) { h.firstNode -= header.nodeCount; h.firstTriangle -= header.triangleCount; h.firstVertex -= header.vertexCount; headers[i] = h; } } // update handles: foreach (var pair in handles) { if (pair.Value.index > handle.index) { pair.Value.index--; } } // Remove nodes, triangles and vertices bihNodes.RemoveRange(header.firstNode, header.nodeCount); triangles.RemoveRange(header.firstTriangle, header.triangleCount); vertices.RemoveRange(header.firstVertex, header.vertexCount); // remove header: headers.RemoveAt(handle.index); // remove the mesh from the dictionary: handles.Remove(handle.owner); // Invalidate our handle: handle.Invalidate(); } }
public void DestroyTriangleMesh(ObiTriangleMeshHandle meshHandle) { triangleMeshContainer.DestroyTriangleMesh(meshHandle); }