OgreMaterialSerializer.h
Go to the documentation of this file.

    00001 /*
    00002 -----------------------------------------------------------------------------
    00003 This source file is part of OGRE
    00004     (Object-oriented Graphics Rendering Engine)
    00005 For the latest info, see http://www.ogre3d.org/
    00006
    00007 Copyright (c) 2000-2012 Torus Knot Software Ltd
    00008
    00009 Permission is hereby granted, free of charge, to any person obtaining a copy
    00010 of this software and associated documentation files (the "Software"), to deal
    00011 in the Software without restriction, including without limitation the rights
    00012 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    00013 copies of the Software, and to permit persons to whom the Software is
    00014 furnished to do so, subject to the following conditions:
    00015
    00016 The above copyright notice and this permission notice shall be included in
    00017 all copies or substantial portions of the Software.
    00018
    00019 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    00020 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    00021 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    00022 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    00023 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    00024 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    00025 THE SOFTWARE.
    00026 -----------------------------------------------------------------------------
    00027 */
    00028 #ifndef __MaterialSerializer_H__
    00029 #define __MaterialSerializer_H__
    00030
    00031 #include "OgrePrerequisites.h"
    00032 #include "OgreMaterial.h"
    00033 #include "OgreBlendMode.h"
    00034 #include "OgreTextureUnitState.h"
    00035 #include "OgreGpuProgram.h"
    00036 #include "OgreStringVector.h"
    00037
    00038 namespace Ogre {
    00039
    00047     enum MaterialScriptSection
    00048     {
    00049         MSS_NONE,
    00050         MSS_MATERIAL,
    00051         MSS_TECHNIQUE,
    00052         MSS_PASS,
    00053         MSS_TEXTUREUNIT,
    00054         MSS_PROGRAM_REF,
    00055         MSS_PROGRAM,
    00056         MSS_DEFAULT_PARAMETERS,
    00057         MSS_TEXTURESOURCE
    00058     };
    00060     struct MaterialScriptProgramDefinition
    00061     {
    00062         String name;
    00063         GpuProgramType progType;
    00064         String language;
    00065         String source;
    00066         String syntax;
    00067         bool supportsSkeletalAnimation;
    00068         bool supportsMorphAnimation;
    00069         ushort supportsPoseAnimation; // number of simultaneous poses supported
    00070         bool usesVertexTextureFetch;
    00071         vector<std::pair<String, String> >::type customParameters;
    00072     };
    00074     struct MaterialScriptContext
    00075     {
    00076         MaterialScriptSection section;
    00077         String groupName;
    00078         MaterialPtr material;
    00079         Technique* technique;
    00080         Pass* pass;
    00081         TextureUnitState* textureUnit;
    00082         GpuProgramPtr program; // used when referencing a program, not when defining it
    00083         bool isVertexProgramShadowCaster; // when referencing, are we in context of shadow caster
    00084         bool isFragmentProgramShadowCaster; // when referencing, are we in context of shadow caster
    00085         bool isVertexProgramShadowReceiver; // when referencing, are we in context of shadow caster
    00086         bool isFragmentProgramShadowReceiver; // when referencing, are we in context of shadow caster
    00087         GpuProgramParametersSharedPtr programParams;
    00088         ushort numAnimationParametrics;
    00089         MaterialScriptProgramDefinition* programDef; // this is used while defining a program
    00090
    00091         int techLev,    //Keep track of what tech, pass, and state level we are in
    00092             passLev,
    00093             stateLev;
    00094         StringVector defaultParamLines;
    00095
    00096         // Error reporting state
    00097         size_t lineNo;
    00098         String filename;
    00099         AliasTextureNamePairList textureAliases;
    00100     };
    00102     typedef bool (*ATTRIBUTE_PARSER)(String& params, MaterialScriptContext& context);
    00103
    00105     class _OgreExport MaterialSerializer : public SerializerAlloc
    00106     {
    00107     public:
    00108
    00109         // Material serizliae event.
    00110         enum SerializeEvent
    00111         {
    00112             MSE_PRE_WRITE,
    00113             MSE_WRITE_BEGIN,
    00114             MSE_WRITE_END,
    00115             MSE_POST_WRITE
    00116         };
    00117
    00121         class Listener
    00122         {
    00123         public:
    00124             virtual ~Listener() {}
    00125
    00133             virtual void materialEventRaised(MaterialSerializer* ser,
    00134                 SerializeEvent event, bool& skip, const Material* mat)
    00135                         { (void)ser; (void)event; (void)skip; (void)mat; }
    00136
    00144             virtual void techniqueEventRaised(MaterialSerializer* ser,
    00145                 SerializeEvent event, bool& skip, const Technique* tech)
    00146                         { (void)ser; (void)event; (void)skip; (void)tech; }
    00147
    00155             virtual void passEventRaised(MaterialSerializer* ser,
    00156                 SerializeEvent event, bool& skip, const Pass* pass)
    00157                         { (void)ser; (void)event; (void)skip; (void)pass; }
    00158
    00169             void gpuProgramRefEventRaised(MaterialSerializer* ser,
    00170                 SerializeEvent event, bool& skip,
    00171                 const String& attrib,
    00172                 const GpuProgramPtr& program,
    00173                 const GpuProgramParametersSharedPtr& params,
    00174                 GpuProgramParameters* defaultParams)
    00175                         {
    00176                             (void)ser;
    00177                             (void)event;
    00178                             (void)skip;
    00179                             (void)attrib;
    00180                             (void)program;
    00181                             (void)params;
    00182                             (void)defaultParams;
    00183                         }
    00184
    00192             virtual void textureUnitStateEventRaised(MaterialSerializer* ser,
    00193                 SerializeEvent event, bool& skip, const TextureUnitState* textureUnit)
    00194                         {
    00195                             (void)ser;
    00196                             (void)event;
    00197                             (void)skip;
    00198                             (void)textureUnit;
    00199                         }
    00200         };
    00201
    00202     protected:
    00204         typedef map<String, ATTRIBUTE_PARSER>::type AttribParserList;
    00205
    00206         MaterialScriptContext mScriptContext;
    00207
    00211         bool parseScriptLine(String& line);
    00213         bool invokeParser(String& line, AttribParserList& parsers);
    00217         void finishProgramDefinition(void);
    00219         AttribParserList mRootAttribParsers;
    00221         AttribParserList mMaterialAttribParsers;
    00223         AttribParserList mTechniqueAttribParsers;
    00225         AttribParserList mPassAttribParsers;
    00227         AttribParserList mTextureUnitAttribParsers;
    00229         AttribParserList mProgramRefAttribParsers;
    00231         AttribParserList mProgramAttribParsers;
    00233         AttribParserList mProgramDefaultParamAttribParsers;
    00234
    00236         typedef vector<Listener*>::type         ListenerList;
    00237         typedef ListenerList::iterator          ListenerListIterator;
    00238         typedef ListenerList::const_iterator    ListenerListConstIterator;
    00239         ListenerList mListeners;
    00240
    00241
    00242         void writeMaterial(const MaterialPtr& pMat, const String& materialName = "");
    00243         void writeTechnique(const Technique* pTech);
    00244         void writePass(const Pass* pPass);
    00245         void writeVertexProgramRef(const Pass* pPass);
    00246         void writeShadowCasterVertexProgramRef(const Pass* pPass);
    00247         void writeShadowCasterFragmentProgramRef(const Pass* pPass);
    00248         void writeShadowReceiverVertexProgramRef(const Pass* pPass);
    00249         void writeShadowReceiverFragmentProgramRef(const Pass* pPass);
    00250         void writeFragmentProgramRef(const Pass* pPass);
    00251         void writeGpuProgramRef(const String& attrib, const GpuProgramPtr& program, const GpuProgramParametersSharedPtr& params);
    00252         void writeGpuPrograms(void);
    00253         void writeGPUProgramParameters(const GpuProgramParametersSharedPtr& params, GpuProgramParameters* defaultParams,
    00254             const unsigned short level = 4, const bool useMainBuffer = true);
    00255         void writeNamedGpuProgramParameters(const GpuProgramParametersSharedPtr& params, GpuProgramParameters* defaultParams,
    00256             const unsigned short level = 4, const bool useMainBuffer = true);
    00257         void writeLowLevelGpuProgramParameters(const GpuProgramParametersSharedPtr& params, GpuProgramParameters* defaultParams,
    00258             const unsigned short level = 4, const bool useMainBuffer = true);
    00259         void writeGpuProgramParameter(
    00260             const String& commandName, const String& identifier,
    00261             const GpuProgramParameters::AutoConstantEntry* autoEntry,
    00262             const GpuProgramParameters::AutoConstantEntry* defaultAutoEntry,
    00263             bool isFloat, size_t physicalIndex, size_t physicalSize,
    00264             const GpuProgramParametersSharedPtr& params, GpuProgramParameters* defaultParams,
    00265             const unsigned short level, const bool useMainBuffer);
    00266         void writeTextureUnit(const TextureUnitState *pTex);
    00267         void writeSceneBlendFactor(const SceneBlendFactor c_src, const SceneBlendFactor c_dest,
    00268             const SceneBlendFactor a_src, const SceneBlendFactor a_dest);
    00269         void writeSceneBlendFactor(const SceneBlendFactor sbf_src, const SceneBlendFactor sbf_dest);
    00270         void writeSceneBlendFactor(const SceneBlendFactor sbf);
    00271         void writeCompareFunction(const CompareFunction cf);
    00272         void writeColourValue(const ColourValue &colour, bool writeAlpha = false);
    00273         void writeLayerBlendOperationEx(const LayerBlendOperationEx op);
    00274         void writeLayerBlendSource(const LayerBlendSource lbs);
    00275
    00276         typedef multimap<TextureUnitState::TextureEffectType, TextureUnitState::TextureEffect>::type EffectMap;
    00277
    00278         void writeRotationEffect(const TextureUnitState::TextureEffect& effect, const TextureUnitState *pTex);
    00279         void writeTransformEffect(const TextureUnitState::TextureEffect& effect, const TextureUnitState *pTex);
    00280         void writeScrollEffect(const TextureUnitState::TextureEffect& effect, const TextureUnitState *pTex);
    00281         void writeEnvironmentMapEffect(const TextureUnitState::TextureEffect& effect, const TextureUnitState *pTex);
    00282
    00283         String convertFiltering(FilterOptions fo);
    00284
    00285
    00289         void fireMaterialEvent(SerializeEvent event, bool& skip, const Material* mat);
    00290
    00294         void fireTechniqueEvent(SerializeEvent event, bool& skip, const Technique* tech);
    00295
    00299         void firePassEvent(SerializeEvent event, bool& skip, const Pass* pass);
    00300
    00304         void fireGpuProgramRefEvent(SerializeEvent event, bool& skip,
    00305             const String& attrib,
    00306             const GpuProgramPtr& program,
    00307             const GpuProgramParametersSharedPtr& params,
    00308             GpuProgramParameters* defaultParams);
    00309
    00310
    00314         void fireTextureUnitStateEvent(SerializeEvent event, bool& skip, const TextureUnitState* textureUnit);
    00315
    00316    public:
    00318         MaterialSerializer();
    00320         virtual ~MaterialSerializer() {}
    00321
    00330         void queueForExport(const MaterialPtr& pMat, bool clearQueued = false,
    00331             bool exportDefaults = false, const String& materialName = "");
    00341         void exportQueued(const String& filename, const bool includeProgDef = false, const String& programFilename = "");
    00353         void exportMaterial(const MaterialPtr& pMat, const String& filename, bool exportDefaults = false,
    00354             const bool includeProgDef = false, const String& programFilename = "",
    00355             const String& materialName = "");
    00357         const String &getQueuedAsString() const;
    00359         void clearQueue();
    00360
    00363         void parseScript(DataStreamPtr& stream, const String& groupName);
    00364
    00368         void addListener(Listener* listener);
    00369
    00373         void removeListener(Listener* listener);
    00374
    00375     private:
    00376         String mBuffer;
    00377         String mGpuProgramBuffer;
    00378         typedef set<String>::type GpuProgramDefinitionContainer;
    00379         typedef GpuProgramDefinitionContainer::iterator GpuProgramDefIterator;
    00380         GpuProgramDefinitionContainer mGpuProgramDefinitionContainer;
    00381         bool mDefaults;
    00382
    00383     public:
    00384         void beginSection(unsigned short level, const bool useMainBuffer = true)
    00385         {
    00386             String& buffer = (useMainBuffer ? mBuffer : mGpuProgramBuffer);
    00387             buffer += "\n";
    00388             for (unsigned short i = 0; i < level; ++i)
    00389             {
    00390                 buffer += "\t";
    00391             }
    00392             buffer += "{";
    00393         }
    00394         void endSection(unsigned short level, const bool useMainBuffer = true)
    00395         {
    00396             String& buffer = (useMainBuffer ? mBuffer : mGpuProgramBuffer);
    00397             buffer += "\n";
    00398             for (unsigned short i = 0; i < level; ++i)
    00399             {
    00400                 buffer += "\t";
    00401             }
    00402             buffer += "}";
    00403         }
    00404
    00405         void writeAttribute(unsigned short level, const String& att, const bool useMainBuffer = true)
    00406         {
    00407             String& buffer = (useMainBuffer ? mBuffer : mGpuProgramBuffer);
    00408             buffer += "\n";
    00409             for (unsigned short i = 0; i < level; ++i)
    00410             {
    00411                 buffer += "\t";
    00412             }
    00413             buffer += att;
    00414         }
    00415
    00416         void writeValue(const String& val, const bool useMainBuffer = true)
    00417         {
    00418             String& buffer = (useMainBuffer ? mBuffer : mGpuProgramBuffer);
    00419             buffer += (" " + val);
    00420         }
    00421
    00422         String quoteWord(const String& val)
    00423         {
    00424             if (val.find_first_of(" \t") != String::npos)
    00425                 return ("\"" + val + "\"");
    00426             else return val;
    00427         }
    00428
    00429
    00430         void writeComment(unsigned short level, const String& comment, const bool useMainBuffer = true)
    00431         {
    00432             String& buffer = (useMainBuffer ? mBuffer : mGpuProgramBuffer);
    00433             buffer += "\n";
    00434             for (unsigned short i = 0; i < level; ++i)
    00435             {
    00436                 buffer += "\t";
    00437             }
    00438             buffer += "// " + comment;
    00439         }
    00440
    00441
    00442
    00443     };
    00446 }
    00447 #endif

Copyright © 2012 Torus Knot Software Ltd
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Sun Sep 2 2012 07:27:22