public unsafe int AddInstances(int model, List <MyInstanceData> instances)
        {
            InstancedModelBuffer buffer;

            if (!m_instancedModels.TryGetValue(model, out buffer))
            {
                buffer = new InstancedModelBuffer(this, model);
                buffer.SetPerInstanceLod(Lod == 0);
                m_instancedModels[model] = buffer;
            }

            buffer.Instances = instances.GetInternalArray();

            var count = instances.Count;

            fixed(MyInstanceData *data = buffer.Instances)
            for (int i = 0; i < count; i++)
            {
                BoundingBox modelBox = buffer.ModelBb.Transform(data[i].LocalMatrix);

                buffer.Bounds.Include(ref modelBox);
            }

            // Fix the unused slot lists
            buffer.UnusedSlots.Clear();
            for (int i = count; i < instances.Capacity; ++i)
            {
                buffer.UnusedSlots.Enqueue((short)(i));
            }

            m_changedBuffers.Add(model);

            return(0);
        }
        public short AddInstance(int modelId, ref MyInstanceData data)
        {
            InstancedModelBuffer buffer;

            if (!m_instancedModels.TryGetValue(modelId, out buffer))
            {
                buffer = new InstancedModelBuffer(this, modelId);
                buffer.SetPerInstanceLod(Lod == 0);
                m_instancedModels[modelId] = buffer;
            }

            short empty;

            if (buffer.UnusedSlots.TryDequeue(out empty))
            {
                buffer.Instances[empty] = data;
            }
            else
            {
                int prevSize = buffer.Instances != null ? buffer.Instances.Length : 0;

                int size = GetExpandedSize(prevSize);
                Array.Resize(ref buffer.Instances, size);

                int diff = size - prevSize;
                empty = (short)prevSize;

                buffer.Instances[empty] = data;

                for (int i = 1; i < diff; ++i)
                {
                    buffer.UnusedSlots.Enqueue((short)(i + empty));
                }
            }

            BoundingBox modelBox = buffer.ModelBb.Transform(data.LocalMatrix);

            buffer.Bounds.Include(ref modelBox);

            m_changedBuffers.Add(modelId);

            return(empty);
        }
        public short AddInstance(int modelId, ref MyInstanceData data)
        {
            InstancedModelBuffer buffer;
            if (!m_instancedModels.TryGetValue(modelId, out buffer))
            {
                buffer = new InstancedModelBuffer(this, modelId);
                buffer.SetPerInstanceLod(Lod == 0);
                m_instancedModels[modelId] = buffer;
            }

            short empty;
            if (buffer.UnusedSlots.TryDequeue(out empty))
            {
                buffer.Instances[empty] = data;
            }
            else
            {
                int prevSize = buffer.Instances != null ? buffer.Instances.Length : 0;

                int size = GetExpandedSize(prevSize);
                Array.Resize(ref buffer.Instances, size);

                int diff = size - prevSize;
                empty = (short)prevSize;

                buffer.Instances[empty] = data;

                for (int i = 1; i < diff; ++i)
                {
                    buffer.UnusedSlots.Enqueue((short)(i + empty));
                }
            }

            BoundingBox modelBox = buffer.ModelBb.Transform(data.LocalMatrix);
            buffer.Bounds.Include(ref modelBox);

            m_changedBuffers.Add(modelId);

            return empty;
        }
        public unsafe int AddInstances(int model, List<MyInstanceData> instances)
        {
            InstancedModelBuffer buffer;
            if (!m_instancedModels.TryGetValue(model, out buffer))
            {
                buffer = new InstancedModelBuffer(this, model);
                buffer.SetPerInstanceLod(Lod == 0);
                m_instancedModels[model] = buffer;
            }

            buffer.Instances = instances.GetInternalArray();

            var count = instances.Count;

            fixed (MyInstanceData* data = buffer.Instances)
                for (int i = 0; i < count; i++)
                {
                    BoundingBox modelBox = buffer.ModelBb.Transform(data[i].LocalMatrix);
                    buffer.Bounds.Include(ref modelBox);
                }

            // Fix the unused slot lists
            buffer.UnusedSlots.Clear();
            for (int i = count; i < instances.Capacity; ++i)
            {
                buffer.UnusedSlots.Enqueue((short)(i));
            }

            m_changedBuffers.Add(model);

            return 0;
        }