mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-26 22:49:01 +08:00
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:
parent
085fb87f40
commit
8e393a8cd5
@ -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);
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user