public void AddRenderer(BatchRenderer _batchRenderer, int _stablePeriod = -1) { BatchRenderer u = _batchRenderer; _Batch batch; List <_Batch> batchList; if (m_materialTable.TryGetValue(u.m_meshRenderer.sharedMaterial.name, out batchList)) { int i = batchList.Count - 1; while (i >= 0) { batch = batchList[i]; if (batch.VertexCount + _batchRenderer.m_meshFilter.sharedMesh.vertexCount < ushort.MaxValue && batch.UnitCount() < short.MaxValue) { batch.AddUnit(u); break; } --i; } if (i < 0) // all full, need a new batch { batch = new _Batch(this, _stablePeriod); batch.AddUnit(_batchRenderer); batchList.Add(batch); } } else { batch = new _Batch(this, _stablePeriod); batch.AddUnit(u); batchList = new List <_Batch>(); batchList.Add(batch); m_materialTable.Add(u.m_meshRenderer.sharedMaterial.name, batchList); } }
public void RemoveRenderer(BatchRenderer _batchRenderer) { List <string> toBeRemoved = new List <string>(); foreach (var pair in m_materialTable) { List <_Batch> batchList = pair.Value; for (int i = 0; i < batchList.Count; i++) { _Batch batch = batchList[i]; if (batch != null) { if (batch.RemoveUnit(_batchRenderer)) { if (batch.UnitCount() == 0) { batch.Destroy(); batchList.RemoveAt(i); } } } else { batchList.RemoveAt(i); } } if (pair.Value.Count == 0) { toBeRemoved.Add(pair.Key); } } foreach (string name in toBeRemoved) { m_materialTable.Remove(name); } }
public _State_Stable(_Batch _batch) { m_batch = _batch; }