public BoneWeight[] Calculate(Vector2[] vertices, Edge[] edges, Vector2[] controlPoints, Edge[] bones, int[] pins) { var boneSamples = SampleBones(controlPoints, bones, kNumSamples); var verticesList = new List <Vector2>(vertices.Length + controlPoints.Length + boneSamples.Length); var edgesList = new List <Edge>(edges); var indicesList = new List <int>(); verticesList.AddRange(vertices); verticesList.AddRange(controlPoints); verticesList.AddRange(boneSamples); TriangulationUtility.Tessellate(kMinAngle, 0f, kMeshAreaFactor, kLargestTriangleAreaFactor, 0, verticesList, edgesList, indicesList); var tessellatedVertices = verticesList.ToArray(); var tessellatedIndices = indicesList.ToArray(); var weights = new BoneWeight[vertices.Length]; GCHandle verticesHandle = GCHandle.Alloc(tessellatedVertices, GCHandleType.Pinned); GCHandle indicesHandle = GCHandle.Alloc(tessellatedIndices, GCHandleType.Pinned); GCHandle controlPointsHandle = GCHandle.Alloc(controlPoints, GCHandleType.Pinned); GCHandle bonesHandle = GCHandle.Alloc(bones, GCHandleType.Pinned); GCHandle pinsHandle = GCHandle.Alloc(pins, GCHandleType.Pinned); GCHandle weightsHandle = GCHandle.Alloc(weights, GCHandleType.Pinned); Bbw(kNumIterations, verticesHandle.AddrOfPinnedObject(), tessellatedVertices.Length, vertices.Length, indicesHandle.AddrOfPinnedObject(), tessellatedIndices.Length, controlPointsHandle.AddrOfPinnedObject(), controlPoints.Length, bonesHandle.AddrOfPinnedObject(), bones.Length, pinsHandle.AddrOfPinnedObject(), pins.Length, weightsHandle.AddrOfPinnedObject()); verticesHandle.Free(); indicesHandle.Free(); controlPointsHandle.Free(); bonesHandle.Free(); pinsHandle.Free(); weightsHandle.Free(); for (var i = 0; i < weights.Length; ++i) { var weight = weights[i]; if (weight.Sum() == 0f) { weights[i] = defaultWeight; } } return(weights); }
public BoneWeight[] Calculate(Vector2[] vertices, Edge[] edges, Vector2[] controlPoints, Edge[] bones, int[] pins) { Vector2[] boneSamples = SampleBones(controlPoints, bones, kDistancePerSample, kMinSamples); List <Vector2> verticesList = new List <Vector2>(vertices.Length + controlPoints.Length + boneSamples.Length); List <Edge> edgesList = new List <Edge>(edges); List <int> indicesList = new List <int>(); verticesList.AddRange(vertices); verticesList.AddRange(controlPoints); verticesList.AddRange(boneSamples); TriangulationUtility.Tessellate(kMinAngle, 0f, kMeshAreaFactor, kLargestTriangleAreaFactor, 0, verticesList, edgesList, indicesList); Vector2[] tessellatedVertices = verticesList.ToArray(); int[] tessellatedIndices = indicesList.ToArray(); BoneWeight[] weights = new BoneWeight[vertices.Length]; GCHandle verticesHandle = GCHandle.Alloc(tessellatedVertices, GCHandleType.Pinned); GCHandle indicesHandle = GCHandle.Alloc(tessellatedIndices, GCHandleType.Pinned); GCHandle controlPointsHandle = GCHandle.Alloc(controlPoints, GCHandleType.Pinned); GCHandle bonesHandle = GCHandle.Alloc(bones, GCHandleType.Pinned); GCHandle pinsHandle = GCHandle.Alloc(pins, GCHandleType.Pinned); GCHandle weightsHandle = GCHandle.Alloc(weights, GCHandleType.Pinned); Bbw(kNumIterations, verticesHandle.AddrOfPinnedObject(), tessellatedVertices.Length, vertices.Length, indicesHandle.AddrOfPinnedObject(), tessellatedIndices.Length, controlPointsHandle.AddrOfPinnedObject(), controlPoints.Length, bonesHandle.AddrOfPinnedObject(), bones.Length, pinsHandle.AddrOfPinnedObject(), pins.Length, weightsHandle.AddrOfPinnedObject()); verticesHandle.Free(); indicesHandle.Free(); controlPointsHandle.Free(); bonesHandle.Free(); pinsHandle.Free(); weightsHandle.Free(); return(weights); }
public void DebugMesh(ISpriteMeshData spriteMeshData, Vector2[] vertices, Edge[] edges, Vector2[] controlPoints, Edge[] bones, int[] pins) { var boneSamples = SampleBones(controlPoints, bones, kNumSamples); var verticesList = new List <Vector2>(vertices.Length + controlPoints.Length + boneSamples.Length); var edgesList = new List <Edge>(edges); var indicesList = new List <int>(); verticesList.AddRange(vertices); verticesList.AddRange(controlPoints); verticesList.AddRange(boneSamples); TriangulationUtility.Tessellate(kMinAngle, 0f, kMeshAreaFactor, kLargestTriangleAreaFactor, 0, verticesList, edgesList, indicesList); spriteMeshData.Clear(); verticesList.ForEach(v => spriteMeshData.AddVertex(v, new BoneWeight())); spriteMeshData.edges.AddRange(edgesList); spriteMeshData.indices.AddRange(indicesList); }
public void Tessellate(float minAngle, float maxAngle, float meshAreaFactor, float largestTriangleAreaFactor, int smoothIterations, IList <Vector2> vertices, IList <Edge> edges, IList <int> indices) { TriangulationUtility.Tessellate(minAngle, maxAngle, meshAreaFactor, largestTriangleAreaFactor, smoothIterations, vertices, edges, indices); }