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