more move semantics

This commit is contained in:
Garux 2021-08-14 08:21:25 +03:00
parent bb1931b745
commit 1372ea440b
3 changed files with 35 additions and 41 deletions

View File

@ -400,7 +400,7 @@ std::pair<winding_t, winding_t> ClipWindingEpsilonStrict( const winding_t& in
Error( "ClipWinding: MAX_POINTS_ON_WINDING" ); Error( "ClipWinding: MAX_POINTS_ON_WINDING" );
} }
return { front, back }; return { std::move( front ), std::move( back ) };
} }
std::pair<winding_t, winding_t> ClipWindingEpsilon( const winding_t& in, const Plane3f& plane, float epsilon ){ std::pair<winding_t, winding_t> ClipWindingEpsilon( const winding_t& in, const Plane3f& plane, float epsilon ){
@ -409,7 +409,7 @@ std::pair<winding_t, winding_t> ClipWindingEpsilon( const winding_t& in, cons
if ( front.empty() && back.empty() ) { if ( front.empty() && back.empty() ) {
back = in; back = in;
} }
return { front, back }; return { std::move( front ), std::move( back ) };
} }

View File

@ -439,24 +439,24 @@ void WriteBSPBrushMap( const char *name, const brushlist_t& list ){
adds brush reference to any intersecting bsp leafnode adds brush reference to any intersecting bsp leafnode
*/ */
int FilterBrushIntoTree_r( brush_t* b, node_t *node ){ int FilterBrushIntoTree_r( brush_t&& b, node_t *node ){
/* dummy check */ /* dummy check */
if ( b == NULL ) { if ( b.sides.empty() ) {
return 0; return 0;
} }
/* add it to the leaf list */ /* add it to the leaf list */
if ( node->planenum == PLANENUM_LEAF ) { if ( node->planenum == PLANENUM_LEAF ) {
/* something somewhere is hammering brushlist */ /* something somewhere is hammering brushlist */
node->brushlist.push_front( std::move( *b ) ); node->brushlist.push_front( std::move( b ) );
/* classify the leaf by the structural brush */ /* classify the leaf by the structural brush */
if ( !b->detail ) { if ( !b.detail ) {
if ( b->opaque ) { if ( b.opaque ) {
node->opaque = true; node->opaque = true;
node->areaportal = false; node->areaportal = false;
} }
else if ( b->compileFlags & C_AREAPORTAL ) { else if ( b.compileFlags & C_AREAPORTAL ) {
if ( !node->opaque ) { if ( !node->opaque ) {
node->areaportal = true; node->areaportal = true;
} }
@ -467,12 +467,11 @@ int FilterBrushIntoTree_r( brush_t* b, node_t *node ){
} }
/* split it by the node plane */ /* split it by the node plane */
auto [front, back] = SplitBrush( *b, node->planenum ); auto [front, back] = SplitBrush( b, node->planenum );
delete b;
int c = 0; int c = 0;
c += FilterBrushIntoTree_r( front, node->children[ 0 ] ); c += FilterBrushIntoTree_r( std::move( front ), node->children[ 0 ] );
c += FilterBrushIntoTree_r( back, node->children[ 1 ] ); c += FilterBrushIntoTree_r( std::move( back ), node->children[ 1 ] );
return c; return c;
} }
@ -500,7 +499,7 @@ void FilterDetailBrushesIntoTree( entity_t *e, tree_t& tree ){
continue; continue;
} }
c_unique++; c_unique++;
const int r = FilterBrushIntoTree_r( new brush_t( b ), tree.headnode ); const int r = FilterBrushIntoTree_r( brush_t( b ), tree.headnode );
c_clusters += r; c_clusters += r;
/* mark all sides as visible so drawsurfs are created */ /* mark all sides as visible so drawsurfs are created */
@ -536,7 +535,7 @@ void FilterStructuralBrushesIntoTree( entity_t *e, tree_t& tree ) {
continue; continue;
} }
c_unique++; c_unique++;
const int r = FilterBrushIntoTree_r( new brush_t( b ), tree.headnode ); const int r = FilterBrushIntoTree_r( brush_t( b ), tree.headnode );
c_clusters += r; c_clusters += r;
// mark all sides as visible so drawsurfs are created // mark all sides as visible so drawsurfs are created
@ -632,7 +631,7 @@ int BrushMostlyOnSide( const brush_t& brush, const Plane3f& plane ){
generates two new brushes, leaving the original unchanged generates two new brushes, leaving the original unchanged
*/ */
std::pair<brush_t*, brush_t*> SplitBrush( const brush_t& brush, int planenum ){ std::pair<brush_t, brush_t> SplitBrush( const brush_t& brush, int planenum ){
const Plane3f& plane = mapplanes[planenum].plane; const Plane3f& plane = mapplanes[planenum].plane;
// check all points // check all points
@ -653,12 +652,12 @@ std::pair<brush_t*, brush_t*> SplitBrush( const brush_t& brush, int planenum ){
if ( d_front < 0.1 ) { // PLANESIDE_EPSILON) if ( d_front < 0.1 ) { // PLANESIDE_EPSILON)
// only on back // only on back
return { {}, new brush_t( brush ) }; return { {}, brush };
} }
if ( d_back > -0.1 ) { // PLANESIDE_EPSILON) if ( d_back > -0.1 ) { // PLANESIDE_EPSILON)
// only on front // only on front
return { new brush_t( brush ), {} }; return { brush, {} };
} }
// create a new winding from the split plane // create a new winding from the split plane
@ -673,10 +672,10 @@ std::pair<brush_t*, brush_t*> SplitBrush( const brush_t& brush, int planenum ){
if ( midwinding.empty() || WindingIsTiny( midwinding ) ) { // the brush isn't really split if ( midwinding.empty() || WindingIsTiny( midwinding ) ) { // the brush isn't really split
const int side = BrushMostlyOnSide( brush, plane ); const int side = BrushMostlyOnSide( brush, plane );
if ( side == PSIDE_BACK ) { if ( side == PSIDE_BACK ) {
return { {}, new brush_t( brush ) }; return { {}, brush };
} }
else { // side == PSIDE_FRONT else { // side == PSIDE_FRONT
return { new brush_t( brush ), {} }; return { brush, {} };
} }
} }
@ -685,11 +684,10 @@ std::pair<brush_t*, brush_t*> SplitBrush( const brush_t& brush, int planenum ){
} }
// split it for real // split it for real
brush_t *b[2]; brush_t b[2]{ brush, brush };
for ( int i = 0; i < 2; i++ ) for ( int i = 0; i < 2; i++ )
{ {
b[i] = new brush_t( brush ); b[i].sides.clear();
b[i]->sides.clear();
} }
// split all the current windings // split all the current windings
@ -703,7 +701,7 @@ std::pair<brush_t*, brush_t*> SplitBrush( const brush_t& brush, int planenum ){
for ( int i = 0; i < 2; i++ ) for ( int i = 0; i < 2; i++ )
{ {
if ( !cw[i].empty() ) { if ( !cw[i].empty() ) {
side_t& cs = b[i]->sides.emplace_back( side ); side_t& cs = b[i].sides.emplace_back( side );
cs.winding.swap( cw[i] ); cs.winding.swap( cw[i] );
} }
} }
@ -714,29 +712,26 @@ std::pair<brush_t*, brush_t*> SplitBrush( const brush_t& brush, int planenum ){
// see if we have valid polygons on both sides // see if we have valid polygons on both sides
for ( int i = 0; i < 2; i++ ) for ( int i = 0; i < 2; i++ )
{ {
if ( b[i]->sides.size() < 3 || !BoundBrush( *b[i] ) ) { if ( b[i].sides.size() < 3 || !BoundBrush( b[i] ) ) {
if ( b[i]->sides.size() >= 3 ) { if ( b[i].sides.size() >= 3 ) {
Sys_FPrintf( SYS_WRN | SYS_VRBflag, "bogus brush after clip\n" ); Sys_FPrintf( SYS_WRN | SYS_VRBflag, "bogus brush after clip\n" );
} }
delete b[i]; b[i].sides.clear();
b[i] = NULL;
} }
} }
if ( b[0] == nullptr || b[1] == nullptr ) { if ( b[0].sides.empty() || b[1].sides.empty() ) {
if ( b[0] == nullptr && b[1] == nullptr ) { if ( b[0].sides.empty() && b[1].sides.empty() ) {
Sys_FPrintf( SYS_WRN | SYS_VRBflag, "split removed brush\n" ); Sys_FPrintf( SYS_WRN | SYS_VRBflag, "split removed brush\n" );
} }
else{ else{
Sys_FPrintf( SYS_WRN | SYS_VRBflag, "split not on both sides\n" ); Sys_FPrintf( SYS_WRN | SYS_VRBflag, "split not on both sides\n" );
} }
if ( b[0] != nullptr ) { if ( !b[0].sides.empty() ) {
delete b[0]; return { brush, {} };
return { new brush_t( brush ), {} };
} }
else if ( b[1] != nullptr ) { else if ( !b[1].sides.empty() ) {
delete b[1]; return { {}, brush };
return { {}, new brush_t( brush ) };
} }
return{}; return{};
} }
@ -744,7 +739,7 @@ std::pair<brush_t*, brush_t*> SplitBrush( const brush_t& brush, int planenum ){
// add the midwinding to both sides // add the midwinding to both sides
for ( int i = 0; i < 2; i++ ) for ( int i = 0; i < 2; i++ )
{ {
side_t& cs = b[i]->sides.emplace_back(); side_t& cs = b[i].sides.emplace_back();
cs.planenum = planenum ^ i ^ 1; cs.planenum = planenum ^ i ^ 1;
cs.shaderInfo = NULL; cs.shaderInfo = NULL;
@ -758,12 +753,11 @@ std::pair<brush_t*, brush_t*> SplitBrush( const brush_t& brush, int planenum ){
for ( int i = 0; i < 2; i++ ) for ( int i = 0; i < 2; i++ )
{ {
if ( BrushVolume( *b[i] ) < 1.0 ) { if ( BrushVolume( b[i] ) < 1.0 ) {
delete b[i]; b[i].sides.clear();
b[i] = NULL;
// Sys_FPrintf( SYS_WRN | SYS_VRBflag, "tiny volume after clip\n" ); // Sys_FPrintf( SYS_WRN | SYS_VRBflag, "tiny volume after clip\n" );
} }
} }
return{ b[0], b[1] }; return{ std::move( b[0] ), std::move( b[1] ) };
} }

View File

@ -1560,7 +1560,7 @@ void FilterStructuralBrushesIntoTree( entity_t *e, tree_t
bool WindingIsTiny( const winding_t& w ); bool WindingIsTiny( const winding_t& w );
std::pair<brush_t*, brush_t*> SplitBrush( const brush_t& brush, int planenum ); std::pair<brush_t, brush_t> SplitBrush( const brush_t& brush, int planenum );
/* mesh.c */ /* mesh.c */