diff options
author | Tiger Wang <ziwei.tiger@outlook.com> | 2022-02-12 15:57:26 +0100 |
---|---|---|
committer | Tiger Wang <ziwei.tiger@outlook.com> | 2022-07-19 23:33:09 +0200 |
commit | 9d0623a6653af85e139addb3d95aeb4f3f3dcfff (patch) | |
tree | 9858a908b5fb2b6c67f614cd4adbd38568fe919e /src/Physics/Tracers/BlockTracer.h | |
parent | Pickups: improve coalescing implementation (diff) | |
download | cuberite-9d0623a6653af85e139addb3d95aeb4f3f3dcfff.tar cuberite-9d0623a6653af85e139addb3d95aeb4f3f3dcfff.tar.gz cuberite-9d0623a6653af85e139addb3d95aeb4f3f3dcfff.tar.bz2 cuberite-9d0623a6653af85e139addb3d95aeb4f3f3dcfff.tar.lz cuberite-9d0623a6653af85e139addb3d95aeb4f3f3dcfff.tar.xz cuberite-9d0623a6653af85e139addb3d95aeb4f3f3dcfff.tar.zst cuberite-9d0623a6653af85e139addb3d95aeb4f3f3dcfff.zip |
Diffstat (limited to 'src/Physics/Tracers/BlockTracer.h')
-rw-r--r-- | src/Physics/Tracers/BlockTracer.h | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/src/Physics/Tracers/BlockTracer.h b/src/Physics/Tracers/BlockTracer.h new file mode 100644 index 000000000..62ae1636e --- /dev/null +++ b/src/Physics/Tracers/BlockTracer.h @@ -0,0 +1,126 @@ + +// BlockTracer.h + +// Declares the classes common for all blocktracers + + + + + +#pragma once + + + + + +#include "Defines.h" +#include "ChunkDef.h" + + + + +// fwd: World.h +class cWorld; + + + + + +class cBlockTracer abstract +{ +public: + /** The callback class is used to notify the caller of individual events that are being traced. + */ + class cCallbacks abstract + { + public: + // Force a virtual destructor in descendants: + virtual ~cCallbacks() {} + + /** Called on each block encountered along the path, including the first block (path start) + When this callback returns true, the tracing is aborted. + */ + virtual bool OnNextBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, eBlockFace a_EntryFace) = 0; + + /** Called on each block encountered along the path, including the first block (path start), if chunk data is not loaded + When this callback returns true, the tracing is aborted. + */ + virtual bool OnNextBlockNoData(Vector3i a_BlockPos, eBlockFace a_EntryFace) + { + UNUSED(a_BlockPos); + UNUSED(a_EntryFace); + return false; + } + + /** Called when the path goes out of world, either below (a_BlockPos.y < 0) or above (a_BlockPos.y >= cChunkDef::Height) + The coords specify the exact point at which the path exited the world. + If this callback returns true, the tracing is aborted. + Note that some paths can go out of the world and come back again (parabola), + in such a case this callback is followed by OnIntoWorld() and further OnNextBlock() calls + */ + virtual bool OnOutOfWorld(Vector3d a_BlockPos) + { + UNUSED(a_BlockPos); + return false; + } + + /** Called when the path goes into the world, from either below (a_BlockPos.y < 0) or above (a_BlockPos.y >= cChunkDef::Height) + The coords specify the exact point at which the path entered the world. + If this callback returns true, the tracing is aborted. + Note that some paths can go out of the world and come back again (parabola), + in such a case this callback is followed by further OnNextBlock() calls + */ + virtual bool OnIntoWorld(Vector3d a_BlockPos) + { + UNUSED(a_BlockPos); + return false; + } + + /** Called when the path is sure not to hit any more blocks. + Note that for some shapes this might never happen (line with constant Y) + */ + virtual void OnNoMoreHits(void) {} + + /** Called when the block tracing walks into a chunk that is not allocated. + This usually means that the tracing is aborted. + */ + virtual void OnNoChunk(void) {} + } ; + + + /** Creates the BlockTracer parent with the specified callbacks */ + cBlockTracer(cWorld & a_World, cCallbacks & a_Callbacks) : + m_World(&a_World), + m_Callbacks(&a_Callbacks) + { + } + + + /** Sets new world, returns the old one. Note that both need to be valid */ + cWorld & SetWorld(cWorld & a_World) + { + cWorld & Old = *m_World; + m_World = &a_World; + return Old; + } + + + /** Sets new callbacks, returns the old ones. Note that both need to be valid */ + cCallbacks & SetCallbacks(cCallbacks & a_NewCallbacks) + { + cCallbacks & Old = *m_Callbacks; + m_Callbacks = &a_NewCallbacks; + return Old; + } + +protected: + /** The world upon which to operate */ + cWorld * m_World; + + /** The callback to use for reporting */ + cCallbacks * m_Callbacks; +} ; + + + + |