00001 #ifndef __SceneManager__
00002 #define __SceneManager__
00003
00004 #include <osg/Group>
00005 #include <osg/Geode>
00006 #include <osgViewer/View>
00007
00008 #include "Observer.h"
00009 #include "SceneObject.h"
00010 #include "Terrain.h"
00011 #include "ObjectManipulatorProxy.h"
00012
00013 #include <list>
00014
00015 using namespace std;
00016
00017
00025 class SceneManager : public Observable {
00026 public:
00027 ~SceneManager();
00028
00029 static SceneManager& instance();
00030
00031 osg::Node* getRootNode();
00032
00033 void addSceneObject(SceneObject* sceneObject);
00034 void removeObject(SceneObject* sceneObject);
00035 void removeSelectedObject();
00036
00037 void clear();
00038
00039 SceneObject* computeHitObject(int x, int y, osg::Camera* camera);
00040 osg::Node* computeHitKnob(int x, int y, osg::Camera* camera);
00041
00042 osg::Vec3 getPlaneIntersection(osg::Vec3d& planePoint, osg::Vec3d& planeNormal, int x, int y, osg::Camera* camera);
00043 void setSelectedObject(SceneObject* sceneObject);
00044 SceneObject* getSelectedObject();
00045
00046
00047 void enableCoordSystem(bool state);
00048
00049 ObjectManipulatorProxy *getObjectManipulatorProxy() const;
00050
00051 void setSkydomePosition(osg::Vec3d* position);
00052
00053 protected:
00054 class SkydomeCallback : public osg::NodeCallback {
00055 public:
00056 void setPosition(osg::Vec3d* position) {
00057 _position = position;
00058 }
00059
00060 virtual void operator()(osg::Node* node, osg::NodeVisitor* nv) {
00061 if (_position != NULL)
00062 ((osg::PositionAttitudeTransform*)node)->setPosition(*_position);
00063
00064 traverse(node, nv);
00065 }
00066
00067 protected:
00068 osg::Vec3d* _position;
00069 };
00070
00071
00072 SceneManager();
00073
00074 osg::ref_ptr<osg::Group> _root;
00075 osg::ref_ptr<osg::Group> _coordSystem;
00076 osg::ref_ptr<osg::PositionAttitudeTransform> _skydomePAT;
00077
00078 ObjectManipulatorProxy* _selectedObjectCoordSys;
00079 SceneObject* _selectedObject;
00080
00081 bool _isCoordSystemEnabled;
00082
00083 Terrain& _terrain;
00084
00085 SkydomeCallback _skydomeCallback;
00086
00087 list<SceneObject*> _sceneObjects;
00088 };
00089
00090 #endif