00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef GLSCENE_BASE_H
00019 #define GLSCENE_BASE_H
00020
00021
00022 #include <vector>
00023 #include <list>
00024 #include <stack>
00025
00026 #include "glfield.h"
00027 #include "smltgl.h"
00028
00029
00030 #define SceneGraphManager GLScene::GLSceneGraphManager::getSingleton()
00031
00032
00033
00034 namespace GLScene
00035 {
00036 class GLSceneNode;
00037 class GLSurface;
00038 class GLSphere;
00039 class GLSceneObject;
00040 class GLSceneGraphManager;
00041 class GLRenderState;
00042 class GLLight;
00043 class GLCamera;
00044 class GLMaterial;
00045 class GLTransform;
00046 class GLTranslation;
00047 class GLRenderMode;
00048 class GLGeometricObject;
00049 class GLDisplacementMap;
00050
00051 typedef GLCamera Camera;
00052 typedef GLLight Light;
00053 typedef GLMaterial Material;
00054 typedef GLRenderMode RenderMode;
00055 typedef GLTransform Transform;
00056 typedef GLTranslation Translation;
00057 typedef GLGeometricObject Geometry;
00058 typedef GLDisplacementMap DisplacementMap;
00059 typedef GLSurface Surface;
00060 typedef GLSphere Sphere;
00061 typedef GLSceneNode SceneNode;
00062 typedef GLSceneObject SceneObject;
00063 typedef GLRenderState RenderState;
00064
00065
00066 typedef IRCPointer<SceneObject> SceneObjectPtr;
00067 typedef IRCPointer<SceneNode> SceneNodePtr;
00068 typedef IRCPointer<Surface> SurfacePtr;
00069 typedef IRCPointer<Sphere> SpherePtr;
00070 typedef IRCPointer<Geometry> GeometryPtr;
00071 typedef IRCPointer<Camera> CameraPtr;
00072 typedef IRCPointer<Transform> TransformPtr;
00073 typedef IRCPointer<Translation> TranslationPtr;
00074 typedef IRCPointer<RenderState> RenderStatePtr;
00075 typedef IRCPointer<Light> LightPtr;
00076 typedef IRCPointer<Material> MaterialPtr;
00077 typedef IRCPointer<DisplacementMap> DisplacementMapPtr;
00078
00079
00080 typedef std::list<SceneObjectPtr> SceneObjectList;
00081 typedef std::list<SceneObjectPtr>::iterator SceneObjectIterator;
00082
00083 typedef std::stack< LightPtr > LightStack;
00084 typedef std::stack< MaterialPtr > MaterialStack;
00085 typedef std::stack< RenderMode > RenderModeStack;
00086 typedef std::stack< DisplacementMapPtr > DispMapStack;
00087
00088
00090 class GLSceneObject: public SML, public ReferenceCounted
00091 {
00092 protected:
00093
00094 friend class GLSceneGraphManager;
00095 friend class GLSceneNode;
00096
00097
00098 SceneNode* parent;
00099
00100
00107 public:
00108
00114 GLSceneObject(SceneNode* par = NULL);
00115
00116 virtual ~GLSceneObject();
00117
00118 virtual SceneNode* getParent( void )
00119 { return parent; }
00120
00121
00128 virtual void render( void ) = 0;
00129
00130 };
00131
00132
00138 class GLSceneNode: public GLSceneObject
00139 {
00140 protected:
00141
00142 friend class GLSceneGraphManager;
00143
00144
00145 public:
00146
00147 SceneObjectList sceneObjects;
00148
00149 SML_TAG(node);
00150
00151 GLSceneNode(GLSceneNode* par = NULL);
00152 virtual ~GLSceneNode();
00153
00157 virtual SceneObjectPtr insertObject( SceneObjectPtr so );
00159 virtual SceneObjectPtr insertBeforeObject( SceneObjectPtr after, SceneObjectPtr so );
00161 virtual SceneObjectPtr insertAfterObject( SceneObjectPtr before, SceneObjectPtr so );
00163 virtual SceneObjectPtr appendObject( SceneObjectPtr so );
00164
00165 virtual SceneObjectPtr removeObject( SceneObjectPtr so );
00166
00167 virtual SceneObjectPtr removeObject( unsigned index );
00168 virtual SceneObjectPtr getObject( unsigned index );
00169
00170 virtual void render(void );
00171
00172 static SceneNodePtr loadFromFile(std::string fileName);
00173 void saveToFile(std::string fileName);
00174 };
00175
00176
00177
00181 class GLSceneGraphManager: public ReferenceCounted
00182 {
00183
00184 static IRCPointer<GLSceneGraphManager> single;
00185
00186 LightStack lights;
00187 std::stack<unsigned> previousLightNum;
00188
00189 MaterialStack materials;
00190 RenderModeStack renderModes;
00191
00192
00193 SceneObjectPtr root;
00194
00195 public:
00196 GLSceneGraphManager();
00197 ~GLSceneGraphManager();
00198
00200 void setRoot( SceneObjectPtr nr ) { root = nr; }
00201 SceneObjectPtr getRoot( void ) { return root; }
00202
00203 void pushState();
00204 void popState();
00205
00206 void render( CameraPtr cam );
00207
00208 void turnOnLight( LightPtr lit);
00209 void turnOnMaterial( MaterialPtr mat );
00210 void turnOnRenderMode( RenderMode rm );
00211
00212 const RenderMode getRenderMode();
00213
00214 static GLSceneGraphManager* getSingleton(void);
00215
00216 private:
00217 void turnOffLight( );
00218 void turnOffMaterial( );
00219 };
00220
00221
00222 class GLRenderState: public GLSceneObject
00223 {
00224 public:
00225
00226
00227 virtual ~GLRenderState() {};
00228 };
00229
00230 class GLTransform: public GLSceneObject
00231 {
00232 public:
00233
00234
00235 virtual ~GLTransform() {};
00236
00237 };
00238
00239 };
00240
00241
00242
00243 #endif