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
Documentation generated on Mon Jun 9 11:45:56 2008 |
Generated with doxygen by Dimitri van Heesch , 1997-2007 |