X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=radiant%2Fbrush.h;h=c20f03cbd36f4d22d9f8dddc703dc345329ac556;hb=ca0295d3b8e3340c18de1fe13f41265ba32612d4;hp=21e7d9ca53e530ac0e6b29f06c1fa34a14d456af;hpb=b25e4389ba4d089fc94cc3860774c8510b843042;p=xonotic%2Fnetradiant.git diff --git a/radiant/brush.h b/radiant/brush.h index 21e7d9ca..c20f03cb 100644 --- a/radiant/brush.h +++ b/radiant/brush.h @@ -307,7 +307,6 @@ class FaceShaderObserver { public: virtual void realiseShader() = 0; - virtual void unrealiseShader() = 0; }; @@ -362,7 +361,8 @@ SavedState( const FaceShader& faceShader ){ void exportState( FaceShader& faceShader ) const { faceShader.setShader( m_shader.c_str() ); - faceShader.setFlags( m_flags ); + //faceShader.setFlags( m_flags ); + faceShader.m_flags = m_flags; } }; @@ -655,6 +655,8 @@ static bool isDoom3Plane(){ return FacePlane::m_type == eBrushTypeDoom3 || FacePlane::m_type == eBrushTypeQuake4; } + FacePlane& operator=(const FacePlane&) = default; + class SavedState { public: @@ -868,11 +870,8 @@ class FaceObserver { public: virtual void planeChanged() = 0; - virtual void connectivityChanged() = 0; - virtual void shaderChanged() = 0; - virtual void evaluateTransform() = 0; }; @@ -1410,8 +1409,7 @@ inline bool plane3_inside( const Plane3& self, const Plane3& other, bool selfIsL return true; } -typedef SmartPointer FaceSmartPointer; -typedef std::vector Faces; +typedef std::vector> Faces; /// \brief Returns the unique-id of the edge adjacent to \p faceVertex in the edge-pair for the set of \p faces. inline FaceVertexId next_edge( const Faces& faces, FaceVertexId faceVertex ){ @@ -1493,25 +1491,15 @@ class BrushObserver { public: virtual void reserve( std::size_t size ) = 0; - virtual void clear() = 0; - virtual void push_back( Face& face ) = 0; - virtual void pop_back() = 0; - virtual void erase( std::size_t index ) = 0; - virtual void connectivityChanged() = 0; - virtual void edge_clear() = 0; - virtual void edge_push_back( SelectableEdge& edge ) = 0; - virtual void vertex_clear() = 0; - virtual void vertex_push_back( SelectableVertex& vertex ) = 0; - virtual void DEBUG_verify() const = 0; }; @@ -1900,24 +1888,24 @@ bool isDetail(){ } /// \brief Appends a copy of \p face to the end of the face list. -Face* addFace( const Face& face ){ + std::shared_ptr addFace( const Face& face ){ if ( m_faces.size() == c_brush_maxFaces ) { return 0; } undoSave(); - push_back( FaceSmartPointer( new Face( face, this ) ) ); + push_back( std::make_shared( face, this ) ); m_faces.back()->setDetail( isDetail() ); planeChanged(); return m_faces.back(); } /// \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 ){ + std::shared_ptr addPlane( const Vector3& p0, const Vector3& p1, const Vector3& p2, const char* shader, const TextureProjection& projection ){ if ( m_faces.size() == c_brush_maxFaces ) { return 0; } undoSave(); - push_back( FaceSmartPointer( new Face( p0, p1, p2, shader, projection, this ) ) ); + push_back( std::make_shared( p0, p1, p2, shader, projection, this ) ); m_faces.back()->setDetail( isDetail() ); planeChanged(); return m_faces.back(); @@ -1961,11 +1949,11 @@ const_iterator end() const { return m_faces.end(); } -Face* back(){ + std::shared_ptr back(){ return m_faces.back(); } -const Face* back() const { + const std::shared_ptr back() const { return m_faces.back(); } @@ -2094,6 +2082,11 @@ void windingForClipPlane( Winding& winding, const Plane3& plane ) const { continue; } + if( buffer[swap].points.empty() ){ + //globalErrorStream() << "windingForClipPlane: about to feed empty winding\n"; + break; + } + buffer[!swap].clear(); #if BRUSH_CONNECTIVITY_DEBUG @@ -2483,9 +2476,6 @@ inline bool triangles_same_winding( const BasicVector3& x1, const Basic } -typedef const Plane3* PlanePointer; -typedef PlanePointer* PlanesIterator; - class VectorLightList : public LightList { typedef std::vector Lights; @@ -2712,7 +2702,7 @@ void testSelect_centroid( Selector& selector, SelectionTest& test ){ } } -void selectPlane( Selector& selector, const Line& line, PlanesIterator first, PlanesIterator last, const PlaneCallback& selectedPlaneCallback ){ +void selectPlane( Selector& selector, const Line& line, const PlaneCallback& selectedPlaneCallback ){ for ( Winding::const_iterator i = getFace().getWinding().begin(); i != getFace().getWinding().end(); ++i ) { Vector3 v( vector3_subtracted( line_closest_point( line, ( *i ).vertex ), ( *i ).vertex ) ); @@ -2733,6 +2723,17 @@ void selectReversedPlane( Selector& selector, const SelectedPlanes& selectedPlan } } +bool trySelectPlane( const Line& line ){ + for ( Winding::const_iterator i = getFace().getWinding().begin(); i != getFace().getWinding().end(); ++i ){ + Vector3 v( vector3_subtracted( line_closest_point( line, ( *i ).vertex ), ( *i ).vertex ) ); + double dot = vector3_dot( getFace().plane3().normal(), v ); + if ( dot <= 0 ) { + return false; + } + } + return true; +} + void transformComponents( const Matrix4& matrix ){ if ( isSelected() ) { m_face->transform( matrix, false ); @@ -3099,6 +3100,20 @@ void testSelect( Selector& selector, SelectionTest& test ){ Selector_add( selector, *this, best ); } } + +void selectVerticesOnPlanes( SelectionTest& test ){ + Line line( test.getNear(), test.getFar() ); + FaceVertexId faceVertex = m_vertex->m_faceVertex; + do + { + if( m_faceInstances[faceVertex.getFace()].trySelectPlane( line ) ){ + //m_faceInstances[faceVertex.getFace()].select_vertex( faceVertex.getVertex(), true ); + setSelected( true ); + } + faceVertex = next_vertex( m_vertex->m_faces, faceVertex ); + } + while ( faceVertex.getFace() != m_vertex->m_faceVertex.getFace() ); +} }; class BrushInstanceVisitor @@ -3171,6 +3186,7 @@ TransformModifier m_transform; BrushInstance( const BrushInstance& other ); // NOT COPYABLE BrushInstance& operator=( const BrushInstance& other ); // NOT ASSIGNABLE + public: static Counter* m_counter; @@ -3317,6 +3333,11 @@ bool isSelected() const { void setSelected( bool select ){ m_selectable.setSelected( select ); + if ( !select && parent() ){ + Selectable* sel_parent = Instance_getSelectable( *parent() ); + if ( sel_parent && sel_parent->isSelected() ) + sel_parent->setSelected( false ); + } } void update_selected() const { @@ -3520,17 +3541,9 @@ void testSelectComponents( Selector& selector, SelectionTest& test, SelectionSys void selectPlanes( Selector& selector, SelectionTest& test, const PlaneCallback& selectedPlaneCallback ){ test.BeginMesh( localToWorld() ); - PlanePointer brushPlanes[c_brush_maxFaces]; - PlanesIterator j = brushPlanes; - - for ( Brush::const_iterator i = m_brush.begin(); i != m_brush.end(); ++i ) - { - *j++ = &( *i )->plane3(); - } - for ( FaceInstances::iterator i = m_faceInstances.begin(); i != m_faceInstances.end(); ++i ) { - ( *i ).selectPlane( selector, Line( test.getNear(), test.getFar() ), brushPlanes, j, selectedPlaneCallback ); + ( *i ).selectPlane( selector, Line( test.getNear(), test.getFar() ), selectedPlaneCallback ); } } @@ -3542,6 +3555,15 @@ void selectReversedPlanes( Selector& selector, const SelectedPlanes& selectedPla } +void selectVerticesOnPlanes( SelectionTest& test ){ + test.BeginMesh( localToWorld() ); + + for ( VertexInstances::iterator i = m_vertexInstances.begin(); i != m_vertexInstances.end(); ++i ){ + ( *i ).selectVerticesOnPlanes( test ); + } +} + + void transformComponents( const Matrix4& matrix ){ for ( FaceInstances::iterator i = m_faceInstances.begin(); i != m_faceInstances.end(); ++i ) {