[unity] Fix tangents not being solved.

This commit is contained in:
pharan 2018-03-24 06:19:41 +08:00
parent f5c2571c44
commit e46a04a130
4 changed files with 53 additions and 42 deletions

View File

@ -317,6 +317,7 @@ namespace Spine.Unity {
meshRenderer.sharedMaterials = rendererBuffers.GetUpdatedSharedMaterialsArray(); meshRenderer.sharedMaterials = rendererBuffers.GetUpdatedSharedMaterialsArray();
} }
meshGenerator.FillLateVertexData(currentMesh);
// STEP 4. The UnityEngine.Mesh is ready. Set it as the MeshFilter's mesh. Store the instructions used for that mesh. =========== // STEP 4. The UnityEngine.Mesh is ready. Set it as the MeshFilter's mesh. Store the instructions used for that mesh. ===========
meshFilter.sharedMesh = currentMesh; meshFilter.sharedMesh = currentMesh;

View File

@ -50,13 +50,13 @@ namespace Spine.Unity {
} }
} }
/// <summary>Instructions for how to generate a mesh or submesh out of a range of slots in a given skeleton.</summary> /// <summary>Instructions for how to generate a mesh or submesh: "Render this skeleton's slots: start slot, up to but not including endSlot, using this material."</summary>
public struct SubmeshInstruction { public struct SubmeshInstruction {
public Skeleton skeleton; public Skeleton skeleton;
public int startSlot; public int startSlot;
public int endSlot; public int endSlot;
public Material material; public Material material;
public bool forceSeparate; public bool forceSeparate;
public int preActiveClippingSlotSource; public int preActiveClippingSlotSource;
@ -206,35 +206,35 @@ namespace Spine.Unity {
bool skeletonHasClipping = false; bool skeletonHasClipping = false;
var drawOrderItems = drawOrder.Items; var drawOrderItems = drawOrder.Items;
for (int i = 0; i < drawOrderCount; i++) { for (int i = 0; i < drawOrderCount; i++) {
Slot slot = drawOrderItems[i]; Slot slot = drawOrderItems[i];
Attachment attachment = slot.attachment; Attachment attachment = slot.attachment;
workingAttachmentsItems[i] = attachment; workingAttachmentsItems[i] = attachment;
int attachmentTriangleCount; int attachmentTriangleCount;
int attachmentVertexCount; int attachmentVertexCount;
var regionAttachment = attachment as RegionAttachment; var regionAttachment = attachment as RegionAttachment;
if (regionAttachment != null) { if (regionAttachment != null) {
attachmentVertexCount = 4; attachmentVertexCount = 4;
attachmentTriangleCount = 6; attachmentTriangleCount = 6;
} else { } else {
var meshAttachment = attachment as MeshAttachment; var meshAttachment = attachment as MeshAttachment;
if (meshAttachment != null) { if (meshAttachment != null) {
attachmentVertexCount = meshAttachment.worldVerticesLength >> 1; attachmentVertexCount = meshAttachment.worldVerticesLength >> 1;
attachmentTriangleCount = meshAttachment.triangles.Length; attachmentTriangleCount = meshAttachment.triangles.Length;
} else { } else {
var clippingAttachment = attachment as ClippingAttachment; var clippingAttachment = attachment as ClippingAttachment;
if (clippingAttachment != null) { if (clippingAttachment != null) {
current.hasClipping = true; current.hasClipping = true;
skeletonHasClipping = true; skeletonHasClipping = true;
} }
attachmentVertexCount = 0; attachmentVertexCount = 0;
attachmentTriangleCount = 0; attachmentTriangleCount = 0;
} }
} }
current.rawTriangleCount += attachmentTriangleCount; current.rawTriangleCount += attachmentTriangleCount;
current.rawVertexCount += attachmentVertexCount; current.rawVertexCount += attachmentVertexCount;
totalRawVertexCount += attachmentVertexCount; totalRawVertexCount += attachmentVertexCount;
} }
@ -448,9 +448,9 @@ namespace Spine.Unity {
meshBoundsThickness = 0f; meshBoundsThickness = 0f;
} }
submeshes.Count = 1;
submeshes.Items[0].Clear(false);
submeshIndex = 0; submeshIndex = 0;
submeshes.Count = 1;
//submeshes.Items[0].Clear(false);
} }
public void AddSubmesh (SubmeshInstruction instruction, bool updateTriangles = true) { public void AddSubmesh (SubmeshInstruction instruction, bool updateTriangles = true) {
@ -1021,17 +1021,25 @@ namespace Spine.Unity {
mesh.uv2 = this.uv2.Items; mesh.uv2 = this.uv2.Items;
mesh.uv3 = this.uv3.Items; mesh.uv3 = this.uv3.Items;
} }
}
}
if (settings.calculateTangents) { public void FillLateVertexData (Mesh mesh) {
MeshGenerator.SolveTangents2DEnsureSize(ref this.tangents, ref this.tempTanBuffer, vertexCount); if (settings.calculateTangents) {
for (int i = 0; i < submeshCount; i++) { int vertexCount = this.vertexBuffer.Count;
var submesh = sbi[i].Items; var sbi = submeshes.Items;
int triangleCount = sbi[i].Count; int submeshCount = submeshes.Count;
MeshGenerator.SolveTangents2DTriangles(this.tempTanBuffer, submesh, triangleCount, vbi, ubi, vertexCount); var vbi = vertexBuffer.Items;
} var ubi = uvBuffer.Items;
MeshGenerator.SolveTangents2DBuffer(this.tangents, this.tempTanBuffer, vertexCount);
mesh.tangents = this.tangents; MeshGenerator.SolveTangents2DEnsureSize(ref this.tangents, ref this.tempTanBuffer, vertexCount);
for (int i = 0; i < submeshCount; i++) {
var submesh = sbi[i].Items;
int triangleCount = sbi[i].Count;
MeshGenerator.SolveTangents2DTriangles(this.tempTanBuffer, submesh, triangleCount, vbi, ubi, vertexCount);
} }
MeshGenerator.SolveTangents2DBuffer(this.tangents, this.tempTanBuffer, vertexCount);
mesh.tangents = this.tangents;
} }
} }

View File

@ -287,6 +287,7 @@ namespace Spine.Unity {
var mesh = smartMesh.mesh; var mesh = smartMesh.mesh;
meshGenerator.FillVertexData(mesh); meshGenerator.FillVertexData(mesh);
if (updateTriangles) meshGenerator.FillTrianglesSingle(mesh); if (updateTriangles) meshGenerator.FillTrianglesSingle(mesh);
meshGenerator.FillLateVertexData(mesh);
canvasRenderer.SetMesh(mesh); canvasRenderer.SetMesh(mesh);
smartMesh.instructionUsed.Set(currentInstructions); smartMesh.instructionUsed.Set(currentInstructions);

View File

@ -117,6 +117,7 @@ namespace Spine.Unity.Modules {
meshRenderer.sharedMaterials = buffers.GetUpdatedSharedMaterialsArray(); meshRenderer.sharedMaterials = buffers.GetUpdatedSharedMaterialsArray();
} }
} }
meshGenerator.FillLateVertexData(mesh);
meshFilter.sharedMesh = mesh; meshFilter.sharedMesh = mesh;
smartMesh.instructionUsed.Set(currentInstructions); smartMesh.instructionUsed.Set(currentInstructions);