bsputils: add a helper struct for checking clipnode identity
This commit is contained in:
parent
2cc97c2519
commit
f5a8bc7b99
|
|
@ -447,29 +447,40 @@ const mleaf_t *BSP_FindLeafAtPoint(const mbsp_t *bsp, const dmodelh2_t *model, c
|
|||
return BSP_FindLeafAtPoint_r(bsp, model->headnode[0], point);
|
||||
}
|
||||
|
||||
static int BSP_FindClipnodeAtPoint_r(const mbsp_t *bsp, const int clipnodenum, const qvec3d &point)
|
||||
static clipnode_info_t BSP_FindClipnodeAtPoint_r(const mbsp_t *bsp, const int parent_clipnodenum, const planeside_t parent_side, const int clipnodenum, const qvec3d &point)
|
||||
{
|
||||
if (clipnodenum < 0) {
|
||||
// actually contents
|
||||
return clipnodenum;
|
||||
clipnode_info_t info;
|
||||
info.parent_clipnode = parent_clipnodenum;
|
||||
info.contents = clipnodenum;
|
||||
info.side = parent_side;
|
||||
return info;
|
||||
}
|
||||
|
||||
const auto *node = &bsp->dclipnodes.at(clipnodenum);
|
||||
const vec_t dist = bsp->dplanes[node->planenum].distance_to_fast(point);
|
||||
|
||||
if (dist >= 0) {
|
||||
return BSP_FindClipnodeAtPoint_r(bsp, node->children[0], point);
|
||||
return BSP_FindClipnodeAtPoint_r(bsp, clipnodenum, SIDE_FRONT, node->children[SIDE_FRONT], point);
|
||||
} else {
|
||||
return BSP_FindClipnodeAtPoint_r(bsp, node->children[1], point);
|
||||
return BSP_FindClipnodeAtPoint_r(bsp, clipnodenum, SIDE_BACK, node->children[SIDE_BACK], point);
|
||||
}
|
||||
}
|
||||
|
||||
clipnode_info_t BSP_FindClipnodeAtPoint(const mbsp_t *bsp, hull_index_t hullnum, const dmodelh2_t *model, const qvec3d &point)
|
||||
{
|
||||
Q_assert(hullnum.value() > 0);
|
||||
return BSP_FindClipnodeAtPoint_r(bsp, 0, static_cast<planeside_t>(-1), model->headnode.at(hullnum.value()), point);
|
||||
}
|
||||
|
||||
int BSP_FindContentsAtPoint(const mbsp_t *bsp, hull_index_t hullnum, const dmodelh2_t *model, const qvec3d &point)
|
||||
{
|
||||
if (!hullnum.value_or(0)) {
|
||||
return BSP_FindLeafAtPoint_r(bsp, model->headnode[0], point)->contents;
|
||||
}
|
||||
return BSP_FindClipnodeAtPoint_r(bsp, model->headnode.at(hullnum.value()), point);
|
||||
auto info = BSP_FindClipnodeAtPoint_r(bsp, 0, static_cast<planeside_t>(-1), model->headnode.at(hullnum.value()), point);
|
||||
return info.contents;
|
||||
}
|
||||
|
||||
std::vector<const mface_t *> Leaf_Markfaces(const mbsp_t *bsp, const mleaf_t *leaf)
|
||||
|
|
|
|||
|
|
@ -71,6 +71,29 @@ const bsp2_dnode_t *BSP_FindNodeAtPoint(
|
|||
const mbsp_t *bsp, const dmodelh2_t *model, const qvec3d &point, const qvec3d &wanted_normal);
|
||||
|
||||
const mleaf_t *BSP_FindLeafAtPoint(const mbsp_t *bsp, const dmodelh2_t *model, const qvec3d &point);
|
||||
|
||||
/**
|
||||
* Leaf nodes in the clipnode tree don't have an identity like hull0 leaf nodes,
|
||||
* so this struct helps tests determine if two clipnodes are the same.
|
||||
*/
|
||||
struct clipnode_info_t {
|
||||
/**
|
||||
* Index into bsp->dclipnodes
|
||||
*/
|
||||
int parent_clipnode;
|
||||
/**
|
||||
* Which side of `parent_clipnode` are we on
|
||||
*/
|
||||
planeside_t side;
|
||||
int contents;
|
||||
|
||||
bool operator==(const clipnode_info_t& other) const {
|
||||
return this->parent_clipnode == other.parent_clipnode
|
||||
&& this->side == other.side
|
||||
&& this->contents == other.contents;
|
||||
}
|
||||
};
|
||||
clipnode_info_t BSP_FindClipnodeAtPoint(const mbsp_t *bsp, hull_index_t hullnum, const dmodelh2_t *model, const qvec3d &point);
|
||||
int BSP_FindContentsAtPoint(const mbsp_t *bsp, hull_index_t hullnum, const dmodelh2_t *model, const qvec3d &point);
|
||||
|
||||
std::vector<const mface_t *> Leaf_Markfaces(const mbsp_t *bsp, const mleaf_t *leaf);
|
||||
|
|
|
|||
Loading…
Reference in New Issue