mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-26 22:49:01 +08:00
[unity] MeshGenerator can fill mesh with setup pose attachment.
This commit is contained in:
parent
1c3f6b1b32
commit
0a23ed3d85
@ -1159,6 +1159,123 @@ namespace Spine.Unity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region AttachmentRendering
|
||||||
|
static List<Vector3> AttachmentVerts = new List<Vector3>();
|
||||||
|
static List<Vector2> AttachmentUVs = new List<Vector2>();
|
||||||
|
static List<Color32> AttachmentColors32 = new List<Color32>();
|
||||||
|
static List<int> AttachmentIndices = new List<int>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Fills mesh vertex data to render a RegionAttachment.</summary>
|
||||||
|
public static void FillMeshLocal (Mesh mesh, RegionAttachment regionAttachment) {
|
||||||
|
if (mesh == null) return;
|
||||||
|
if (regionAttachment == null) return;
|
||||||
|
|
||||||
|
AttachmentVerts.Clear();
|
||||||
|
var offsets = regionAttachment.Offset;
|
||||||
|
AttachmentVerts.Add(new Vector3(offsets[RegionAttachment.BLX], offsets[RegionAttachment.BLY]));
|
||||||
|
AttachmentVerts.Add(new Vector3(offsets[RegionAttachment.ULX], offsets[RegionAttachment.ULY]));
|
||||||
|
AttachmentVerts.Add(new Vector3(offsets[RegionAttachment.URX], offsets[RegionAttachment.URY]));
|
||||||
|
AttachmentVerts.Add(new Vector3(offsets[RegionAttachment.BRX], offsets[RegionAttachment.BRY]));
|
||||||
|
|
||||||
|
AttachmentUVs.Clear();
|
||||||
|
var uvs = regionAttachment.UVs;
|
||||||
|
AttachmentUVs.Add(new Vector2(uvs[RegionAttachment.ULX], uvs[RegionAttachment.ULY]));
|
||||||
|
AttachmentUVs.Add(new Vector2(uvs[RegionAttachment.URX], uvs[RegionAttachment.URY]));
|
||||||
|
AttachmentUVs.Add(new Vector2(uvs[RegionAttachment.BRX], uvs[RegionAttachment.BRY]));
|
||||||
|
AttachmentUVs.Add(new Vector2(uvs[RegionAttachment.BLX], uvs[RegionAttachment.BLY]));
|
||||||
|
|
||||||
|
AttachmentColors32.Clear();
|
||||||
|
Color32 c = (Color32)(new Color(regionAttachment.r, regionAttachment.g, regionAttachment.b, regionAttachment.a));
|
||||||
|
for (int i = 0; i < 4; i++)
|
||||||
|
AttachmentColors32.Add(c);
|
||||||
|
|
||||||
|
AttachmentIndices.Clear();
|
||||||
|
AttachmentIndices.AddRange(new[] { 0, 2, 1, 0, 3, 2 });
|
||||||
|
|
||||||
|
mesh.Clear();
|
||||||
|
mesh.name = regionAttachment.Name;
|
||||||
|
mesh.SetVertices(AttachmentVerts);
|
||||||
|
mesh.SetUVs(0, AttachmentUVs);
|
||||||
|
mesh.SetColors(AttachmentColors32);
|
||||||
|
mesh.SetTriangles(AttachmentIndices, 0);
|
||||||
|
mesh.RecalculateBounds();
|
||||||
|
|
||||||
|
AttachmentVerts.Clear();
|
||||||
|
AttachmentUVs.Clear();
|
||||||
|
AttachmentColors32.Clear();
|
||||||
|
AttachmentIndices.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void FillMeshLocal (Mesh mesh, MeshAttachment meshAttachment, SkeletonData skeletonData) {
|
||||||
|
if (mesh == null) return;
|
||||||
|
if (meshAttachment == null) return;
|
||||||
|
int vertexCount = meshAttachment.WorldVerticesLength / 2;
|
||||||
|
|
||||||
|
AttachmentVerts.Clear();
|
||||||
|
if (meshAttachment.IsWeighted()) {
|
||||||
|
int count = meshAttachment.WorldVerticesLength;
|
||||||
|
int[] meshAttachmentBones = meshAttachment.bones;
|
||||||
|
int v = 0;
|
||||||
|
|
||||||
|
float[] vertices = meshAttachment.vertices;
|
||||||
|
for (int w = 0, b = 0; w < count; w += 2) {
|
||||||
|
float wx = 0, wy = 0;
|
||||||
|
int n = meshAttachmentBones[v++];
|
||||||
|
n += v;
|
||||||
|
for (; v < n; v++, b += 3) {
|
||||||
|
BoneMatrix bm = BoneMatrix.CalculateSetupWorld(skeletonData.bones.Items[meshAttachmentBones[v]]);
|
||||||
|
float vx = vertices[b], vy = vertices[b + 1], weight = vertices[b + 2];
|
||||||
|
wx += (vx * bm.a + vy * bm.b + bm.x) * weight;
|
||||||
|
wy += (vx * bm.c + vy * bm.d + bm.y) * weight;
|
||||||
|
}
|
||||||
|
AttachmentVerts.Add(new Vector3(wx, wy));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
var localVerts = meshAttachment.Vertices;
|
||||||
|
Vector3 pos = default(Vector3);
|
||||||
|
for (int i = 0; i < vertexCount; i++) {
|
||||||
|
int ii = i * 2;
|
||||||
|
pos.x = localVerts[ii];
|
||||||
|
pos.y = localVerts[ii + 1];
|
||||||
|
AttachmentVerts.Add(pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var uvs = meshAttachment.uvs;
|
||||||
|
Vector2 uv = default(Vector2);
|
||||||
|
Color32 c = (Color32)(new Color(meshAttachment.r, meshAttachment.g, meshAttachment.b, meshAttachment.a));
|
||||||
|
AttachmentUVs.Clear();
|
||||||
|
AttachmentColors32.Clear();
|
||||||
|
for (int i = 0; i < vertexCount; i++) {
|
||||||
|
int ii = i * 2;
|
||||||
|
uv.x = uvs[ii];
|
||||||
|
uv.y = uvs[ii + 1];
|
||||||
|
AttachmentUVs.Add(uv);
|
||||||
|
|
||||||
|
AttachmentColors32.Add(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
AttachmentIndices.Clear();
|
||||||
|
AttachmentIndices.AddRange(meshAttachment.triangles);
|
||||||
|
|
||||||
|
mesh.Clear();
|
||||||
|
mesh.name = meshAttachment.Name;
|
||||||
|
mesh.SetVertices(AttachmentVerts);
|
||||||
|
mesh.SetUVs(0, AttachmentUVs);
|
||||||
|
mesh.SetColors(AttachmentColors32);
|
||||||
|
mesh.SetTriangles(AttachmentIndices, 0);
|
||||||
|
mesh.RecalculateBounds();
|
||||||
|
|
||||||
|
AttachmentVerts.Clear();
|
||||||
|
AttachmentUVs.Clear();
|
||||||
|
AttachmentColors32.Clear();
|
||||||
|
AttachmentIndices.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MeshRendererBuffers : IDisposable {
|
public class MeshRendererBuffers : IDisposable {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user