Exemple #1
0
        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;
        }