public void UpdateRenderInstanceData() { if (m_instanceBufferId == MyRenderProxy.RENDER_ID_UNASSIGNED) { m_instanceBufferId = MyRenderProxy.CreateRenderInstanceBuffer("Cube builder instance buffer", MyRenderInstanceBufferType.Generic); } // Merge data into one buffer Debug.Assert(m_tmpInstanceData.Count == 0, "Instance data is not cleared"); m_instanceInfo.Clear(); foreach (var part in m_instanceParts) { m_instanceInfo.Add(part.Key, new MyRenderInstanceInfo(m_instanceBufferId, m_tmpInstanceData.Count, part.Value.InstanceData.Count, part.Value.InstanceInfo.MaxViewDistance, part.Value.InstanceInfo.Flags)); m_tmpInstanceData.AddList(part.Value.InstanceData); } m_instanceDataArray = m_tmpInstanceData.ToArray(); if (m_tmpInstanceData.Count > 0) { // MyRenderProxy.UpdateRenderCubeInstanceBuffer(m_instanceBufferId, m_tmpInstanceData, (int)(m_tmpInstanceData.Count * 1.2f)); MyRenderProxy.UpdateRenderInstanceBufferRange(m_instanceBufferId, m_instanceDataArray); } m_tmpInstanceData.Clear(); }
public void UpdateRenderInstanceData() { if (this.InstanceData.Count != 0) { if (this.InstanceBuffer == uint.MaxValue) { this.InstanceBuffer = MyRenderProxy.CreateRenderInstanceBuffer($"EnvironmentSector{this.Parent.SectorId} - {this.SubtypeId}", MyRenderInstanceBufferType.Generic, uint.MaxValue); } MyRenderProxy.UpdateRenderInstanceBufferRange(this.InstanceBuffer, this.InstanceData.Values.ToArray <MyInstanceData>(), 0, false); } }
private void UpdateRenderInstanceData(Dictionary <MyInstanceBucket, Tuple <List <MyCubeInstanceMergedData>, Sandbox.Game.Entities.Cube.MyInstanceInfo> > instanceParts, RenderFlags renderFlags) { if (this.m_parentCullObject == uint.MaxValue) { object[] objArray1 = new object[] { this.m_gridRenderComponent.Container.Entity.DisplayName, " ", this.m_gridRenderComponent.Container.Entity.EntityId, ", cull object" }; this.AddRenderObjectId(true, out this.m_parentCullObject, MyRenderProxy.CreateManualCullObject(string.Concat(objArray1), this.m_gridRenderComponent.Container.Entity.PositionComp.WorldMatrix)); } if (this.m_instanceBufferId == uint.MaxValue) { object[] objArray2 = new object[] { this.m_gridRenderComponent.Container.Entity.DisplayName, " ", this.m_gridRenderComponent.Container.Entity.EntityId, ", instance buffer ", this.DebugName }; this.AddRenderObjectId(false, out this.m_instanceBufferId, MyRenderProxy.CreateRenderInstanceBuffer(string.Concat(objArray2), MyRenderInstanceBufferType.Cube, this.m_gridRenderComponent.GetRenderObjectID())); } this.m_instanceInfo.Clear(); m_tmpDecalData.AssertEmpty <MyCubeInstanceDecalData>(); m_tmpInstanceData.AssertEmpty <MyCubeInstanceData>(); int num = -1; foreach (KeyValuePair <MyInstanceBucket, Tuple <List <MyCubeInstanceMergedData>, Sandbox.Game.Entities.Cube.MyInstanceInfo> > pair in instanceParts) { MyInstanceBucket key = pair.Key; Tuple <List <MyCubeInstanceMergedData>, Sandbox.Game.Entities.Cube.MyInstanceInfo> tuple = pair.Value; this.m_instanceInfo.Add(key, new MyRenderInstanceInfo(this.m_instanceBufferId, m_tmpInstanceData.Count, tuple.Item1.Count, tuple.Item2.MaxViewDistance, tuple.Item2.Flags)); List <MyCubeInstanceMergedData> list = tuple.Item1; for (int i = 0; i < list.Count; i++) { num++; m_tmpInstanceData.Add(list[i].CubeInstanceData); ConcurrentDictionary <uint, bool> decals = list[i].Decals; if (decals != null) { foreach (uint num3 in decals.Keys) { MyCubeInstanceDecalData item = new MyCubeInstanceDecalData { DecalId = num3, InstanceIndex = num }; m_tmpDecalData.Add(item); } } } } if (m_tmpInstanceData.Count > 0) { MyRenderProxy.UpdateRenderCubeInstanceBuffer(this.m_instanceBufferId, ref m_tmpInstanceData, (int)(m_tmpInstanceData.Count * 1.2f), ref m_tmpDecalData); } m_tmpDecalData.AssertEmpty <MyCubeInstanceDecalData>(); m_tmpInstanceData.AssertEmpty <MyCubeInstanceData>(); this.UpdateRenderEntitiesInstanceData(renderFlags, this.m_parentCullObject); }
public void UpdateRenderInstanceData() { if (InstanceData.Count == 0) { return; } if (InstanceBuffer == MyRenderProxy.RENDER_ID_UNASSIGNED) { InstanceBuffer = MyRenderProxy.CreateRenderInstanceBuffer(string.Format("EnvironmentSector{0} - {1}", Parent.SectorId, SubtypeId), MyRenderInstanceBufferType.Generic); } MyRenderProxy.UpdateRenderInstanceBufferRange(InstanceBuffer, InstanceData.Values.ToArray()); }
public void UpdateRenderInstanceData() { if (m_instanceBufferId == MyRenderProxy.RENDER_ID_UNASSIGNED) { m_instanceBufferId = MyRenderProxy.CreateRenderInstanceBuffer("Environment items sector " + string.Format("{0} {1} {2}", m_id.X, m_id.Y, m_id.Z), MyRenderInstanceBufferType.Generic); } // Merge data into one buffer Debug.Assert(m_tmpInstanceData.Count == 0, "Instance data is not cleared"); m_instanceInfo.Clear(); using (m_instancePartsLock.AcquireSharedUsing()) { foreach (var part in m_instanceParts) { m_instanceInfo.Add(part.Key, new MyRenderInstanceInfo(m_instanceBufferId, m_tmpInstanceData.Count, part.Value.InstanceData.Count, part.Value.MaxViewDistance, part.Value.Flags)); var instanceData = part.Value.InstanceData; if (m_tmpInstanceData.Count + instanceData.Count > m_tmpInstanceData.Capacity) { m_tmpInstanceData.Capacity = m_tmpInstanceData.Count + instanceData.Count; } foreach (var instance in instanceData) { m_tmpInstanceData.Add(instance.InstanceData); } } } if (m_tmpInstanceData.Count > 0) { MyRenderProxy.UpdateRenderInstanceBuffer(m_instanceBufferId, m_tmpInstanceData, (int)(m_tmpInstanceData.Count * 1.2f)); } else { MyRenderProxy.RemoveRenderObject(m_instanceBufferId); foreach (var renderObjectId in m_instanceGroupRenderObjects.Values) { MyRenderProxy.RemoveRenderObject(renderObjectId); } m_instanceGroupRenderObjects.Clear(); } m_tmpInstanceData.Clear(); }
private void UpdateRenderInstanceData(Dictionary <ModelId, Tuple <List <MyCubeInstanceData>, MyInstanceInfo> > instanceParts, RenderFlags renderFlags) { if (m_instanceBufferId == MyRenderProxy.RENDER_ID_UNASSIGNED) { m_instanceBufferId = MyRenderProxy.CreateRenderInstanceBuffer(m_gridRenderComponent.Container.Entity.GetFriendlyName() + " " + m_gridRenderComponent.Container.Entity.EntityId.ToString() + ", instance buffer " + DebugName, MyRenderInstanceBufferType.Cube); AddRenderObjectId(m_instanceBufferId, false); } if (m_parentCullObject == MyRenderProxy.RENDER_ID_UNASSIGNED) { m_parentCullObject = MyRenderProxy.CreateManualCullObject(m_gridRenderComponent.Container.Entity.GetFriendlyName() + " " + m_gridRenderComponent.Container.Entity.EntityId.ToString() + ", cull object", m_gridRenderComponent.Container.Entity.PositionComp.WorldMatrix); AddRenderObjectId(m_parentCullObject, true); } ProfilerShort.Begin("Merge render parts"); // Merge data into one buffer Debug.Assert(m_tmpInstanceData.Count == 0, "Instance data is not cleared"); m_instanceInfo.Clear(); foreach (var part in instanceParts) { m_instanceInfo.Add(part.Key, new MyRenderInstanceInfo(m_instanceBufferId, m_tmpInstanceData.Count, part.Value.Item1.Count, part.Value.Item2.MaxViewDistance, part.Value.Item2.Flags)); m_tmpInstanceData.AddList(part.Value.Item1); } ProfilerShort.End(); if (m_tmpInstanceData.Count > 0) { ProfilerShort.Begin("Update instance buffer"); MyRenderProxy.UpdateRenderCubeInstanceBuffer(m_instanceBufferId, m_tmpInstanceData, (int)(m_tmpInstanceData.Count * 1.2f)); ProfilerShort.End(); } m_tmpInstanceData.Clear(); ProfilerShort.Begin("Update instance entitites"); UpdateRenderEntitiesInstanceData(renderFlags, m_parentCullObject); ProfilerShort.End(); }
public void UpdateRenderInstanceData() { if (m_instanceBufferId == MyRenderProxy.RENDER_ID_UNASSIGNED) { m_instanceBufferId = MyRenderProxy.CreateRenderInstanceBuffer(m_debugBufferName, MyRenderInstanceBufferType.Cube); } // Merge data into one buffer Debug.Assert(m_tmpInstanceData.Count == 0, "Instance data is not cleared"); m_instanceInfo.Clear(); foreach (var part in m_instanceParts) { m_instanceInfo.Add(part.Key, new MyRenderInstanceInfo(m_instanceBufferId, m_tmpInstanceData.Count, part.Value.InstanceData.Count, part.Value.InstanceInfo.MaxViewDistance, part.Value.InstanceInfo.Flags)); m_tmpInstanceData.AddList(part.Value.InstanceData.Values.ToList()); } if (m_tmpInstanceData.Count > 0) { MyRenderProxy.UpdateRenderCubeInstanceBuffer(m_instanceBufferId, m_tmpInstanceData, (int)(m_tmpInstanceData.Count * 1.2f)); } m_tmpInstanceData.Clear(); }
public void UpdateRenderInstanceData() { if (m_instanceBufferId == MyRenderProxy.RENDER_ID_UNASSIGNED) { m_instanceBufferId = MyRenderProxy.CreateRenderInstanceBuffer("Environment items sector " + string.Format("{0} {1} {2}", m_id.X, m_id.Y, m_id.Z), MyRenderInstanceBufferType.Generic); } // Merge data into one buffer Debug.Assert(m_tmpInstanceData.Count == 0, "Instance data is not cleared"); m_instanceInfo.Clear(); foreach (var part in m_instanceParts) { m_instanceInfo.Add(part.Key, new MyRenderInstanceInfo(m_instanceBufferId, m_tmpInstanceData.Count, part.Value.InstanceData.Count, part.Value.MaxViewDistance, part.Value.Flags)); m_tmpInstanceData.AddList(part.Value.InstanceData); } if (m_tmpInstanceData.Count > 0) { MyRenderProxy.UpdateRenderInstanceBuffer(m_instanceBufferId, m_tmpInstanceData, (int)(m_tmpInstanceData.Count * 1.2f)); } m_tmpInstanceData.Clear(); }
private void UpdateRenderInstanceData(Dictionary <ModelId, Tuple <List <MyCubeInstanceMergedData>, MyInstanceInfo> > instanceParts, RenderFlags renderFlags) { if (m_parentCullObject == MyRenderProxy.RENDER_ID_UNASSIGNED) { m_parentCullObject = MyRenderProxy.CreateManualCullObject(m_gridRenderComponent.Container.Entity.GetFriendlyName() + " " + m_gridRenderComponent.Container.Entity.EntityId.ToString() + ", cull object", m_gridRenderComponent.Container.Entity.PositionComp.WorldMatrix); AddRenderObjectId(m_parentCullObject, true); } if (m_instanceBufferId == MyRenderProxy.RENDER_ID_UNASSIGNED) { m_instanceBufferId = MyRenderProxy.CreateRenderInstanceBuffer( m_gridRenderComponent.Container.Entity.GetFriendlyName() + " " + m_gridRenderComponent.Container.Entity.EntityId.ToString() + ", instance buffer " + DebugName, MyRenderInstanceBufferType.Cube, m_gridRenderComponent.GetRenderObjectID()); AddRenderObjectId(m_instanceBufferId, false); } ProfilerShort.Begin("Merge render parts"); // Merge data into one buffer Debug.Assert(InstanceData.Count == 0, "Instance data is not cleared"); m_instanceInfo.Clear(); m_tmpDecalData.Clear(); int instaceDataIndex = -1; foreach (var pair in instanceParts) { var modeId = pair.Key; var tuple = pair.Value; m_instanceInfo.Add(modeId, new MyRenderInstanceInfo(m_instanceBufferId, InstanceData.Count, tuple.Item1.Count, tuple.Item2.MaxViewDistance, tuple.Item2.Flags)); var instaceDatas = tuple.Item1; for (int it1 = 0; it1 < instaceDatas.Count; it1++) { instaceDataIndex++; InstanceData.Add(instaceDatas[it1].CubeInstanceData); var decals = instaceDatas[it1].Decals; if (decals == null) { continue; } for (int it2 = 0; it2 < decals.Count; it2++) { m_tmpDecalData.Add(new MyCubeInstanceDecalData() { DecalId = decals[it2], InstanceIndex = instaceDataIndex }); } } } ProfilerShort.End(); if (InstanceData.Count > 0) { ProfilerShort.Begin("Update instance buffer"); MyRenderProxy.UpdateRenderCubeInstanceBuffer(m_instanceBufferId, InstanceData, (int)(InstanceData.Count * 1.2f), m_tmpDecalData); ProfilerShort.End(); } InstanceData.Clear(); ProfilerShort.Begin("Update instance entitites"); UpdateRenderEntitiesInstanceData(renderFlags, m_parentCullObject); ProfilerShort.End(); }
public void UpdateRenderObjects() { var modelName = MyModel.GetById(Model); if (InstanceOIDs == null) { var bounds = Bounds; bounds.Translate(m_parent.WorldMatrix.Translation); if (RenderObjectId == MyRenderProxy.RENDER_ID_UNASSIGNED) { RenderObjectId = MyRenderProxy.CreateRenderEntity( string.Format("RO::{0}: {1}", m_parent.Name, modelName), modelName, m_parent.WorldMatrix, MyMeshDrawTechnique.MESH, RenderFlags.Visible | RenderFlags.CastShadows, CullingOptions.Default, Vector3.One, colorMaskHsv: Vector3.Zero, dithering: 0, maxViewDistance: 100000 ); MyRenderProxy.UpdateRenderEntity(RenderObjectId, Vector3.One, Vector3.Zero, 0); } if (InstanceBufferId == MyRenderProxy.RENDER_ID_UNASSIGNED) { InstanceBufferId = MyRenderProxy.CreateRenderInstanceBuffer(string.Format("IB::{0}: {1}", m_parent.Name, modelName), MyRenderInstanceBufferType.Generic); } MyRenderProxy.UpdateRenderInstanceBufferRange(InstanceBufferId, Instances); MyRenderProxy.UpdateRenderInstanceBufferSettings(InstanceBufferId, m_parent.Lod == 0); MyRenderProxy.SetInstanceBuffer(RenderObjectId, InstanceBufferId, 0, Instances.Length, bounds); MyRenderProxy.UpdateRenderObject(RenderObjectId, ref m_parent.WorldMatrix, false, (BoundingBoxD)bounds); } else { unsafe { if (InstanceOIDs.Length != Instances.Length) ResizeActorBuffer(); fixed(MyInstanceData *instances = Instances) for (int i = 0; i < InstanceOIDs.Length; ++i) { if (InstanceOIDs[i] == MyRenderProxy.RENDER_ID_UNASSIGNED && instances[i].m_row0.PackedValue != 0) { MatrixD matrix = instances[i].LocalMatrix * m_parent.WorldMatrix; var bounds = (BoundingBoxD)ModelBb; bounds = bounds.TransformFast(ref matrix); //bounds.Translate(m_parent.WorldMatrix.Translation); var obj = MyRenderProxy.CreateRenderEntity( string.Format("RO::{0}: {1}", m_parent.Name, modelName), modelName, matrix, MyMeshDrawTechnique.MESH, RenderFlags.Visible | RenderFlags.CastShadows, CullingOptions.Default, Vector3.One, colorMaskHsv: Vector3.Zero, dithering: 0, maxViewDistance: 100000 ); MyRenderProxy.UpdateRenderObject(obj, ref matrix, false, (BoundingBoxD)bounds); InstanceOIDs[i] = obj; } } } } }