OMKMaterial.h

Go to the documentation of this file.
00001 /************************************************************************/
00002 /* This file is part of openMask(c) INRIA, CNRS, Universite de Rennes 1 */
00003 /* 1993-2002, thereinafter the Software                                 */
00004 /*                                                                      */
00005 /* The Software has been developped within the Siames Project.          */
00006 /* INRIA, the University of Rennes 1 and CNRS jointly hold intellectual */
00007 /* property rights                                                      */
00008 /*                                                                      */
00009 /* The Software has been registered with the Agence pour la Protection  */
00010 /* des Programmes (APP) under registration number                       */
00011 /* IDDN.FR.001.510008.00.S.P.2001.000.41200                             */
00012 /*                                                                      */
00013 /* This file may be distributed under the terms of the Q Public License */
00014 /* version 1.0 as defined by Trolltech AS of Norway and appearing in    */
00015 /* the file LICENSE.QPL included in the packaging of this file.         */
00016 /*                                                                      */
00017 /* Licensees holding valid specific licenses issued by INRIA, CNRS or   */
00018 /* Universite Rennes 1 for the software may use this file in            */
00019 /* acordance with that specific license                                 */
00020 /************************************************************************/
00021 #ifndef OMKMaterial_H
00022 #define OMKMaterial_H
00023 
00024 #include "OMKOgreObject.h"
00025 #include <stack>
00026 
00027 namespace OMK
00028 {
00029 namespace Vis
00030 {
00031 
00032 class IMaterialAction ;
00033 class IUpdateMaterial ;
00034 class NodeMaterial ;
00035 class EntityMaterial ;
00036 class SubEntityMaterial ;
00037 class NodeMaterialOrig ;
00038 class EntityMaterialOrig ;
00039 class SubEntityMaterialOrig ;
00040 class NodeMaterialCopy ;
00041 class EntityMaterialCopy ;
00042 class SubEntityMaterialCopy ;
00043 
00044 //=============================================================================
00045 class OMKVIS_API IMaterialAction 
00046 {
00047 protected:
00050   IMaterialAction() {}
00051 public : 
00053   virtual ~IMaterialAction() {}
00059   virtual bool nodeAction( NodeMaterial* node ) const { return true ; }
00065   virtual bool entityAction( EntityMaterial* entity ) const { return true ; }
00069   virtual void subEntityAction( SubEntityMaterial* subEntity ) const {}
00070 protected:
00072   static Ogre::Pass* getFirstPassOfFirstTechnique( SubEntityMaterial* subEntity ) ;
00073 } ;
00074 //=============================================================================
00075 class OMKVIS_API IUpdateMaterial
00076 {
00077   friend class NodeMaterialOrig ;
00078 protected:
00079   IUpdateMaterial() {}
00080 public:
00081   virtual ~IUpdateMaterial() {}
00082   virtual void update( NodeMaterial* node ) = 0 ;
00083   virtual void undo( NodeMaterial* node ) ; 
00084   virtual Ogre::String getMaterialName( const Ogre::String& name ) const { return getUniqueMaterialName( name ) ; }
00085 protected:
00086   static Ogre::String getUniqueMaterialName( const Ogre::String& name ) ;
00087 } ;
00088 //Base
00089 //=============================================================================
00090 typedef std::map< std::string, EntityMaterial* > EntityMaterialMap ;
00091 typedef Ogre::MapIterator< EntityMaterialMap > EntityMaterialIterator ;
00092 typedef std::stack< IUpdateMaterial* > UpdateMaterialStack ;
00093 //-----------------------------------------------------------------------------
00094 class OMKVIS_API NodeMaterial
00095 {
00096 public:
00097   NodeMaterial() {}
00098   virtual ~NodeMaterial() ;
00099 protected:
00100   friend class NodeMaterialOrig ;
00101   friend class NodeMaterialCopy ;
00102   struct Item
00103   {
00104     Item( NodeMaterialCopy* n, IUpdateMaterial* u ) : nodeMaterial( n ), update( u ) {}
00105     NodeMaterialCopy* nodeMaterial ;
00106     IUpdateMaterial* update ;
00107   } ;
00108   typedef std::list< Item > ItemStack ;
00109   ItemStack _stack ;
00110   EntityMaterialMap _entities ;
00111 public:
00112   void activateMaterial() ;
00113   void clearMaterial() ;
00114   EntityMaterialIterator getEntityMaterialIterator() { return EntityMaterialIterator( _entities ) ; }
00115   virtual void doAction( const IMaterialAction& action ) ;
00116 } ;
00117 //=============================================================================
00118 typedef std::vector < SubEntityMaterial* > SubEntityMaterialVector ;
00119 typedef Ogre::VectorIterator < SubEntityMaterialVector > SubEntityMaterialIterator ;
00120 //-----------------------------------------------------------------------------
00121 class OMKVIS_API EntityMaterial
00122 {
00123 public:
00124   EntityMaterial( Ogre::Entity * ogreEntity ) : _ogreEntity( ogreEntity ) {}
00125   virtual ~EntityMaterial() ;
00126 protected:
00127   friend class EntityMaterialCopy ;
00128   SubEntityMaterialVector _subEntities ;
00129   Ogre::Entity * _ogreEntity ;
00130 public:
00131   Ogre::Entity * getOgreEntity() { return _ogreEntity ; }
00132   void activateMaterial() ;
00133   void clearMaterial() ;
00134   SubEntityMaterialIterator getSubEntityMaterialIterator() { return SubEntityMaterialIterator( _subEntities ) ; }
00135   void doAction( const IMaterialAction& action ) ;
00136 } ;
00137 //=============================================================================
00138 class OMKVIS_API SubEntityMaterial 
00139 {
00140 public:
00141   SubEntityMaterial( Ogre::SubEntity *ogreSubEntity ) : _ogreSubEntity( ogreSubEntity ) {} ;
00142   virtual ~SubEntityMaterial() {} ;
00143 protected:
00144   friend class SubEntityMaterialCopy ;
00145   Ogre::SubEntity *_ogreSubEntity ;
00146   Ogre::MaterialPtr _mat ;
00147 public:
00148   Ogre::MaterialPtr& getMaterial() { return _mat ; }
00149   Ogre::SubEntity* getOgreSubEntity() { return _ogreSubEntity ; }
00150   void activateMaterial() ;
00151   void activateMaterial( const Ogre::String& materialName ) ;
00152   virtual void clearMaterial() ;
00153   void doAction( const IMaterialAction& action ) ;
00154 } ;
00155 
00156 //Original
00157 //=============================================================================
00158 typedef std::vector< NodeMaterialOrig* > NodeMaterialOrigVector ;
00159 //-----------------------------------------------------------------------------
00160 class OMKVIS_API NodeMaterialOrig : public NodeMaterial
00161 {
00162 public:
00163   NodeMaterialOrig( Ogre::SceneNode* node ) ;
00164   virtual ~NodeMaterialOrig() ;
00165   void undoFor( IUpdateMaterial* update, bool deleteNode ) ;
00166   void createCopyAndUpdateWith( IUpdateMaterial* update ) ;
00167   NodeMaterialOrig* find( Ogre::SceneNode* node ) ;
00168   virtual void doAction( const IMaterialAction& action ) ;
00169 protected:
00170   void updateCopyWith( IUpdateMaterial* update ) ;
00171   NodeMaterialOrigVector _childs ;
00172   Ogre::SceneNode* _sceneNode ;
00173 } ;
00174 //=============================================================================
00175 class OMKVIS_API EntityMaterialOrig : public EntityMaterial
00176 {
00177 public:
00178   EntityMaterialOrig( Ogre::Entity *e ) ;
00179   virtual ~EntityMaterialOrig() {}
00180 } ;
00181 //=============================================================================
00182 class OMKVIS_API SubEntityMaterialOrig : public SubEntityMaterial 
00183 {
00184 public:
00185   SubEntityMaterialOrig( Ogre::SubEntity *ogreSubEntity ) ;
00186   virtual ~SubEntityMaterialOrig() ;
00187   virtual void clearMaterial() {}
00188 protected:
00189   Ogre::MaterialPtr _currentMat ;
00190 } ;
00191 
00192 //Copy
00193 //=============================================================================
00194 class OMKVIS_API NodeMaterialCopy : public NodeMaterial 
00195 {
00196 public:
00197   NodeMaterialCopy( NodeMaterial* node, IUpdateMaterial* update ) ;
00198   virtual ~NodeMaterialCopy() ;
00199 } ;
00200 //=============================================================================
00201 class OMKVIS_API EntityMaterialCopy : public EntityMaterial
00202 {
00203 public:
00204   EntityMaterialCopy( EntityMaterial *e, IUpdateMaterial* update ) ;
00205   virtual ~EntityMaterialCopy() ;
00206 } ;
00207 //=============================================================================
00208 class OMKVIS_API SubEntityMaterialCopy : public SubEntityMaterial 
00209 {
00210 public:
00211   SubEntityMaterialCopy( SubEntityMaterial *se, IUpdateMaterial* update ) ;
00212   virtual ~SubEntityMaterialCopy() ;
00213 } ;
00214 } // namespace Vis
00215 } // namespace OMK
00216 
00217 #endif // OMKMaterial_H

logo OpenMask

Documentation generated on Mon Jun 9 11:45:56 2008

Generated with doxygen by Dimitri van Heesch ,   1997-2007