From: Frederic Bouvier Date: Sat, 19 May 2012 21:50:35 +0000 (+0200) Subject: Add world viewer position in cartesian and geodesic coordinate as shader uniforms X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=3e7b8e57b6050d2a15f5f1c38914223c899ffe2a;p=flightgear.git Add world viewer position in cartesian and geodesic coordinate as shader uniforms --- diff --git a/src/Viewer/CameraGroup.cxx b/src/Viewer/CameraGroup.cxx index 9322fd040..07b07130b 100644 --- a/src/Viewer/CameraGroup.cxx +++ b/src/Viewer/CameraGroup.cxx @@ -274,8 +274,13 @@ int CameraInfo::getMainSlaveIndex() const void CameraInfo::setMatrices(osg::Camera* c) { view->set( c->getViewMatrix() ); - viewInverse->set( osg::Matrix::inverse( c->getViewMatrix() ) ); + osg::Matrixd vi = c->getInverseViewMatrix(); + viewInverse->set( vi ); projInverse->set( osg::Matrix::inverse( c->getProjectionMatrix() ) ); + osg::Vec4d pos = osg::Vec4d(0., 0., 0., 1.) * vi; + worldPosCart->set( osg::Vec3f( pos.x(), pos.y(), pos.z() ) ); + SGGeod pos2 = SGGeod::fromCart( SGVec3d( pos.x(), pos.y(), pos.z() ) ); + worldPosGeod->set( osg::Vec3f( pos2.getLongitudeRad(), pos2.getLatitudeRad(), pos2.getElevationM() ) ); } void CameraGroup::update(const osg::Vec3d& position, diff --git a/src/Viewer/CameraGroup.hxx b/src/Viewer/CameraGroup.hxx index d498d4000..0d40c0c37 100644 --- a/src/Viewer/CameraGroup.hxx +++ b/src/Viewer/CameraGroup.hxx @@ -94,6 +94,8 @@ struct CameraInfo : public osg::Referenced bufferSize( new osg::Uniform("fg_BufferSize", osg::Vec2f() ) ), projInverse( new osg::Uniform( "fg_ProjectionMatrixInverse", osg::Matrixf() ) ), viewInverse( new osg::Uniform( "fg_ViewMatrixInverse",osg::Matrixf() ) ), + worldPosCart( new osg::Uniform( "fg_CameraPositionCart", osg::Vec3f() ) ), + worldPosGeod( new osg::Uniform( "fg_CameraPositionGeod", osg::Vec3f() ) ), view( new osg::Uniform( "fg_ViewMatrix",osg::Matrixf() ) ), du( new osg::Uniform( "fg_du",osg::Vec4() ) ), dv( new osg::Uniform( "fg_dv",osg::Vec4() ) ) @@ -152,6 +154,8 @@ struct CameraInfo : public osg::Referenced osg::ref_ptr projInverse; osg::ref_ptr viewInverse; osg::ref_ptr view; + osg::ref_ptr worldPosCart; + osg::ref_ptr worldPosGeod; osg::ref_ptr du; osg::ref_ptr dv; diff --git a/src/Viewer/renderer.cxx b/src/Viewer/renderer.cxx index 5b32f9283..1052746e7 100644 --- a/src/Viewer/renderer.cxx +++ b/src/Viewer/renderer.cxx @@ -1091,10 +1091,13 @@ osg::Camera* FGRenderer::buildDeferredLightingCamera( CameraInfo* info, osg::Gra quadCam1->setProjectionMatrixAsOrtho2D(-1,1,-1,1); quadCam1->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR); ss = quadCam1->getOrCreateStateSet(); - ss->addUniform( _ambientFactor ); ss->addUniform( info->projInverse ); ss->addUniform( info->viewInverse ); ss->addUniform( info->view ); + ss->addUniform( info->bufferSize ); + ss->addUniform( info->worldPosCart ); + ss->addUniform( info->worldPosGeod ); + ss->addUniform( _ambientFactor ); ss->addUniform( _sunDiffuse ); ss->addUniform( _sunSpecular ); ss->addUniform( _sunDirection ); @@ -1159,10 +1162,13 @@ osg::Camera* FGRenderer::buildDeferredLightingCamera( CameraInfo* info, osg::Gra quadCam2->setProjectionMatrixAsOrtho2D(-1,1,-1,1); quadCam2->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR); ss = quadCam2->getOrCreateStateSet(); - ss->addUniform( _ambientFactor ); ss->addUniform( info->projInverse ); ss->addUniform( info->viewInverse ); ss->addUniform( info->view ); + ss->addUniform( info->bufferSize ); + ss->addUniform( info->worldPosCart ); + ss->addUniform( info->worldPosGeod ); + ss->addUniform( _ambientFactor ); ss->addUniform( _sunDiffuse ); ss->addUniform( _sunSpecular ); ss->addUniform( _sunDirection ); @@ -1262,6 +1268,8 @@ FGRenderer::buildDeferredFullscreenCamera( flightgear::CameraInfo* info, const F ss->addUniform( info->viewInverse ); ss->addUniform( info->view ); ss->addUniform( info->bufferSize ); + ss->addUniform( info->worldPosCart ); + ss->addUniform( info->worldPosGeod ); ss->addUniform( _ambientFactor ); ss->addUniform( _sunDiffuse ); ss->addUniform( _sunSpecular );