using System; using System.Collections; using System.Collections.Generic; using UnityEngine; [Serializable] public class PolyVector { public float vectorScale = 1f; public Mesh meshJoint, meshVector; public Material matVector; List j4 = new List(); List v4 = new List(); int length; public void AddVectors(List vectors) { // vectors.Add(Vector3.zero); // break at end length = 0; for (int i = 0; i < vectors.Count; i++) { if (vectors[i] == Vector3.zero) { length = 0; } else { Matrix4x4 newJoint = new Matrix4x4(); newJoint.SetTRS(vectors[i], Quaternion.identity, Vector3.one * vectorScale ); j4.Add(newJoint); if (length > 0 && vectors[i] != vectors[i - 1]) // *-*-* { Matrix4x4 m4 = new Matrix4x4(); m4.SetTRS(vectors[i - 1], Quaternion.LookRotation(vectors[i] - vectors[i - 1]), new Vector3(vectorScale, vectorScale, Vector3.Distance(vectors[i - 1], vectors[i])) ); v4.Add(m4); } length++; } } } public void Frame() { // trim before render // v4.RemoveRange(vCount - 1, v4.Count - vCount); Graphics.DrawMeshInstanced(meshJoint, 0, matVector, j4); j4.Clear(); Graphics.DrawMeshInstanced(meshVector, 0, matVector, v4); v4.Clear(); } public Mesh ToMesh(List vectors) { List js = new List(); List vs = new List(); length = 0; for (int i = 0; i < vectors.Count; i++) { if (vectors[i] == Vector3.zero) { length = 0; } else { Matrix4x4 newJoint = new Matrix4x4(); newJoint.SetTRS(vectors[i], Quaternion.identity, Vector3.one * vectorScale ); js.Add(newJoint); if (length > 0 && vectors[i] != vectors[i - 1]) // *-*-* { Matrix4x4 newVector = new Matrix4x4(); newVector.SetTRS(vectors[i - 1], Quaternion.LookRotation(vectors[i] - vectors[i - 1]), new Vector3(vectorScale, vectorScale, Vector3.Distance(vectors[i - 1], vectors[i])) ); vs.Add(newVector); } length++; } } CombineInstance[] combI = new CombineInstance[js.Count + vs.Count]; for (int i = 0; i < js.Count; i++) { combI[i].mesh = meshJoint; combI[i].transform = js[i]; } Debug.Log(vs.Count); for (int i = 0; i < vs.Count; i++) { combI[js.Count + i].mesh = meshVector; combI[js.Count + i].transform = vs[i]; } Mesh mesh = new Mesh(); mesh.CombineMeshes(combI, true, true); return mesh; } }