public MyDecalsForVoxelsTriangleBuffer GetTrianglesBuffer(MyRenderVoxelCell voxelMap, MyDecalTexturesEnum decalTexture) { MyDecalsForVoxelsDictionaryKey key = new MyDecalsForVoxelsDictionaryKey(voxelMap.ID, decalTexture); MyDecalsForVoxelsTriangleBuffer outValue; if (m_triangleBuffersByKey.TryGetValue(key, out outValue) == true) { // Combination of cell/texture was found in dictionary, so we can return in right now return(outValue); } else { if (m_triangleBuffersByKey.Count >= m_capacity) { // We are full, can't place decal on a new cell/texture. Need to wait for next CheckBufferFull. return(null); } else { // This is first time we want to place decal to this cell/texture, so here we allocate and initialize buffer MyDecalsForVoxelsTriangleBuffer newBuffer = m_freeTriangleBuffers.Pop(); m_triangleBuffersByKey.Add(key, newBuffer); m_usedTriangleBuffers.Enqueue(newBuffer); newBuffer.Start(voxelMap, decalTexture); return(newBuffer); } } }
public MyDecalsForVoxels(int capacity) { m_status = MyDecalForVoxelsState.READY; m_capacity = capacity; m_fadingOutStartLimit = (int)(m_capacity * MyDecalsConstants.TEXTURE_LARGE_FADING_OUT_START_LIMIT_PERCENT); m_fadingOutBuffersCount = (int)(m_capacity * MyDecalsConstants.TEXTURE_LARGE_FADING_OUT_MINIMAL_TRIANGLE_COUNT_PERCENT); m_sortTriangleBuffersByTexture = new List <MyDecalsForVoxelsTriangleBuffer>(m_capacity); m_triangleBuffersByKey = new Dictionary <MyDecalsForVoxelsDictionaryKey, MyDecalsForVoxelsTriangleBuffer>(m_capacity); m_freeTriangleBuffers = new Stack <MyDecalsForVoxelsTriangleBuffer>(m_capacity); m_usedTriangleBuffers = new Queue <MyDecalsForVoxelsTriangleBuffer>(m_capacity); m_triangleBuffers = new MyDecalsForVoxelsTriangleBuffer[m_capacity]; for (int i = 0; i < m_capacity; i++) { m_triangleBuffers[i] = new MyDecalsForVoxelsTriangleBuffer(MyDecalsConstants.MAX_DECAL_TRIANGLES_IN_BUFFER); m_freeTriangleBuffers.Push(m_triangleBuffers[i]); } }
// For sorting buffers by texture public int CompareTo(object compareToObject) { MyDecalsForVoxelsTriangleBuffer compareToBuffer = (MyDecalsForVoxelsTriangleBuffer)compareToObject; return(((int)compareToBuffer.DecalTexture).CompareTo((int)this.DecalTexture)); }