protected bool Equals(VoxelBlock other) { return(Equals(block, other.block) && RelativePosition.Equals(other.RelativePosition) && Equals(TerrainChunk, other.TerrainChunk)); }
public Vector3 GetPositionOf(VoxelBlock block) { return(block.RelativePosition.ToVector3() * block.TerrainChunk.NodeSize + block.TerrainChunk.WorldPosition); }
public VoxelBlock Raycast(Ray ray, out VoxelBlock emptyTargetedBlock) { VoxelBlock last = null; VoxelBlock ret = null; var traverser = new GridTraverser(); float?closest = null; foreach (VoxelTerrainChunk terr in TW.Data.Objects.Where(o => o is VoxelTerrainChunk)) { var trace = new RayTrace(); trace.Ray = ray; float?dist = trace.Ray.xna().Intersects(terr.GetBoundingBox().xna()); if (!dist.HasValue) { continue; } if (closest.HasValue && closest.Value < dist.Value) { continue; } trace.Start = dist.Value + 0.001f; traverser.NodeSize = terr.NodeSize; traverser.GridOffset = terr.WorldPosition; //TODO: fix multiple terrains var hit = false; VoxelTerrainChunk terr1 = terr; traverser.Traverse(trace, delegate(Point3 arg) { if (!terr1.InGrid(arg)) { return(true); } var voxelBlock = terr1.GetVoxelInternal(ref arg); if (voxelBlock == null) { return(false); } if (voxelBlock.Filled) { hit = true; ret = getChunkVoxelWrapper(terr1, arg); return(true); } last = getChunkVoxelWrapper(terr1, arg); return(false); }); if (hit) { closest = dist; } } emptyTargetedBlock = last; return(ret); }
private void raycastBlock() { targetedBlock = TW.Data.GetSingleton <VoxelTerrain>().Raycast(cameraInfo.GetCenterScreenRay(), out emptyTargetedBlock); }