]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/brush.h
Merge commit 'aa4bc3893f6c0c360c91896eba46631e53b2f0d1' into master-merge
[xonotic/netradiant.git] / radiant / brush.h
index 21e7d9ca53e530ac0e6b29f06c1fa34a14d456af..c20f03cbd36f4d22d9f8dddc703dc345329ac556 100644 (file)
@@ -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<Face> FaceSmartPointer;
-typedef std::vector<FaceSmartPointer> Faces;
+typedef std::vector<std::shared_ptr<Face>> 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<Face> 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>( 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<Face> 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<Face>( 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<Face> back(){
        return m_faces.back();
 }
 
-const Face* back() const {
+       const std::shared_ptr<Face> 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<Element>& x1, const Basic
 }
 
 
-typedef const Plane3* PlanePointer;
-typedef PlanePointer* PlanesIterator;
-
 class VectorLightList : public LightList
 {
 typedef std::vector<const RendererLight*> 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 )
        {