diff --git a/contrib/brushexport/export.cpp b/contrib/brushexport/export.cpp index e14d1e7d..80731b81 100644 --- a/contrib/brushexport/export.cpp +++ b/contrib/brushexport/export.cpp @@ -208,7 +208,7 @@ bool ExportDataAsWavefront::WriteToFile( const std::string& path, collapsemode m { std::multimap brushMaterials; - std::vector vertices; // unique vertices list for welding + std::vector vertices; // unique vertices list for welding // submesh starts here if ( objs ) { @@ -238,9 +238,9 @@ bool ExportDataAsWavefront::WriteToFile( const std::string& path, collapsemode m --i; ++texcoord_count; std::size_t vertexN = 0; // vertex index to use, 0 is special value = no vertex to weld to found - const Vector3& vertex = w[i].vertex; + const DoubleVector3& vertex = w[i].vertex; if( weld ){ - auto found = std::find_if( vertices.begin(), vertices.end(), [&vertex]( const Vector3& othervertex ){ + auto found = std::find_if( vertices.begin(), vertices.end(), [&vertex]( const DoubleVector3& othervertex ){ return Edge_isDegenerate( vertex, othervertex ); } ); if( found == vertices.end() ){ // unique vertex, add to the list diff --git a/libs/scenelib.h b/libs/scenelib.h index 4fc318b5..b02e7c81 100644 --- a/libs/scenelib.h +++ b/libs/scenelib.h @@ -52,7 +52,7 @@ public: virtual void gatherComponentsHighlight( std::vector>& polygons, SelectionIntersection& intersection, SelectionTest& test, SelectionSystem::EComponentMode mode ) const = 0; }; -typedef std::function Vector3Callback; +typedef std::function Vector3Callback; class ComponentEditable { diff --git a/plugins/vfspk3/vfs.cpp b/plugins/vfspk3/vfs.cpp index 28146e86..005c8816 100644 --- a/plugins/vfspk3/vfs.cpp +++ b/plugins/vfspk3/vfs.cpp @@ -144,7 +144,7 @@ static void InitPakFile( ArchiveModules& archiveModules, const char *filename ){ } inline void pathlist_append_unique( StrList& pathlist, CopiedString path ){ - if( pathlist.cend() == std::find_if( pathlist.cbegin(), pathlist.cend(), + if( std::none_of( pathlist.cbegin(), pathlist.cend(), [&path]( const CopiedString& str ){ return path_compare( str.c_str(), path.c_str() ) == 0; } ) ) pathlist.emplace_back( std::move( path ) ); } diff --git a/radiant/brush.cpp b/radiant/brush.cpp index 3d1fa22f..5c319029 100644 --- a/radiant/brush.cpp +++ b/radiant/brush.cpp @@ -422,11 +422,7 @@ public: m_planes.push_back( plane ); } iterator find( const Plane3& plane ){ - iterator i = begin(); - for( ; i != end(); ++i ) - if( plane3_equal( plane, i->m_plane ) ) - break; - return i; + return std::find_if( begin(), end(), [&plane]( const VertexModePlane& pla ){ return plane3_equal( plane, pla.m_plane ); } ); } const_iterator begin() const { return m_planes.begin(); @@ -446,15 +442,13 @@ public: }; const Face* vertex_mode_find_common_face( const Brush::VertexModeVertex& v1, const Brush::VertexModeVertex& v2, const Brush::VertexModeVertex& v3 ){ - const Face* face = 0; - for( const auto& i : v1.m_faces ){ - if( std::find( v2.m_faces.begin(), v2.m_faces.end(), i ) != v2.m_faces.end() - && std::find( v3.m_faces.begin(), v3.m_faces.end(), i ) != v3.m_faces.end() ){ - face = i; - break; + for( const Face* face : v1.m_faces ){ + if( std::find( v2.m_faces.begin(), v2.m_faces.end(), face ) != v2.m_faces.end() + && std::find( v3.m_faces.begin(), v3.m_faces.end(), face ) != v3.m_faces.end() ){ + return face; } } - return face; + return nullptr; } #include "quickhull/QuickHull.hpp" @@ -463,9 +457,9 @@ void Brush::vertexModeBuildHull( bool allTransformed /*= false*/ ){ std::vector> pointCloud; pointCloud.reserve( m_vertexModeVertices.size() ); for( auto& i : m_vertexModeVertices ){ - pointCloud.push_back( quickhull::Vector3( static_cast( i.m_vertexTransformed.x() ), - static_cast( i.m_vertexTransformed.y() ), - static_cast( i.m_vertexTransformed.z() ) ) ); + pointCloud.push_back( quickhull::Vector3( i.m_vertexTransformed.x(), + i.m_vertexTransformed.y(), + i.m_vertexTransformed.z() ) ); } auto hull = quickhull.getConvexHull( pointCloud, true, true ); const auto& indexBuffer = hull.getIndexBuffer(); diff --git a/radiant/brush.h b/radiant/brush.h index 9f73be8c..f646848a 100644 --- a/radiant/brush.h +++ b/radiant/brush.h @@ -79,12 +79,12 @@ inline bool texdef_sane( const texdef_t& texdef ){ } inline void Winding_DrawWireframe( const Winding& winding ){ - glVertexPointer( 3, GL_FLOAT, sizeof( WindingVertex ), &winding.points.data()->vertex ); + glVertexPointer( 3, GL_DOUBLE, sizeof( WindingVertex ), &winding.points.data()->vertex ); glDrawArrays( GL_LINE_LOOP, 0, GLsizei( winding.numpoints ) ); } inline void Winding_Draw( const Winding& winding, const Vector3& normal, RenderStateFlags state ){ - glVertexPointer( 3, GL_FLOAT, sizeof( WindingVertex ), &winding.points.data()->vertex ); + glVertexPointer( 3, GL_DOUBLE, sizeof( WindingVertex ), &winding.points.data()->vertex ); Vector3 normals[c_brush_maxFaces]; @@ -823,7 +823,7 @@ public: updateSource(); } } - void copy( const Vector3& p0, const Vector3& p1, const Vector3& p2 ){ + void copy( const DoubleVector3& p0, const DoubleVector3& p1, const DoubleVector3& p2 ){ if ( !isDoom3Plane() ) { m_planepts[0] = p0; m_planepts[1] = p1; @@ -980,14 +980,14 @@ public: m_undoable_observer( 0 ), m_map( 0 ){ m_shader.attach( *this ); - m_plane.copy( Vector3( 0, 0, 0 ), Vector3( 64, 0, 0 ), Vector3( 0, 64, 0 ) ); + m_plane.copy( DoubleVector3( 0, 0, 0 ), DoubleVector3( 64, 0, 0 ), DoubleVector3( 0, 64, 0 ) ); m_texdef.setBasis( m_plane.plane3().normal() ); planeChanged(); } Face( - const Vector3& p0, - const Vector3& p1, - const Vector3& p2, + const DoubleVector3& p0, + const DoubleVector3& p1, + const DoubleVector3& p2, const char* shader, const TextureProjection& projection, FaceObserver* observer @@ -1541,7 +1541,7 @@ public: class SelectableVertex { public: - Vector3 getVertex() const { + DoubleVector3 getVertex() const { return getFace().getWinding()[m_faceVertex.getVertex()].vertex; } @@ -1930,11 +1930,11 @@ public: class VertexModeVertex { public: - const Vector3 m_vertex; - Vector3 m_vertexTransformed; + const DoubleVector3 m_vertex; + DoubleVector3 m_vertexTransformed; const bool m_selected; std::vector m_faces; - VertexModeVertex( const Vector3& vertex, const bool selected ) : m_vertex( vertex ), m_vertexTransformed( vertex ), m_selected( selected ) { + VertexModeVertex( const DoubleVector3& vertex, const bool selected ) : m_vertex( vertex ), m_vertexTransformed( vertex ), m_selected( selected ) { } }; typedef std::vector VertexModeVertices; @@ -2030,7 +2030,7 @@ public: } /// \brief Appends a new face constructed from the parameters to the end of the face list. - Face* addPlane( const Vector3& p0, const Vector3& p1, const Vector3& p2, const char* shader, const TextureProjection& projection ){ + Face* addPlane( const DoubleVector3& p0, const DoubleVector3& p1, const DoubleVector3& p2, const char* shader, const TextureProjection& projection ){ if ( m_faces.size() == c_brush_maxFaces ) { return 0; } @@ -3357,7 +3357,7 @@ public: } while ( faceVertex.getFace() != m_vertex->m_faceVertex.getFace() ); } - bool vertex_select( const Vector3& vertex ){ + bool vertex_select( const DoubleVector3& vertex ){ if( vector3_length_squared( vertex - m_vertex->getVertex() ) < ( 0.1 * 0.1 ) ){ setSelected( true ); return true; @@ -4036,7 +4036,7 @@ public: v.pop_back(); } std::vector ok( v.size(), true ); - gatherSelectedComponents( [&]( const Vector3 & value ) { + gatherSelectedComponents( [&]( const DoubleVector3 & value ) { for( std::size_t i = 0; i < v.size(); ++i ) if( vector3_length_squared( v[i].m_vertex - value ) < 0.05 * 0.05 ) ok[i] = false; diff --git a/radiant/brush_primit.cpp b/radiant/brush_primit.cpp index 7739edd5..48551fdf 100644 --- a/radiant/brush_primit.cpp +++ b/radiant/brush_primit.cpp @@ -305,17 +305,17 @@ void Texdef_EmitTextureCoordinates( const TextureProjection& projection, std::si matrix4_multiply_by_matrix4( local2tex, xyz2st ); } - Vector3 tangent( vector3_normalised( vector4_to_vector3( matrix4_transposed( local2tex ).x() ) ) ); - Vector3 bitangent( vector3_normalised( vector4_to_vector3( matrix4_transposed( local2tex ).y() ) ) ); + const Vector3 tangent( vector3_normalised( vector4_to_vector3( matrix4_transposed( local2tex ).x() ) ) ); + const Vector3 bitangent( vector3_normalised( vector4_to_vector3( matrix4_transposed( local2tex ).y() ) ) ); matrix4_multiply_by_matrix4( local2tex, localToWorld ); - for ( Winding::iterator i = w.begin(); i != w.end(); ++i ) + for ( WindingVertex& v : w ) { - ( *i ).texcoord = matrix4_transformed_point( local2tex, ( *i ).vertex ).vec2(); + v.texcoord = matrix4_transformed_point( local2tex, v.vertex ).vec2(); - ( *i ).tangent = tangent; - ( *i ).bitangent = bitangent; + v.tangent = tangent; + v.bitangent = bitangent; } } diff --git a/radiant/brushmanip.cpp b/radiant/brushmanip.cpp index e3d11084..48d26255 100644 --- a/radiant/brushmanip.cpp +++ b/radiant/brushmanip.cpp @@ -400,7 +400,7 @@ void Brush_ConstructIcosahedron( Brush& brush, const AABB& bounds, std::size_t s } const Plane3 plane = plane3_for_points( p ); if( plane3_valid( plane ) ){ - if( std::find_if( planes.begin(), planes.end(), [&plane]( const Plane3& pla ){ return plane3_equal( plane, pla ); } ) == planes.end() ){ + if( std::none_of( planes.begin(), planes.end(), [&plane]( const Plane3& pla ){ return plane3_equal( plane, pla ); } ) ){ planes.push_back( plane ); brush.addPlane( p[0] * radius + mid, p[1] * radius + mid, p[2] * radius + mid, shader, projection ); } diff --git a/radiant/csg.cpp b/radiant/csg.cpp index 758eac73..09b8e134 100644 --- a/radiant/csg.cpp +++ b/radiant/csg.cpp @@ -243,7 +243,7 @@ void brush_extrudeDiag( const Brush& brush0, const Brush& brush2, brush_vector_t const auto addSidePlanes = [&m_out, shader, &projection]( const Winding& winding0, const Winding& winding2, const DoubleVector3 normal, const bool swap ){ for( std::size_t index0 = 0; index0 < winding0.numpoints; ++index0 ){ const std::size_t next = Winding_next( winding0, index0 ); - Vector3 BestPoint; + DoubleVector3 BestPoint; double bestdot = -1; for( std::size_t index2 = 0; index2 < winding2.numpoints; ++index2 ){ const double dot = vector3_dot( @@ -275,7 +275,7 @@ void brush_extrudeDiag( const Brush& brush0, const Brush& brush2, brush_vector_t const Winding& winding0 = face0.getWinding(); for( std::size_t index0 = 0; index0 < winding0.numpoints; ++index0 ){ const std::size_t next = Winding_next( winding0, index0 ); - Vector3 BestPoint; + DoubleVector3 BestPoint; double bestdist = 999999; for( const Face* f : brush2 ) { const Winding& winding2 = f->getWinding(); @@ -966,19 +966,16 @@ void CSG_Merge(){ class MergeVertices { - typedef std::vector Vertices; + typedef std::vector Vertices; Vertices m_vertices; public: typedef Vertices::const_iterator const_iterator; - void insert( const Vector3& vertex ){ + void insert( const DoubleVector3& vertex ){ if( !contains( vertex ) ) m_vertices.push_back( vertex ); } - bool contains( const Vector3& vertex ) const { - for( const_iterator i = begin(); i != end(); ++i ) - if( Edge_isDegenerate( vertex, *i ) ) - return true; - return false; + bool contains( const DoubleVector3& vertex ) const { + return std::any_of( begin(), end(), [&vertex]( const DoubleVector3& v ){ return Edge_isDegenerate( vertex, v ); } ); } const_iterator begin() const { return m_vertices.begin(); @@ -989,13 +986,13 @@ public: std::size_t size() const { return m_vertices.size(); } - const Vector3& operator[]( std::size_t i ) const { + const DoubleVector3& operator[]( std::size_t i ) const { return m_vertices[i]; } brushsplit_t classify_plane( const Plane3& plane ) const { brushsplit_t split; - for( const_iterator i = begin(); i != end(); ++i ){ - WindingVertex_ClassifyPlane( ( *i ), plane, split ); + for( const DoubleVector3& vertex : m_vertices ){ + WindingVertex_ClassifyPlane( vertex, plane, split ); if( ( split.counts[ePlaneFront] != 0 ) && ( split.counts[ePlaneBack] != 0 ) ) // optimized to break, if plane is inside break; } @@ -1009,7 +1006,7 @@ class Scene_gatherSelectedComponents : public scene::Graph::Walker const Vector3Callback m_callback; public: Scene_gatherSelectedComponents( MergeVertices& mergeVertices ) - : m_mergeVertices( mergeVertices ), m_callback( [this]( const Vector3& value ){ m_mergeVertices.insert( value ); } ){ + : m_mergeVertices( mergeVertices ), m_callback( [this]( const DoubleVector3& value ){ m_mergeVertices.insert( value ); } ){ } bool pre( const scene::Path& path, scene::Instance& instance ) const { if ( path.top().get().visible() ) { @@ -1023,17 +1020,14 @@ public: } }; -class MergePlane +struct MergePlane { -public: - Plane3 m_plane; - const Face* m_face; - Vector3 m_v1; - Vector3 m_v2; - Vector3 m_v3; + const Plane3 m_plane; + const Face *const m_face; + const DoubleVector3 m_verts[3]; MergePlane( const Plane3& plane, const Face* face ) : m_plane( plane ), m_face( face ){ } - MergePlane( const Plane3& plane, const Vector3& v1, const Vector3& v2, const Vector3& v3 ) : m_plane( plane ), m_face( 0 ), m_v1( v1 ), m_v2( v2 ), m_v3( v3 ){ + MergePlane( const Plane3& plane, const DoubleVector3 verts[3] ) : m_plane( plane ), m_face( 0 ), m_verts{ verts[0], verts[1], verts[2] } { } }; @@ -1044,10 +1038,8 @@ class MergePlanes public: typedef Planes::const_iterator const_iterator; void insert( const MergePlane& plane ){ - for( const_iterator i = begin(); i != end(); ++i ) - if( plane3_equal( plane.m_plane, i->m_plane ) ) - return; - m_planes.push_back( plane ); + if( std::none_of( begin(), end(), [&plane]( const MergePlane& pla ){ return plane3_equal( plane.m_plane, pla.m_plane ); } ) ) + m_planes.push_back( plane ); } const_iterator begin() const { return m_planes.begin(); @@ -1086,22 +1078,20 @@ void CSG_build_hull( const MergeVertices& mergeVertices, MergePlanes& mergePlane quickhull::QuickHull quickhull; std::vector> pointCloud; pointCloud.reserve( mergeVertices.size() ); - for( std::size_t i = 0; i < mergeVertices.size(); ++i ){ - pointCloud.push_back( quickhull::Vector3( static_cast( mergeVertices[i].x() ), - static_cast( mergeVertices[i].y() ), - static_cast( mergeVertices[i].z() ) ) ); + for( const DoubleVector3& v : mergeVertices ){ + pointCloud.push_back( quickhull::Vector3( v.x(), v.y(), v.z() ) ); } auto hull = quickhull.getConvexHull( pointCloud, true, true ); const auto& indexBuffer = hull.getIndexBuffer(); const size_t triangleCount = indexBuffer.size() / 3; for( size_t i = 0; i < triangleCount; ++i ) { - Vector3 p[3]; + DoubleVector3 points[3]; for( size_t j = 0; j < 3; ++j ){ - p[j] = mergeVertices[indexBuffer[i * 3 + j]]; + points[j] = mergeVertices[indexBuffer[i * 3 + j]]; } - const Plane3 plane = plane3_for_points( p[0], p[1], p[2] ); + const Plane3 plane = plane3_for_points( points ); if( plane3_valid( plane ) ){ - mergePlanes.insert( MergePlane( plane, p[0], p[1], p[2] ) ); + mergePlanes.insert( MergePlane( plane, points ) ); } } } @@ -1120,13 +1110,11 @@ void CSG_WrapMerge( const ClipperPoints& clipperPoints ){ MergeVertices mergeVertices; /* gather unique vertices */ - for ( brush_vector_t::const_iterator b = selected_brushes.begin(); b != selected_brushes.end(); ++b ) - for ( Brush::const_iterator f = ( *b )->begin(); f != ( *b )->end(); ++f ) - if ( ( *f )->contributes() ){ - const Winding& winding = ( *f )->getWinding(); - for ( std::size_t w = 0; w != winding.numpoints; ++w ) - mergeVertices.insert( winding[w].vertex ); - } + for ( const Brush *brush : selected_brushes ) + for ( const FaceSmartPointer& face : *brush ) + if ( face->contributes() ) + for ( const WindingVertex& v : face->getWinding() ) + mergeVertices.insert( v.vertex ); GlobalSceneGraph().traverse( Scene_gatherSelectedComponents( mergeVertices ) ); @@ -1141,15 +1129,13 @@ void CSG_WrapMerge( const ClipperPoints& clipperPoints ){ MergePlanes mergePlanes; /* gather unique && worthy planes */ - for ( brush_vector_t::const_iterator b = selected_brushes.begin(); b != selected_brushes.end(); ++b ) - for ( Brush::const_iterator f = ( *b )->begin(); f != ( *b )->end(); ++f ){ - const Face& face = *( *f ); - if ( face.contributes() ){ - const brushsplit_t split = mergeVertices.classify_plane( face.getPlane().plane3() ); + for ( const Brush *brush : selected_brushes ) + for ( const FaceSmartPointer& face : *brush ) + if ( face->contributes() ){ + const brushsplit_t split = mergeVertices.classify_plane( face->getPlane().plane3() ); if( ( split.counts[ePlaneFront] == 0 ) != ( split.counts[ePlaneBack] == 0 ) ) - mergePlanes.insert( MergePlane( face.getPlane().plane3(), &face ) ); + mergePlanes.insert( MergePlane( face->getPlane().plane3(), face.get() ) ); } - } CSG_build_hull( mergeVertices, mergePlanes ); @@ -1172,12 +1158,12 @@ void CSG_WrapMerge( const ClipperPoints& clipperPoints ){ const char* shader = TextureBrowser_GetSelectedShader(); TextureProjection projection; TexDef_Construct_Default( projection ); - for( MergePlanes::const_iterator i = mergePlanes.begin(); i != mergePlanes.end(); ++i ){ - if( i->m_face ) - brush->addFace( *( i->m_face ) ); + for( const MergePlane& p : mergePlanes ){ + if( p.m_face ) + brush->addFace( *( p.m_face ) ); else - brush->addPlane( i->m_v1, i->m_v2, i->m_v3, shader, projection ); -// globalOutputStream() << i->m_plane.normal() << " " << i->m_plane.dist() << " i->m_plane\n"; + brush->addPlane( p.m_verts[0], p.m_verts[1], p.m_verts[2], shader, projection ); +// globalOutputStream() << p.m_plane.normal() << " " << p.m_plane.dist() << " p.m_plane\n"; } brush->removeEmptyFaces(); } diff --git a/radiant/selection.cpp b/radiant/selection.cpp index e52cd799..599ae0fa 100644 --- a/radiant/selection.cpp +++ b/radiant/selection.cpp @@ -1034,7 +1034,7 @@ private: const auto addSidePlanes = [&outBrush, shader, &projection]( const Winding& winding0, const Winding& winding2, const DoubleVector3 normal, const bool swap ){ for( std::size_t index0 = 0; index0 < winding0.numpoints; ++index0 ){ const std::size_t next = Winding_next( winding0, index0 ); - Vector3 BestPoint; + DoubleVector3 BestPoint; double bestdot = -1; for( std::size_t index2 = 0; index2 < winding2.numpoints; ++index2 ){ const double dot = vector3_dot( @@ -1066,7 +1066,7 @@ private: const auto addSidePlanes = [&outBrush, shader, &projection]( const Winding& winding0, const Brush& brush2, const Plane3 plane, const bool swap ){ for( std::size_t index0 = 0; index0 < winding0.numpoints; ++index0 ){ const std::size_t next = Winding_next( winding0, index0 ); - Vector3 BestPoint; + DoubleVector3 BestPoint; double bestdist = 999999; for( const Face* f : brush2 ) { const Winding& winding2 = f->getWinding(); @@ -3170,9 +3170,9 @@ public: BestPoint( matrix4_clip_triangle( m_local2view, - reinterpret_cast( vertices[0] ), - reinterpret_cast( vertices[i + 1] ), - reinterpret_cast( vertices[i + 2] ), + reinterpret_cast( vertices[0] ), + reinterpret_cast( vertices[i + 1] ), + reinterpret_cast( vertices[i + 2] ), clipped ), clipped, @@ -4100,21 +4100,23 @@ Vector3 testSelected_scene_snapped_point( const SelectionVolume& test, ClipperSe float bestDist = FLT_MAX; Vector3 wannabePoint; for ( Winding::const_iterator prev = face.getWinding().end() - 1, curr = face.getWinding().begin(); curr != face.getWinding().end(); prev = curr, ++curr ){ + const Vector3 v1( prev->vertex ); + const Vector3 v2( curr->vertex ); { /* try vertices */ - const float dist = vector3_length_squared( ( *curr ).vertex - point ); + const float dist = vector3_length_squared( v2 - point ); if( dist < bestDist ){ - wannabePoint = ( *curr ).vertex; + wannabePoint = v2; bestDist = dist; } } { /* try edges */ - Vector3 edgePoint = line_closest_point( Line( ( *prev ).vertex, ( *curr ).vertex ), point ); - if( edgePoint != ( *prev ).vertex && edgePoint != ( *curr ).vertex ){ - const Vector3 edgedir = vector3_normalised( ( *curr ).vertex - ( *prev ).vertex ); + Vector3 edgePoint = line_closest_point( Line( v1, v2 ), point ); + if( edgePoint != v1 && edgePoint != v2 ){ + const Vector3 edgedir = vector3_normalised( v2 - v1 ); const std::size_t maxi = vector3_max_abs_component_index( edgedir ); - // ( *prev ).vertex[maxi] + edgedir[maxi] * coef = float_snapped( point[maxi], GetSnapGridSize() ) - const float coef = ( float_snapped( point[maxi], GetSnapGridSize() ) - ( *prev ).vertex[maxi] ) / edgedir[maxi]; - edgePoint = ( *prev ).vertex + edgedir * coef; + // v1[maxi] + edgedir[maxi] * coef = float_snapped( point[maxi], GetSnapGridSize() ) + const float coef = ( float_snapped( point[maxi], GetSnapGridSize() ) - v1[maxi] ) / edgedir[maxi]; + edgePoint = v1 + edgedir * coef; const float dist = vector3_length_squared( edgePoint - point ); if( dist < bestDist ){ wannabePoint = edgePoint; diff --git a/radiant/surfacedialog.cpp b/radiant/surfacedialog.cpp index 5302a1de..8c41a54d 100644 --- a/radiant/surfacedialog.cpp +++ b/radiant/surfacedialog.cpp @@ -1715,7 +1715,7 @@ static std::vector Patch_getClosestTriangle( const PatchDat /* try patchControls-on-edgeLine */ for ( std::size_t i = w.numpoints - 1, j = 0; j < w.numpoints && ret.empty(); i = j, ++j ) { - const auto ray_close = [eps, ray = ray_for_points( DoubleVector3( w[i].vertex ), DoubleVector3( w[j].vertex ) )]( const PatchControl& p ){ + const auto ray_close = [eps, ray = ray_for_points( w[i].vertex, w[j].vertex )]( const PatchControl& p ){ return ray_squared_distance_to_point( ray, p.m_vertex ) < eps; }; find_triangle( ray_close ); diff --git a/radiant/winding.cpp b/radiant/winding.cpp index 39f43f6c..f87848b9 100644 --- a/radiant/winding.cpp +++ b/radiant/winding.cpp @@ -253,7 +253,7 @@ brushsplit_t Winding_ClassifyPlane( const Winding& winding, const Plane3& plane return split; } -void WindingVertex_ClassifyPlane( const Vector3& vertex, const Plane3& plane, brushsplit_t& split ){ +void WindingVertex_ClassifyPlane( const DoubleVector3& vertex, const Plane3& plane, brushsplit_t& split ){ ++split.counts[Winding_ClassifyDistance( plane3_distance_to_point( plane, vertex ), ON_EPSILON )]; } @@ -339,7 +339,7 @@ std::size_t Winding_Opposite( const Winding& winding, const std::size_t index, c double dist_best = 0; std::size_t index_best = c_brush_maxFaces; - Ray edge( ray_for_points( winding[index].vertex, winding[other].vertex ) ); + const DoubleRay edge( ray_for_points( winding[index].vertex, winding[other].vertex ) ); for ( std::size_t i = 0; i < winding.numpoints; ++i ) { @@ -347,7 +347,7 @@ std::size_t Winding_Opposite( const Winding& winding, const std::size_t index, c continue; } - double dist_squared = ray_squared_distance_to_point( edge, winding[i].vertex ); + const double dist_squared = ray_squared_distance_to_point( edge, winding[i].vertex ); if ( dist_squared > dist_best ) { dist_best = dist_squared; @@ -368,20 +368,20 @@ void Winding_Centroid( const Winding& winding, const Plane3& plane, Vector3& cen const indexremap_t remap = indexremap_for_projectionaxis( axis ); for ( std::size_t i = winding.numpoints - 1, j = 0; j < winding.numpoints; i = j, ++j ) { - const double ai = static_cast( winding[i].vertex[remap.x] ) * winding[j].vertex[remap.y] - static_cast( winding[j].vertex[remap.x] ) * winding[i].vertex[remap.y]; + const double ai = winding[i].vertex[remap.x] * winding[j].vertex[remap.y] - winding[j].vertex[remap.x] * winding[i].vertex[remap.y]; area2 += ai; - x_sum += ( static_cast( winding[j].vertex[remap.x] ) + winding[i].vertex[remap.x] ) * ai; - y_sum += ( static_cast( winding[j].vertex[remap.y] ) + winding[i].vertex[remap.y] ) * ai; + x_sum += ( winding[j].vertex[remap.x] + winding[i].vertex[remap.x] ) * ai; + y_sum += ( winding[j].vertex[remap.y] + winding[i].vertex[remap.y] ) * ai; } - centroid[remap.x] = static_cast( x_sum / ( 3 * area2 ) ); - centroid[remap.y] = static_cast( y_sum / ( 3 * area2 ) ); + centroid[remap.x] = x_sum / ( 3 * area2 ); + centroid[remap.y] = y_sum / ( 3 * area2 ); { Ray ray( Vector3( 0, 0, 0 ), Vector3( 0, 0, 0 ) ); ray.origin[remap.x] = centroid[remap.x]; ray.origin[remap.y] = centroid[remap.y]; ray.direction[remap.z] = 1; - centroid[remap.z] = static_cast( ray_distance_to_plane( ray, plane ) ); + centroid[remap.z] = ray_distance_to_plane( ray, plane ); } // windingTestInfinity(); } diff --git a/radiant/winding.h b/radiant/winding.h index 102470ae..de37cc47 100644 --- a/radiant/winding.h +++ b/radiant/winding.h @@ -85,7 +85,7 @@ const std::size_t c_brush_maxFaces = 1024; class WindingVertex { public: - Vector3 vertex; + DoubleVector3 vertex; Vector2 texcoord; Vector3 tangent; Vector3 bitangent; @@ -210,9 +210,9 @@ inline void Winding_forFixedWinding( Winding& winding, const FixedWinding& fixed winding.numpoints = fixed.size(); for ( std::size_t i = 0; i < fixed.size(); ++i ) { - winding[i].vertex[0] = static_cast( fixed[i].vertex[0] ); - winding[i].vertex[1] = static_cast( fixed[i].vertex[1] ); - winding[i].vertex[2] = static_cast( fixed[i].vertex[2] ); + winding[i].vertex[0] = fixed[i].vertex[0]; + winding[i].vertex[1] = fixed[i].vertex[1]; + winding[i].vertex[2] = fixed[i].vertex[2]; winding[i].adjacent = fixed[i].adjacent; } } @@ -232,7 +232,7 @@ void Winding_createInfinite( FixedWinding& w, const Plane3& plane, double infini const double ON_EPSILON = 1.0 / ( 1 << 8 ); /// \brief Returns true if edge (\p x, \p y) is smaller than the epsilon used to classify winding points against a plane. -inline bool Edge_isDegenerate( const Vector3& x, const Vector3& y ){ +inline bool Edge_isDegenerate( const DoubleVector3& x, const DoubleVector3& y ){ return vector3_length_squared( y - x ) < ( ON_EPSILON * ON_EPSILON ); } @@ -255,7 +255,7 @@ struct brushsplit_t }; brushsplit_t Winding_ClassifyPlane( const Winding& w, const Plane3& plane ); -void WindingVertex_ClassifyPlane( const Vector3& vertex, const Plane3& plane, brushsplit_t& split ); +void WindingVertex_ClassifyPlane( const DoubleVector3& vertex, const Plane3& plane, brushsplit_t& split ); bool Winding_PlanesConcave( const Winding& w1, const Winding& w2, const Plane3& plane1, const Plane3& plane2 ); bool Winding_TestPlane( const Winding& w, const Plane3& plane, bool flipped ); diff --git a/tools/quake3/q3map2/surface_meta.cpp b/tools/quake3/q3map2/surface_meta.cpp index 05584772..9d606b08 100644 --- a/tools/quake3/q3map2/surface_meta.cpp +++ b/tools/quake3/q3map2/surface_meta.cpp @@ -1239,7 +1239,7 @@ void SmoothMetaTriangles(){ smoothed[ j ] = true; /* see if this normal has already been voted */ - if( votes.end() == std::find_if( votes.begin(), votes.end(), + if( std::none_of( votes.begin(), votes.end(), [normal = verts[j]->normal]( const Vector3& vote ){ return vector3_equal_epsilon( normal, vote, EQUAL_NORMAL_EPSILON ); } ) )