예제 #1
0
        public static bool CheckCollision(Vector3 point)
        {
            Vector2 chunkPosition = new Vector2((int)point.X / SubChunk.WIDTH, (int)point.Z / SubChunk.DEPTH);
            Vector3 localPosition = new Vector3((int)point.X - (chunkPosition.X * SubChunk.WIDTH),
                                                (int)point.Y,
                                                (int)point.Z - (chunkPosition.Y * SubChunk.DEPTH));

            // Offset
            localPosition += new Vector3(0.5f, 0.5f, 0.5f);

            Vector3 chunkPos3 = new Vector3(chunkPosition.X, 0, chunkPosition.Y);


            var m = Mouse.GetState();


            if (localPosition.Y > Chunk.MAX_BLOCK_HEIGHT - 1 || localPosition.Y < 0)
            {
                return(false);
            }

            if (point.X < 0)
            {
                if (point.X % SubChunk.WIDTH != 0)
                {
                    chunkPosition.X = (int)point.X / SubChunk.WIDTH - 1;
                }

                localPosition.X = point.X - (SubChunk.WIDTH * chunkPosition.X);
            }
            if (point.Z < 0)
            {
                if (point.Z % SubChunk.DEPTH != 0)
                {
                    chunkPosition.Y = (int)point.Z / SubChunk.DEPTH - 1;
                }

                localPosition.Z = point.Z - (SubChunk.WIDTH * chunkPosition.Y);
            }

            if (IsChunkLoaded(chunkPosition))
            {
                Chunk chunk = LoadedChunks[chunkPosition];
                return(chunk.GetBlock(localPosition) != Blocks.Air);
            }

            return(false);
        }
예제 #2
0
        public static bool IsPointColliding(Vector3 point)
        {
            Vector2 chunkPosition = new Vector2((int)point.X / SubChunk.WIDTH, (int)point.Z / SubChunk.WIDTH);
            Vector3 localPosition = new Vector3((int)point.X - (chunkPosition.X * SubChunk.WIDTH),
                                                (int)point.Y,
                                                (int)point.Z - (chunkPosition.Y * SubChunk.DEPTH));

            // Offset
            localPosition += new Vector3(0.5f, 0.5f, 0.5f);

            Vector3 chunkPos3 = new Vector3(chunkPosition.X, 0, chunkPosition.Y);

            if (localPosition.Y > 255 || localPosition.Y < 0)
            {
                return(false);
            }

            if (point.X < 0)
            {
                if (point.X % SubChunk.WIDTH != 0)
                {
                    chunkPosition.X = (int)point.X / SubChunk.WIDTH - 1;
                }

                localPosition.X = point.X - (SubChunk.WIDTH * chunkPosition.X);
            }
            if (point.Z < 0)
            {
                if (point.Z % SubChunk.DEPTH != 0)
                {
                    chunkPosition.Y = (int)point.Z / SubChunk.DEPTH - 1;
                }

                localPosition.Z = point.Z - (SubChunk.DEPTH * chunkPosition.Y);
            }

            if (IsChunkLoaded(chunkPosition))
            {
                Chunk chunk = LoadedChunks[chunkPosition];

                // Collision!
                return(chunk.GetBlock(localPosition) != Blocks.Air);
            }
            return(false);
        }
예제 #3
0
        public static CollisionResult?RaycastCollision(Raycast ray)
        {
            Vector3 startPoint = ray.Start;
            Vector3 endPoint   = ray.End;
            float   length     = Vector3.Distance(startPoint, endPoint);

            for (int i = 0; i < length * 8; i++)
            {
                Vector3 point         = Vector3.Lerp(startPoint, endPoint, (i / 8f) / (length));
                Vector2 chunkPosition = new Vector2((int)point.X / SubChunk.WIDTH, (int)point.Z / SubChunk.DEPTH);
                Vector3 localPosition = new Vector3((int)point.X - (chunkPosition.X * SubChunk.DEPTH),
                                                    (int)point.Y,
                                                    (int)point.Z - (chunkPosition.Y * SubChunk.DEPTH));

                // Offset
                localPosition += new Vector3(0.5f, 0.5f, 0.5f);

                Vector3 chunkPos3 = new Vector3(chunkPosition.X, 0, chunkPosition.Y);

                if (localPosition.Y > Chunk.HEIGHT * SubChunk.HEIGHT - 1 || localPosition.Y < 0)
                {
                    return(null);
                }

                if (point.X < 0)
                {
                    if (point.X % SubChunk.WIDTH != 0)
                    {
                        chunkPosition.X = (int)point.X / SubChunk.WIDTH - 1;
                    }

                    localPosition.X = point.X - (SubChunk.WIDTH * chunkPosition.X);
                }
                if (point.Z < 0)
                {
                    if (point.Z % SubChunk.DEPTH != 0)
                    {
                        chunkPosition.Y = (int)point.Z / SubChunk.DEPTH - 1;
                    }

                    localPosition.Z = point.Z - (SubChunk.DEPTH * chunkPosition.Y);
                }

                if (IsChunkLoaded(chunkPosition))
                {
                    Chunk chunk = LoadedChunks[chunkPosition];

                    // Collision!
                    Blocks blockType = chunk.GetBlock(localPosition);
                    if (blockType != Blocks.Air)
                    {
                        CollisionResult result = new CollisionResult()
                        {
                            GlobalPosition = point,
                            VoxelPosition  = localPosition + (chunkPos3 * SubChunk.WIDTH),
                            BlockType      = blockType
                        };
                        return(result);
                    }
                }
            }
            return(null);
        }