예제 #1
0
        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);
                }
            }
        }
예제 #2
0
        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));
        }