Exemplo n.º 1
0
        protected override void AddRenderObjects()
        {
            m_renderObjectIDs = new uint[RenderCellsCount.X * RenderCellsCount.Y * RenderCellsCount.Z];

            for (int j = 0; j < m_renderObjectIDs.Length; j++)
            {
                m_renderObjectIDs[j] = VRageRender.MyRenderProxy.RENDER_ID_UNASSIGNED;
            }

            int         i = 0;
            Vector3I    cellCoord;
            BoundingBox aabb;
            var         scale = MyVoxelCacheRender.CellVertexPositionScale;

            for (cellCoord.X = 0; cellCoord.X < RenderCellsCount.X; cellCoord.X++)
            {
                for (cellCoord.Y = 0; cellCoord.Y < RenderCellsCount.Y; cellCoord.Y++)
                {
                    for (cellCoord.Z = 0; cellCoord.Z < RenderCellsCount.Z; cellCoord.Z++)
                    {
                        var offset = MyVoxelCacheRender.CellVertexPositionOffset(ref cellCoord);

                        // x * (maxy*maxz) + y * maxz  + z
                        GetRenderCellBoundingBox(ref cellCoord, out aabb);
                        SetRenderObjectID(i++, VRageRender.MyRenderProxy.CreateRenderVoxelCell(GetFriendlyName(), VoxelMapId, cellCoord, aabb, PositionLeftBottomCorner,
                                                                                               offset,
                                                                                               scale
                                                                                               ));
                    }
                }
            }
        }
Exemplo n.º 2
0
        //  This method must be called when this object dies or is removed
        //  E.g. it removes lights, sounds, etc
        public override void Close()
        {
            base.Close();

            //  Delete this voxel map from data cell cache
            Storage.Close();
            Geometry.Clear();

            //  Delete this voxel map from render cell cache
            Vector3I renderCellCoord;

            for (renderCellCoord.X = 0; renderCellCoord.X < RenderCellsCount.X; renderCellCoord.X++)
            {
                for (renderCellCoord.Y = 0; renderCellCoord.Y < RenderCellsCount.Y; renderCellCoord.Y++)
                {
                    for (renderCellCoord.Z = 0; renderCellCoord.Z < RenderCellsCount.Z; renderCellCoord.Z++)
                    {
                        MyVoxelCacheRender.RemoveCell(this, ref renderCellCoord, MyLodTypeEnum.LOD1);
                        MyVoxelCacheRender.RemoveCell(this, ref renderCellCoord, MyLodTypeEnum.LOD0);
                    }
                }
            }

            MySession.Static.VoxelMaps.RemoveVoxelMap(this);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Invalidates voxel cache
        /// </summary>
        /// <param name="minChanged">Inclusive min</param>
        /// <param name="maxChanged">Inclusive max</param>
        public void InvalidateCache(Vector3I minChanged, Vector3I maxChanged)
        {
            minChanged = Vector3I.Clamp(minChanged, Vector3I.Zero, SizeMinusOne);
            maxChanged = Vector3I.Clamp(maxChanged, Vector3I.Zero, SizeMinusOne);
            VRageRender.MyRenderProxy.GetRenderProfiler().StartProfilingBlock("MyVoxelMap::InvalidateCache()");
            Geometry.InvalidateRange(minChanged, maxChanged);
            MyVoxelCacheRender.RemoveCellForVoxels(this, minChanged, maxChanged);

            if (Physics != null)
            {
                Physics.InvalidateRange(minChanged, maxChanged);
            }

            InvalidateRenderObjects(true);
            VRageRender.MyRenderProxy.GetRenderProfiler().EndProfilingBlock();
        }
Exemplo n.º 4
0
        //  Prepares render cell cache. Basicaly, it will precalculate all cells in this voxel map.
        //  Cells that don't contain triangles will be precalced too, but of course not stored in the cache.
        //  This method prepares render and data cells too, so you don't have to call PrepareDataCellCache()
        //  IMPORTANT: Do not use this method because it fills vertex/index buffers and when called from background thread
        //  while game is minimized through alt+f4, those VB/IB won't be filled
        public void PrepareRenderCellCache()
        {
            Vector3I cellCoord;

            for (cellCoord.X = 0; cellCoord.X < RenderCellsCount.X; cellCoord.X++)
            {
                for (cellCoord.Y = 0; cellCoord.Y < RenderCellsCount.Y; cellCoord.Y++)
                {
                    for (cellCoord.Z = 0; cellCoord.Z < RenderCellsCount.Z; cellCoord.Z++)
                    {
                        MyVoxelCacheRender.GetCell(this, ref cellCoord, MyLodTypeEnum.LOD0);
                        MyVoxelCacheRender.GetCell(this, ref cellCoord, MyLodTypeEnum.LOD1);
                    }
                }
            }

            UpdateAABBHr();
        }