Exemple #1
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);
                            }
                        }
                    }
                }
            }
        }
Exemple #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);
        }
Exemple #3
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);
        }
Exemple #4
0
        public bool DisableInstance(int sectorInstanceId, ModelId modelId)
        {
            MyModelInstanceData instanceData = null;

            m_instanceParts.TryGetValue(modelId, out instanceData);
            Debug.Assert(instanceData != null, "Could not find instance data in a sector for model " + modelId.ToString());
            if (instanceData == null)
            {
                return(false);
            }

            Debug.Assert(instanceData.InstanceData.Count > sectorInstanceId, "Disabling invalid instance in environment item sector!");
            if (instanceData.InstanceData.Count <= sectorInstanceId)
            {
                return(false);
            }

            var data = instanceData.InstanceData[sectorInstanceId];

            data.InstanceData.LocalMatrix = Matrix.Zero;
            instanceData.InstanceData[sectorInstanceId] = data;

            instanceData.FreeInstances.Enqueue(sectorInstanceId);
            m_sectorItemCount--;
            m_invalidateAABB = true;

            return(true);
        }
Exemple #5
0
        /// <summary>
        /// Adds instance of the given model and returns its internal id which can be used for removing the instance. Local matrix specified will be changed to internal packed matrix.
        /// </summary>
        /// <param name="model"></param>
        /// <param name="localMatrix">Local transformation matrix. Changed to internal matrix.</param>
        /// <param name="colorMaskHsv"></param>
        public uint AddInstance(ModelId model, ref Matrix localMatrix, BoundingBox localAabb, Vector4 colorMaskHsv = default(Vector4))
        {
            MyModelInstanceData builderInstanceData;

            if (!m_instanceParts.TryGetValue(model, out builderInstanceData))
            {
                builderInstanceData       = new MyModelInstanceData(m_instanceFlags, m_maxViewDistance);
                builderInstanceData.Model = model;
                m_instanceParts.Add(model, builderInstanceData);
            }

            uint instanceId = m_idCounter++;

            var instanceData = new MyCubeInstanceData()
            {
                ColorMaskHSV   = colorMaskHsv,
                EnableSkinning = false,
                LocalMatrix    = localMatrix
            };

            instanceData.SetColorMaskHSV(colorMaskHsv);

            builderInstanceData.InstanceData.Add(instanceId, instanceData);
            // Matrix has been changed due to packing.
            localMatrix = builderInstanceData.InstanceData[instanceId].LocalMatrix;

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

            return(instanceId);
        }
Exemple #6
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);
        }
Exemple #7
0
 public void UpdateRenderInstanceData(int modelId)
 {
     using (this.m_instancePartsLock.AcquireSharedUsing())
     {
         MyModelInstanceData data = null;
         this.m_instanceParts.TryGetValue(modelId, out data);
         if (data != null)
         {
             data.UpdateRenderInstanceData();
         }
     }
 }
        /// <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(
            MyStringHash subtypeId,
            ModelId modelId,
            int localId,
            ref Matrix localMatrix,
            BoundingBox localAabb,
            MyInstanceFlagsEnum instanceFlags,
            float maxViewDistance,
            Vector4 colorMaskHsv = default(Vector4),
            Vector2I uvOffset    = default(Vector2I))
        {
            MyModelInstanceData builderInstanceData;

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


            uvOffset = new Vector2I(MyUtils.GetRandomInt(2), MyUtils.GetRandomInt(2));
            Color   green = Color.Green;
            Vector3 hsv   = green.ColorToHSVDX11();

            hsv.Y        = MyUtils.GetRandomFloat(0.0f, 1.0f);
            colorMaskHsv = new Vector4(hsv, 0);

            MySectorInstanceData newInstance = new MySectorInstanceData()
            {
                LocalId      = localId,
                InstanceData = new MyInstanceData()
                {
                    ColorMaskHSV = new VRageMath.PackedVector.HalfVector4(colorMaskHsv),
                    LocalMatrix  = localMatrix,
                    UVOffset     = new VRageMath.PackedVector.HalfVector2(uvOffset)
                }
            };
            int sectorInstanceId = builderInstanceData.AddInstanceData(ref newInstance);

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

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

            return(sectorInstanceId);
        }
        public void UpdateRenderInstanceData(ModelId modelId)
        {
            using (m_instancePartsLock.AcquireSharedUsing())
            {
                MyModelInstanceData instanceData = null;
                m_instanceParts.TryGetValue(modelId, out instanceData);
                Debug.Assert(instanceData != null, "Could not find instance data in a sector for model " + modelId.ToString());
                if (instanceData == null)
                {
                    return;
                }

                instanceData.UpdateRenderInstanceData();
            }
        }
Exemple #10
0
        public bool DisableInstance(int sectorInstanceId, int modelId)
        {
            MyModelInstanceData data = null;

            this.m_instanceParts.TryGetValue(modelId, out data);
            if (data == null)
            {
                return(false);
            }
            if (!data.DisableInstance(sectorInstanceId))
            {
                return(false);
            }
            this.m_sectorItemCount--;
            this.m_invalidateAABB = true;
            return(true);
        }
Exemple #11
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));
                 }
             }
         }
     }
 }
        /// <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(
            MyStringHash subtypeId,
            ModelId modelId,
            int localId,
            ref Matrix localMatrix,
            BoundingBox localAabb,
            MyInstanceFlagsEnum instanceFlags,
            float maxViewDistance,
            Vector3 colorMaskHsv = default(Vector3))
        {
            MyModelInstanceData builderInstanceData;

            using (m_instancePartsLock.AcquireExclusiveUsing())
            {
                if (!m_instanceParts.TryGetValue(modelId, out builderInstanceData))
                {
                    builderInstanceData = new MyModelInstanceData(this, subtypeId, modelId, instanceFlags, maxViewDistance, localAabb);
                    m_instanceParts.Add(modelId, builderInstanceData);
                }
            }


            MySectorInstanceData newInstance = new MySectorInstanceData()
            {
                LocalId      = localId,
                InstanceData = new MyInstanceData()
                {
                    ColorMaskHSV = new VRageMath.PackedVector.HalfVector4(colorMaskHsv.X, colorMaskHsv.Y, colorMaskHsv.Z, 0),
                    LocalMatrix  = localMatrix,
                }
            };
            int sectorInstanceId = builderInstanceData.AddInstanceData(ref newInstance);

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

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

            return(sectorInstanceId);
        }
        public bool DisableInstance(int sectorInstanceId, ModelId modelId)
        {
            MyModelInstanceData instanceData = null;

            m_instanceParts.TryGetValue(modelId, out instanceData);
            Debug.Assert(instanceData != null, "Could not find instance data in a sector for model " + modelId.ToString());
            if (instanceData == null)
            {
                return(false);
            }

            if (instanceData.DisableInstance(sectorInstanceId))
            {
                m_sectorItemCount--;
                m_invalidateAABB = true;

                return(true);
            }
            return(false);
        }
Exemple #14
0
        public bool DisableInstance(int sectorInstanceId, MyStringId subtypeId)
        {
            MyModelInstanceData instanceData = null;

            m_instanceParts.TryGetValue(subtypeId, out instanceData);
            Debug.Assert(instanceData != null, "Could not find instance data in a sector for subtype " + subtypeId.ToString());
            if (instanceData == null)
            {
                return(false);
            }

            Debug.Assert(instanceData.InstanceData.Count > sectorInstanceId, "Disabling invalid instance in environment item sector!");
            if (instanceData.InstanceData.Count <= sectorInstanceId)
            {
                return(false);
            }

            var data = instanceData.InstanceData[sectorInstanceId];

            data.LocalMatrix = Matrix.Zero;
            instanceData.InstanceData[sectorInstanceId] = data;

            return(true);
        }
Exemple #15
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);
                 }
             }
         }
     }
 }
        /// <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(
            MyStringHash subtypeId, 
            ModelId modelId,
            int localId,
            ref Matrix localMatrix, 
            BoundingBox localAabb, 
            MyInstanceFlagsEnum instanceFlags, 
            float maxViewDistance,
            Vector4 colorMaskHsv = default(Vector4),
            Vector2I uvOffset = default(Vector2I))
        {
            MyModelInstanceData builderInstanceData;

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


            uvOffset = new Vector2I(MyUtils.GetRandomInt(2), MyUtils.GetRandomInt(2));
            Color green = Color.Green;
            Vector3 hsv = green.ColorToHSVDX11();
            hsv.Y = MyUtils.GetRandomFloat(0.0f, 1.0f);
            colorMaskHsv = new Vector4(hsv, 0);

            MySectorInstanceData newInstance = new MySectorInstanceData()
            {
                LocalId = localId,
                InstanceData = new MyInstanceData()
                {
                    ColorMaskHSV = new VRageMath.PackedVector.HalfVector4(colorMaskHsv),
                    LocalMatrix = localMatrix,
                    UVOffset = new VRageMath.PackedVector.HalfVector2(uvOffset)
                }
            };
            int sectorInstanceId = builderInstanceData.AddInstanceData(ref newInstance);

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

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

            return sectorInstanceId;
        }
        /// <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(
            MyStringHash subtypeId, 
            ModelId modelId,
            int localId,
            ref Matrix localMatrix, 
            BoundingBox localAabb, 
            MyInstanceFlagsEnum instanceFlags, 
            float maxViewDistance,
            Vector4 colorMaskHsv = default(Vector4))
        {
            MyModelInstanceData builderInstanceData;
            if (!m_instanceParts.TryGetValue(modelId, out builderInstanceData))
            {
                builderInstanceData = new MyModelInstanceData(subtypeId, instanceFlags, maxViewDistance, localAabb);
                m_instanceParts.Add(modelId, builderInstanceData);
            }

            MySectorInstanceData newInstance = new MySectorInstanceData()
            {
                LocalId = localId,
                InstanceData = 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[sectorInstanceId].InstanceData.LocalMatrix;
            Debug.Assert(builderInstanceData.InstanceData[sectorInstanceId].InstanceData.LocalMatrix == localMatrix, "Bad matrix");

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

            return sectorInstanceId;
        }
        /// <summary>
        /// Adds instance of the given model and returns its internal id which can be used for removing the instance. Local matrix specified will be changed to internal packed matrix.
        /// </summary>
        /// <param name="model"></param>
        /// <param name="localMatrix">Local transformation matrix. Changed to internal matrix.</param>
        /// <param name="colorMaskHsv"></param>
        public uint AddInstance(ModelId model, ref Matrix localMatrix, BoundingBox localAabb, Vector4 colorMaskHsv = default(Vector4))
        {
            MyModelInstanceData builderInstanceData;
            if (!m_instanceParts.TryGetValue(model, out builderInstanceData))
            {
                builderInstanceData = new MyModelInstanceData(m_instanceFlags, m_maxViewDistance);
                builderInstanceData.Model = model;
                m_instanceParts.Add(model, builderInstanceData);
            }

            uint instanceId = m_idCounter++;

            var instanceData = new MyCubeInstanceData()
            {
                ColorMaskHSV = colorMaskHsv,
                EnableSkinning = false,
                LocalMatrix = localMatrix
            };
            instanceData.SetColorMaskHSV(colorMaskHsv);

            builderInstanceData.InstanceData.Add(instanceId, instanceData);
            // Matrix has been changed due to packing.
            localMatrix = builderInstanceData.InstanceData[instanceId].LocalMatrix;

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

            return instanceId;
        }