public void Bind(Transform sourceTransform, Transform targetTransform) { bound = false; if (sourceTopology == null || sourceTopology.InputMesh == null || targetMesh == null || sourceTransform == null || targetTransform == null) { return; } this.sourceSkinTransform = new SkinTransform(sourceTransform); this.targetSkinTransform = new SkinTransform(targetTransform); IntPtr solver = Oni.CreateSolver(0, 0); // get source mesh: float[] transformData = new float[16]; for (int i = 0; i < 16; ++i) { transformData[i] = sourceTransform.worldToLocalMatrix[i]; } IntPtr sourceDefMesh = Oni.CreateDeformableMesh(solver, sourceTopology.HalfEdgeMesh, IntPtr.Zero, transformData, IntPtr.Zero, sourceTopology.InputMesh.vertexCount, sourceTopology.InputMesh.vertexCount); GCHandle sourceTrianglesHandle = Oni.PinMemory(sourceTopology.InputMesh.triangles); GCHandle sourceVerticesHandle = Oni.PinMemory(sourceTopology.InputMesh.vertices); GCHandle sourceNormalsHandle = Oni.PinMemory(sourceTopology.InputMesh.normals); GCHandle sourceTangentsHandle = Oni.PinMemory(sourceTopology.InputMesh.tangents); Oni.SetDeformableMeshData(sourceDefMesh, sourceTrianglesHandle.AddrOfPinnedObject(), sourceVerticesHandle.AddrOfPinnedObject(), sourceNormalsHandle.AddrOfPinnedObject(), sourceTangentsHandle.AddrOfPinnedObject(), IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); // get target mesh transform data: for (int i = 0; i < 16; ++i) { transformData[i] = targetTransform.worldToLocalMatrix[i]; } IntPtr targetDefMesh = Oni.CreateDeformableMesh(solver, IntPtr.Zero, IntPtr.Zero, transformData, IntPtr.Zero, targetMesh.vertexCount, targetMesh.vertexCount); GCHandle meshTrianglesHandle = Oni.PinMemory(targetMesh.triangles); GCHandle meshVerticesHandle = Oni.PinMemory(targetMesh.vertices); GCHandle meshNormalsHandle = Oni.PinMemory(targetMesh.normals); GCHandle meshTangentsHandle = Oni.PinMemory(targetMesh.tangents); Oni.SetDeformableMeshData(targetDefMesh, meshTrianglesHandle.AddrOfPinnedObject(), meshVerticesHandle.AddrOfPinnedObject(), meshNormalsHandle.AddrOfPinnedObject(), meshTangentsHandle.AddrOfPinnedObject(), IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); // Perform the binding process: Oni.Bind(triangleSkinMap, sourceDefMesh, targetDefMesh, masterFlags, slaveFlags); // Cleanup data: Oni.UnpinMemory(sourceTrianglesHandle); Oni.UnpinMemory(sourceVerticesHandle); Oni.UnpinMemory(sourceNormalsHandle); Oni.UnpinMemory(sourceTangentsHandle); Oni.UnpinMemory(meshTrianglesHandle); Oni.UnpinMemory(meshVerticesHandle); Oni.UnpinMemory(meshNormalsHandle); Oni.UnpinMemory(meshTangentsHandle); Oni.DestroyDeformableMesh(solver, sourceDefMesh); Oni.DestroyDeformableMesh(solver, targetDefMesh); Oni.DestroySolver(solver); // Get skinned vertex count: int skinCount = Oni.GetSkinnedVertexCount(triangleSkinMap); // Create arrays of the appropiate size to store skinning data: skinnedVertices = new int[skinCount]; skinnedTriangles = new int[skinCount]; baryPositions = new Vector3[skinCount]; baryNormals = new Vector3[skinCount]; baryTangents = new Vector3[skinCount]; // Retrieve skinning data: Oni.GetSkinInfo(triangleSkinMap, skinnedVertices, skinnedTriangles, baryPositions, baryNormals, baryTangents); bound = true; }