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); } } } } } }
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); }
/// <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); }
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); }
/// <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); }
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); }
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(); } }
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); }
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); }
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); }
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; }