Main Page | Namespace List | Class Hierarchy | Alphabetical List | Compound List | File List | Compound Members

glscene.h

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

Generated on Wed Feb 4 23:11:33 2004 by doxygen 1.3.3