summaryrefslogtreecommitdiff
path: root/Assets/ThirdParty/XWeaponTrail/Scripts/VertexPool.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/ThirdParty/XWeaponTrail/Scripts/VertexPool.cs')
-rw-r--r--Assets/ThirdParty/XWeaponTrail/Scripts/VertexPool.cs282
1 files changed, 282 insertions, 0 deletions
diff --git a/Assets/ThirdParty/XWeaponTrail/Scripts/VertexPool.cs b/Assets/ThirdParty/XWeaponTrail/Scripts/VertexPool.cs
new file mode 100644
index 00000000..31d98d08
--- /dev/null
+++ b/Assets/ThirdParty/XWeaponTrail/Scripts/VertexPool.cs
@@ -0,0 +1,282 @@
+//----------------------------------------------
+// Xffect Editor
+// Copyright © 2012- Shallway Studio
+// http://shallway.net
+//----------------------------------------------
+using UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace XftWeapon {
+
+ public class VertexPool
+ {
+ public class VertexSegment
+ {
+ public int VertStart;
+ public int IndexStart;
+ public int VertCount;
+ public int IndexCount;
+ public VertexPool Pool;
+
+ public VertexSegment(int start, int count, int istart, int icount, VertexPool pool)
+ {
+ VertStart = start;
+ VertCount = count;
+ IndexCount = icount;
+ IndexStart = istart;
+ Pool = pool;
+ }
+
+
+ public void ClearIndices()
+ {
+ for (int i = IndexStart; i < IndexStart + IndexCount; i++)
+ {
+ Pool.Indices[i] = 0;
+ }
+
+ Pool.IndiceChanged = true;
+ }
+
+ }
+
+ public Vector3[] Vertices;
+ public int[] Indices;
+ public Vector2[] UVs;
+ public Color[] Colors;
+
+ public bool IndiceChanged;
+ public bool ColorChanged;
+ public bool UVChanged;
+ public bool VertChanged;
+ public bool UV2Changed;
+
+
+
+
+
+ protected int VertexTotal;
+ protected int VertexUsed;
+ protected int IndexTotal = 0;
+ protected int IndexUsed = 0;
+ public bool FirstUpdate = true;
+
+ protected bool VertCountChanged;
+
+
+ public const int BlockSize = 108;
+
+ public float BoundsScheduleTime = 1f;
+ public float ElapsedTime = 0f;
+
+ protected XWeaponTrail _owner;
+
+ protected MeshFilter _meshFilter;
+
+ protected Mesh _mesh2d;
+ protected Material _material;
+
+ public Mesh MyMesh {
+ get {
+
+ if (!_owner.UseWith2D) {
+ return _mesh2d;
+ }
+ else {
+ if (_meshFilter == null || _meshFilter.gameObject == null) {
+ return null;
+ }
+ return _meshFilter.sharedMesh;
+ }
+ }
+ }
+
+ public void RecalculateBounds()
+ {
+ MyMesh.RecalculateBounds();
+ }
+
+
+ public void SetMeshObjectActive(bool flag) {
+ if (_meshFilter == null) {
+ return;
+ }
+
+ _meshFilter.gameObject.SetActive(flag);
+ }
+
+ void CreateMeshObj(XWeaponTrail owner, Material material) {
+ GameObject obj = new GameObject("_XWeaponTrailMesh:" + "|material:" + material.name);
+ obj.layer = owner.gameObject.layer;
+ obj.AddComponent<MeshFilter>();
+ obj.AddComponent<MeshRenderer>();
+
+ obj.transform.position = Vector3.zero;
+ obj.transform.rotation = Quaternion.identity;
+
+
+ MeshRenderer Meshrenderer;
+ _meshFilter = (MeshFilter)obj.GetComponent(typeof(MeshFilter));
+ Meshrenderer = (MeshRenderer)obj.GetComponent(typeof(MeshRenderer));
+#if UNITY_4_5 || UNITY_4_6 || UNITY_4_7 || UNITY_4_8
+ Meshrenderer.castShadows = false;
+#else
+ Meshrenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
+#endif
+ Meshrenderer.receiveShadows = false;
+ Meshrenderer.GetComponent<Renderer>().sharedMaterial = material;
+ Meshrenderer.sortingLayerName = _owner.SortingLayerName;
+ Meshrenderer.sortingOrder = _owner.SortingOrder;
+ _meshFilter.sharedMesh = new Mesh();
+ }
+
+ public void Destroy() {
+
+ if (!_owner.UseWith2D) {
+ Mesh.DestroyImmediate(_mesh2d);
+ }
+ else {
+ if (_meshFilter != null) {
+ GameObject.Destroy(_meshFilter.gameObject);
+ }
+ }
+ }
+
+ public VertexPool(Material material, XWeaponTrail owner)
+ {
+ VertexTotal = VertexUsed = 0;
+ VertCountChanged = false;
+ _owner = owner;
+ if (owner.UseWith2D) {
+ CreateMeshObj(owner, material);
+ }
+ else {
+ _mesh2d = new Mesh();
+ }
+ _material = material;
+ InitArrays();
+ IndiceChanged = ColorChanged = UVChanged = UV2Changed = VertChanged = true;
+ }
+
+
+ public VertexSegment GetVertices(int vcount, int icount)
+ {
+ int vertNeed = 0;
+ int indexNeed = 0;
+ if (VertexUsed + vcount >= VertexTotal)
+ {
+ vertNeed = (vcount / BlockSize + 1) * BlockSize;
+ }
+ if (IndexUsed + icount >= IndexTotal)
+ {
+ indexNeed = (icount / BlockSize + 1) * BlockSize;
+ }
+ VertexUsed += vcount;
+ IndexUsed += icount;
+ if (vertNeed != 0 || indexNeed != 0)
+ {
+ EnlargeArrays(vertNeed, indexNeed);
+ VertexTotal += vertNeed;
+ IndexTotal += indexNeed;
+ }
+
+ VertexSegment ret = new VertexSegment(VertexUsed - vcount, vcount, IndexUsed - icount, icount, this);
+
+ return ret;
+ }
+
+
+ protected void InitArrays()
+ {
+ Vertices = new Vector3[4];
+ UVs = new Vector2[4];
+ Colors = new Color[4];
+ Indices = new int[6];
+ VertexTotal = 4;
+ IndexTotal = 6;
+ }
+
+
+
+ public void EnlargeArrays(int count, int icount)
+ {
+ Vector3[] tempVerts = Vertices;
+ Vertices = new Vector3[Vertices.Length + count];
+ tempVerts.CopyTo(Vertices, 0);
+
+ Vector2[] tempUVs = UVs;
+ UVs = new Vector2[UVs.Length + count];
+ tempUVs.CopyTo(UVs, 0);
+
+ Color[] tempColors = Colors;
+ Colors = new Color[Colors.Length + count];
+ tempColors.CopyTo(Colors, 0);
+
+ int[] tempTris = Indices;
+ Indices = new int[Indices.Length + icount];
+ tempTris.CopyTo(Indices, 0);
+
+ VertCountChanged = true;
+ IndiceChanged = true;
+ ColorChanged = true;
+ UVChanged = true;
+ VertChanged = true;
+ UV2Changed = true;
+ }
+
+
+
+
+ public void LateUpdate()
+ {
+ if (VertCountChanged)
+ {
+ MyMesh.Clear();
+ }
+
+ // we assume the vertices are always changed.
+ MyMesh.vertices = Vertices;
+ if (UVChanged)
+ {
+ MyMesh.uv = UVs;
+ }
+
+ if (ColorChanged)
+ {
+ MyMesh.colors = Colors;
+ }
+
+ if (IndiceChanged)
+ {
+ MyMesh.triangles = Indices;
+ }
+
+ ElapsedTime += Time.deltaTime;
+ if (ElapsedTime > BoundsScheduleTime || FirstUpdate)
+ {
+ RecalculateBounds();
+ ElapsedTime = 0f;
+ }
+
+ if (ElapsedTime > BoundsScheduleTime)
+ FirstUpdate = false;
+
+ VertCountChanged = false;
+ IndiceChanged = false;
+ ColorChanged = false;
+ UVChanged = false;
+ UV2Changed = false;
+ VertChanged = false;
+
+
+ if (_owner.UseWith2D) {
+
+ }
+ else {
+ //Matrix4x4 matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, Vector3.one);
+ Graphics.DrawMesh(MyMesh, Matrix4x4.identity, _material, _owner.gameObject.layer, null, 0, null, false, false);
+ }
+ }
+ }
+} \ No newline at end of file