]> git.mxchange.org Git - flightgear.git/commitdiff
Add world viewer position in cartesian and geodesic coordinate as shader uniforms
authorFrederic Bouvier <fredfgfs01@free.fr>
Sat, 19 May 2012 21:50:35 +0000 (23:50 +0200)
committerFrederic Bouvier <fredfgfs01@free.fr>
Sat, 19 May 2012 21:50:35 +0000 (23:50 +0200)
src/Viewer/CameraGroup.cxx
src/Viewer/CameraGroup.hxx
src/Viewer/renderer.cxx

index 9322fd0408a9acc81e7bf864b5620e4a88f8d473..07b07130b8b884be7bbf5fc63d79556eb8a18e4b 100644 (file)
@@ -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,
index d498d4000837d026887978ff8b9d6ab6efdb610b..0d40c0c37402470fdb0ac390977b11120fc2433c 100644 (file)
@@ -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<osg::Uniform> projInverse;
     osg::ref_ptr<osg::Uniform> viewInverse;
     osg::ref_ptr<osg::Uniform> view;
+    osg::ref_ptr<osg::Uniform> worldPosCart;
+    osg::ref_ptr<osg::Uniform> worldPosGeod;
     osg::ref_ptr<osg::Uniform> du;
     osg::ref_ptr<osg::Uniform> dv;
 
index 5b32f9283e92e8ea3b6d16391e79c4a4cd193df5..1052746e72897c382c4152d6fc2aa0163a8f3316 100644 (file)
@@ -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 );