void ViewData::notifyChanged() { ::seq::ViewData::setOrtho( ViewData::getOrtho( )); _view.changeMode( getStereo() ? eq::View::MODE_STEREO : eq::View::MODE_MONO ); const auto& observer = _view.getObserver(); if( !observer ) return; observer->setEyePosition( eq::EYE_LEFT, seq::Vector3f( -getEyeSeparation()/2.f, 0.f , 0 )); observer->setEyePosition( eq::EYE_RIGHT, seq::Vector3f( getEyeSeparation()/2.f, 0.f , 0 )); }
// LOOKAT const Camera::LookAtValueType Camera::getLookAt( const EyeUsagePolicyValueType eyeUsagePolicy ) const { vgm::MatrixR matrix; // MONOSCOPIC if ( getMode() == MONOSCOPIC ) { switch ( eyeUsagePolicy.value() ) { case EYE_LEFT: matrix = getLookAtLeft(); break; case EYE_RIGHT: matrix = getLookAtRight(); break; case EYE_BOTH: { const Camera::LookAtValueType left = getLookAtLeft(); const Camera::LookAtValueType right = getLookAtRight(); vgAssertN( left.equals(right), "lookAtLeft != lookAtRight" ); matrix = left; break; } //case DEFAULT_EYEUSAGEPOLICY: = EYE_BOTH default: vgAssertN( false, "Unexpected value for eye usage policy %i", eyeUsagePolicy.value() ); matrix.setIdentity(); } } else // STEREOSCOPIC { const vgm::Vec3f halfEyeSeparation( getEyeSeparation() / 2.f, 0.f, 0.f ); switch ( eyeUsagePolicy.value() ) { case EYE_LEFT: { vgm::MatrixR eyeSeparation; eyeSeparation.setTranslate( halfEyeSeparation ); matrix = getLookAtLeft(); matrix = matrix * eyeSeparation; break; } case EYE_RIGHT: { vgm::MatrixR eyeSeparation; eyeSeparation.setTranslate( -halfEyeSeparation ); matrix = getLookAtRight(); matrix = matrix * eyeSeparation; break; } case EYE_BOTH: { vgAssertN( false, "EYE_BOTH not allowed in non MONOSCOPIC mode" ); break; } //case DEFAULT_EYEUSAGEPOLICY: = EYE_BOTH default: vgAssertN( false, "Unexpected value for eye usage policy %i", eyeUsagePolicy.value() ); matrix.setIdentity(); } } return matrix; }