]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/brush.h
Merge commit 'aa4bc3893f6c0c360c91896eba46631e53b2f0d1' into master-merge
[xonotic/netradiant.git] / radiant / brush.h
index 3b0b8c7c472b0ea427673503c6f7ad748ca15abb..c20f03cbd36f4d22d9f8dddc703dc345329ac556 100644 (file)
@@ -361,7 +361,8 @@ SavedState( const FaceShader& faceShader ){
 
 void exportState( FaceShader& faceShader ) const {
        faceShader.setShader( m_shader.c_str() );
-                       faceShader.m_flags = m_flags;
+       //faceShader.setFlags( m_flags );
+       faceShader.m_flags = m_flags;
 }
 };
 
@@ -2081,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
@@ -2470,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;
@@ -2699,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 ) );
@@ -2720,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 );
@@ -3086,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
@@ -3305,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 {
@@ -3508,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 );
        }
 }
 
@@ -3530,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 )
        {