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); }
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); }
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); }
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); } } } } } }
/// <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); }
private void SetData() { MyInstanceData data = Chameleon.GetData <MyInstanceData>(); data.Message = "This is the data I am saving"; Chameleon.SaveData(data); }
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); }
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(); }
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); } } } } }
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 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); }
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; }