add and use VolumeTest/View.getViewDir()
This commit is contained in:
parent
4745e0b23b
commit
6f8a0668a3
|
|
@ -60,6 +60,7 @@ virtual const Matrix4& GetModelview() const = 0;
|
||||||
|
|
||||||
virtual const Matrix4& GetViewMatrix() const = 0; //viewproj
|
virtual const Matrix4& GetViewMatrix() const = 0; //viewproj
|
||||||
virtual const Vector3& getViewer() const = 0;
|
virtual const Vector3& getViewer() const = 0;
|
||||||
|
virtual const Vector3& getViewDir() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Cullable
|
class Cullable
|
||||||
|
|
|
||||||
|
|
@ -117,7 +117,7 @@ void selectPlanes( const AABB& aabb, Selector& selector, SelectionTest& test, co
|
||||||
7, 6, 5, 4, //-z //bottom
|
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;
|
double bestDot = 1;
|
||||||
ObservedSelectable* selectable = 0;
|
ObservedSelectable* selectable = 0;
|
||||||
ObservedSelectable* selectable2 = 0;
|
ObservedSelectable* selectable2 = 0;
|
||||||
|
|
|
||||||
|
|
@ -3550,7 +3550,7 @@ void invertComponentSelection( SelectionSystem::EComponentMode mode ){
|
||||||
void selectPlanes( SelectionTest& test, FaceInstances_ptrs& bestInstances ){
|
void selectPlanes( SelectionTest& test, FaceInstances_ptrs& bestInstances ){
|
||||||
test.BeginMesh( localToWorld() );
|
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;
|
double bestDot = 1;
|
||||||
|
|
||||||
for ( FaceInstances::iterator i = m_faceInstances.begin(); i != m_faceInstances.end(); ++i )
|
for ( FaceInstances::iterator i = m_faceInstances.begin(); i != m_faceInstances.end(); ++i )
|
||||||
|
|
|
||||||
|
|
@ -1892,9 +1892,9 @@ void GlobalCamera_ResetAngles(){
|
||||||
#include "select.h"
|
#include "select.h"
|
||||||
|
|
||||||
Vector3 Camera_getFocusPos( camera_t& camera ){
|
Vector3 Camera_getFocusPos( camera_t& camera ){
|
||||||
Vector3 camorigin( Camera_getOrigin( camera ) );
|
const Vector3 camorigin( Camera_getOrigin( camera ) );
|
||||||
AABB aabb( aabb_for_minmax( Select_getWorkZone().d_work_min, Select_getWorkZone().d_work_max ) );
|
const AABB aabb( aabb_for_minmax( Select_getWorkZone().d_work_min, Select_getWorkZone().d_work_max ) );
|
||||||
View& view = *( camera.m_view );
|
const View& view = *( camera.m_view );
|
||||||
#if 0
|
#if 0
|
||||||
Vector3 angles( Camera_getAngles( camera ) );
|
Vector3 angles( Camera_getAngles( camera ) );
|
||||||
Vector3 radangles( degrees_to_radians( angles[0] ), degrees_to_radians( angles[1] ), degrees_to_radians( angles[2] ) );
|
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[1] = sin( radangles[1] ) * cos( radangles[0] );
|
||||||
viewvector[2] = sin( radangles[0] );
|
viewvector[2] = sin( radangles[0] );
|
||||||
#elif 0
|
#elif 0
|
||||||
Vector3 viewvector( -view.GetModelview()[2], -view.GetModelview()[6], -view.GetModelview()[10] );
|
const Vector3 viewvector( view.getViewDir() );
|
||||||
#elif 1
|
#elif 1
|
||||||
Vector3 viewvector( -camera.vpn );
|
const Vector3 viewvector( -camera.vpn );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Plane3 frustumPlanes[4];
|
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 i = 0; i < 4; ++i ){
|
||||||
for ( std::size_t j = 0; j < 8; ++j ){
|
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] - frustumPlanes[i].normal() * 16.0f ) );
|
||||||
Plane3 newplane( frustumPlanes[i].normal(), vector3_dot( frustumPlanes[i].normal(), corners[j] ) );
|
const Plane3 newplane( frustumPlanes[i].normal(), vector3_dot( frustumPlanes[i].normal(), corners[j] ) );
|
||||||
float d = vector3_dot( ray.direction, newplane.normal() );
|
const float d = vector3_dot( ray.direction, newplane.normal() );
|
||||||
if( d != 0 ){
|
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 );
|
offset = std::max( offset, s );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2393,7 +2393,7 @@ public:
|
||||||
Selectable* selectable = 0;
|
Selectable* selectable = 0;
|
||||||
Selectable* selectable2 = 0;
|
Selectable* selectable2 = 0;
|
||||||
double bestDot = 1;
|
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 i = 0; i < 3; ++i ){
|
||||||
for ( int j = 0; j < 2; ++j ){
|
for ( int j = 0; j < 2; ++j ){
|
||||||
const Vector3 normal = j? g_vector3_axes[i] : -g_vector3_axes[i];
|
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 ){
|
void newPoint( const Vector3& point, const View& view ){
|
||||||
{ /* update m_viewdir */
|
{ /* 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 );
|
const std::size_t maxi = vector3_max_abs_component_index( viewdir );
|
||||||
m_viewdir = ( viewdir[maxi] > 0 )? g_vector3_axes[maxi] : -g_vector3_axes[maxi];
|
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 );
|
const std::size_t i = newPointIndex( view );
|
||||||
if( i == 0 )
|
if( i == 0 )
|
||||||
|
|
@ -3870,14 +3868,10 @@ public:
|
||||||
newPoint( point, view );
|
newPoint( point, view );
|
||||||
}
|
}
|
||||||
else{
|
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 point = vector4_projected( matrix4_transformed_vector4( matrix4_full_inverse( view.GetViewMatrix() ), Vector4( 0, 0, 0, 1 ) ) );
|
||||||
vector3_snap( point, GetSnapGridSize() );
|
vector3_snap( point, GetSnapGridSize() );
|
||||||
{
|
{
|
||||||
|
const std::size_t maxi = vector3_max_abs_component_index( view.getViewDir() );
|
||||||
const std::size_t i = newPointIndex( view );
|
const std::size_t i = newPointIndex( view );
|
||||||
point[maxi] = m_bounds.origin[maxi] + ( i == 2? -1 : 1 ) * m_bounds.extents[maxi];
|
point[maxi] = m_bounds.origin[maxi] + ( i == 2? -1 : 1 ) * m_bounds.extents[maxi];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -93,6 +93,8 @@ Vector4 m_viewer;
|
||||||
/// view frustum in world space
|
/// view frustum in world space
|
||||||
Frustum m_frustum;
|
Frustum m_frustum;
|
||||||
|
|
||||||
|
Vector3 m_viewdir;
|
||||||
|
|
||||||
bool m_fill;
|
bool m_fill;
|
||||||
|
|
||||||
void construct(){
|
void construct(){
|
||||||
|
|
@ -100,6 +102,7 @@ void construct(){
|
||||||
|
|
||||||
m_frustum = frustum_from_viewproj( m_viewproj );
|
m_frustum = frustum_from_viewproj( m_viewproj );
|
||||||
m_viewer = viewer_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:
|
public:
|
||||||
View( bool fill = false ) :
|
View( bool fill = false ) :
|
||||||
|
|
@ -186,6 +189,9 @@ bool fill() const {
|
||||||
const Vector3& getViewer() const {
|
const Vector3& getViewer() const {
|
||||||
return vector4_to_vector3( m_viewer );
|
return vector4_to_vector3( m_viewer );
|
||||||
}
|
}
|
||||||
|
const Vector3& getViewDir() const {
|
||||||
|
return m_viewdir;
|
||||||
|
}
|
||||||
const Frustum& getFrustum() const {
|
const Frustum& getFrustum() const {
|
||||||
return m_frustum;
|
return m_frustum;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user