Fixed submesh index recalculation. Fixed #82, Clear onDisable causing problems.

http://www.esotericsoftware.com/forum/viewtopic.php?f=7&t=1116
This commit is contained in:
NathanSweet 2013-08-16 13:30:54 +02:00
parent 085fb87f40
commit 8e393a8cd5
2 changed files with 60 additions and 48 deletions

View File

@ -46,6 +46,7 @@ public class SkeletonComponent : MonoBehaviour {
private Material[] sharedMaterials = new Material[0]; private Material[] sharedMaterials = new Material[0];
private List<Material> submeshMaterials = new List<Material>(); private List<Material> submeshMaterials = new List<Material>();
private List<int[]> submeshIndexes = new List<int[]>(); private List<int[]> submeshIndexes = new List<int[]>();
private List<int> submeshFirstVertex = new List<int>();
private Vector4[] tangents = new Vector4[0]; private Vector4[] tangents = new Vector4[0];
public virtual void Clear () { public virtual void Clear () {
@ -63,9 +64,6 @@ public class SkeletonComponent : MonoBehaviour {
mesh.hideFlags = HideFlags.HideAndDontSave; mesh.hideFlags = HideFlags.HideAndDontSave;
mesh.MarkDynamic(); mesh.MarkDynamic();
// BOZO
//renderer.sharedMaterial = skeletonDataAsset.atlasAsset.material;
vertices = new Vector3[0]; vertices = new Vector3[0];
skeleton = new Skeleton(skeletonDataAsset.GetSkeletonData(false)); skeleton = new Skeleton(skeletonDataAsset.GetSkeletonData(false));
@ -117,7 +115,7 @@ public class SkeletonComponent : MonoBehaviour {
quadCount++; quadCount++;
submeshQuadCount++; submeshQuadCount++;
} }
addSubmesh(lastMaterial, quadCount, submeshQuadCount, false); addSubmesh(lastMaterial, quadCount, submeshQuadCount, true);
// Set materials. // Set materials.
if (submeshMaterials.Count == sharedMaterials.Length) if (submeshMaterials.Count == sharedMaterials.Length)
@ -194,7 +192,8 @@ public class SkeletonComponent : MonoBehaviour {
if (calculateTangents) { if (calculateTangents) {
Vector4[] tangents = this.tangents; Vector4[] tangents = this.tangents;
int count = mesh.normals.Length; int count = mesh.normals.Length;
if (tangents.Length != count) this.tangents = tangents = new Vector4[count]; if (tangents.Length != count)
this.tangents = tangents = new Vector4[count];
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
tangents[i] = new Vector4(1, 0, 0, 1); tangents[i] = new Vector4(1, 0, 0, 1);
mesh.tangents = tangents; mesh.tangents = tangents;
@ -203,25 +202,37 @@ public class SkeletonComponent : MonoBehaviour {
} }
/** Adds a material. Adds submesh indexes if existing indexes aren't sufficient. */ /** Adds a material. Adds submesh indexes if existing indexes aren't sufficient. */
private void addSubmesh (Material material, int endQuadCount, int submeshQuadCount, bool exact) { private void addSubmesh (Material material, int endQuadCount, int submeshQuadCount, bool lastSubmesh) {
int submeshIndex = submeshMaterials.Count; int submeshIndex = submeshMaterials.Count;
submeshMaterials.Add(material); submeshMaterials.Add(material);
// Return if the existing submesh is big enough.
int indexCount = submeshQuadCount * 6; int indexCount = submeshQuadCount * 6;
if (submeshIndexes.Count > submeshIndex) {
if (exact) {
if (submeshIndexes[submeshIndex].Length == indexCount)
return;
} else {
if (submeshIndexes[submeshIndex].Length >= indexCount)
return;
}
} else
submeshIndexes.Add(null);
int vertexIndex = (endQuadCount - submeshQuadCount) * 4; int vertexIndex = (endQuadCount - submeshQuadCount) * 4;
int[] indexes = new int[indexCount];
int[] indexes;
if (submeshIndexes.Count > submeshIndex) {
indexes = submeshIndexes[submeshIndex];
// Don't reallocate if existing indexes are right size. Skip setting vertices if already set correctly.
if (!lastSubmesh) {
if (indexes.Length == indexCount) {
if (submeshFirstVertex[submeshIndex] == vertexIndex) return;
} else
submeshIndexes[submeshIndex] = indexes = new int[indexCount];
} else {
if (indexes.Length >= indexCount) { // Allow last submesh to have more indices than required.
if (submeshFirstVertex[submeshIndex] == vertexIndex) return;
indexCount = indexes.Length; // Update vertices to the end.
} else
submeshIndexes[submeshIndex] = indexes = new int[indexCount];
}
submeshFirstVertex[submeshIndex] = vertexIndex;
} else {
// Need new indexes.
indexes = new int[indexCount];
submeshIndexes.Add(indexes);
submeshFirstVertex.Add(vertexIndex);
}
for (int i = 0; i < indexCount; i += 6, vertexIndex += 4) { for (int i = 0; i < indexCount; i += 6, vertexIndex += 4) {
indexes[i] = vertexIndex; indexes[i] = vertexIndex;
indexes[i + 1] = vertexIndex + 2; indexes[i + 1] = vertexIndex + 2;
@ -230,25 +241,19 @@ public class SkeletonComponent : MonoBehaviour {
indexes[i + 4] = vertexIndex + 3; indexes[i + 4] = vertexIndex + 3;
indexes[i + 5] = vertexIndex + 1; indexes[i + 5] = vertexIndex + 1;
} }
submeshIndexes[submeshIndex] = indexes;
} }
public virtual void OnEnable () { public virtual void OnEnable () {
Update(); Update();
} }
#if UNITY_EDITOR
public virtual void OnDisable () {
Clear();
}
#endif
public virtual void Reset () { public virtual void Reset () {
Update(); Update();
} }
#if UNITY_EDITOR #if UNITY_EDITOR
void OnDrawGizmos() { void OnDrawGizmos() {
if (vertices == null) return;
Vector3 gizmosCenter = new Vector3(); Vector3 gizmosCenter = new Vector3();
Vector3 gizmosSize = new Vector3(); Vector3 gizmosSize = new Vector3();
Vector3 min = new Vector3(float.MaxValue, float.MaxValue, 0f); Vector3 min = new Vector3(float.MaxValue, float.MaxValue, 0f);

View File

@ -46,6 +46,7 @@ public class SkeletonComponent : MonoBehaviour {
private Material[] sharedMaterials = new Material[0]; private Material[] sharedMaterials = new Material[0];
private List<Material> submeshMaterials = new List<Material>(); private List<Material> submeshMaterials = new List<Material>();
private List<int[]> submeshIndexes = new List<int[]>(); private List<int[]> submeshIndexes = new List<int[]>();
private List<int> submeshFirstVertex = new List<int>();
private Vector4[] tangents = new Vector4[0]; private Vector4[] tangents = new Vector4[0];
public virtual void Clear () { public virtual void Clear () {
@ -118,7 +119,7 @@ public class SkeletonComponent : MonoBehaviour {
quadCount++; quadCount++;
submeshQuadCount++; submeshQuadCount++;
} }
addSubmesh(lastMaterial, quadCount, submeshQuadCount, false); addSubmesh(lastMaterial, quadCount, submeshQuadCount, true);
// Set materials. // Set materials.
if (submeshMaterials.Count == sharedMaterials.Length) if (submeshMaterials.Count == sharedMaterials.Length)
@ -204,25 +205,37 @@ public class SkeletonComponent : MonoBehaviour {
} }
/** Adds a material. Adds submesh indexes if existing indexes aren't sufficient. */ /** Adds a material. Adds submesh indexes if existing indexes aren't sufficient. */
private void addSubmesh (Material material, int endQuadCount, int submeshQuadCount, bool exact) { private void addSubmesh (Material material, int endQuadCount, int submeshQuadCount, bool lastSubmesh) {
int submeshIndex = submeshMaterials.Count; int submeshIndex = submeshMaterials.Count;
submeshMaterials.Add(material); submeshMaterials.Add(material);
// Return if the existing submesh is big enough.
int indexCount = submeshQuadCount * 6; int indexCount = submeshQuadCount * 6;
if (submeshIndexes.Count > submeshIndex) {
if (exact) {
if (submeshIndexes[submeshIndex].Length == indexCount)
return;
} else {
if (submeshIndexes[submeshIndex].Length >= indexCount)
return;
}
} else
submeshIndexes.Add(null);
int vertexIndex = (endQuadCount - submeshQuadCount) * 4; int vertexIndex = (endQuadCount - submeshQuadCount) * 4;
int[] indexes = new int[indexCount];
int[] indexes;
if (submeshIndexes.Count > submeshIndex) {
indexes = submeshIndexes[submeshIndex];
// Don't reallocate if existing indexes are right size. Skip setting vertices if already set correctly.
if (!lastSubmesh) {
if (indexes.Length == indexCount) {
if (submeshFirstVertex[submeshIndex] == vertexIndex) return;
} else
submeshIndexes[submeshIndex] = indexes = new int[indexCount];
} else {
if (indexes.Length >= indexCount) { // Allow last submesh to have more indices than required.
if (submeshFirstVertex[submeshIndex] == vertexIndex) return;
indexCount = indexes.Length; // Update vertices to the end.
} else
submeshIndexes[submeshIndex] = indexes = new int[indexCount];
}
submeshFirstVertex[submeshIndex] = vertexIndex;
} else {
// Need new indexes.
indexes = new int[indexCount];
submeshIndexes.Add(indexes);
submeshFirstVertex.Add(vertexIndex);
}
for (int i = 0; i < indexCount; i += 6, vertexIndex += 4) { for (int i = 0; i < indexCount; i += 6, vertexIndex += 4) {
indexes[i] = vertexIndex; indexes[i] = vertexIndex;
indexes[i + 1] = vertexIndex + 2; indexes[i + 1] = vertexIndex + 2;
@ -231,25 +244,19 @@ public class SkeletonComponent : MonoBehaviour {
indexes[i + 4] = vertexIndex + 3; indexes[i + 4] = vertexIndex + 3;
indexes[i + 5] = vertexIndex + 1; indexes[i + 5] = vertexIndex + 1;
} }
submeshIndexes[submeshIndex] = indexes;
} }
public virtual void OnEnable () { public virtual void OnEnable () {
Update(); Update();
} }
#if UNITY_EDITOR
public virtual void OnDisable () {
Clear();
}
#endif
public virtual void Reset () { public virtual void Reset () {
Update(); Update();
} }
#if UNITY_EDITOR #if UNITY_EDITOR
void OnDrawGizmos() { void OnDrawGizmos() {
if (vertices == null) return;
Vector3 gizmosCenter = new Vector3(); Vector3 gizmosCenter = new Vector3();
Vector3 gizmosSize = new Vector3(); Vector3 gizmosSize = new Vector3();
Vector3 min = new Vector3(float.MaxValue, float.MaxValue, 0f); Vector3 min = new Vector3(float.MaxValue, float.MaxValue, 0f);