diff options
author | Tiger Wang <ziwei.tiger@outlook.com> | 2022-07-11 00:56:25 +0200 |
---|---|---|
committer | Tiger Wang <ziwei.tiger@outlook.com> | 2022-07-19 23:33:09 +0200 |
commit | 284f54ed81186d3122b994db7395e870703efb4f (patch) | |
tree | 51a4b5c4a7e9fdde460c84117ea8f9ea6ed97393 /src/Physics/Tracers/LineBlockTracer.h | |
parent | Move LineBlockTracer into Physics (diff) | |
download | cuberite-Megumin.tar cuberite-Megumin.tar.gz cuberite-Megumin.tar.bz2 cuberite-Megumin.tar.lz cuberite-Megumin.tar.xz cuberite-Megumin.tar.zst cuberite-Megumin.zip |
Diffstat (limited to 'src/Physics/Tracers/LineBlockTracer.h')
-rw-r--r-- | src/Physics/Tracers/LineBlockTracer.h | 78 |
1 files changed, 15 insertions, 63 deletions
diff --git a/src/Physics/Tracers/LineBlockTracer.h b/src/Physics/Tracers/LineBlockTracer.h index b1dacee20..41b26c354 100644 --- a/src/Physics/Tracers/LineBlockTracer.h +++ b/src/Physics/Tracers/LineBlockTracer.h @@ -1,7 +1,7 @@ // LineBlockTracer.h -// Declares the cLineBlockTracer class representing a cBlockTracer that traces along a straight line between two points +// Declares the LineBlockTracer namespace representing a tracer that visits every block along a straight line between two points @@ -15,47 +15,36 @@ -// fwd: Chunk.h class cChunk; +class cWorld; -class cLineBlockTracer: - public cBlockTracer +namespace LineBlockTracer { - using Super = cBlockTracer; - -public: - - enum eLineOfSight + /* Bit flags used for LineOfSightTrace's Sight parameter. */ + enum LineOfSight { - // Bit flags used for LineOfSightTrace's Sight parameter: - losAir = 1, // Can see through air - losWater = 2, // Can see through water - losLava = 4, // Can see through lava + Air = 1, // Can see through air. + Water = 2, // Can see through water. + Lava = 4, // Can see through lava. // Common combinations: - losAirWaterLava = losAir | losWater | losLava, - losAirWater = losAir | losWater, + AirWaterLava = Air | Water | Lava, + AirWater = Air | Water, }; - - cLineBlockTracer(cWorld & a_World, cCallbacks & a_Callbacks); - /** Traces one line between Start and End; returns true if the entire line was traced (until OnNoMoreHits()) */ - bool Trace(Vector3d a_Start, Vector3d a_End); - - - // Utility functions for simple one-line usage: + bool Trace(const cChunk & a_Chunk, BlockTracerCallbacks & a_Callbacks, Vector3d a_Start, Vector3d a_End); /** Traces one line between Start and End; returns true if the entire line was traced (until OnNoMoreHits()) */ - static bool Trace(cWorld & a_World, cCallbacks & a_Callbacks, const Vector3d a_Start, const Vector3d a_End); + bool Trace(cWorld & a_World, BlockTracerCallbacks & a_Callbacks, const Vector3d a_Start, const Vector3d a_End); /** Returns true if the two positions are within line of sight (not obscured by blocks). a_Sight specifies which blocks are considered transparent for the trace, is an OR-combination of eLineOfSight constants. */ - static bool LineOfSightTrace(cWorld & a_World, const Vector3d & a_Start, const Vector3d & a_End, int a_Sight); + bool LineOfSightTrace(cWorld & a_World, const Vector3d & a_Start, const Vector3d & a_End, LineOfSight a_Sight); /** Traces until the first solid block is hit (or until end, whichever comes first. If a solid block was hit, returns true and fills a_HitCoords, a_HitBlockCoords and a_HitBlockFace. @@ -63,48 +52,11 @@ public: a_HitCoords is the exact coords of the hit, a_HitBlockCoords are the coords of the solid block that was hit, a_HitBlockFace is the face of the solid block that was hit. */ - static bool FirstSolidHitTrace( + bool FirstSolidHitTrace( cWorld & a_World, const Vector3d & a_Start, const Vector3d & a_End, Vector3d & a_HitCoords, Vector3i & a_HitBlockCoords, eBlockFace & a_HitBlockFace ); - -protected: - /** The start point of the trace */ - Vector3d m_Start; - - /** The end point of the trace */ - Vector3d m_End; - - /** The difference in coords, End - Start */ - Vector3d m_Diff; - - /** The increment at which the block coords are going from Start to End; either +1 or -1 */ - Vector3i m_Dir; - - /** The current block */ - Vector3i m_Current; - - /** The face through which the current block has been entered */ - eBlockFace m_CurrentFace; - - - /** Adjusts the start point above the world to just at the world's top */ - void FixStartAboveWorld(void); - - /** Adjusts the start point below the world to just at the world's bottom */ - void FixStartBelowWorld(void); - - /** Calculates the XZ coords of an intersection with the specified Yconst plane; assumes that such an intersection exists */ - void CalcXZIntersection(double a_Y, double & a_IntersectX, double & a_IntersectZ); - - /** Moves m_Current to the next block on the line; returns false if no move is possible (reached the end) */ - bool MoveToNextBlock(void); - - bool ChunkCallback(cChunk * a_Chunk); -} ; - - - +} |