public ModelInstanceHandle AllocateInstance(uint materialIndex, uint modelIndex, uint sceneLayerIndex, Transform initialTransform)
        {
            using (RenderingModule.RenderStateBarrier.AcquirePermit(withLock: instanceMutationLock)) {
                MIDArray           midArray = materialMap.GetOrCreate(materialIndex, createNewMIDArrayAct);
                ModelInstanceData *data     = midArray.Data;
                for (uint i = midArray.Length - 1U; i < midArray.Length; --i)
                {
                    if (!data[i].InUse)
                    {
                        data[i] = new ModelInstanceData(modelIndex, sceneLayerIndex, initialTransform);
                        return(new ModelInstanceHandle(this, materialIndex, i));
                    }
                }

                // MIDArray is full, so resize...
                uint newSize     = midArray.Length << 1;
                uint numBytes    = (uint)sizeof(ModelInstanceData) * newSize;
                uint oldNumBytes = (uint)sizeof(ModelInstanceData) * midArray.Length;
                if (midArray.Length >= MAX_SIZE_BEFORE_LINEAR_GROWTH)
                {
                    newSize = midArray.Length + LINEAR_GROWTH_AMOUNT;
                }
                ModelInstanceData *newData = (ModelInstanceData *)Marshal.AllocHGlobal(new IntPtr(numBytes));
                UnsafeUtils.MemCopy((IntPtr)data, (IntPtr)newData, oldNumBytes);
                Marshal.FreeHGlobal((IntPtr)data);
                UnsafeUtils.ZeroMem(((IntPtr)newData) + (int)oldNumBytes, numBytes - oldNumBytes);
                materialMap[materialIndex] = new MIDArray(newData, newSize);
                newData[midArray.Length]   = new ModelInstanceData(modelIndex, sceneLayerIndex, initialTransform);
                return(new ModelInstanceHandle(this, materialIndex, midArray.Length));
            }
        }
Ejemplo n.º 2
0
        private static IntPtr AllocAndZeroTemp(uint numBytes)
        {
            IntPtr result = RenderCommandTempMemPool.GetLocalPool().Reserve(numBytes);

            UnsafeUtils.ZeroMem(result, numBytes);
            return(result);
        }
        private MIDArray CreateNewMIDArray(uint materialIndex)
        {
            uint numBytes           = (uint)sizeof(ModelInstanceData) * INITIAL_INSTANCE_ALLOCATION;
            ModelInstanceData *data = (ModelInstanceData *)Marshal.AllocHGlobal(new IntPtr(numBytes));

            UnsafeUtils.ZeroMem((IntPtr)data, numBytes);
            return(new MIDArray(data, INITIAL_INSTANCE_ALLOCATION));
        }