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 )); } } } }
// 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); }
/// <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(); }
// 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(); }