00001 /*************************************************************************** 00002 glscene.h - description 00003 ------------------- 00004 begin : Mon Oct 13 2003 00005 copyright : (C) 2003 by Jacques Gasselin de Richebourg 00006 email : jacquesgasselin@hotmail.com 00007 ***************************************************************************/ 00008 00009 /*************************************************************************** 00010 * * 00011 * This program is free software; you can redistribute it and/or modify * 00012 * it under the terms of the GNU Lesser General Public License as published by * 00013 * the Free Software Foundation; either version 2 of the License, or * 00014 * (at your option) any later version. * 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 //#define DEBUG 00032 //#define TESTING 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 //for upward traversal of the graph 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 //it is meant to be used as a singleton 00184 static IRCPointer<GLSceneGraphManager> single; 00185 00186 LightStack lights; 00187 std::stack<unsigned> previousLightNum; 00188 00189 MaterialStack materials; 00190 RenderModeStack renderModes; 00191 //DispMapStack dispMaps; 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 //GLRenderState(); 00227 virtual ~GLRenderState() {}; 00228 }; 00229 00230 class GLTransform: public GLSceneObject //inherits but does not implement, so no "SML_TAG" 00231 { 00232 public: 00233 00234 //GLTransform(); 00235 virtual ~GLTransform() {}; 00236 00237 }; 00238 00239 }; 00240 00241 00242 00243 #endif