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