bsputils: add a helper struct for checking clipnode identity

This commit is contained in:
Eric Wasylishen 2022-08-15 23:06:00 -06:00
parent 2cc97c2519
commit f5a8bc7b99
2 changed files with 39 additions and 5 deletions

View File

@ -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)

View File

@ -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);