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 Vector3& getViewer() const = 0;
|
||||
virtual const Vector3& getViewDir() const = 0;
|
||||
};
|
||||
|
||||
class Cullable
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 )
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user