#include <simgear/timing/timestamp.hxx>
#include <osg/ref_ptr>
+#include <osg/Matrix>
+#include <osg/Vec3>
namespace osg
{
class Camera;
class Group;
+class GraphicsContext;
}
namespace osgGA
namespace flightgear
{
class FGEventHandler;
+struct CameraInfo;
+class CameraGroup;
}
class SGSky;
-extern SGSky *thesky;
class FGRenderer {
void resize(int width, int height );
- // calling update( refresh_camera_settings = false ) will not
- // touch window or camera settings. This is useful for the tiled
- // renderer which needs to set the view frustum itself.
- void update( bool refresh_camera_settings);
+ void update();
/** Just pick into the scene and return the pick callbacks on the way ...
*/
void setEventHandler(flightgear::FGEventHandler* manipulator);
/** Add a top level camera.
- */
+ */
void addCamera(osg::Camera* camera, bool useSceneData);
+ void removeCamera(osg::Camera* camera);
+
+ /** Add a camera to the group. The camera is added to the viewer
+ * as a slave. See osgViewer::Viewer::addSlave.
+ * @param flags properties of the camera; see CameraGroup::Flags
+ * @param projection slave projection matrix
+ * @param view slave view matrix
+ * @param useMasterSceneData whether the camera displays the
+ * viewer's scene data.
+ * @return a CameraInfo object for the camera.
+ */
+ flightgear::CameraInfo* buildRenderingPipeline(flightgear::CameraGroup* cgroup, unsigned flags, osg::Camera* camera,
+ const osg::Matrix& view,
+ const osg::Matrix& projection,
+ osg::GraphicsContext* gc,
+ bool useMasterSceneData);
+
+ /**
+ */
+ flightgear::CameraInfo* buildClassicalPipeline(flightgear::CameraGroup* cgroup, unsigned flags, osg::Camera* camera,
+ const osg::Matrix& view,
+ const osg::Matrix& projection,
+ bool useMasterSceneData);
+
+ /**
+ */
+ flightgear::CameraInfo* buildDeferredPipeline(flightgear::CameraGroup* cgroup, unsigned flags, osg::Camera* camera,
+ const osg::Matrix& view, const osg::Matrix& projection, osg::GraphicsContext* gc);
+
+ void updateShadowCamera(const flightgear::CameraInfo* info, const osg::Vec3d& position);
+ void updateShadowMapSize(int mapSize);
+ void enableShadows(bool enabled);
+ void updateCascadeFar(int index, float far_m);
+ void updateCascadeNumber(size_t num);
+
+ SGSky* getSky() const { return _sky; }
+
+ void setPlanes( double zNear, double zFar );
+
+ /**
+ * inform the renderer when the global (2D) panel is changed
+ */
+ void panelChanged();
protected:
osg::ref_ptr<osgViewer::Viewer> viewer;
osg::ref_ptr<flightgear::FGEventHandler> eventHandler;
SGPropertyNode_ptr _panel_hotspots, _sim_delta_sec, _horizon_effect, _altitude_ft;
SGPropertyNode_ptr _virtual_cockpit;
SGTimeStamp _splash_time;
+ SGSky* _sky;
+ bool _classicalRenderer;
+ int _shadowMapSize;
+ size_t _numCascades;
+ float _cascadeFar[4];
+
+ osg::Camera* buildDeferredGeometryCamera( flightgear::CameraInfo* info, osg::GraphicsContext* gc );
+ osg::Camera* buildDeferredShadowCamera( flightgear::CameraInfo* info, osg::GraphicsContext* gc );
+ osg::Camera* buildDeferredLightingCamera( flightgear::CameraInfo* info, osg::GraphicsContext* gc );
+ void updateShadowCascade(const flightgear::CameraInfo* info, osg::Camera* camera, osg::Group* grp, int idx, double left, double right, double bottom, double top, double zNear, double f1, double f2);
+ osg::Vec3 getSunDirection() const;
+ osg::ref_ptr<osg::Uniform> _ambientFactor;
+ osg::ref_ptr<osg::Uniform> _sunDiffuse;
+ osg::ref_ptr<osg::Uniform> _sunSpecular;
+ osg::ref_ptr<osg::Uniform> _sunDirection;
+ osg::ref_ptr<osg::Uniform> _planes;
+ osg::ref_ptr<osg::Uniform> _fogColor;
+ osg::ref_ptr<osg::Uniform> _fogDensity;
+ osg::ref_ptr<osg::Uniform> _shadowNumber;
+ osg::ref_ptr<osg::Uniform> _shadowDistances;
};
bool fgDumpSceneGraphToFile(const char* filename);