From 943845e8c009e37a1453e4fa373f8b64b4080e71 Mon Sep 17 00:00:00 2001 From: Garux Date: Fri, 14 Nov 2025 17:14:25 +0500 Subject: [PATCH] add winding_next_point() --- tools/quake3/common/polylib.cpp | 16 ++++++++-------- tools/quake3/common/polylib.h | 4 ++++ tools/quake3/q3map2/map.cpp | 2 +- tools/quake3/q3map2/model.cpp | 14 +++++++------- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/tools/quake3/common/polylib.cpp b/tools/quake3/common/polylib.cpp index e417a604..7b8cc3de 100644 --- a/tools/quake3/common/polylib.cpp +++ b/tools/quake3/common/polylib.cpp @@ -58,12 +58,12 @@ winding_t AllocWinding( int points ){ void RemoveColinearPoints( winding_t& w ){ winding_t p = AllocWinding( w.size() ); - for ( size_t i = 0; i < w.size(); ++i ) + for ( auto i = w.begin(); i != w.end(); ++i ) { - const size_t j = winding_next( w, i ); - const size_t k = winding_next( w, j ); - if ( vector3_dot( VectorNormalized( w[k] - w[j] ), VectorNormalized( w[k] - w[i] ) ) < 0.999 ) { - p.push_back( w[i] ); + const auto j = winding_next( w, i ); + const auto k = winding_next( w, j ); + if ( vector3_dot( VectorNormalized( *k - *j ), VectorNormalized( *k - *i ) ) < 0.999 ) { + p.push_back( *i ); } } @@ -376,7 +376,7 @@ std::pair ClipWindingEpsilonStrict( const winding_t& in } // generate a split point - const Vector3& p2 = in[winding_next( in, i )]; + const Vector3& p2 = winding_next_point( in, i ); const double dot = dists[i] / ( dists[i] - dists[i + 1] ); Vector3 mid; for ( size_t j = 0; j < 3; ++j ) @@ -602,7 +602,7 @@ void ChopWindingInPlace( winding_t& inout, const Plane3f& plane, float epsilon ) } // generate a split point - const Vector3& p2 = in[winding_next( in, i )]; + const Vector3& p2 = winding_next_point( in, i ); const double dot = dists[i] / ( dists[i] - dists[i + 1] ); Vector3 mid; @@ -663,7 +663,7 @@ void CheckWinding( const winding_t& w ){ } // check the edge isnt degenerate - const Vector3& p2 = w[winding_next( w, i )]; + const Vector3& p2 = winding_next_point( w, i ); const Vector3 dir = p2 - p1; if ( vector3_length( dir ) < ON_EPSILON ) { diff --git a/tools/quake3/common/polylib.h b/tools/quake3/common/polylib.h index 851aef56..3e3b1abb 100644 --- a/tools/quake3/common/polylib.h +++ b/tools/quake3/common/polylib.h @@ -31,6 +31,10 @@ template size_t winding_next( const std::vector>& w, size_t index ){ return ++index == w.size()? 0 : index; } +template +const BasicVector3& winding_next_point( const std::vector>& w, size_t index ){ + return w[ winding_next( w, index ) ]; +} // it < w.end() template std::vector>::iterator winding_next( std::vector>& w, typename std::vector>::iterator it ){ diff --git a/tools/quake3/q3map2/map.cpp b/tools/quake3/q3map2/map.cpp index 8cdf8554..756ba211 100644 --- a/tools/quake3/q3map2/map.cpp +++ b/tools/quake3/q3map2/map.cpp @@ -647,7 +647,7 @@ void AddBrushBevels(){ // test the non-axial plane edges for ( size_t i = 6; i < sides.size(); ++i ) { for ( size_t j = 0; j < sides[i].winding.size(); ++j ) { - Vector3 vec = sides[i].winding[j] - sides[i].winding[winding_next( sides[i].winding, j )]; + Vector3 vec = sides[i].winding[j] - winding_next_point( sides[i].winding, j ); if ( VectorNormalize( vec ) < 0.5f ) { continue; } diff --git a/tools/quake3/q3map2/model.cpp b/tools/quake3/q3map2/model.cpp index 1a97e8f3..679f48d4 100644 --- a/tools/quake3/q3map2/model.cpp +++ b/tools/quake3/q3map2/model.cpp @@ -453,7 +453,7 @@ struct ClipSides buildBrush.sides[0].planenum = FindFloatPlane( fplane, fw ); for( size_t i = 0; i < splanes.size(); ++i ){ - buildBrush.sides[i + 1].planenum = FindFloatPlane( splanes[i], std::array{ fw[i], fw[winding_next( fw, i )] } ); + buildBrush.sides[i + 1].planenum = FindFloatPlane( splanes[i], std::array{ fw[i], winding_next_point( fw, i ) } ); } if( doBack ) buildBrush.sides.back().planenum = FindFloatPlane( bplane, bw ); @@ -478,7 +478,7 @@ static void clipModel_default( ClipSides& cs ){ /* make side planes */ for ( size_t i = 0; i < cs.fw.size(); ++i ) { - cs.splanes[i].normal() = VectorNormalized( vector3_cross( bestNormal, cs.fw[winding_next( cs.fw, i )] - cs.fw[i] ) ); + cs.splanes[i].normal() = VectorNormalized( vector3_cross( bestNormal, winding_next_point( cs.fw, i ) - cs.fw[i] ) ); cs.splanes[i].dist() = vector3_dot( cs.fw[i], cs.splanes[i].normal() ); } @@ -498,7 +498,7 @@ static void clipModel_pyramidal( ClipSides& cs ){ /* make side planes */ for ( size_t i = 0; i < cs.fw.size(); ++i ) { - PlaneFromPoints( cs.splanes[i], cs.fw[winding_next( cs.fw, i )], cs.fw[i], Vector3( cnt ) ); + PlaneFromPoints( cs.splanes[i], winding_next_point( cs.fw, i ), cs.fw[i], Vector3( cnt ) ); #if 0 // no definite profit, problems are rather triggered by windings more complex than simple triangle const auto susNormal = []( float a, float b ){ return ( a != 0 || b != 0 ) && std::fabs( a ) < .00025f && std::fabs( b ) < .00025f; }; if( susNormal( cs.splanes[i].a, cs.splanes[i].b ) @@ -515,7 +515,7 @@ static void clipModel_faceNormals( ClipSides& cs ){ /* make side planes */ for ( size_t i = 0; i < cs.fw.size(); ++i ) { - cs.splanes[i].normal() = VectorNormalized( vector3_cross( cs.fplane.normal(), cs.fw[winding_next( cs.fw, i )] - cs.fw[i] ) ); + cs.splanes[i].normal() = VectorNormalized( vector3_cross( cs.fplane.normal(), winding_next_point( cs.fw, i ) - cs.fw[i] ) ); cs.splanes[i].dist() = vector3_dot( cs.fw[i], cs.splanes[i].normal() ); } @@ -560,7 +560,7 @@ static void clipModel_45( ClipSides& cs ){ /* 45 degrees normals for side planes */ for ( size_t i = 0; i < cs.fw.size(); ++i ) { - const Vector3 enrm = VectorNormalized( vector3_cross( cs.fplane.normal(), cs.fw[winding_next( cs.fw, i )] - cs.fw[i] ) ); + const Vector3 enrm = VectorNormalized( vector3_cross( cs.fplane.normal(), winding_next_point( cs.fw, i ) - cs.fw[i] ) ); /* make side planes */ cs.splanes[i].normal() = VectorNormalized( enrm - cs.fplane.normal() ); cs.splanes[i].dist() = vector3_dot( cs.fw[i], cs.splanes[i].normal() ); @@ -601,7 +601,7 @@ static void clipModel_terrain( ClipSides& cs, const int spf, size_t axis, const /* make side planes */ for ( size_t i = 0; i < cs.fw.size(); ++i ) { - cs.splanes[i].normal() = VectorNormalized( vector3_cross( bestNormal, cs.fw[winding_next( cs.fw, i )] - cs.fw[i] ) ); + cs.splanes[i].normal() = VectorNormalized( vector3_cross( bestNormal, winding_next_point( cs.fw, i ) - cs.fw[i] ) ); cs.splanes[i].dist() = vector3_dot( cs.fw[i], cs.splanes[i].normal() ); } @@ -667,7 +667,7 @@ static void clipModel_axialPyramid( ClipSides& cs, const float limDepth ){ for ( size_t j = 0; j < 3; ++j ){ // axes Plane3f pln; - Vector3 nrm = cs.fw[winding_next( cs.fw, i )] - cs.fw[i]; + Vector3 nrm = winding_next_point( cs.fw, i ) - cs.fw[i]; if ( j == axis ){ pln.normal() = VectorNormalized( vector3_cross( bestNormal, nrm ) ); }