add and use VolumeTest/View.getViewDir()

This commit is contained in:
Garux 2018-05-18 01:55:20 +03:00
parent 4745e0b23b
commit 6f8a0668a3
6 changed files with 21 additions and 20 deletions

View File

@ -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

View File

@ -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;

View File

@ -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 )

View File

@ -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 );
}
}

View File

@ -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];
}

View File

@ -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;
}