Sys_GetCursorPos( widget, ¤t_x, ¤t_y );
int dx = current_x - self->last_x;
int dy = current_y - self->last_y;
++#if 0 // NetRadiantCustom
+ int ddx = current_x - self->center_x;
+ int ddy = current_y - self->center_y;
++#else
++ int ddx = current_x - self->recorded_x;
++ int ddy = current_y - self->recorded_y;
++#endif
self->last_x = current_x;
self->last_y = current_y;
if ( dx != 0 || dy != 0 ) {
//globalOutputStream() << "motion x: " << dx << ", y: " << dy << "\n";
- #if 0 // NetRadiantCustom
- int ddx = current_x - self->center_x;
- int ddy = current_y - self->center_y;
- #else
- int ddx = current_x - self->recorded_x;
- int ddy = current_y - self->recorded_y;
- #endif
+#if defined(WORKAROUND_MACOS_GTK2_LAGGYPOINTER)
+ ui::Dimensions dimensions = widget.dimensions();
+ int window_x, window_y;
+ int translated_x, translated_y;
+
+ gdk_window_get_origin( gtk_widget_get_window( widget ), &window_x, &window_y);
+
+ translated_x = current_x - ( window_x );
+ translated_y = current_y - ( window_y );
+
+#if 0
+ int widget_x, widget_y;
+ gtk_widget_translate_coordinates( GTK_WIDGET( widget ), gtk_widget_get_toplevel( GTK_WIDGET( widget ) ), 0, 0, &widget_x, &widget_y);
+
+ globalOutputStream()
+ << "window_x: " << window_x
+ << ", window_y: " << window_y
+ << ", widget_x: " << widget_x
+ << ", widget_y: " << widget_y
+ << ", current x: " << current_x
+ << ", current_y: " << current_y
+ << ", translated x: " << translated_x
+ << ", translated_y: " << translated_y
+ << ", width: " << dimensions.width
+ << ", height: " << dimensions.height
+ << "\n";
+#endif
+
+ if ( translated_x < 32 || translated_x > dimensions.width - 32
+ || translated_y < 32 || translated_y > dimensions.height - 32 ) {
+#if 0
+ // Reposition the pointer to the widget center.
+ int reposition_x = window_x + dimensions.width / 2;
+ int reposition_y = window_y + dimensions.height / 2;
+#else
+ // Move the pointer to the opposite side of the XY Window
+ // to maximize the distance that can be moved again.
+ int reposition_x = current_x;
+ int reposition_y = current_y;
+
+ if ( translated_x < 32 ) {
+ reposition_x = window_x + dimensions.width - 32;
+ }
+ else if ( translated_x > dimensions.width - 32 ) {
+ reposition_x = window_x + 32;
+ }
+
+ if ( translated_y < 32 ) {
+ reposition_y = window_y + dimensions.height - 32;
+ }
+ else if ( translated_y > dimensions.height - 32 ) {
+ reposition_y = window_y + 32;
+ }
+#endif
+
+ Sys_SetCursorPos( widget, reposition_x, reposition_y );
+ self->last_x = reposition_x;
+ self->last_y = reposition_y;
+ }
+#else
if (ddx < -32 || ddx > 32 || ddy < -32 || ddy > 32) {
+#if 0 // NetRadiantCustom
Sys_SetCursorPos( widget, self->center_x, self->center_y );
- #endif
+ self->last_x = self->center_x;
+ self->last_y = self->center_y;
+#else
+ Sys_SetCursorPos( widget, self->recorded_x, self->recorded_y );
+ self->last_x = self->recorded_x;
+ self->last_y = self->recorded_y;
++#endif
}
+#endif
self->m_function( dx, dy, event->state, self->m_data );
}
return FALSE;
| GDK_BUTTON_RELEASE_MASK
| GDK_VISIBILITY_NOTIFY_MASK );
- GdkCursor* cursor = create_blank_cursor();
+#if defined(WORKAROUND_MACOS_GTK2_LAGGYPOINTER)
+ /* Keep the pointer visible during the move operation.
+ Because of a bug, it remains visible even if we give
+ the order to hide it anyway.
+ Other parts of the code assume the pointer is visible,
+ so make sure it is consistently visible accross
+ third-party updates that may fix the mouse pointer
+ visibility issue. */
+#else
+#if 0 // NetRadiantCustom
+ //GdkCursor* cursor = create_blank_cursor();
+ GdkCursor* cursor = gdk_cursor_new( GDK_BLANK_CURSOR );
//GdkGrabStatus status =
/* fixes cursor runaways during srsly quick drags in camera
drags with pressed buttons have no problem at all w/o this */
m_function = 0;
m_data = 0;
- // Sys_SetCursorPos( widget, center_x, center_y );
+#if defined(WORKAROUND_MACOS_GTK2_LAGGYPOINTER)
+ /* The pointer was visible during all the move operation,
+ so, keep the current position. */
+#else
+ // NetRadiantCustom still uses window instead of widget.
+#if 0 // NetRadiantCustom
+ Sys_SetCursorPos( window, recorded_x, recorded_y );
+#else
+ Sys_SetCursorPos( widget, recorded_x, recorded_y );
+#endif
+#endif
+ // gdk_window_set_cursor( GTK_WIDGET( window )->window, 0 );
gdk_pointer_ungrab( GDK_CURRENT_TIME );
-
+#if 0 // NetRadiantCustom
gtk_grab_remove( weedjet );
+#endif
}
const Brush& brush;
brush_vector_t& out;
float offset;
- bool room;
+ eHollowType HollowType;
+ DoubleVector3 ExclusionAxis;
+ double &mindot;
+ double &maxdot;
+ bool caulk;
+ bool RemoveInner;
public:
- FaceMakeBrush( const Brush& brush, brush_vector_t& out, float offset, bool room )
- : brush( brush ), out( out ), offset( offset ), room( room ){
+ FaceMakeBrush( const Brush& brush,
+ brush_vector_t& out,
+ float offset,
+ eHollowType HollowType,
+ DoubleVector3 ExclusionAxis,
+ double &mindot,
+ double &maxdot,
+ bool caulk,
+ bool RemoveInner )
+ : brush( brush ),
+ out( out ),
+ offset( offset ),
+ HollowType( HollowType ),
+ ExclusionAxis( ExclusionAxis ),
+ mindot( mindot ),
+ maxdot( maxdot ),
+ caulk( caulk ),
+ RemoveInner( RemoveInner ){
}
void operator()( Face& face ) const {
- if( room ){
- Face_extrude( face, brush, out, offset );
+ double dot = vector3_dot( face.getPlane().plane3().normal(), ExclusionAxis );
+ if( dot == 0 || ( dot > mindot + 0.005 && dot < maxdot - 0.005 ) ){
+ if( HollowType == pull ){
+ if ( face.contributes() ) {
+ face.getPlane().offset( offset );
+ face.planeChanged();
+ out.push_back( new Brush( brush ) );
+ face.getPlane().offset( -offset );
+ face.planeChanged();
+
+ if( caulk ){
+ Brush_forEachFace( *out.back(), CaulkFace( ExclusionAxis, mindot, maxdot ) );
+ }
- Face* newFace = out.back()->addFace( face );
++ std::shared_ptr<Face> newFace = out.back()->addFace( face );
+ if ( newFace != 0 ) {
+ newFace->flipWinding();
+ }
+ }
+ }
+ else if( HollowType == wrap ){
+ //Face_makeBrush( face, brush, out, offset );
+ if ( face.contributes() ) {
+ face.undoSave();
+ out.push_back( new Brush( brush ) );
+ if( !RemoveInner && caulk )
+ face.SetShader( getCaulkShader() );
- Face* newFace = out.back()->addFace( face );
++ std::shared_ptr<Face> newFace = out.back()->addFace( face );
+ face.getPlane().offset( -offset );
+ face.planeChanged();
+ if( caulk )
+ face.SetShader( getCaulkShader() );
+ if ( newFace != 0 ) {
+ newFace->flipWinding();
+ newFace->getPlane().offset( offset );
+ newFace->planeChanged();
+ }
+ }
+ }
+ else if( HollowType == extrude ){
+ if ( face.contributes() ) {
+ //face.undoSave();
+ out.push_back( new Brush( brush ) );
+ out.back()->clear();
+
- Face* newFace = out.back()->addFace( face );
++ std::shared_ptr<Face> newFace = out.back()->addFace( face );
+ if ( newFace != 0 ) {
+ newFace->getPlane().offset( offset );
+ newFace->planeChanged();
+ }
+
+ if( !RemoveInner && caulk )
+ face.SetShader( getCaulkShader() );
+ newFace = out.back()->addFace( face );
+ if ( newFace != 0 ) {
+ newFace->flipWinding();
+ }
+ Winding& winding = face.getWinding();
+ TextureProjection projection;
+ TexDef_Construct_Default( projection );
+ for ( Winding::iterator j = winding.begin(); j != winding.end(); ++j ){
+ std::size_t index = std::distance( winding.begin(), j );
+ std::size_t next = Winding_next( winding, index );
+
+ out.back()->addPlane( winding[index].vertex, winding[next].vertex, winding[next].vertex + face.getPlane().plane3().normal() * offset, TextureBrowser_GetSelectedShader( GlobalTextureBrowser() ), projection );
+ }
+ }
+ }
+ else if( HollowType == diag ){
+ if ( face.contributes() ) {
+ out.push_back( new Brush( brush ) );
+ out.back()->clear();
+
- Face* newFace = out.back()->addFace( face );
++ std::shared_ptr<Face> newFace = out.back()->addFace( face );
+ if ( newFace != 0 ) {
+
+ newFace->planeChanged();
+ }
+ newFace = out.back()->addFace( face );
+
+ if ( newFace != 0 ) {
+ if( !RemoveInner && caulk )
+ newFace->SetShader( getCaulkShader() );
+ newFace->flipWinding();
+ newFace->getPlane().offset( offset );
+ newFace->planeChanged();
+ }
+
+ Winding& winding = face.getWinding();
+ TextureProjection projection;
+ TexDef_Construct_Default( projection );
+ for ( Winding::iterator i = winding.begin(); i != winding.end(); ++i ){
+ std::size_t index = std::distance( winding.begin(), i );
+ std::size_t next = Winding_next( winding, index );
+ Vector3 BestPoint;
+ float bestdist = 999999;
+
+ for( Brush::const_iterator j = brush.begin(); j != brush.end(); ++j ){
+ Winding& winding2 = ( *j )->getWinding();
+ for ( Winding::iterator k = winding2.begin(); k != winding2.end(); ++k ){
+ std::size_t index2 = std::distance( winding2.begin(), k );
+ float testdist = vector3_length( winding[index].vertex - winding2[index2].vertex );
+ if( testdist < bestdist ){
+ bestdist = testdist;
+ BestPoint = winding2[index2].vertex;
+ }
+ }
+ }
+ out.back()->addPlane( winding[next].vertex, winding[index].vertex, BestPoint, caulk? getCaulkShader() : TextureBrowser_GetSelectedShader( GlobalTextureBrowser() ), projection );
+ }
+ }
+ }
}
- else{
- Face_makeBrush( face, brush, out, offset );
}
+ };
+
+ class FaceExclude
+ {
+ DoubleVector3 ExclusionAxis;
+ double &mindot;
+ double &maxdot;
+ public:
+ FaceExclude( DoubleVector3 ExclusionAxis, double &mindot, double &maxdot )
+ : ExclusionAxis( ExclusionAxis ), mindot( mindot ), maxdot( maxdot ){
+ }
+ void operator()( Face& face ) const {
+ if( vector3_length_squared( ExclusionAxis ) != 0 ){
+ double dot = vector3_dot( face.getPlane().plane3().normal(), ExclusionAxis );
+ if( dot < mindot ){
+ mindot = dot;
+ }
+ else if( dot > maxdot ){
+ maxdot = dot;
+ }
+ }
}
};
for ( brush_vector_t::const_iterator i = out.begin(); i != out.end(); ++i )
{
( *i )->removeEmptyFaces();
- NodeSmartReference node( ( new BrushNode() )->node() );
- Node_getBrush( node )->copy( *( *i ) );
- delete ( *i );
- Node_getTraversable( path.parent() )->insert( node );
+ if( ( *i )->hasContributingFaces() ){
+ NodeSmartReference node( ( new BrushNode() )->node() );
+ Node_getBrush( node )->copy( *( *i ) );
+ delete ( *i );
+ Node_getTraversable( path.parent() )->insert( node );
+ //path.push( makeReference( node.get() ) );
+ //selectPath( path, true );
+ //Instance_getSelectable( *GlobalSceneGraph().find( path ) )->setSelected( true );
+ //Path_deleteTop( path );
+ }
}
}
}