Exemplo n.º 1
0
 internal void DebugDraw(Vector3I sectorPos, float sectorSize)
 {
     using (this.m_instancePartsLock.AcquireSharedUsing())
     {
         foreach (MyModelInstanceData data in this.m_instanceParts.Values)
         {
             using (data.InstanceBufferLock.AcquireSharedUsing())
             {
                 foreach (KeyValuePair <int, MyInstanceData> pair in data.InstanceData)
                 {
                     MyInstanceData data2       = pair.Value;
                     Matrix         localMatrix = data2.LocalMatrix;
                     Vector3D       vectord     = Vector3D.Transform(localMatrix.Translation, this.m_sectorMatrix);
                     BoundingBox    modelBox    = data.ModelBox;
                     MyRenderProxy.DebugDrawOBB(Matrix.Rescale(data2.LocalMatrix * this.m_sectorMatrix, modelBox.HalfExtents * 2f), Color.OrangeRed, 0.5f, true, true, true, false);
                     if (Vector3D.Distance(MySector.MainCamera.Position, vectord) < 250.0)
                     {
                         MyRenderProxy.DebugDrawText3D(vectord, data.SubtypeId.ToString(), Color.White, 0.7f, true, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_TOP, -1, false);
                     }
                 }
             }
         }
     }
     MyRenderProxy.DebugDrawAABB(this.SectorWorldBox, Color.OrangeRed, 1f, 1f, true, false, false);
 }
Exemplo n.º 2
0
        private BoundingBox GetSectorBoundingBox()
        {
            if (!this.IsValid)
            {
                return(new BoundingBox(Vector3.Zero, Vector3.Zero));
            }
            BoundingBox box = BoundingBox.CreateInvalid();

            using (this.m_instancePartsLock.AcquireSharedUsing())
            {
                foreach (KeyValuePair <int, MyModelInstanceData> pair in this.m_instanceParts)
                {
                    MyModelInstanceData data = pair.Value;
                    using (data.InstanceBufferLock.AcquireSharedUsing())
                    {
                        BoundingBox modelBox = data.ModelBox;
                        foreach (KeyValuePair <int, MyInstanceData> pair2 in data.InstanceData)
                        {
                            MyInstanceData data2       = pair2.Value;
                            Matrix         localMatrix = data2.LocalMatrix;
                            if (!localMatrix.EqualsFast(ref Matrix.Zero, 0.0001f))
                            {
                                box.Include(modelBox.Transform(data2.LocalMatrix));
                            }
                        }
                    }
                }
            }
            return(box);
        }
Exemplo n.º 3
0
        public int AddInstance(MyStringHash subtypeId, int modelId, int localId, ref Matrix localMatrix, BoundingBox localAabb, MyInstanceFlagsEnum instanceFlags, float maxViewDistance, Vector3 colorMaskHsv = new Vector3())
        {
            MyModelInstanceData data;

            using (this.m_instancePartsLock.AcquireExclusiveUsing())
            {
                if (!this.m_instanceParts.TryGetValue(modelId, out data))
                {
                    data = new MyModelInstanceData(this, subtypeId, modelId, instanceFlags, maxViewDistance, localAabb);
                    this.m_instanceParts.Add(modelId, data);
                }
            }
            MySectorInstanceData data3 = new MySectorInstanceData {
                LocalId = localId
            };
            MyInstanceData data4 = new MyInstanceData {
                ColorMaskHSV = new HalfVector4(colorMaskHsv.X, colorMaskHsv.Y, colorMaskHsv.Z, 0f),
                LocalMatrix  = localMatrix
            };

            data3.InstanceData = data4;
            MySectorInstanceData instanceData = data3;
            int num = data.AddInstanceData(ref instanceData);

            localMatrix = data.InstanceData[num].LocalMatrix;
            this.m_AABB = this.m_AABB.Include(localAabb.Transform((Matrix)localMatrix));
            this.m_sectorItemCount++;
            this.m_invalidateAABB = true;
            return(num);
        }
Exemplo n.º 4
0
        internal void GetItemsInRadius(Vector3 position, float radius, List <MyEnvironmentItems.ItemInfo> output)
        {
            double num = radius * radius;

            foreach (KeyValuePair <int, MyModelInstanceData> pair in this.m_instanceParts)
            {
                MyModelInstanceData data = pair.Value;
                using (data.InstanceBufferLock.AcquireSharedUsing())
                {
                    foreach (KeyValuePair <int, MyInstanceData> pair2 in data.InstanceData)
                    {
                        MyInstanceData data2       = pair2.Value;
                        Matrix         localMatrix = data2.LocalMatrix;
                        if (!localMatrix.EqualsFast(ref Matrix.Zero, 0.0001f))
                        {
                            Vector3D vectord = Vector3.Transform(data2.LocalMatrix.Translation, this.m_sectorMatrix);
                            if ((vectord - position).LengthSquared() < num)
                            {
                                MyEnvironmentItems.ItemInfo item = new MyEnvironmentItems.ItemInfo {
                                    LocalId   = data.InstanceIds[pair2.Key],
                                    SubtypeId = pair.Value.SubtypeId,
                                    Transform = new MyTransformD(vectord)
                                };
                                output.Add(item);
                            }
                        }
                    }
                }
            }
        }
Exemplo n.º 5
0
        /// <summary>
        /// Adds instance of the given model. Local matrix specified might be changed internally for renderer (must be used for removing instances).
        /// </summary>
        /// <param name="subtypeId"></param>
        /// <param name="localMatrix">Local transformation matrix. Changed to internal matrix.</param>
        /// <param name="colorMaskHsv"></param>
        public int AddInstance(MyStringId subtypeId, ref Matrix localMatrix, BoundingBox localAabb, MyInstanceFlagsEnum instanceFlags, float maxViewDistance,
                               Vector4 colorMaskHsv = default(Vector4))
        {
            MyModelInstanceData builderInstanceData;

            if (!m_instanceParts.TryGetValue(subtypeId, out builderInstanceData))
            {
                builderInstanceData = new MyModelInstanceData(subtypeId, instanceFlags, maxViewDistance);
                m_instanceParts.Add(subtypeId, builderInstanceData);
            }

            MyInstanceData newInstance = new MyInstanceData()
            {
                ColorMaskHSV = new VRageMath.PackedVector.HalfVector4(colorMaskHsv),
                LocalMatrix  = localMatrix
            };
            int sectorInstanceId = builderInstanceData.AddInstanceData(ref newInstance);

            // Matrix has been changed due to packing.
            localMatrix = builderInstanceData.InstanceData[builderInstanceData.InstanceData.Count - 1].LocalMatrix;
            Debug.Assert(builderInstanceData.InstanceData[builderInstanceData.InstanceData.Count - 1].LocalMatrix == localMatrix, "Bad matrix");

            m_AABB = m_AABB.Include(localAabb.Transform(localMatrix));
            m_sectorItemCount++;

            return(sectorInstanceId);
        }
Exemplo n.º 6
0
        private void SetData()
        {
            MyInstanceData data = Chameleon.GetData <MyInstanceData>();

            data.Message = "This is the data I am saving";
            Chameleon.SaveData(data);
        }
Exemplo n.º 7
0
 internal void GetItems(List <Vector3D> output)
 {
     foreach (KeyValuePair <int, MyModelInstanceData> pair in this.m_instanceParts)
     {
         MyModelInstanceData data = pair.Value;
         using (data.InstanceBufferLock.AcquireSharedUsing())
         {
             foreach (KeyValuePair <int, MyInstanceData> pair2 in data.InstanceData)
             {
                 MyInstanceData data2       = pair2.Value;
                 Matrix         localMatrix = data2.LocalMatrix;
                 if (!localMatrix.EqualsFast(ref Matrix.Zero, 0.0001f))
                 {
                     output.Add(Vector3D.Transform(data2.LocalMatrix.Translation, this.m_sectorMatrix));
                 }
             }
         }
     }
 }
        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);
        }
Exemplo n.º 9
0
        internal void GetItemsInRadius(Vector3D position, float radius, List <Vector3D> output)
        {
            Vector3D vectord = Vector3D.Transform(position, this.m_sectorInvMatrix);

            foreach (KeyValuePair <int, MyModelInstanceData> pair in this.m_instanceParts)
            {
                using (pair.Value.InstanceBufferLock.AcquireSharedUsing())
                {
                    foreach (KeyValuePair <int, MyInstanceData> pair2 in pair.Value.InstanceData)
                    {
                        MyInstanceData data        = pair2.Value;
                        Matrix         localMatrix = data.LocalMatrix;
                        if (Vector3D.DistanceSquared(localMatrix.Translation, vectord) < (radius * radius))
                        {
                            output.Add(Vector3D.Transform(pair2.Value.LocalMatrix.Translation, this.m_sectorMatrix));
                        }
                    }
                }
            }
        }
        private void UpdateItemModel(int index, short newModelIndex)
        {
            ProfilerShort.Begin("Update Render Model");
            var item = DataView.Items[index];

            if (item.ModelIndex != newModelIndex)
            {
                if (m_currentLod == m_lodToSwitch)
                {
                    if (item.ModelIndex >= 0 && m_owner.GetModelForId(item.ModelIndex) != null)
                    {
                        int modelId = MyModel.GetId(m_owner.GetModelForId(item.ModelIndex).Model);
                        m_render.RemoveInstance(modelId, m_modelToItem[index]);
                        m_modelToItem[index] = -1;
                    }

                    if (newModelIndex >= 0 && m_owner.GetModelForId(newModelIndex) != null)
                    {
                        int modelId = MyModel.GetId(m_owner.GetModelForId(newModelIndex).Model);

                        Vector3D offset = SectorCenter - m_render.WorldMatrix.Translation;
                        Matrix   m;
                        Matrix.CreateFromQuaternion(ref item.Rotation, out m);
                        m.Translation = item.Position + offset;

                        var data = new MyInstanceData(m);

                        m_modelToItem[index] = m_render.AddInstance(modelId, ref data);
                    }
                }

                item.ModelIndex       = newModelIndex;
                DataView.Items[index] = item;
            }
            ProfilerShort.End();
        }
Exemplo n.º 11
0
 internal void GetItems(List <MyEnvironmentItems.ItemInfo> output)
 {
     foreach (KeyValuePair <int, MyModelInstanceData> pair in this.m_instanceParts)
     {
         MyModelInstanceData data = pair.Value;
         using (data.InstanceBufferLock.AcquireSharedUsing())
         {
             foreach (KeyValuePair <int, MyInstanceData> pair2 in data.InstanceData)
             {
                 MyInstanceData data2       = pair2.Value;
                 Matrix         localMatrix = data2.LocalMatrix;
                 if (!localMatrix.EqualsFast(ref Matrix.Zero, 0.0001f))
                 {
                     MyEnvironmentItems.ItemInfo item = new MyEnvironmentItems.ItemInfo {
                         LocalId   = data.InstanceIds[pair2.Key],
                         SubtypeId = pair.Value.SubtypeId,
                         Transform = new MyTransformD(Vector3.Transform(localMatrix.Translation, this.m_sectorMatrix))
                     };
                     output.Add(item);
                 }
             }
         }
     }
 }
Exemplo n.º 12
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;
        }
Exemplo n.º 13
0
        public static void UpdateRenderInstanceBufferRange(uint id, MyInstanceData[] instanceData, int offset = 0, bool trimEnd = false)
        {
            var message = MessagePool.Get<MyRenderMessageUpdateRenderInstanceBufferRange>(MyRenderMessageEnum.UpdateRenderInstanceBufferRange);

            message.ID = id;
            message.InstanceData = instanceData;
            message.StartOffset = offset;
            message.Trim = trimEnd;
            

            EnqueueMessage(message);
        }
Exemplo n.º 14
0
 public int AddInstanceData(ref MyInstanceData instanceData)
 {
     InstanceData.Add(instanceData);
     return(InstanceData.Count - 1);
 }
 public int AddInstanceData(ref MyInstanceData instanceData)
 {
     InstanceData.Add(instanceData);
     return InstanceData.Count - 1;
 }
        /// <summary>
        /// Adds instance of the given model. Local matrix specified might be changed internally for renderer (must be used for removing instances).
        /// </summary>
        /// <param name="subtypeId"></param>
        /// <param name="localMatrix">Local transformation matrix. Changed to internal matrix.</param>
        /// <param name="colorMaskHsv"></param>
        public int AddInstance(MyStringId subtypeId, ref Matrix localMatrix, BoundingBox localAabb, MyInstanceFlagsEnum instanceFlags, float maxViewDistance,
            Vector4 colorMaskHsv = default(Vector4))
        {
            MyModelInstanceData builderInstanceData;
            if (!m_instanceParts.TryGetValue(subtypeId, out builderInstanceData))
            {
                builderInstanceData = new MyModelInstanceData(subtypeId, instanceFlags, maxViewDistance);
                m_instanceParts.Add(subtypeId, builderInstanceData);
            }

            MyInstanceData newInstance = new MyInstanceData()
            {
                ColorMaskHSV = new VRageMath.PackedVector.HalfVector4(colorMaskHsv),
                LocalMatrix = localMatrix
            };
            int sectorInstanceId = builderInstanceData.AddInstanceData(ref newInstance);

            // Matrix has been changed due to packing.
            localMatrix = builderInstanceData.InstanceData[builderInstanceData.InstanceData.Count - 1].LocalMatrix;
            Debug.Assert(builderInstanceData.InstanceData[builderInstanceData.InstanceData.Count - 1].LocalMatrix == localMatrix, "Bad matrix");

            m_AABB = m_AABB.Include(localAabb.Transform(localMatrix));
            m_sectorItemCount++;

            return sectorInstanceId;
        }