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