make all BSP-related tags size_t so they can store pointers

The tags are often initially assigned from pointers and then copied
around, even from one tag type to the other.
As BSPTree::MoveSubTreeToArray() uses them to get the original pointer,
we need the pointers anyway, so just CRC-ing the pointers doesn't seem
like a good option. As the tags are assigned from other tag-types
sometimes, I probably would have needed to add Pointers for the same
values in addition to the ULONG tags, that are also copied around along
the tags, to keep the tags ULONG - that seemed like a worse alternative.

However, when writing (via BSPTree::Write_t()) the bn_ulPlaneTag tag
needs to be ULONG, so there I actually use CRC for 64bit pointers (via
IntPtrToID()) - when restoring (in Read_t()), the pointers aren't valid
anymore anyway, so that all should somehow be fine.
I assume that Write_t() is only used by the Editor, anyway, so I fear I
won't be able to test that part of the code on Linux anytime soon.
This commit is contained in:
Daniel Gibson 2016-04-20 17:33:18 +02:00
parent b437abf10d
commit d228b6a7a7
2 changed files with 18 additions and 19 deletions

View File

@ -19,6 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <Engine/Templates/BSP_internal.h> #include <Engine/Templates/BSP_internal.h>
#include <Engine/Base/Stream.h> #include <Engine/Base/Stream.h>
#include <Engine/Base/CRC.h>
#include <Engine/Math/Vector.h> #include <Engine/Math/Vector.h>
#include <Engine/Math/Plane.h> #include <Engine/Math/Plane.h>
#include <Engine/Math/OBBox.h> #include <Engine/Math/OBBox.h>
@ -219,7 +220,7 @@ void BSPVertexContainer<Type, iDimensions>::ElliminatePairedVertices(void)
* Create edges from vertices in one container -- must be sorted before. * Create edges from vertices in one container -- must be sorted before.
*/ */
template<class Type, int iDimensions> template<class Type, int iDimensions>
void BSPVertexContainer<Type, iDimensions>::CreateEdges(CDynamicArray<BSPEdge<Type, iDimensions> > &abed, ULONG ulEdgeTag) void BSPVertexContainer<Type, iDimensions>::CreateEdges(CDynamicArray<BSPEdge<Type, iDimensions> > &abed, size_t ulEdgeTag)
{ {
// if there are no vertices, or the container is not line // if there are no vertices, or the container is not line
if (bvc_aVertices.Count()==0 || IsPlannar()) { if (bvc_aVertices.Count()==0 || IsPlannar()) {
@ -372,7 +373,7 @@ void BSPEdge<Type, iDimensions>::OptimizeBSPEdges(CDynamicArray<BSPEdge<Type, iD
* Add an edge to the polygon. * Add an edge to the polygon.
*/ */
template<class Type, int iDimensions> template<class Type, int iDimensions>
inline void BSPPolygon<Type, iDimensions>::AddEdge(const Vector<Type, iDimensions> &vPoint0, const Vector<Type, iDimensions> &vPoint1, ULONG ulTag) inline void BSPPolygon<Type, iDimensions>::AddEdge(const Vector<Type, iDimensions> &vPoint0, const Vector<Type, iDimensions> &vPoint1, size_t ulTag)
{ {
*bpo_abedPolygonEdges.New() = BSPEdge<Type, iDimensions>(vPoint0, vPoint1, ulTag); *bpo_abedPolygonEdges.New() = BSPEdge<Type, iDimensions>(vPoint0, vPoint1, ulTag);
} }
@ -412,7 +413,7 @@ BSPNode<Type, iDimensions>::BSPNode(enum BSPNodeLocation bnl)
* Constructor for a branch node. * Constructor for a branch node.
*/ */
template<class Type, int iDimensions> template<class Type, int iDimensions>
BSPNode<Type, iDimensions>::BSPNode(const Plane<Type, iDimensions> &plSplitPlane, ULONG ulPlaneTag, BSPNode<Type, iDimensions>::BSPNode(const Plane<Type, iDimensions> &plSplitPlane, size_t ulPlaneTag,
BSPNode<Type, iDimensions> &bnFront, BSPNode<Type, iDimensions> &bnBack) BSPNode<Type, iDimensions> &bnFront, BSPNode<Type, iDimensions> &bnBack)
: Plane<Type, iDimensions>(plSplitPlane) : Plane<Type, iDimensions>(plSplitPlane)
, bn_pbnFront(&bnFront) , bn_pbnFront(&bnFront)
@ -731,7 +732,7 @@ void BSPCutter<Type, iDimensions>::CutPolygon(BSPPolygon<Type, iDimensions> &bpo
* -- returns FALSE if polygon is laying on the plane * -- returns FALSE if polygon is laying on the plane
*/ */
template<class Type, int iDimensions> template<class Type, int iDimensions>
BOOL BSPCutter<Type, iDimensions>::SplitPolygon(BSPPolygon<Type, iDimensions> &bpoPolygon, const Plane<Type, iDimensions> &plSplitPlane, ULONG ulPlaneTag, BOOL BSPCutter<Type, iDimensions>::SplitPolygon(BSPPolygon<Type, iDimensions> &bpoPolygon, const Plane<Type, iDimensions> &plSplitPlane, size_t ulPlaneTag,
BSPPolygon<Type, iDimensions> &bpoFront, BSPPolygon<Type, iDimensions> &bpoBack) BSPPolygon<Type, iDimensions> &bpoFront, BSPPolygon<Type, iDimensions> &bpoBack)
{ {
(Plane<Type, iDimensions> &)bpoFront = (Plane<Type, iDimensions> &)bpoPolygon; (Plane<Type, iDimensions> &)bpoFront = (Plane<Type, iDimensions> &)bpoPolygon;
@ -802,7 +803,7 @@ BOOL BSPCutter<Type, iDimensions>::SplitPolygon(BSPPolygon<Type, iDimensions> &b
* Split an edge with a plane. * Split an edge with a plane.
*/ */
template<class Type, int iDimensions> template<class Type, int iDimensions>
void BSPCutter<Type, iDimensions>::SplitEdge(const Vector<Type, iDimensions> &vPoint0, const Vector<Type, iDimensions> &vPoint1, ULONG ulEdgeTag, void BSPCutter<Type, iDimensions>::SplitEdge(const Vector<Type, iDimensions> &vPoint0, const Vector<Type, iDimensions> &vPoint1, size_t ulEdgeTag,
const Plane<Type, iDimensions> &plSplitPlane, const Plane<Type, iDimensions> &plSplitPlane,
BSPPolygon<Type, iDimensions> &bpoFront, BSPPolygon<Type, iDimensions> &bpoBack, BSPPolygon<Type, iDimensions> &bpoFront, BSPPolygon<Type, iDimensions> &bpoBack,
BSPVertexContainer<Type, iDimensions> &bvcFront, BSPVertexContainer<Type, iDimensions> &bvcBack) BSPVertexContainer<Type, iDimensions> &bvcFront, BSPVertexContainer<Type, iDimensions> &bvcBack)
@ -1132,20 +1133,17 @@ void BSPTree<Type, iDimensions>::MoveSubTreeToArray(BSPNode<Type, iDimensions> *
bnInArray.bn_bnlLocation = pbnSubtree->bn_bnlLocation; bnInArray.bn_bnlLocation = pbnSubtree->bn_bnlLocation;
bnInArray.bn_ulPlaneTag = pbnSubtree->bn_ulPlaneTag; bnInArray.bn_ulPlaneTag = pbnSubtree->bn_ulPlaneTag;
// let plane tag hold pointer to node in array // let plane tag hold pointer to node in array
STUBBED("64-bit issue"); pbnSubtree->bn_ulPlaneTag = (size_t)&bnInArray;
pbnSubtree->bn_ulPlaneTag = (ULONG)(size_t)&bnInArray;
// remap pointers to subnodes // remap pointers to subnodes
if (pbnSubtree->bn_pbnFront==NULL) { if (pbnSubtree->bn_pbnFront==NULL) {
bnInArray.bn_pbnFront = NULL; bnInArray.bn_pbnFront = NULL;
} else { } else {
STUBBED("64-bit issue"); // bn_ulPlaneTag is uint32!
bnInArray.bn_pbnFront = (BSPNode<Type, iDimensions>*)pbnSubtree->bn_pbnFront->bn_ulPlaneTag; bnInArray.bn_pbnFront = (BSPNode<Type, iDimensions>*)pbnSubtree->bn_pbnFront->bn_ulPlaneTag;
} }
if (pbnSubtree->bn_pbnBack==NULL) { if (pbnSubtree->bn_pbnBack==NULL) {
bnInArray.bn_pbnBack = NULL; bnInArray.bn_pbnBack = NULL;
} else { } else {
STUBBED("64-bit issue"); // basically the same as above but for back!
bnInArray.bn_pbnBack = (BSPNode<Type, iDimensions>*)pbnSubtree->bn_pbnBack->bn_ulPlaneTag; bnInArray.bn_pbnBack = (BSPNode<Type, iDimensions>*)pbnSubtree->bn_pbnBack->bn_ulPlaneTag;
} }
} }
@ -1232,8 +1230,9 @@ void BSPTree<Type, iDimensions>::Read_t(CTStream &strm) // throw char *
} else { } else {
bn.bn_pbnBack = &bt_abnNodes[iBack]; bn.bn_pbnBack = &bt_abnNodes[iBack];
} }
ULONG ul;
strm>>bn.bn_ulPlaneTag; strm>>ul;
bn.bn_ulPlaneTag = ul;
} }
// check end id // check end id
@ -1283,7 +1282,7 @@ void BSPTree<Type, iDimensions>::Write_t(CTStream &strm) // throw char *
} }
strm<<iBack; strm<<iBack;
strm<<bn.bn_ulPlaneTag; strm<<IntPtrToID(bn.bn_ulPlaneTag);
} }
// write end id for checking // write end id for checking
strm.WriteID_t("BSPE"); // bsp end strm.WriteID_t("BSPE"); // bsp end

View File

@ -76,7 +76,7 @@ public:
/* Elliminate paired vertices. */ /* Elliminate paired vertices. */
void ElliminatePairedVertices(void); void ElliminatePairedVertices(void);
/* Create edges from vertices in one container -- must be sorted before. */ /* Create edges from vertices in one container -- must be sorted before. */
void CreateEdges(CDynamicArray<BSPEdge<Type, iDimensions> > &abedAll, ULONG ulEdgeTag); void CreateEdges(CDynamicArray<BSPEdge<Type, iDimensions> > &abedAll, size_t ulEdgeTag);
}; };
/* /*
@ -87,7 +87,7 @@ class BSPEdge {
public: public:
Vector<Type, iDimensions> bed_vVertex0; // edge vertices Vector<Type, iDimensions> bed_vVertex0; // edge vertices
Vector<Type, iDimensions> bed_vVertex1; Vector<Type, iDimensions> bed_vVertex1;
size_t bed_ulEdgeTag; // tags for BSPs with tagged edges/planes - FIXME DG: or uintprt_t? size_t bed_ulEdgeTag; // tags for BSPs with tagged edges/planes
/* Default constructor. */ /* Default constructor. */
inline BSPEdge(void) {}; inline BSPEdge(void) {};
@ -113,7 +113,7 @@ public:
size_t bpo_ulPlaneTag; // tags for BSPs with tagged planes (-1 for no tag) size_t bpo_ulPlaneTag; // tags for BSPs with tagged planes (-1 for no tag)
/* Add an edge to the polygon. */ /* Add an edge to the polygon. */
inline void AddEdge(const Vector<Type, iDimensions> &vPoint0, const Vector<Type, iDimensions> &vPoint1, ULONG ulTag); inline void AddEdge(const Vector<Type, iDimensions> &vPoint0, const Vector<Type, iDimensions> &vPoint1, size_t ulTag);
/* Default constructor. */ /* Default constructor. */
inline BSPPolygon(void) : bpo_ulPlaneTag(-1) {}; inline BSPPolygon(void) : bpo_ulPlaneTag(-1) {};
@ -146,7 +146,7 @@ public:
BSPNode<Type, iDimensions> *bn_pbnFront; // pointer to child node in front of split plane BSPNode<Type, iDimensions> *bn_pbnFront; // pointer to child node in front of split plane
BSPNode<Type, iDimensions> *bn_pbnBack; // pointer to child node behind split plane BSPNode<Type, iDimensions> *bn_pbnBack; // pointer to child node behind split plane
ULONG bn_ulPlaneTag; // tags for BSPs with tagged planes (-1 for no tag) size_t bn_ulPlaneTag; // tags for BSPs with tagged planes (-1 for no tag)
public: public:
/* Defualt constructor (for arrays only). */ /* Defualt constructor (for arrays only). */
@ -154,7 +154,7 @@ public:
/* Constructor for a leaf node. */ /* Constructor for a leaf node. */
inline BSPNode(enum BSPNodeLocation bnl); inline BSPNode(enum BSPNodeLocation bnl);
/* Constructor for a branch node. */ /* Constructor for a branch node. */
inline BSPNode(const Plane<Type, iDimensions> &plSplitPlane, ULONG ulPlaneTag, inline BSPNode(const Plane<Type, iDimensions> &plSplitPlane, size_t ulPlaneTag,
BSPNode<Type, iDimensions> &bnFront, BSPNode<Type, iDimensions> &bnBack); BSPNode<Type, iDimensions> &bnFront, BSPNode<Type, iDimensions> &bnBack);
/* Constructor for cloning a bsp (sub)tree. */ /* Constructor for cloning a bsp (sub)tree. */
BSPNode(BSPNode<Type, iDimensions> &bnRoot); BSPNode(BSPNode<Type, iDimensions> &bnRoot);
@ -180,7 +180,7 @@ template<class Type, int iDimensions>
class BSPCutter { class BSPCutter {
public: public:
/* Split an edge with a plane. */ /* Split an edge with a plane. */
static inline void SplitEdge(const Vector<Type, iDimensions> &vPoint0, const Vector<Type, iDimensions> &vPoint1, ULONG ulEdgeTag, static inline void SplitEdge(const Vector<Type, iDimensions> &vPoint0, const Vector<Type, iDimensions> &vPoint1, size_t ulEdgeTag,
const Plane<Type, iDimensions> &plSplitPlane, const Plane<Type, iDimensions> &plSplitPlane,
BSPPolygon<Type, iDimensions> &abedFront, BSPPolygon<Type, iDimensions> &abedBack, BSPPolygon<Type, iDimensions> &abedFront, BSPPolygon<Type, iDimensions> &abedBack,
BSPVertexContainer<Type, iDimensions> &bvcFront, BSPVertexContainer<Type, iDimensions> &bvcBack); BSPVertexContainer<Type, iDimensions> &bvcFront, BSPVertexContainer<Type, iDimensions> &bvcBack);
@ -195,7 +195,7 @@ public:
CDynamicArray<BSPEdge<Type, iDimensions> > bc_abedBorderOutside;// edges of border part of polygon facing outwards CDynamicArray<BSPEdge<Type, iDimensions> > bc_abedBorderOutside;// edges of border part of polygon facing outwards
/* Split a polygon with a plane. */ /* Split a polygon with a plane. */
static inline BOOL SplitPolygon(BSPPolygon<Type, iDimensions> &bpoPolygon, const Plane<Type, iDimensions> &plPlane, ULONG ulPlaneTag, static inline BOOL SplitPolygon(BSPPolygon<Type, iDimensions> &bpoPolygon, const Plane<Type, iDimensions> &plPlane, size_t ulPlaneTag,
BSPPolygon<Type, iDimensions> &bpoFront, BSPPolygon<Type, iDimensions> &bpoBack); BSPPolygon<Type, iDimensions> &bpoFront, BSPPolygon<Type, iDimensions> &bpoBack);
/* Constructor for splitting a polygon with a BSP tree. */ /* Constructor for splitting a polygon with a BSP tree. */