fixed frontFacing stuff

This commit is contained in:
ZimM 2015-05-20 02:45:15 +03:00
parent 3347ffcf86
commit dcab4d975b

View File

@ -183,15 +183,25 @@ public class SkeletonRenderer : MonoBehaviour {
ExposedList<int> attachmentsTriangleCountTemp = lastState.attachmentsTriangleCountTemp; ExposedList<int> attachmentsTriangleCountTemp = lastState.attachmentsTriangleCountTemp;
attachmentsTriangleCountTemp.GrowIfNeeded(drawOrderCount); attachmentsTriangleCountTemp.GrowIfNeeded(drawOrderCount);
attachmentsTriangleCountTemp.Count = drawOrderCount; attachmentsTriangleCountTemp.Count = drawOrderCount;
ExposedList<bool> attachmentsFlipStateTemp = lastState.attachmentsFlipStateTemp;
attachmentsFlipStateTemp.GrowIfNeeded(drawOrderCount);
attachmentsFlipStateTemp.Count = drawOrderCount;
ExposedList<LastState.AddSubmeshArguments> addSubmeshArgumentsTemp = lastState.addSubmeshArgumentsTemp; ExposedList<LastState.AddSubmeshArguments> addSubmeshArgumentsTemp = lastState.addSubmeshArgumentsTemp;
addSubmeshArgumentsTemp.Clear(false); addSubmeshArgumentsTemp.Clear(false);
for (int i = 0; i < drawOrderCount; i++) { for (int i = 0; i < drawOrderCount; i++) {
Slot slot = drawOrder.Items[i]; Slot slot = drawOrder.Items[i];
Bone bone = slot.bone;
Attachment attachment = slot.attachment; Attachment attachment = slot.attachment;
object rendererObject; object rendererObject;
int attachmentVertexCount, attachmentTriangleCount; int attachmentVertexCount, attachmentTriangleCount;
bool worldScaleXIsPositive = bone.worldScaleX >= 0f;
bool worldScaleYIsPositive = bone.worldScaleY >= 0f;
bool worldScaleIsSameSigns = (worldScaleXIsPositive && worldScaleYIsPositive) ||
(!worldScaleXIsPositive && !worldScaleYIsPositive);
bool flip = frontFacing && ((bone.worldFlipX != bone.worldFlipY) == worldScaleIsSameSigns);
attachmentsFlipStateTemp.Items[i] = flip;
attachmentsTriangleCountTemp.Items[i] = -1; attachmentsTriangleCountTemp.Items[i] = -1;
RegionAttachment regionAttachment = attachment as RegionAttachment; RegionAttachment regionAttachment = attachment as RegionAttachment;
@ -240,7 +250,7 @@ public class SkeletonRenderer : MonoBehaviour {
new LastState.AddSubmeshArguments(lastMaterial, submeshStartSlotIndex, drawOrderCount, submeshTriangleCount, submeshFirstVertex, true) new LastState.AddSubmeshArguments(lastMaterial, submeshStartSlotIndex, drawOrderCount, submeshTriangleCount, submeshFirstVertex, true)
); );
bool mustUpdateMeshStructure = MustUpdateMeshStructure(attachmentsTriangleCountTemp, addSubmeshArgumentsTemp); bool mustUpdateMeshStructure = CheckIfMustUpdateMeshStructure(attachmentsTriangleCountTemp, attachmentsFlipStateTemp, addSubmeshArgumentsTemp);
if (mustUpdateMeshStructure) { if (mustUpdateMeshStructure) {
submeshMaterials.Clear(); submeshMaterials.Clear();
for (int i = 0, n = addSubmeshArgumentsTemp.Count; i < n; i++) { for (int i = 0, n = addSubmeshArgumentsTemp.Count; i < n; i++) {
@ -251,7 +261,8 @@ public class SkeletonRenderer : MonoBehaviour {
arguments.endSlot, arguments.endSlot,
arguments.triangleCount, arguments.triangleCount,
arguments.firstVertex, arguments.firstVertex,
arguments.lastSubmesh arguments.lastSubmesh,
attachmentsFlipStateTemp
); );
} }
@ -487,38 +498,39 @@ public class SkeletonRenderer : MonoBehaviour {
} }
// Update previous state // Update previous state
ExposedList<int> attachmentsTriangleCountCurrentMesh = ExposedList<int> attachmentsTriangleCountCurrentMesh;
useMesh1 ? ExposedList<bool> attachmentsFlipStateCurrentMesh;
lastState.attachmentsTriangleCountMesh1 : ExposedList<LastState.AddSubmeshArguments> addSubmeshArgumentsCurrentMesh;
lastState.attachmentsTriangleCountMesh2; if (useMesh1) {
ExposedList<LastState.AddSubmeshArguments> addSubmeshArgumentsCurrentMesh = attachmentsTriangleCountCurrentMesh = lastState.attachmentsTriangleCountMesh1;
useMesh1 ? addSubmeshArgumentsCurrentMesh = lastState.addSubmeshArgumentsMesh1;
lastState.addSubmeshArgumentsMesh1 : attachmentsFlipStateCurrentMesh = lastState.attachmentsFlipStateMesh1;
lastState.addSubmeshArgumentsMesh2; lastState.immutableTrianglesMesh1 = immutableTriangles;
} else {
attachmentsTriangleCountCurrentMesh = lastState.attachmentsTriangleCountMesh2;
addSubmeshArgumentsCurrentMesh = lastState.addSubmeshArgumentsMesh2;
attachmentsFlipStateCurrentMesh = lastState.attachmentsFlipStateMesh2;
lastState.immutableTrianglesMesh2 = immutableTriangles;
}
attachmentsTriangleCountCurrentMesh.GrowIfNeeded(attachmentsTriangleCountTemp.Capacity); attachmentsTriangleCountCurrentMesh.GrowIfNeeded(attachmentsTriangleCountTemp.Capacity);
attachmentsTriangleCountCurrentMesh.Count = attachmentsTriangleCountTemp.Count; attachmentsTriangleCountCurrentMesh.Count = attachmentsTriangleCountTemp.Count;
attachmentsTriangleCountTemp.CopyTo(attachmentsTriangleCountCurrentMesh.Items, 0); attachmentsTriangleCountTemp.CopyTo(attachmentsTriangleCountCurrentMesh.Items, 0);
attachmentsFlipStateCurrentMesh.GrowIfNeeded(attachmentsFlipStateTemp.Capacity);
attachmentsFlipStateCurrentMesh.Count = attachmentsFlipStateTemp.Count;
attachmentsFlipStateTemp.CopyTo(attachmentsFlipStateCurrentMesh.Items, 0);
addSubmeshArgumentsCurrentMesh.GrowIfNeeded(addSubmeshArgumentsTemp.Count); addSubmeshArgumentsCurrentMesh.GrowIfNeeded(addSubmeshArgumentsTemp.Count);
addSubmeshArgumentsCurrentMesh.Count = addSubmeshArgumentsTemp.Count; addSubmeshArgumentsCurrentMesh.Count = addSubmeshArgumentsTemp.Count;
addSubmeshArgumentsTemp.CopyTo(addSubmeshArgumentsCurrentMesh.Items); addSubmeshArgumentsTemp.CopyTo(addSubmeshArgumentsCurrentMesh.Items);
if (useMesh1) {
lastState.frontFacingMesh1 = frontFacing;
lastState.immutableTrianglesMesh1 = immutableTriangles;
} else {
lastState.frontFacingMesh2 = frontFacing;
lastState.immutableTrianglesMesh2 = immutableTriangles;
}
useMesh1 = !useMesh1; useMesh1 = !useMesh1;
} }
private bool MustUpdateMeshStructure(ExposedList<int> attachmentsTriangleCountTemp, ExposedList<LastState.AddSubmeshArguments> addSubmeshArgumentsTemp) { private bool CheckIfMustUpdateMeshStructure(ExposedList<int> attachmentsTriangleCountTemp, ExposedList<bool> attachmentsFlipStateTemp, ExposedList<LastState.AddSubmeshArguments> addSubmeshArgumentsTemp) {
// Check if any mesh settings were changed // Check if any mesh settings were changed
bool mustUpdateMeshStructure = bool mustUpdateMeshStructure =
frontFacing != (useMesh1 ? lastState.frontFacingMesh1 : lastState.frontFacingMesh2) ||
immutableTriangles != (useMesh1 ? lastState.immutableTrianglesMesh1 : lastState.immutableTrianglesMesh2); immutableTriangles != (useMesh1 ? lastState.immutableTrianglesMesh1 : lastState.immutableTrianglesMesh2);
#if UNITY_EDITOR #if UNITY_EDITOR
mustUpdateMeshStructure |= !Application.isPlaying; mustUpdateMeshStructure |= !Application.isPlaying;
@ -529,14 +541,18 @@ public class SkeletonRenderer : MonoBehaviour {
// Check if any attachments were enabled/disabled // Check if any attachments were enabled/disabled
// or submesh structures has changed // or submesh structures has changed
ExposedList<int> attachmentsTriangleCountCurrentMesh = ExposedList<int> attachmentsTriangleCountCurrentMesh;
useMesh1 ? ExposedList<bool> attachmentsFlipStateCurrentMesh;
lastState.attachmentsTriangleCountMesh1 : ExposedList<LastState.AddSubmeshArguments> addSubmeshArgumentsCurrentMesh;
lastState.attachmentsTriangleCountMesh2; if (useMesh1) {
ExposedList<LastState.AddSubmeshArguments> addSubmeshArgumentsCurrentMesh = attachmentsTriangleCountCurrentMesh = lastState.attachmentsTriangleCountMesh1;
useMesh1 ? addSubmeshArgumentsCurrentMesh = lastState.addSubmeshArgumentsMesh1;
lastState.addSubmeshArgumentsMesh1 : attachmentsFlipStateCurrentMesh = lastState.attachmentsFlipStateMesh1;
lastState.addSubmeshArgumentsMesh2; } else {
attachmentsTriangleCountCurrentMesh = lastState.attachmentsTriangleCountMesh2;
addSubmeshArgumentsCurrentMesh = lastState.addSubmeshArgumentsMesh2;
attachmentsFlipStateCurrentMesh = lastState.attachmentsFlipStateMesh2;
}
// Check attachments // Check attachments
int attachmentCount = attachmentsTriangleCountTemp.Count; int attachmentCount = attachmentsTriangleCountTemp.Count;
@ -548,6 +564,12 @@ public class SkeletonRenderer : MonoBehaviour {
return true; return true;
} }
// Check flip state
for (int i = 0; i < attachmentCount; i++) {
if (attachmentsFlipStateCurrentMesh.Items[i] != attachmentsFlipStateTemp.Items[i])
return true;
}
// Check submeshes // Check submeshes
int submeshCount = addSubmeshArgumentsTemp.Count; int submeshCount = addSubmeshArgumentsTemp.Count;
if (addSubmeshArgumentsCurrentMesh.Count != submeshCount) if (addSubmeshArgumentsCurrentMesh.Count != submeshCount)
@ -562,7 +584,7 @@ public class SkeletonRenderer : MonoBehaviour {
} }
/** Stores vertices and triangles for a single material. */ /** Stores vertices and triangles for a single material. */
private void AddSubmesh (Material material, int startSlot, int endSlot, int triangleCount, int firstVertex, bool lastSubmesh) { private void AddSubmesh (Material material, int startSlot, int endSlot, int triangleCount, int firstVertex, bool lastSubmesh, ExposedList<bool> flipStates) {
int submeshIndex = submeshMaterials.Count; int submeshIndex = submeshMaterials.Count;
submeshMaterials.Add(material); submeshMaterials.Add(material);
@ -611,11 +633,7 @@ public class SkeletonRenderer : MonoBehaviour {
Attachment attachment = slot.attachment; Attachment attachment = slot.attachment;
Bone bone = slot.bone; Bone bone = slot.bone;
bool worldScaleXIsPositive = bone.worldScaleX >= 0f; bool flip = flipStates.Items[i];
bool worldScaleYIsPositive = bone.worldScaleY >= 0f;
bool worldScaleIsSameSigns = (worldScaleXIsPositive && worldScaleYIsPositive) ||
(!worldScaleXIsPositive && !worldScaleYIsPositive);
bool flip = frontFacing && ((bone.worldFlipX != bone.worldFlipY) != worldScaleIsSameSigns);
if (attachment is RegionAttachment) { if (attachment is RegionAttachment) {
if (!flip) { if (!flip) {
@ -686,11 +704,12 @@ public class SkeletonRenderer : MonoBehaviour {
#endif #endif
private class LastState { private class LastState {
public bool frontFacingMesh1;
public bool frontFacingMesh2;
public bool immutableTrianglesMesh1; public bool immutableTrianglesMesh1;
public bool immutableTrianglesMesh2; public bool immutableTrianglesMesh2;
public int vertexCount; public int vertexCount;
public readonly ExposedList<bool> attachmentsFlipStateTemp = new ExposedList<bool>();
public readonly ExposedList<bool> attachmentsFlipStateMesh1 = new ExposedList<bool>();
public readonly ExposedList<bool> attachmentsFlipStateMesh2 = new ExposedList<bool>();
public readonly ExposedList<int> attachmentsTriangleCountTemp = new ExposedList<int>(); public readonly ExposedList<int> attachmentsTriangleCountTemp = new ExposedList<int>();
public readonly ExposedList<int> attachmentsTriangleCountMesh1 = new ExposedList<int>(); public readonly ExposedList<int> attachmentsTriangleCountMesh1 = new ExposedList<int>();
public readonly ExposedList<int> attachmentsTriangleCountMesh2 = new ExposedList<int>(); public readonly ExposedList<int> attachmentsTriangleCountMesh2 = new ExposedList<int>();