private void CheckWrapping() { if (SortedChunks.Count(x => x.State != ChunkState.DisplayInSyncWithMeshes) > 0) { return; } // Get World Border line ! => Highest and lowest X et Z chunk components //Compute Player position against WorldRange var resultmin = new Vector3D(PlayerManager.Player.Position.X - VisualWorldParameters.WorldRange.Position.X, PlayerManager.Player.Position.Y - VisualWorldParameters.WorldRange.Position.Y, PlayerManager.Player.Position.Z - VisualWorldParameters.WorldRange.Position.Z); var resultmax = new Vector3D(VisualWorldParameters.WorldRange.Max.X - PlayerManager.Player.Position.X, VisualWorldParameters.WorldRange.Max.Y - PlayerManager.Player.Position.Y, VisualWorldParameters.WorldRange.Max.Z - PlayerManager.Player.Position.Z); float wrapOrder = float.MaxValue; ChunkWrapType operation = ChunkWrapType.Z_Plus1; //FindLowest value ! if (_chunkCreationTrigger > resultmin.X || _chunkCreationTrigger > resultmin.Z || _chunkCreationTrigger > resultmax.X || _chunkCreationTrigger > resultmax.Z) { if (resultmin.X < wrapOrder) { wrapOrder = (float)resultmin.X; operation = ChunkWrapType.X_Minus1; } if (resultmin.Z < wrapOrder) { wrapOrder = (float)resultmin.Z; operation = ChunkWrapType.Z_Minus1; } if (resultmax.X < wrapOrder) { wrapOrder = (float)resultmax.X; operation = ChunkWrapType.X_Plus1; } if (resultmax.Z < wrapOrder) { wrapOrder = (float)resultmax.Z; operation = ChunkWrapType.Z_Plus1; } _chunkWrapper.AddWrapOperation(operation); } }
private void Wrap(ChunkWrapType operationType) { _processingType = operationType; Range3I NewCubeRange, ActualCubeRange, NewWorldRange; Vector2I NewWrapEnd; int NewMinWorldValue; NewWorldRange = WorldChunks.VisualWorldParameters.WorldRange; NewWrapEnd = WorldChunks.VisualWorldParameters.WrapEnd; switch (operationType) { case ChunkWrapType.X_Plus1: //GameConsole.Write("Row of chunks generated : Xmax"); //Find the Xmin chunks ! (They will be recycled with newwww cube Range) foreach (VisualChunk chunk in WorldChunks.GetChunksWithFixedX(WorldChunks.VisualWorldParameters.WorldRange.Position.X, WorldChunks.VisualWorldParameters.WorldRange.Position.Z)) { chunk.State = ChunkState.Empty; chunk.Graphics.IsExistingMesh4Drawing = false; NewMinWorldValue = WorldChunks.VisualWorldParameters.WorldRange.Max.X; ActualCubeRange = chunk.CubeRange; NewCubeRange = new Range3I() { Position = new Vector3I(NewMinWorldValue, ActualCubeRange.Position.Y, ActualCubeRange.Position.Z), Size = AbstractChunk.ChunkSize }; chunk.CubeRange = NewCubeRange; } //Update World Range NewWorldRange.Position.X += AbstractChunk.ChunkSize.X; if (NewWorldRange.Position.X > NewWrapEnd.X) { NewWrapEnd.X += WorldChunks.VisualWorldParameters.WorldVisibleSize.X; } break; case ChunkWrapType.X_Minus1: //GameConsole.Write("Row of chunks generated : Xmin"); //Find the Xmin chunks ! (They will be recycled with newwww cube Range) foreach (VisualChunk chunk in WorldChunks.GetChunksWithFixedX(WorldChunks.VisualWorldParameters.WorldRange.Max.X - AbstractChunk.ChunkSize.X, WorldChunks.VisualWorldParameters.WorldRange.Position.Z)) { chunk.State = ChunkState.Empty; chunk.Graphics.IsExistingMesh4Drawing = false; NewMinWorldValue = WorldChunks.VisualWorldParameters.WorldRange.Position.X; ActualCubeRange = chunk.CubeRange; NewCubeRange = new Range3I() { Position = new Vector3I(NewMinWorldValue - AbstractChunk.ChunkSize.X, ActualCubeRange.Position.Y, ActualCubeRange.Position.Z), Size = AbstractChunk.ChunkSize }; chunk.CubeRange = NewCubeRange; } //Update World Range NewWorldRange.Position.X -= AbstractChunk.ChunkSize.X; if (NewWorldRange.Position.X <= NewWrapEnd.X - (WorldChunks.VisualWorldParameters.WorldVisibleSize.X)) { NewWrapEnd.X -= WorldChunks.VisualWorldParameters.WorldVisibleSize.X; } break; case ChunkWrapType.Z_Plus1: //GameConsole.Write("Row of chunks generated : ZMax"); //Find the Xmin chunks ! (They will be recycled with new cube Range) foreach (VisualChunk chunk in WorldChunks.GetChunksWithFixedZ(WorldChunks.VisualWorldParameters.WorldRange.Position.Z, WorldChunks.VisualWorldParameters.WorldRange.Position.X)) { chunk.State = ChunkState.Empty; chunk.Graphics.IsExistingMesh4Drawing = false; NewMinWorldValue = WorldChunks.VisualWorldParameters.WorldRange.Max.Z; ActualCubeRange = chunk.CubeRange; NewCubeRange = new Range3I() { Position = new Vector3I(ActualCubeRange.Position.X, ActualCubeRange.Position.Y, NewMinWorldValue), Size = AbstractChunk.ChunkSize }; chunk.CubeRange = NewCubeRange; } //Update World Range NewWorldRange.Position.Z += AbstractChunk.ChunkSize.Z; if (NewWorldRange.Position.Z > NewWrapEnd.Y) { NewWrapEnd.Y += WorldChunks.VisualWorldParameters.WorldVisibleSize.Z; } break; case ChunkWrapType.Z_Minus1: //GameConsole.Write("Row of chunks generated : Zmin"); foreach (VisualChunk chunk in WorldChunks.GetChunksWithFixedZ(WorldChunks.VisualWorldParameters.WorldRange.Max.Z - AbstractChunk.ChunkSize.Z, WorldChunks.VisualWorldParameters.WorldRange.Position.X)) { chunk.State = ChunkState.Empty; chunk.Graphics.IsExistingMesh4Drawing = false; NewMinWorldValue = WorldChunks.VisualWorldParameters.WorldRange.Position.Z; ActualCubeRange = chunk.CubeRange; NewCubeRange = new Range3I() { Position = new Vector3I(ActualCubeRange.Position.X, ActualCubeRange.Position.Y, NewMinWorldValue - AbstractChunk.ChunkSize.Z), Size = AbstractChunk.ChunkSize }; chunk.CubeRange = NewCubeRange; } //Update World Range NewWorldRange.Position.Z -= AbstractChunk.ChunkSize.Z; if (NewWorldRange.Position.Z <= NewWrapEnd.Y - (WorldChunks.VisualWorldParameters.WorldVisibleSize.Z)) { NewWrapEnd.Y -= WorldChunks.VisualWorldParameters.WorldVisibleSize.Z; } break; default: break; } //Save the new World Range after Wrapping WorldChunks.VisualWorldParameters.WorldRange = NewWorldRange; WorldChunks.VisualWorldParameters.WrapEnd = NewWrapEnd; PostWrappingStep(); }
public void AddWrapOperation(ChunkWrapType operationType) { Wrap(operationType); }