public ListMeshDraw ListSplit(float Priority) { if (null == MeshDataTop) { return(null); } InformationMeshData DataNext = MeshDataTop; InformationMeshData DataPrevious = null; int CountNow = 0; while (null != DataNext) { if (DataNext.Priority > Priority) { ListMeshDraw ListNew = new ListMeshDraw(); ListNew.MaterialNo = MaterialNo; ListNew.Count = Count - CountNow; ListNew.MeshDataTop = DataNext; ListNew.PriorityMinimum = DataNext.Priority; Count -= ListNew.Count; if (null == DataPrevious) { PriorityMinimum = -10000.0f; PriorityMaximum = -10000.0f; MeshDataTop = null; } else { DataPrevious.ChainNext = null; ListNew.PriorityMaximum = PriorityMaximum; PriorityMaximum = DataPrevious.Priority; } return(ListNew); } CountNow++; DataPrevious = DataNext; DataNext = DataNext.ChainNext; } return(null); }
public void ListMerge(ListMeshDraw ListNext) { if (0 == ListNext.Count) { return; } if (0 == Count) { MeshDataTop = ListNext.MeshDataTop; PriorityMinimum = ListNext.PriorityMinimum; PriorityMaximum = ListNext.PriorityMaximum; Count = ListNext.Count; return; } InformationMeshData DataLast = MeshDataTop; while (null != DataLast.ChainNext) { DataLast = DataLast.ChainNext; } DataLast.ChainNext = ListNext.MeshDataTop; PriorityMaximum = ListNext.PriorityMaximum; Count += ListNext.Count; }
public void ListMerge(ListMeshDraw ListNext) { if(0 == ListNext.Count) { return; } if(0 == Count) { MeshDataTop = ListNext.MeshDataTop; PriorityMinimum = ListNext.PriorityMinimum; PriorityMaximum = ListNext.PriorityMaximum; Count = ListNext.Count; return; } InformationMeshData DataLast = MeshDataTop; while(null != DataLast.ChainNext) { DataLast = DataLast.ChainNext; } DataLast.ChainNext = ListNext.MeshDataTop; PriorityMaximum = ListNext.PriorityMaximum; Count += ListNext.Count; }
/* ******************************************************** */ //! Add Mesh to Draw-Manager /*! @param TextureNo Serial-number of using texture @param Operation Color-Blend Operation for the target @param DataMeshInformation Mesh Information @retval Return-Value (None) Don't use this function. <br> (This function is for the animation-parts' scripts.) */ public void MeshAdd(int TextureNo, Library_SpriteStudio.KindColorOperation Operation, InformationMeshData DataMeshInformation) { if(0 > TextureNo) { return; } if(null == TableListMesh) { TableListMesh = new ArrayList(); TableListMesh.Clear(); } int MaterialNo = TextureNo * ((int)Library_SpriteStudio.KindColorOperation.TERMINATOR - 1) + ((int)Operation - 1); int CountList = TableListMesh.Count; int ListNo = -1; ListMeshDraw ListMesh = null; if(0 == TableListMesh.Count) { goto MeshAdd_NewListAdd; } else { ListNo = 0; ListMesh = TableListMesh[0] as ListMeshDraw; for(int i=1; i<CountList; i++) { ListMesh = TableListMesh[i] as ListMeshDraw; if(DataMeshInformation.Priority < ListMesh.PriorityMinimum) { ListNo = i - 1; break; } ListMesh = null; } if(null == ListMesh) { /* Highest-Priority */ ListNo = CountList - 1; ListMesh = TableListMesh[ListNo] as ListMeshDraw; if(ListMesh.MaterialNo != MaterialNo) { if(DataMeshInformation.Priority < ListMesh.PriorityMaximum) { goto MeshAdd_NewListInsertSplit; } else { goto MeshAdd_NewListAdd; } } } else { ListMesh = TableListMesh[ListNo] as ListMeshDraw; if(ListMesh.MaterialNo != MaterialNo) { if(DataMeshInformation.Priority < ListMesh.PriorityMaximum) { goto MeshAdd_NewListInsertSplit; } else { ListNo++; if(CountList <= ListNo) { goto MeshAdd_NewListAdd; } else { ListMeshDraw ListMeshNext = TableListMesh[ListNo] as ListMeshDraw; if(ListMeshNext.MaterialNo != MaterialNo) { ListNo--; goto MeshAdd_NewListInsert; } else { ListMesh = ListMeshNext; } } } } } ListMesh.MeshAdd(ref DataMeshInformation); } return; MeshAdd_NewListAdd: ListMesh = new ListMeshDraw(); ListMesh.MaterialNo = MaterialNo; TableListMesh.Add(ListMesh); ListMesh.MeshAdd(ref DataMeshInformation); return; MeshAdd_NewListInsert: ListMesh = new ListMeshDraw(); ListMesh.MaterialNo = MaterialNo; TableListMesh.Insert(ListNo + 1, ListMesh); ListMesh.MeshAdd(ref DataMeshInformation); return; MeshAdd_NewListInsertSplit: { ListMeshDraw ListMeshSplit = ListMesh.ListSplit(DataMeshInformation.Priority); int ListNoNext = ListNo + 1; if(CountList <= ListNoNext) { TableListMesh.Add(ListMeshSplit); } else { TableListMesh.Insert(ListNoNext, ListMeshSplit); } int CountOld = ListMesh.Count; ListMesh = new ListMeshDraw(); ListMesh.MaterialNo = MaterialNo; TableListMesh.Insert(ListNoNext, ListMesh); if(0 >= CountOld) { TableListMesh.RemoveAt(ListNo); } } ListMesh.MeshAdd(ref DataMeshInformation); return; }
public ListMeshDraw ListSplit(float Priority) { if(null == MeshDataTop) { return(null); } InformationMeshData DataNext = MeshDataTop; InformationMeshData DataPrevious = null; int CountNow = 0; while(null != DataNext) { if(DataNext.Priority > Priority) { ListMeshDraw ListNew = new ListMeshDraw(); ListNew.MaterialNo = MaterialNo; ListNew.Count = Count - CountNow; ListNew.MeshDataTop = DataNext; ListNew.PriorityMinimum = DataNext.Priority; Count -= ListNew.Count; if(null == DataPrevious) { PriorityMinimum = -10000.0f; PriorityMaximum = -10000.0f; MeshDataTop = null; } else { DataPrevious.ChainNext = null; ListNew.PriorityMaximum = PriorityMaximum; PriorityMaximum = DataPrevious.Priority; } return(ListNew); } CountNow++; DataPrevious = DataNext; DataNext = DataNext.ChainNext; } return(null); }
protected void AppendExecLateUpdate() { /* Execute Simplified-SpriteDrawManager */ int Count = 0; MeshFilter InstanceMeshFilter = GetComponent <MeshFilter>(); MeshRenderer InstanceMeshRenderer = GetComponent <MeshRenderer>(); if (null != TableListMesh) { ListMeshDraw ListMesh = null; Count = TableListMesh.Count; int CountMesh = 0; Material[] MaterialTable = new Material[Count]; int ValueRenderQueue = ValueKindDrawQueue[(int)KindRenderQueueBase]; int MaterialRenderQueue = 0; if (null == InstanceCameraDraw) { /* Camera is lost ? */ CameraGetRendering(); } int ZOffset = 0; if (null != InstanceCameraDraw) { Vector3 PositionViewPort = (null != InstanceCameraDraw) ? InstanceCameraDraw.WorldToViewportPoint(transform.position) : Vector3.zero; float RateLinerZ = 1.0f - ((PositionViewPort.z - InstanceCameraDraw.nearClipPlane) / (InstanceCameraDraw.farClipPlane - InstanceCameraDraw.nearClipPlane)); ZOffset = ((0.0f > RateLinerZ) || (1.0f < RateLinerZ)) ? -1 : (int)(RateLinerZ * RateDrawQueueEffectZ); } if (-1 == ZOffset) { /* out of sight (Clipping) */ InstanceMeshRenderer.enabled = false; } else { /* in sight */ InstanceMeshRenderer.enabled = true; for (int i = 0; i < Count; i++) { ListMesh = TableListMesh[i] as ListMeshDraw; CountMesh += ListMesh.Count; MaterialTable[i] = new Material(TableMaterial[ListMesh.MaterialNo]); MaterialRenderQueue = (-1 == ValueRenderQueue) ? MaterialTable[i].shader.renderQueue : ValueRenderQueue; MaterialRenderQueue += (OffsetDrawQueue + ZOffset + i); MaterialTable[i].renderQueue = MaterialRenderQueue; } Material[] TableMaterialOld = InstanceMeshRenderer.sharedMaterials; InstanceMeshRenderer.sharedMaterials = MaterialTable; for (int i = 0; i < TableMaterialOld.Length; i++) { Object.DestroyImmediate(TableMaterialOld[i]); } int IndexVertexNow = 0; int IndexTriangleNow = 0; int[] IndexVertex = new int[Count]; int[] IndexTriangle = new int[Count + 1]; CombineInstance[] CombineMesh = new CombineInstance[CountMesh]; InformationMeshData DataMeshInformation = null; CountMesh = 0; for (int i = 0; i < Count; i++) { ListMesh = TableListMesh[i] as ListMeshDraw; IndexVertex[i] = IndexVertexNow; IndexTriangle[i] = IndexTriangleNow; DataMeshInformation = ListMesh.MeshDataTop; Matrix4x4 MatrixCorrect = transform.localToWorldMatrix.inverse; while (null != DataMeshInformation) { CombineMesh[CountMesh].mesh = DataMeshInformation.DataMesh; CombineMesh[CountMesh].transform = MatrixCorrect * DataMeshInformation.DataTransform.localToWorldMatrix; CountMesh++; IndexVertexNow += DataMeshInformation.DataMesh.vertexCount; IndexTriangleNow += DataMeshInformation.DataMesh.triangles.Length / 3; DataMeshInformation = DataMeshInformation.ChainNext; } } IndexTriangle[Count] = IndexTriangleNow; Mesh MeshNew = new Mesh(); MeshNew.CombineMeshes(CombineMesh); int[] TriangleBuffer = MeshNew.triangles; int[] VertexNoTriangle = null; MeshNew.triangles = null; MeshNew.subMeshCount = Count; for (int i = 0; i < Count; i++) { CountMesh = IndexTriangle[i + 1] - IndexTriangle[i]; VertexNoTriangle = new int[CountMesh * 3]; for (int j = 0; j < CountMesh; j++) { IndexTriangleNow = (j + IndexTriangle[i]) * 3; IndexVertexNow = j * 3; VertexNoTriangle[IndexVertexNow] = TriangleBuffer[IndexTriangleNow]; VertexNoTriangle[IndexVertexNow + 1] = TriangleBuffer[IndexTriangleNow + 1]; VertexNoTriangle[IndexVertexNow + 2] = TriangleBuffer[IndexTriangleNow + 2]; } MeshNew.SetTriangles(VertexNoTriangle, i); } if (null != InstanceMeshFilter.sharedMesh) { InstanceMeshFilter.sharedMesh.Clear(); Object.DestroyImmediate(InstanceMeshFilter.sharedMesh); } InstanceMeshFilter.sharedMesh = MeshNew; } TableListMesh.Clear(); } /* Excute "UserData CallBack" */ if ((null != ListCallBackUserData) && (null != functionUserData)) { Count = ListCallBackUserData.Count; ParameterCallBackUserData Parameter = null; for (int i = 0; i < Count; i++) { Parameter = ListCallBackUserData[i] as ParameterCallBackUserData; functionUserData(transform.parent.gameObject, Parameter.PartsName, Parameter.AnimationDataParts, AnimationNo, frameNoNow, Parameter.FrameNo, Parameter.Data ); } ListCallBackUserData.Clear(); } /* Excute "Play-End CallBack" */ if (0 != (Status & BitStatus.REQUEST_PLAYEND)) { Status = BitStatus.CLEAR; if (null != functionPlayEnd) { if (false == (functionPlayEnd(transform.parent.gameObject))) { InstanceMeshFilter.sharedMesh.Clear(); Object.DestroyImmediate(InstanceMeshFilter.sharedMesh); InstanceMeshFilter.sharedMesh = null; Destroy(transform.parent.gameObject); } } } }
/* ******************************************************** */ //! Add Mesh to Draw-Manager /*! * @param TextureNo * Serial-number of using texture * @param Operation * Color-Blend Operation for the target * @param DataMeshInformation * Mesh Information * @retval Return-Value * (None) * * Don't use this function. <br> * (This function is for the animation-parts' scripts.) */ public void MeshAdd(int TextureNo, Library_SpriteStudio.KindColorOperation Operation, InformationMeshData DataMeshInformation) { if (0 > TextureNo) { return; } if (null == TableListMesh) { TableListMesh = new ArrayList(); TableListMesh.Clear(); } int MaterialNo = TextureNo * ((int)Library_SpriteStudio.KindColorOperation.TERMINATOR - 1) + ((int)Operation - 1); int CountList = TableListMesh.Count; int ListNo = -1; ListMeshDraw ListMesh = null; if (0 == TableListMesh.Count) { goto MeshAdd_NewListAdd; } else { ListNo = 0; ListMesh = TableListMesh[0] as ListMeshDraw; for (int i = 1; i < CountList; i++) { ListMesh = TableListMesh[i] as ListMeshDraw; if (DataMeshInformation.Priority < ListMesh.PriorityMinimum) { ListNo = i - 1; break; } ListMesh = null; } if (null == ListMesh) { /* Highest-Priority */ ListNo = CountList - 1; ListMesh = TableListMesh[ListNo] as ListMeshDraw; if (ListMesh.MaterialNo != MaterialNo) { if (DataMeshInformation.Priority < ListMesh.PriorityMaximum) { goto MeshAdd_NewListInsertSplit; } else { goto MeshAdd_NewListAdd; } } } else { ListMesh = TableListMesh[ListNo] as ListMeshDraw; if (ListMesh.MaterialNo != MaterialNo) { if (DataMeshInformation.Priority < ListMesh.PriorityMaximum) { goto MeshAdd_NewListInsertSplit; } else { ListNo++; if (CountList <= ListNo) { goto MeshAdd_NewListAdd; } else { ListMeshDraw ListMeshNext = TableListMesh[ListNo] as ListMeshDraw; if (ListMeshNext.MaterialNo != MaterialNo) { ListNo--; goto MeshAdd_NewListInsert; } else { ListMesh = ListMeshNext; } } } } } ListMesh.MeshAdd(ref DataMeshInformation); } return; MeshAdd_NewListAdd: ListMesh = new ListMeshDraw(); ListMesh.MaterialNo = MaterialNo; TableListMesh.Add(ListMesh); ListMesh.MeshAdd(ref DataMeshInformation); return; MeshAdd_NewListInsert: ListMesh = new ListMeshDraw(); ListMesh.MaterialNo = MaterialNo; TableListMesh.Insert(ListNo + 1, ListMesh); ListMesh.MeshAdd(ref DataMeshInformation); return; MeshAdd_NewListInsertSplit: { ListMeshDraw ListMeshSplit = ListMesh.ListSplit(DataMeshInformation.Priority); int ListNoNext = ListNo + 1; if (CountList <= ListNoNext) { TableListMesh.Add(ListMeshSplit); } else { TableListMesh.Insert(ListNoNext, ListMeshSplit); } int CountOld = ListMesh.Count; ListMesh = new ListMeshDraw(); ListMesh.MaterialNo = MaterialNo; TableListMesh.Insert(ListNoNext, ListMesh); if (0 >= CountOld) { TableListMesh.RemoveAt(ListNo); } } ListMesh.MeshAdd(ref DataMeshInformation); return; }