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);
            }
        }
Example #2
0
        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();
        }
Example #3
0
 public void AddWrapOperation(ChunkWrapType operationType)
 {
     Wrap(operationType);
 }