// ClassicalSharp copyright 2014-2016 UnknownShadow200 | Licensed under MIT using System; using OpenTK; namespace ClassicalSharp { /// Describes the picked/selected block by the user and its position. public class PickedPos { /// Minimum world coordinates of the block's bounding box. public Vector3 Min; /// Maximum world coordinates of the block's bounding box. public Vector3 Max; /// Exact world coordinates at which the ray intersected this block. public Vector3 Intersect; /// Integer world coordinates of the block. public Vector3I BlockPos; /// Integer world coordinates of the neighbouring block that is closest to the player. public Vector3I TranslatedPos; /// Whether this instance actually has a selected block currently. public bool Valid = true; /// Face of the picked block that is closet to the player. public BlockFace BlockFace; /// Block ID of the picked block. public byte Block; /// Mark this as having a selected block, and /// calculates the closest face of the selected block's position. public void SetAsValid( int x, int y, int z, Vector3 min, Vector3 max, byte block, Vector3 intersect ) { Min = min; Max = max; BlockPos = new Vector3I( x, y, z ); Valid = true; Block = block; Intersect = intersect; Vector3I normal = Vector3I.Zero; float dist = float.PositiveInfinity; TestAxis( intersect.X - Min.X, ref dist, -Vector3I.UnitX, ref normal, BlockFace.XMin ); TestAxis( intersect.X - Max.X, ref dist, Vector3I.UnitX, ref normal, BlockFace.XMax ); TestAxis( intersect.Y - Min.Y, ref dist, -Vector3I.UnitY, ref normal, BlockFace.YMin ); TestAxis( intersect.Y - Max.Y, ref dist, Vector3I.UnitY, ref normal, BlockFace.YMax ); TestAxis( intersect.Z - Min.Z, ref dist, -Vector3I.UnitZ, ref normal, BlockFace.ZMin ); TestAxis( intersect.Z - Max.Z, ref dist, Vector3I.UnitZ, ref normal, BlockFace.ZMax ); TranslatedPos = BlockPos + normal; } /// Mark this as not having a selected block. public void SetAsInvalid() { Valid = false; BlockPos = TranslatedPos = Vector3I.MinusOne; BlockFace = (BlockFace)255; Block = 0; } void TestAxis( float dAxis, ref float dist, Vector3I nAxis, ref Vector3I normal, BlockFace fAxis) { dAxis = Math.Abs( dAxis ); if( dAxis >= dist ) return; dist = dAxis; normal = nAxis; BlockFace = fAxis; } } }