Ejemplo n.º 1
0
 protected bool Equals(VoxelBlock other)
 {
     return(Equals(block, other.block) && RelativePosition.Equals(other.RelativePosition) && Equals(TerrainChunk, other.TerrainChunk));
 }
Ejemplo n.º 2
0
 public Vector3 GetPositionOf(VoxelBlock block)
 {
     return(block.RelativePosition.ToVector3() * block.TerrainChunk.NodeSize + block.TerrainChunk.WorldPosition);
 }
Ejemplo n.º 3
0
        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);
 }