diff --git a/include/cullable.h b/include/cullable.h index 7281fd01..303803a9 100644 --- a/include/cullable.h +++ b/include/cullable.h @@ -60,6 +60,7 @@ virtual const Matrix4& GetModelview() const = 0; virtual const Matrix4& GetViewMatrix() const = 0; //viewproj virtual const Vector3& getViewer() const = 0; +virtual const Vector3& getViewDir() const = 0; }; class Cullable diff --git a/libs/dragplanes.h b/libs/dragplanes.h index f42c7174..27093543 100644 --- a/libs/dragplanes.h +++ b/libs/dragplanes.h @@ -117,7 +117,7 @@ void selectPlanes( const AABB& aabb, Selector& selector, SelectionTest& test, co 7, 6, 5, 4, //-z //bottom }; - const Vector3 viewdir( vector3_normalised( Vector3( test.getVolume().GetModelview()[2], test.getVolume().GetModelview()[6], test.getVolume().GetModelview()[10] ) ) ); + const Vector3 viewdir( test.getVolume().getViewDir() ); double bestDot = 1; ObservedSelectable* selectable = 0; ObservedSelectable* selectable2 = 0; diff --git a/radiant/brush.h b/radiant/brush.h index 39522371..52558265 100644 --- a/radiant/brush.h +++ b/radiant/brush.h @@ -3550,7 +3550,7 @@ void invertComponentSelection( SelectionSystem::EComponentMode mode ){ void selectPlanes( SelectionTest& test, FaceInstances_ptrs& bestInstances ){ test.BeginMesh( localToWorld() ); - const Vector3 viewdir( vector3_normalised( Vector3( test.getVolume().GetModelview()[2], test.getVolume().GetModelview()[6], test.getVolume().GetModelview()[10] ) ) ); + const Vector3 viewdir( test.getVolume().getViewDir() ); double bestDot = 1; for ( FaceInstances::iterator i = m_faceInstances.begin(); i != m_faceInstances.end(); ++i ) diff --git a/radiant/camwindow.cpp b/radiant/camwindow.cpp index 38873d69..4542eaaa 100644 --- a/radiant/camwindow.cpp +++ b/radiant/camwindow.cpp @@ -1892,9 +1892,9 @@ void GlobalCamera_ResetAngles(){ #include "select.h" Vector3 Camera_getFocusPos( camera_t& camera ){ - Vector3 camorigin( Camera_getOrigin( camera ) ); - AABB aabb( aabb_for_minmax( Select_getWorkZone().d_work_min, Select_getWorkZone().d_work_max ) ); - View& view = *( camera.m_view ); + const Vector3 camorigin( Camera_getOrigin( camera ) ); + const AABB aabb( aabb_for_minmax( Select_getWorkZone().d_work_min, Select_getWorkZone().d_work_max ) ); + const View& view = *( camera.m_view ); #if 0 Vector3 angles( Camera_getAngles( camera ) ); Vector3 radangles( degrees_to_radians( angles[0] ), degrees_to_radians( angles[1] ), degrees_to_radians( angles[2] ) ); @@ -1903,9 +1903,9 @@ Vector3 Camera_getFocusPos( camera_t& camera ){ viewvector[1] = sin( radangles[1] ) * cos( radangles[0] ); viewvector[2] = sin( radangles[0] ); #elif 0 - Vector3 viewvector( -view.GetModelview()[2], -view.GetModelview()[6], -view.GetModelview()[10] ); + const Vector3 viewvector( view.getViewDir() ); #elif 1 - Vector3 viewvector( -camera.vpn ); + const Vector3 viewvector( -camera.vpn ); #endif Plane3 frustumPlanes[4]; @@ -1921,12 +1921,12 @@ Vector3 Camera_getFocusPos( camera_t& camera ){ for ( std::size_t i = 0; i < 4; ++i ){ for ( std::size_t j = 0; j < 8; ++j ){ - Ray ray( aabb.origin, -viewvector ); + const Ray ray( aabb.origin, -viewvector ); //Plane3 newplane( frustumPlanes[i].normal(), vector3_dot( frustumPlanes[i].normal(), corners[j] - frustumPlanes[i].normal() * 16.0f ) ); - Plane3 newplane( frustumPlanes[i].normal(), vector3_dot( frustumPlanes[i].normal(), corners[j] ) ); - float d = vector3_dot( ray.direction, newplane.normal() ); + const Plane3 newplane( frustumPlanes[i].normal(), vector3_dot( frustumPlanes[i].normal(), corners[j] ) ); + const float d = vector3_dot( ray.direction, newplane.normal() ); if( d != 0 ){ - float s = vector3_dot( newplane.normal() * newplane.dist() - ray.origin, newplane.normal() ) / d; + const float s = vector3_dot( newplane.normal() * newplane.dist() - ray.origin, newplane.normal() ) / d; offset = std::max( offset, s ); } } diff --git a/radiant/selection.cpp b/radiant/selection.cpp index c5cb17c5..597dc9aa 100644 --- a/radiant/selection.cpp +++ b/radiant/selection.cpp @@ -2393,7 +2393,7 @@ public: Selectable* selectable = 0; Selectable* selectable2 = 0; double bestDot = 1; - const Vector3 viewdir( vector3_normalised( Vector3( view.GetModelview()[2], view.GetModelview()[6], view.GetModelview()[10] ) ) ); + const Vector3 viewdir( view.getViewDir() ); for ( int i = 0; i < 3; ++i ){ for ( int j = 0; j < 2; ++j ){ const Vector3 normal = j? g_vector3_axes[i] : -g_vector3_axes[i]; @@ -3786,11 +3786,9 @@ public: } void newPoint( const Vector3& point, const View& view ){ { /* update m_viewdir */ - const Vector3 viewdir( view.GetModelview()[2], view.GetModelview()[6], view.GetModelview()[10] ); + const Vector3 viewdir( view.getViewDir() ); const std::size_t maxi = vector3_max_abs_component_index( viewdir ); m_viewdir = ( viewdir[maxi] > 0 )? g_vector3_axes[maxi] : -g_vector3_axes[maxi]; - if( view.fill() ) //viewdir, taken this way in perspective view is negative for some reason - m_viewdir *= -1; } const std::size_t i = newPointIndex( view ); if( i == 0 ) @@ -3870,14 +3868,10 @@ public: newPoint( point, view ); } else{ - const Vector3 viewdir( Vector3( fabs( view.GetModelview()[2] ), fabs( view.GetModelview()[6] ), fabs( view.GetModelview()[10] ) ) ); - std::size_t maxi = 0; - for( std::size_t i = 1; i < 3; ++i ) - if( viewdir[i] > viewdir[maxi] ) - maxi = i; Vector3 point = vector4_projected( matrix4_transformed_vector4( matrix4_full_inverse( view.GetViewMatrix() ), Vector4( 0, 0, 0, 1 ) ) ); vector3_snap( point, GetSnapGridSize() ); { + const std::size_t maxi = vector3_max_abs_component_index( view.getViewDir() ); const std::size_t i = newPointIndex( view ); point[maxi] = m_bounds.origin[maxi] + ( i == 2? -1 : 1 ) * m_bounds.extents[maxi]; } diff --git a/radiant/view.h b/radiant/view.h index 2e713d16..0856b7f8 100644 --- a/radiant/view.h +++ b/radiant/view.h @@ -93,6 +93,8 @@ Vector4 m_viewer; /// view frustum in world space Frustum m_frustum; +Vector3 m_viewdir; + bool m_fill; void construct(){ @@ -100,6 +102,7 @@ void construct(){ m_frustum = frustum_from_viewproj( m_viewproj ); m_viewer = viewer_from_viewproj( m_viewproj ); + m_viewdir = vector3_normalised( fill()? Vector3( -m_modelview[2], -m_modelview[6], -m_modelview[10] ) : Vector3( m_modelview[2], m_modelview[6], m_modelview[10] ) ); } public: View( bool fill = false ) : @@ -186,6 +189,9 @@ bool fill() const { const Vector3& getViewer() const { return vector4_to_vector3( m_viewer ); } +const Vector3& getViewDir() const { + return m_viewdir; +} const Frustum& getFrustum() const { return m_frustum; }