123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 |
- //----------------------------------------------
- // 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 || _owner.UseWithSRP){
- if (_meshFilter == null || _meshFilter.gameObject == null) {
- return null;
- }
- return _meshFilter.sharedMesh;
- }
- else{
- return _mesh2d;
- }
- }
- }
- 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 || _owner.UseWithSRP){
- if (_meshFilter != null) {
- GameObject.Destroy(_meshFilter.gameObject);
- }
- }
- else{
- Mesh.DestroyImmediate(_mesh2d);
- }
- }
- public VertexPool(Material material, XWeaponTrail owner)
- {
- VertexTotal = VertexUsed = 0;
- VertCountChanged = false;
- _owner = owner;
- if (owner.UseWith2D || owner.UseWithSRP) {
- 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 (MyMesh == null){
- return;
- }
- 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 || _owner.UseWithSRP) {
- }
- else {
- Matrix4x4 matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, Vector3.one);
- for (int i = 0; i < _material.passCount; i++) {
- _material.SetPass(i);
- }
- if (!_owner.UseWithSRP){
- Graphics.DrawMeshNow(MyMesh, matrix);
- }
- else{
- Graphics.DrawMesh(MyMesh, Matrix4x4.identity, _material, _owner.gameObject.layer, null, 0, null, false, false);
- }
- }
- }
- }
- }
|