Example #1
0
        public static CubeCoordinates GetTargetedNewCube(this CubeWorld cubeWorld, Camera camera, int maxLayingDistance)         // is not 100% trustworthy, and is not powerful, be careful
        {
            Vector3 checkPosition = camera.ScreenPosition * cubeWorld.GetGraphicsCubeRatio();

            CubeCoordinates oldPosition    = null;
            CubeCoordinates actualPosition = null;
            CubeCoordinates convertedCheckPosition;

            const int checkIntensity = 100;
            float     checkIncrement = (float)maxLayingDistance / checkIntensity;

            for (int i = 0; i < checkIntensity; i++)
            {                                                           // in World, is free space
                checkPosition         += camera.Front * checkIncrement; // increment check zone
                convertedCheckPosition = CubeCoordinates.FromVector3(checkPosition);

                if (convertedCheckPosition == actualPosition)                                     // perf maintainer
                {
                    if (!(oldPosition is null) && !cubeWorld.IsFreeSpace(convertedCheckPosition)) // check if it's a free space
                    {
                        return(oldPosition);
                    }
                    else if (!(actualPosition is null))                     // or accept the new checkable position (or exit if actualPosition wasn't initialized)
                    {
                        oldPosition = actualPosition;
                    }
                }

                actualPosition = convertedCheckPosition;
            }
Example #2
0
        public override void Update(GameTime gameTime)
        {
            fpsCounter.Update(gameTime);
            state = GetLitteralState();

            PlayerCoordinates = Nocubeless.CubeWorld.GetCoordinatesFromGraphics(Nocubeless.Camera.ScreenPosition);
            ChunkCoordinates  = CubeChunkHelper.FindBaseCoordinates(PlayerCoordinates);

            int margin = 2;

            coordinatesDrawPosition = new Vector2(margin, margin);
            fpsDrawPosition         = new Vector2(GraphicsDevice.Viewport.Width / 2, margin);

            base.Update(gameTime);

            string GetLitteralState()
            {
                switch (Nocubeless.CurrentState)
                {
                case NocubelessState.Playing:
                    return("Playing");

                case NocubelessState.Editing:
                    return("Editing world");

                case NocubelessState.ColorPicking:
                    return("Picking a color...");

                default:
                    return("Unknown");
                }
            }
        }
Example #3
0
        public static CubeCoordinates GetTargetedCube(this CubeWorld cubeWorld, Camera camera, int maxLayingDistance) // is not 100% trustworthy, and is not powerful, be careful
        {
            Vector3 checkPosition = camera.ScreenPosition * cubeWorld.GetGraphicsCubeRatio();                         // Not a beautiful way!

            CubeCoordinates actualPosition = null;
            CubeCoordinates convertedCheckPosition;

            const int checkIntensity = 100;
            float     checkIncrement = (float)maxLayingDistance / checkIntensity;

            for (int i = 0; i < checkIntensity; i++)
            {                                                           // in World, is free space
                checkPosition         += camera.Front * checkIncrement; // increment check zone
                convertedCheckPosition = CubeCoordinates.FromVector3(checkPosition);

                if (convertedCheckPosition == actualPosition)
                {
                    if (!cubeWorld.IsFreeSpace(convertedCheckPosition))                     // check if it's a free space
                    {
                        return(convertedCheckPosition);
                    }
                }

                actualPosition = convertedCheckPosition;
            }

            return(actualPosition);
        }
Example #4
0
        public static int GetIndexFromCoordinates(CubeCoordinates cubeCoordinates) // get position of the cube in the chunk from lamba cube coordinates
        {
            if (cubeCoordinates == null)
            {
                throw new NullReferenceException();
            }

            int x = GetRemainder(cubeCoordinates.X),
                y = GetRemainder(cubeCoordinates.Y),
                z = GetRemainder(cubeCoordinates.Z);

            return(x + (y * CubeChunk.Size) + (z * CubeChunk.Size * CubeChunk.Size));

            int GetRemainder(int value) // x < 0 please
            {
                int remainder = value % CubeChunk.Size;

                if (value >= 0)
                {
                    return(remainder);
                }
                else
                {
                    if (remainder == 0) // when (-)x%size == 0
                    {
                        return(0);
                    }
                    else
                    {
                        return(CubeChunk.Size + remainder);
                    }
                }
            }
        }
Example #5
0
        public override void Process()
        {
            var direction = new CubeCoordinates(0, 0, 0);

            if (Input.WasJustPressed(Nocubeless.Settings.Keys.MoveRight))
            {
                direction = new CubeCoordinates(Nocubeless.Camera.Right);
            }
            else if (Input.WasJustPressed(Nocubeless.Settings.Keys.MoveLeft))
            {
                direction = new CubeCoordinates(-Nocubeless.Camera.Right);
            }
            else if (Input.WasJustPressed(Nocubeless.Settings.Keys.MoveForward))
            {
                direction = new CubeCoordinates(Nocubeless.Camera.Front);
            }
            else if (Input.WasJustPressed(Nocubeless.Settings.Keys.MoveBackward))
            {
                direction = new CubeCoordinates(-Nocubeless.Camera.Front);
            }
            else if (Input.WasJustPressed(Nocubeless.Settings.Keys.MoveUpward))
            {
                direction = new CubeCoordinates(Nocubeless.Camera.Up);
            }
            else if (Input.WasJustPressed(Nocubeless.Settings.Keys.MoveDown))
            {
                direction = new CubeCoordinates(-Nocubeless.Camera.Up);
            }

            Nocubeless.CubeWorld.PreviewableCube.Coordinates += direction;

            if (Input.WasJustPressed(Nocubeless.Settings.Keys.ToggleLayBreak))
            {
                shouldBreakCube = !shouldBreakCube;
            }

            var cubeToLay = new Cube(Nocubeless.Player.NextColorToLay /*TODO: Change with a kind of Editing/NextColorToLay*/, Nocubeless.CubeWorld.PreviewableCube.Coordinates); // Make the Editor Cube class

            Nocubeless.CubeWorld.PreviewCube(cubeToLay);

            if (Input.WasRightMouseButtonJustPressed() && !shouldBreakCube)
            {
                Nocubeless.CubeWorld.LayCube(cubeToLay);
            }

            if (Input.WasLeftMouseButtonJustPressed() && shouldBreakCube)
            {
                Nocubeless.CubeWorld.BreakCube(Nocubeless.CubeWorld.PreviewableCube.Coordinates);
            }

            if (Input.WasMiddleMouseButtonJustPressed() && shouldBreakCube)
            {
                Pick();
            }

            if (Input.WasJustPressed(Nocubeless.Settings.Keys.SetPreviewableCubeAtTheFront))
            {
                Nocubeless.CubeWorld.PreviewableCube.Coordinates = Nocubeless.CubeWorld.GetCoordinatesFromGraphics(Nocubeless.Camera.Target);
            }
        }
Example #6
0
        public static CubeCoordinates FindBaseCoordinates(CubeCoordinates cubeCoordinates) // find real chunk coordinates from lamba cube coordinates
        {
            if (cubeCoordinates == null)
            {
                throw new NullReferenceException();
            }

            int x = FindCloserLeftMultiple(cubeCoordinates.X),
                y = FindCloserLeftMultiple(cubeCoordinates.Y),
                z = FindCloserLeftMultiple(cubeCoordinates.Z);

            return(new CubeCoordinates(x, y, z));

            /// <summary>
            /// This method find the first value that is a multiple of a CubeChunk Size by crossing from the left.
            /// </summary>
            int FindCloserLeftMultiple(int value)
            {
                while (value % CubeChunk.Size != 0)
                {
                    value--;
                }

                return(value);
            }
        }
Example #7
0
        public void BreakCube(CubeCoordinates coordinates)
        {
            var chunkCoordinates = CubeChunkHelper.FindBaseCoordinates(coordinates);

            var tookChunk = TakeChunkAt(chunkCoordinates);

            int cubePositionInChunk = CubeChunkHelper.GetIndexFromCoordinates(coordinates);

            tookChunk[cubePositionInChunk] = null;
        }
Example #8
0
        public CubeColor GetCubeColorAt(CubeCoordinates coordinates)         // TODO: Redundance fix
        {
            var chunkCoordinates = CubeChunkHelper.FindBaseCoordinates(coordinates);

            var tookChunk = TakeChunkAt(chunkCoordinates);

            int cubePositionInChunk = CubeChunkHelper.GetIndexFromCoordinates(coordinates);

            return(tookChunk[cubePositionInChunk]);
        }
        public bool ChunkExistsAt(CubeCoordinates coordinates)
        {
            var dataOffset = GetChunkDataOffset(coordinates);

            if (dataOffset == -1)
            {
                return(false);
            }
            else
            {
                return(true);
            }
        }
Example #10
0
        public void LoadChunk(CubeCoordinates chunkCoordinates)
        {
            var gotChunk = GetChunkAt(chunkCoordinates);

            if (gotChunk != null)
            {
                LoadedChunks.Add(gotChunk);
            }
            else
            {
                LoadedChunks.Add(new CubeChunk(chunkCoordinates));                 // TODO: ForceGetChunkAt
            }
        }
        public CubeChunk GetChunkAt(CubeCoordinates coordinates)
        {
            var dataOffset = GetChunkDataOffset(coordinates);

            if (dataOffset == -1)
            {
                return(null);
            }
            else
            {
                var readChunk = new CubeChunk(coordinates);
                ReadChunkData(ref readChunk, (int)dataOffset);
                return(readChunk);
            }
        }
        public bool ChunkExistsAt(CubeCoordinates coordinates)
        {
            var gotChunk = (from chunk in chunks
                            where chunk.Coordinates.Equals(coordinates)
                            select chunk).FirstOrDefault();

            if (gotChunk == null)
            {
                return(false);
            }
            else
            {
                return(true);
            }
        }
Example #13
0
        void UnloadFarChunks(CubeCoordinates playerCoordinates) // TODO: no need this argument now
        {
            int viewingCubes = CubeChunk.Size * Nocubeless.Settings.Graphics.ChunkViewDistance;
            int min          = -(viewingCubes / 2);
            int max          = viewingCubes / 2;

            for (int i = 0; i < Nocubeless.CubeWorld.LoadedChunks.Count; i++)
            {
                var playerMinCoordinates = CubeChunkHelper.FindBaseCoordinates(new CubeCoordinates(playerCoordinates.X + min, playerCoordinates.Y + min, playerCoordinates.Z + min));
                var playerMaxCoordinates = CubeChunkHelper.FindBaseCoordinates(new CubeCoordinates(playerCoordinates.X + max, playerCoordinates.Y + max, playerCoordinates.Z + max));

                if (Nocubeless.CubeWorld.LoadedChunks[i].Coordinates <playerMinCoordinates ||
                                                                      Nocubeless.CubeWorld.LoadedChunks[i].Coordinates> playerMaxCoordinates)
                {
                    var gotChunk = Nocubeless.CubeWorld.TakeChunkAt(Nocubeless.CubeWorld.LoadedChunks[i].Coordinates);
                    Nocubeless.CubeWorld.UnloadChunk(gotChunk);
                }
            }
        }
        public override void Process()
        {
            if (Input.WasJustPressed(Nocubeless.Settings.Keys.ToggleLayBreak))
            {
                shouldLayCube = !shouldLayCube;
            }

            if (Input.WasMiddleMouseButtonJustPressed())
            {
                Pick();
            }

            if (shouldLayCube)
            {
                CubeCoordinates cubeToPreviewPosition = Nocubeless.CubeWorld.GetTargetedNewCube((PlayingCamera)Nocubeless.Camera, Nocubeless.Settings.CubeHandler.MaxLayingDistance);
                Cube            cubeToLay             = new Cube(Nocubeless.Player.NextColorToLay, cubeToPreviewPosition);

                if (!AreColliding(Nocubeless.Player, cubeToLay))
                {
                    Nocubeless.CubeWorld.PreviewCube(cubeToLay);

                    if (Input.WasRightMouseButtonJustPressed())
                    {
                        Nocubeless.CubeWorld.LayCube(cubeToLay);
                    }
                }
                else
                {
                    Nocubeless.CubeWorld.PreviewCube(null);
                }
            }
            else
            {             // break
                Nocubeless.CubeWorld.PreviewCube(null);

                if (Input.WasLeftMouseButtonJustPressed())
                {
                    CubeCoordinates cubeToBreakPosition = Nocubeless.CubeWorld.GetTargetedCube((PlayingCamera)Nocubeless.Camera, Nocubeless.Settings.CubeHandler.MaxLayingDistance);
                    Nocubeless.CubeWorld.BreakCube(cubeToBreakPosition);
                }
            }
        }
        public CubeChunk GetChunkAt(CubeCoordinates coordinates)
        {
            var gotChunk = (from chunk in chunks
                            where chunk.Coordinates.Equals(coordinates)
                            select chunk).FirstOrDefault();

            if (gotChunk != null) // shallow copy
            {
                var newChunk = new CubeChunk(gotChunk.Coordinates);
                for (int i = 0; i < CubeChunk.TotalSize; i++)
                {
                    newChunk[i] = gotChunk[i];
                }
                return(newChunk);
            }
            else
            {
                return(null);
            }
        }
Example #16
0
        public bool IsFreeSpace(CubeCoordinates coordinates)         // TO-OPTIMIZE
        {
            var chunkCoordinates = CubeChunkHelper.FindBaseCoordinates(coordinates);

            var gotChunk = (from chunk in LoadedChunks
                            where chunk.Coordinates == chunkCoordinates
                            select chunk).FirstOrDefault();

            if (gotChunk == null)             // don't try to check in a not loaded chunk, or it will crash
            {
                return(false);
            }

            int cubePositionInChunk = CubeChunkHelper.GetIndexFromCoordinates(coordinates);

            if (!(gotChunk[cubePositionInChunk] == null))
            {
                return(false);
            }

            return(true);
        }
        private int GetChunkDataOffset(CubeCoordinates chunkCoordinates)
        {
            int dataSize = CubeChunk.TotalSize * 3;
            var stream   = File.OpenRead(FilePath);

            using (var reader = new BinaryReader(stream))
            {
                while (stream.Position < stream.Length)
                {
                    var foundCoordinates = new CubeCoordinates(reader.ReadInt32(),
                                                               reader.ReadInt32(),
                                                               reader.ReadInt32());

                    if (foundCoordinates == chunkCoordinates)
                    {
                        return((int)stream.Position);
                    }

                    stream.Seek(dataSize, SeekOrigin.Current); // jump to the next coordinates
                }
            }

            return(-1); // no offset found
        }
Example #18
0
        private void LoadChunks(CubeCoordinates playerCoordinates) // it's the big cube algorithm
        {
            int viewingCubes = CubeChunk.Size * Nocubeless.Settings.Graphics.ChunkViewDistance;
            int min          = -(viewingCubes / 2);
            int max          = viewingCubes / 2;

            for (int x = min; x < max; x += CubeChunk.Size)
            {
                for (int y = min; y < max; y += CubeChunk.Size)
                {
                    for (int z = min; z < max; z += CubeChunk.Size)
                    { // explore chunks to load
                        var chunkCoordinates = CubeChunkHelper.FindBaseCoordinates(new CubeCoordinates(playerCoordinates.X + x, playerCoordinates.Y + y, playerCoordinates.Z + z));

                        var tookChunk = Nocubeless.CubeWorld.TakeChunkAt(chunkCoordinates);

                        if (tookChunk == null)
                        {
                            Nocubeless.CubeWorld.LoadChunk(chunkCoordinates);
                        }
                    }
                }
            }
        }
 private static void WriteChunkCoordinates(CubeCoordinates chunkCoordinates, BinaryWriter writer)
 {
     writer.Write(chunkCoordinates.X);
     writer.Write(chunkCoordinates.Y);
     writer.Write(chunkCoordinates.Z);
 }
Example #20
0
 public Cube(CubeColor color, CubeCoordinates position)
 {
     Coordinates = position;
     Color       = color;
 }
Example #21
0
 public WorldCoordinates(CubeCoordinates coordinates, Vector3 positionOnCube)
     : base(coordinates.X, coordinates.Y, coordinates.Z)
 {
     PositionOnCurrentCube = positionOnCube;
 }
Example #22
0
 private CubeChunk GetChunkAt(CubeCoordinates coordinates)
 {
     return(Handler.GetChunkAt(coordinates));
 }
Example #23
0
 public CubeChunk TakeChunkAt(CubeCoordinates chunkCoordinates)
 {
     return((from chunk in LoadedChunks
             where chunk.Coordinates == chunkCoordinates
             select chunk).FirstOrDefault());
 }
Example #24
0
        public CubeChunk(CubeCoordinates coordinates)
        {
            Coordinates = coordinates;

            cubeColors = new CubeColor[Size * Size * Size];
        }