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);
            }
        }
Example #2
0
 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));
         }
     }
 }
Example #3
0
        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);
        }
Example #4
0
        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);
        }
Example #5
0
        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();
        }