public override void AddRenderObjects() { if (Models.Count == 0) { return; } m_renderObjectIDs = new uint[Models.Count + 1]; m_renderObjectIDs[0] = VRageRender.MyRenderProxy.RENDER_ID_UNASSIGNED; SetRenderObjectID(0, MyRenderProxy.CreateManualCullObject(Container.Entity.Name ?? "Fracture", Container.Entity.PositionComp.WorldMatrix)); for (int i = 0; i < Models.Count; ++i) { m_renderObjectIDs[i + 1] = VRageRender.MyRenderProxy.RENDER_ID_UNASSIGNED; SetRenderObjectID(i + 1, MyRenderProxy.CreateRenderEntity ( "Fractured piece " + i.ToString() + " " + Container.Entity.EntityId.ToString(), Models[i].Name, Models[i].LocalTransform, MyMeshDrawTechnique.MESH, GetRenderFlags(), GetRenderCullingOptions(), m_diffuseColor, m_colorMaskHsv )); MyRenderProxy.SetParentCullObject(m_renderObjectIDs[i + 1], m_renderObjectIDs[0], Models[i].LocalTransform); } }
public override void AddRenderObjects() { if (this.Models.Count != 0) { MyCubeBlock entity = base.Container.Entity as MyCubeBlock; if (entity != null) { this.CalculateBlockDepthBias(entity); } base.m_renderObjectIDs = new uint[this.Models.Count + 1]; base.m_parentIDs = new uint[this.Models.Count + 1]; base.m_parentIDs[0] = base.m_renderObjectIDs[0] = uint.MaxValue; string name = base.Container.Entity.Name; this.SetRenderObjectID(0, MyRenderProxy.CreateManualCullObject(name ?? "Fracture", base.Container.Entity.PositionComp.WorldMatrix)); for (int i = 0; i < this.Models.Count; i++) { base.m_parentIDs[i + 1] = base.m_renderObjectIDs[i + 1] = uint.MaxValue; long entityId = base.Container.Entity.EntityId; this.SetRenderObjectID(i + 1, MyRenderProxy.CreateRenderEntity("Fractured piece " + i.ToString() + " " + entityId.ToString(), this.Models[i].Name, this.Models[i].LocalTransform, MyMeshDrawTechnique.MESH, this.GetRenderFlags(), this.GetRenderCullingOptions(), base.m_diffuseColor, base.m_colorMaskHsv, 0f, float.MaxValue, base.DepthBias, 1f, base.FadeIn)); if (base.m_textureChanges != null) { MyRenderProxy.ChangeMaterialTexture(base.m_renderObjectIDs[i + 1], base.m_textureChanges); } base.SetParent(i + 1, base.m_renderObjectIDs[0], new Matrix?((Matrix)this.Models[i].LocalTransform)); } } }
public override void AddRenderObjects() { base.AddRenderObjects(); this.m_cullRenderId = MyRenderProxy.CreateManualCullObject(base.Entity.DisplayName + " ManualCullObject", base.Entity.WorldMatrix); base.SetParent(0, this.m_cullRenderId, new Matrix?(Matrix.Identity)); BoundingBox localAABB = base.Entity.LocalAABB; localAABB.Scale(new Vector3(1.5f, 2f, 1.5f)); MatrixD?worldMatrix = null; Matrix? localMatrix = null; MyRenderProxy.UpdateRenderObject(base.GetRenderObjectID(), worldMatrix, new BoundingBox?(localAABB), -1, localMatrix); }
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); }
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(); }
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(); }