qbsp: restore MergeAll
This commit is contained in:
parent
50ef495000
commit
70ea752587
|
|
@ -24,4 +24,4 @@
|
|||
#include <list>
|
||||
|
||||
void MergeFaceToList(face_t *face, std::list<face_t *> &list);
|
||||
void MergeAll(std::vector<surface_t> &surfhead);
|
||||
void MergeAll(node_t *headnode);
|
||||
|
|
|
|||
|
|
@ -25,4 +25,5 @@
|
|||
|
||||
std::vector<surface_t> GatherNodeFaces(node_t *headnode);
|
||||
void FreeNodes(node_t* node);
|
||||
void MakeVisibleFaces(mapentity_t *entity, node_t *headnode);
|
||||
void MakeVisibleFaces(mapentity_t *entity, node_t *headnode);
|
||||
void MakeMarkFaces(mapentity_t* entity, node_t* headnode);
|
||||
|
|
@ -167,7 +167,9 @@ void MergeFaceToList(face_t *face, std::list<face_t *> &list)
|
|||
|
||||
if (newf) {
|
||||
delete face;
|
||||
delete *it;
|
||||
list.erase(it);
|
||||
// restart, now trying to merge `newf` into the list
|
||||
face = newf;
|
||||
it = list.begin();
|
||||
} else {
|
||||
|
|
@ -180,37 +182,52 @@ void MergeFaceToList(face_t *face, std::list<face_t *> &list)
|
|||
|
||||
/*
|
||||
===============
|
||||
MergePlaneFaces
|
||||
MergeFaceList
|
||||
===============
|
||||
*/
|
||||
inline void MergePlaneFaces(surface_t &plane)
|
||||
inline std::list<face_t *> MergeFaceList(std::list<face_t *> input)
|
||||
{
|
||||
std::list<face_t *> merged;
|
||||
std::list<face_t *> result;
|
||||
|
||||
for (auto &f : plane.faces) {
|
||||
MergeFaceToList(f, merged);
|
||||
for (face_t * face : input) {
|
||||
MergeFaceToList(face, result);
|
||||
}
|
||||
|
||||
plane.faces = std::move(merged);
|
||||
return result;
|
||||
}
|
||||
|
||||
#include <tbb/parallel_for_each.h>
|
||||
|
||||
static void CollectNodes_R(node_t *node, std::vector<node_t *> &allnodes)
|
||||
{
|
||||
allnodes.push_back(node);
|
||||
|
||||
if (node->planenum == PLANENUM_LEAF) {
|
||||
return;
|
||||
}
|
||||
|
||||
CollectNodes_R(node->children[0], allnodes);
|
||||
CollectNodes_R(node->children[1], allnodes);
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
MergeAll
|
||||
============
|
||||
*/
|
||||
void MergeAll(std::vector<surface_t> &surfhead)
|
||||
void MergeAll(node_t *headnode)
|
||||
{
|
||||
std::atomic<int> mergefaces = 0, premergefaces = 0;
|
||||
|
||||
LogPrint(LOG_PROGRESS, "---- {} ----\n", __func__);
|
||||
|
||||
tbb::parallel_for_each(surfhead, [&](surface_t &surf) {
|
||||
premergefaces += surf.faces.size();
|
||||
MergePlaneFaces(surf);
|
||||
mergefaces += surf.faces.size();
|
||||
std::vector<node_t *> allnodes;
|
||||
CollectNodes_R(headnode, allnodes);
|
||||
|
||||
tbb::parallel_for_each(allnodes, [&](node_t *node) {
|
||||
premergefaces += node->facelist.size();
|
||||
node->facelist = MergeFaceList(node->facelist);
|
||||
mergefaces += node->facelist.size();
|
||||
});
|
||||
|
||||
LogPrint(LOG_STAT, " {:8} mergefaces (from {}; {:.0}% merged)\n", mergefaces, premergefaces, (static_cast<double>(mergefaces) / premergefaces) * 100.);
|
||||
|
|
|
|||
|
|
@ -570,6 +570,12 @@ static void ProcessEntity(mapentity_t *entity, const int hullnum)
|
|||
|
||||
MakeVisibleFaces(entity, nodes);
|
||||
|
||||
// fixme-brushbsp: only here for testing, was inside FillOutside if()
|
||||
MergeAll(nodes);
|
||||
|
||||
// needs to come after any face creation
|
||||
MakeMarkFaces(entity, nodes);
|
||||
|
||||
// build all the portals in the bsp tree
|
||||
// some portals are solid polygons, and some are paths to other leafs
|
||||
if (entity == pWorldEnt()) {
|
||||
|
|
|
|||
|
|
@ -516,6 +516,16 @@ int MakeFaceEdges(mapentity_t *entity, node_t *headnode)
|
|||
|
||||
static int c_nodefaces;
|
||||
|
||||
/*
|
||||
================
|
||||
AddMarksurfaces_r
|
||||
|
||||
Adds the given face to the markfaces lists of all descendant leafs of `node`.
|
||||
|
||||
fixme-brushbsp: do this accurately, not exhaustively
|
||||
fixme-brushbsp: all leafs in a cluster can share the same marksurfaces, right?
|
||||
================
|
||||
*/
|
||||
static void AddMarksurfaces_r(face_t *face, node_t *node)
|
||||
{
|
||||
if (node->planenum == PLANENUM_LEAF) {
|
||||
|
|
@ -527,6 +537,30 @@ static void AddMarksurfaces_r(face_t *face, node_t *node)
|
|||
AddMarksurfaces_r(face, node->children[1]);
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
MakeMarkFaces
|
||||
|
||||
Populates the `markfaces` vectors of all leafs
|
||||
================
|
||||
*/
|
||||
void MakeMarkFaces(mapentity_t* entity, node_t* node)
|
||||
{
|
||||
if (node->planenum == PLANENUM_LEAF) {
|
||||
return;
|
||||
}
|
||||
|
||||
// for the faces on this splitting node..
|
||||
for (face_t *face : node->facelist) {
|
||||
// add this face to all descendant leafs (temporary hack)
|
||||
AddMarksurfaces_r(face, node);
|
||||
}
|
||||
|
||||
// process child nodes recursively
|
||||
MakeMarkFaces(entity, node->children[0]);
|
||||
MakeMarkFaces(entity, node->children[1]);
|
||||
}
|
||||
|
||||
static void AddFaceToTree_r(mapentity_t* entity, face_t *face, brush_t *srcbrush, node_t* node)
|
||||
{
|
||||
if (node->planenum == PLANENUM_LEAF) {
|
||||
|
|
@ -555,11 +589,6 @@ static void AddFaceToTree_r(mapentity_t* entity, face_t *face, brush_t *srcbrush
|
|||
|
||||
for (face_t *part: parts) {
|
||||
node->facelist.push_back(part);
|
||||
|
||||
// Now that the final face has been added
|
||||
// fixme-brushbsp: do this as a postprocessing step
|
||||
// fixme-brushbsp: all leafs in a cluster can share the same marksurfaces, right?
|
||||
AddMarksurfaces_r(part, node);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,96 @@
|
|||
// Game: Quake
|
||||
// Format: Valve
|
||||
// entity 0
|
||||
{
|
||||
"mapversion" "220"
|
||||
"classname" "worldspawn"
|
||||
"wad" "deprecated/free_wad.wad;deprecated/fence.wad;deprecated/origin.wad;deprecated/hintskip.wad"
|
||||
"_wateralpha" "0.5"
|
||||
"_tb_def" "builtin:Quake.fgd"
|
||||
// brush 0
|
||||
{
|
||||
( 176 16 96 ) ( 160 80 96 ) ( 160 80 224 ) orangestuff8 [ 0.24253562503633297 -0.9701425001453319 0 0 ] [ 0 0 -1 0 ] 0 2 2
|
||||
( 208 16 96 ) ( 176 64 96 ) ( 176 64 224 ) orangestuff8 [ 0.5547001962252291 -0.8320502943378437 0 0 ] [ 0 0 -1 0 ] 0 2 2
|
||||
( 224 96 80 ) ( 48 0 80 ) ( 224 0 80 ) orangestuff8 [ 1 0 0 -32 ] [ 0 -1 0 0 ] 180 2 2
|
||||
( 224 96 96 ) ( 48 0 96 ) ( 48 96 96 ) orangestuff8 [ -1 0 0 32 ] [ 0 -1 0 0 ] 180 2 2
|
||||
( 224 96 96 ) ( 48 96 80 ) ( 224 96 80 ) orangestuff8 [ 1 0 0 -32 ] [ 0 0 -1 0 ] 180 2 2
|
||||
( 160 48 96 ) ( 112 16 96 ) ( 112 16 224 ) orangestuff8 [ 0.8320502943378437 0.5547001962252291 0 32 ] [ 0 0 -1 0 ] 180 2 2
|
||||
( 224 96 96 ) ( 224 0 80 ) ( 224 0 96 ) orangestuff8 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 2 2
|
||||
}
|
||||
// brush 1
|
||||
{
|
||||
( 208 16 96 ) ( 176 64 96 ) ( 176 64 224 ) orangestuff8 [ 0.5547001962252291 -0.8320502943378437 0 0 ] [ 0 0 -1 0 ] 0 2 2
|
||||
( 160 48 96 ) ( 112 16 224 ) ( 112 16 96 ) orangestuff8 [ -0.8320502943378437 -0.5547001962252291 0 -32 ] [ 0 0 -1 0 ] 180 2 2
|
||||
( 224 0 96 ) ( 48 0 80 ) ( 48 0 96 ) orangestuff8 [ -1 0 0 32 ] [ 0 0 -1 0 ] 180 2 2
|
||||
( 224 96 80 ) ( 48 0 80 ) ( 224 0 80 ) orangestuff8 [ 1 0 0 -32 ] [ 0 -1 0 0 ] 180 2 2
|
||||
( 224 96 96 ) ( 48 0 96 ) ( 48 96 96 ) orangestuff8 [ -1 0 0 32 ] [ 0 -1 0 0 ] 180 2 2
|
||||
( 224 96 96 ) ( 224 0 80 ) ( 224 0 96 ) orangestuff8 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 2 2
|
||||
}
|
||||
// brush 2
|
||||
{
|
||||
( 208 16 96 ) ( 176 64 96 ) ( 176 64 224 ) orangestuff8 [ 0.5547001962252291 -0.8320502943378437 0 0 ] [ 0 0 -1 0 ] 0 2 2
|
||||
( 224 96 80 ) ( 48 0 80 ) ( 224 0 80 ) orangestuff8 [ 1 0 0 -32 ] [ 0 -1 0 0 ] 180 2 2
|
||||
( 224 96 96 ) ( 48 0 96 ) ( 48 96 96 ) orangestuff8 [ -1 0 0 32 ] [ 0 -1 0 0 ] 180 2 2
|
||||
( 224 96 96 ) ( 48 96 80 ) ( 224 96 80 ) orangestuff8 [ 1 0 0 -32 ] [ 0 0 -1 0 ] 180 2 2
|
||||
( 176 16 96 ) ( 160 80 224 ) ( 160 80 96 ) orangestuff8 [ -0.24253562503633297 0.9701425001453319 0 0 ] [ 0 0 -1 0 ] 0 2 2
|
||||
}
|
||||
// brush 3
|
||||
{
|
||||
( 176 16 96 ) ( 160 80 96 ) ( 160 80 224 ) orangestuff8 [ 0.24253562503633297 -0.9701425001453319 0 0 ] [ 0 0 -1 0 ] 0 2 2
|
||||
( 224 96 80 ) ( 48 0 80 ) ( 224 0 80 ) orangestuff8 [ 1 0 0 -32 ] [ 0 -1 0 0 ] 180 2 2
|
||||
( 224 96 96 ) ( 48 0 96 ) ( 48 96 96 ) orangestuff8 [ -1 0 0 32 ] [ 0 -1 0 0 ] 180 2 2
|
||||
( 160 48 96 ) ( 112 16 96 ) ( 112 16 224 ) orangestuff8 [ 0.8320502943378437 0.5547001962252291 0 32 ] [ 0 0 -1 0 ] 180 2 2
|
||||
( 208 16 96 ) ( 176 64 224 ) ( 176 64 96 ) orangestuff8 [ -0.5547001962252291 0.8320502943378437 0 0 ] [ 0 0 -1 0 ] 0 2 2
|
||||
}
|
||||
// brush 4
|
||||
{
|
||||
( 176 16 96 ) ( 160 80 96 ) ( 160 80 224 ) orangestuff8 [ 0.24253562503633297 -0.9701425001453319 0 0 ] [ 0 0 -1 0 ] 0 2 2
|
||||
( 160 48 96 ) ( 112 16 224 ) ( 112 16 96 ) orangestuff8 [ -0.8320502943378437 -0.5547001962252291 0 -32 ] [ 0 0 -1 0 ] 180 2 2
|
||||
( 224 0 96 ) ( 48 0 80 ) ( 48 0 96 ) orangestuff8 [ -1 0 0 32 ] [ 0 0 -1 0 ] 180 2 2
|
||||
( 224 96 80 ) ( 48 0 80 ) ( 224 0 80 ) orangestuff8 [ 1 0 0 -32 ] [ 0 -1 0 0 ] 180 2 2
|
||||
( 224 96 96 ) ( 48 0 96 ) ( 48 96 96 ) orangestuff8 [ -1 0 0 32 ] [ 0 -1 0 0 ] 180 2 2
|
||||
( 208 16 96 ) ( 176 64 224 ) ( 176 64 96 ) orangestuff8 [ -0.5547001962252291 0.8320502943378437 0 0 ] [ 0 0 -1 0 ] 0 2 2
|
||||
}
|
||||
// brush 5
|
||||
{
|
||||
( 128 16 96 ) ( 112 48 96 ) ( 112 48 224 ) orangestuff8 [ 0.447213595499958 -0.894427190999916 0 0 ] [ 0 0 -1 0 ] 0 2 2
|
||||
( 224 96 80 ) ( 48 0 80 ) ( 224 0 80 ) orangestuff8 [ 1 0 0 -32 ] [ 0 -1 0 0 ] 180 2 2
|
||||
( 224 96 96 ) ( 48 0 96 ) ( 48 96 96 ) orangestuff8 [ -1 0 0 32 ] [ 0 -1 0 0 ] 180 2 2
|
||||
( 224 96 96 ) ( 48 96 80 ) ( 224 96 80 ) orangestuff8 [ 1 0 0 -32 ] [ 0 0 -1 0 ] 180 2 2
|
||||
( 160 48 96 ) ( 112 16 96 ) ( 112 16 224 ) orangestuff8 [ 0.8320502943378437 0.5547001962252291 0 32 ] [ 0 0 -1 0 ] 180 2 2
|
||||
( 208 16 96 ) ( 176 64 224 ) ( 176 64 96 ) orangestuff8 [ -0.5547001962252291 0.8320502943378437 0 0 ] [ 0 0 -1 0 ] 0 2 2
|
||||
( 176 16 96 ) ( 160 80 224 ) ( 160 80 96 ) orangestuff8 [ -0.24253562503633297 0.9701425001453319 0 0 ] [ 0 0 -1 0 ] 0 2 2
|
||||
}
|
||||
// brush 6
|
||||
{
|
||||
( 48 0 96 ) ( 48 96 80 ) ( 48 96 96 ) orangestuff8 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 2 2
|
||||
( 224 0 96 ) ( 48 0 80 ) ( 48 0 96 ) orangestuff8 [ -1 0 0 32 ] [ 0 0 -1 0 ] 180 2 2
|
||||
( 224 96 80 ) ( 48 0 80 ) ( 224 0 80 ) orangestuff8 [ 1 0 0 -32 ] [ 0 -1 0 0 ] 180 2 2
|
||||
( 224 96 96 ) ( 48 0 96 ) ( 48 96 96 ) orangestuff8 [ -1 0 0 32 ] [ 0 -1 0 0 ] 180 2 2
|
||||
( 224 96 96 ) ( 48 96 80 ) ( 224 96 80 ) orangestuff8 [ 1 0 0 -32 ] [ 0 0 -1 0 ] 180 2 2
|
||||
( 160 48 96 ) ( 112 16 96 ) ( 112 16 224 ) orangestuff8 [ 0.8320502943378437 0.5547001962252291 0 32 ] [ 0 0 -1 0 ] 180 2 2
|
||||
( 128 16 96 ) ( 112 48 224 ) ( 112 48 96 ) orangestuff8 [ -0.447213595499958 0.894427190999916 0 0 ] [ 0 0 -1 0 ] 0 2 2
|
||||
}
|
||||
// brush 7
|
||||
{
|
||||
( 128 16 96 ) ( 112 48 96 ) ( 112 48 224 ) orangestuff8 [ 0.447213595499958 -0.894427190999916 0 0 ] [ 0 0 -1 0 ] 0 2 2
|
||||
( 160 48 96 ) ( 112 16 224 ) ( 112 16 96 ) orangestuff8 [ -0.8320502943378437 -0.5547001962252291 0 -32 ] [ 0 0 -1 0 ] 180 2 2
|
||||
( 224 0 96 ) ( 48 0 80 ) ( 48 0 96 ) orangestuff8 [ -1 0 0 32 ] [ 0 0 -1 0 ] 180 2 2
|
||||
( 224 96 80 ) ( 48 0 80 ) ( 224 0 80 ) orangestuff8 [ 1 0 0 -32 ] [ 0 -1 0 0 ] 180 2 2
|
||||
( 224 96 96 ) ( 48 0 96 ) ( 48 96 96 ) orangestuff8 [ -1 0 0 32 ] [ 0 -1 0 0 ] 180 2 2
|
||||
( 176 16 96 ) ( 160 80 224 ) ( 160 80 96 ) orangestuff8 [ -0.24253562503633297 0.9701425001453319 0 0 ] [ 0 0 -1 0 ] 0 2 2
|
||||
}
|
||||
// brush 8
|
||||
{
|
||||
( 160 48 96 ) ( 112 16 224 ) ( 112 16 96 ) orangestuff8 [ -0.8320502943378437 -0.5547001962252291 0 -32 ] [ 0 0 -1 0 ] 180 2 2
|
||||
( 224 0 96 ) ( 48 0 80 ) ( 48 0 96 ) orangestuff8 [ -1 0 0 32 ] [ 0 0 -1 0 ] 180 2 2
|
||||
( 224 96 80 ) ( 48 0 80 ) ( 224 0 80 ) orangestuff8 [ 1 0 0 -32 ] [ 0 -1 0 0 ] 180 2 2
|
||||
( 224 96 96 ) ( 48 0 96 ) ( 48 96 96 ) orangestuff8 [ -1 0 0 32 ] [ 0 -1 0 0 ] 180 2 2
|
||||
( 128 16 96 ) ( 112 48 224 ) ( 112 48 96 ) orangestuff8 [ -0.447213595499958 0.894427190999916 0 0 ] [ 0 0 -1 0 ] 0 2 2
|
||||
}
|
||||
}
|
||||
// entity 1
|
||||
{
|
||||
"classname" "info_player_start"
|
||||
"origin" "72 32 120"
|
||||
}
|
||||
Loading…
Reference in New Issue