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