[148] | 1 | /* |
---|
| 2 | ----------------------------------------------------------------------------- |
---|
| 3 | This source file is part of OGRE |
---|
| 4 | (Object-oriented Graphics Rendering Engine) |
---|
| 5 | For the latest info, see http://www.ogre3d.org/ |
---|
| 6 | |
---|
| 7 | Copyright (c) 2000-2013 Torus Knot Software Ltd |
---|
| 8 | |
---|
| 9 | Permission is hereby granted, free of charge, to any person obtaining a copy |
---|
| 10 | of this software and associated documentation files (the "Software"), to deal |
---|
| 11 | in the Software without restriction, including without limitation the rights |
---|
| 12 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
---|
| 13 | copies of the Software, and to permit persons to whom the Software is |
---|
| 14 | furnished to do so, subject to the following conditions: |
---|
| 15 | |
---|
| 16 | The above copyright notice and this permission notice shall be included in |
---|
| 17 | all copies or substantial portions of the Software. |
---|
| 18 | |
---|
| 19 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
---|
| 20 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
---|
| 21 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
---|
| 22 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
---|
| 23 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
---|
| 24 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
---|
| 25 | THE SOFTWARE. |
---|
| 26 | ----------------------------------------------------------------------------- |
---|
| 27 | */ |
---|
| 28 | |
---|
| 29 | #ifndef __SCRIPTCOMPILER_H_ |
---|
| 30 | #define __SCRIPTCOMPILER_H_ |
---|
| 31 | |
---|
| 32 | #include "OgreSharedPtr.h" |
---|
| 33 | #include "OgreMaterial.h" |
---|
| 34 | #include "OgreHighLevelGpuProgram.h" |
---|
| 35 | #include "OgreCompositor.h" |
---|
| 36 | #include "OgreCompositionPass.h" |
---|
| 37 | #include "OgreAny.h" |
---|
| 38 | #include "OgreHeaderPrefix.h" |
---|
| 39 | |
---|
| 40 | namespace Ogre |
---|
| 41 | { |
---|
| 42 | /** \addtogroup Core |
---|
| 43 | * @{ |
---|
| 44 | */ |
---|
| 45 | /** \addtogroup General |
---|
| 46 | * @{ |
---|
| 47 | */ |
---|
| 48 | /** These enums hold the types of the concrete parsed nodes */ |
---|
| 49 | enum ConcreteNodeType |
---|
| 50 | { |
---|
| 51 | CNT_VARIABLE, |
---|
| 52 | CNT_VARIABLE_ASSIGN, |
---|
| 53 | CNT_WORD, |
---|
| 54 | CNT_IMPORT, |
---|
| 55 | CNT_QUOTE, |
---|
| 56 | CNT_LBRACE, |
---|
| 57 | CNT_RBRACE, |
---|
| 58 | CNT_COLON |
---|
| 59 | }; |
---|
| 60 | |
---|
| 61 | /** The ConcreteNode is the struct that holds an un-conditioned sub-tree of parsed input */ |
---|
| 62 | struct ConcreteNode; |
---|
| 63 | typedef SharedPtr<ConcreteNode> ConcreteNodePtr; |
---|
| 64 | typedef list<ConcreteNodePtr>::type ConcreteNodeList; |
---|
| 65 | typedef SharedPtr<ConcreteNodeList> ConcreteNodeListPtr; |
---|
| 66 | struct ConcreteNode : public ScriptCompilerAlloc |
---|
| 67 | { |
---|
| 68 | String token, file; |
---|
| 69 | unsigned int line; |
---|
| 70 | ConcreteNodeType type; |
---|
| 71 | ConcreteNodeList children; |
---|
| 72 | ConcreteNode *parent; |
---|
| 73 | }; |
---|
| 74 | |
---|
| 75 | /** This enum holds the types of the possible abstract nodes */ |
---|
| 76 | enum AbstractNodeType |
---|
| 77 | { |
---|
| 78 | ANT_UNKNOWN, |
---|
| 79 | ANT_ATOM, |
---|
| 80 | ANT_OBJECT, |
---|
| 81 | ANT_PROPERTY, |
---|
| 82 | ANT_IMPORT, |
---|
| 83 | ANT_VARIABLE_SET, |
---|
| 84 | ANT_VARIABLE_ACCESS |
---|
| 85 | }; |
---|
| 86 | class AbstractNode; |
---|
| 87 | typedef SharedPtr<AbstractNode> AbstractNodePtr; |
---|
| 88 | typedef list<AbstractNodePtr>::type AbstractNodeList; |
---|
| 89 | typedef SharedPtr<AbstractNodeList> AbstractNodeListPtr; |
---|
| 90 | |
---|
| 91 | class _OgreExport AbstractNode : public AbstractNodeAlloc |
---|
| 92 | { |
---|
| 93 | public: |
---|
| 94 | String file; |
---|
| 95 | unsigned int line; |
---|
| 96 | AbstractNodeType type; |
---|
| 97 | AbstractNode *parent; |
---|
| 98 | Any context; // A holder for translation context data |
---|
| 99 | public: |
---|
| 100 | AbstractNode(AbstractNode *ptr); |
---|
| 101 | virtual ~AbstractNode(){} |
---|
| 102 | /// Returns a new AbstractNode which is a replica of this one. |
---|
| 103 | virtual AbstractNode *clone() const = 0; |
---|
| 104 | /// Returns a string value depending on the type of the AbstractNode. |
---|
| 105 | virtual String getValue() const = 0; |
---|
| 106 | }; |
---|
| 107 | |
---|
| 108 | /** This is an abstract node which cannot be broken down further */ |
---|
| 109 | class _OgreExport AtomAbstractNode : public AbstractNode |
---|
| 110 | { |
---|
| 111 | public: |
---|
| 112 | String value; |
---|
| 113 | uint32 id; |
---|
| 114 | public: |
---|
| 115 | AtomAbstractNode(AbstractNode *ptr); |
---|
| 116 | AbstractNode *clone() const; |
---|
| 117 | String getValue() const; |
---|
| 118 | private: |
---|
| 119 | void parseNumber() const; |
---|
| 120 | }; |
---|
| 121 | |
---|
| 122 | /** This specific abstract node represents a script object */ |
---|
| 123 | class _OgreExport ObjectAbstractNode : public AbstractNode |
---|
| 124 | { |
---|
| 125 | private: |
---|
| 126 | map<String,String>::type mEnv; |
---|
| 127 | public: |
---|
| 128 | String name, cls; |
---|
| 129 | vector<String>::type bases; |
---|
| 130 | uint32 id; |
---|
| 131 | bool abstract; |
---|
| 132 | AbstractNodeList children; |
---|
| 133 | AbstractNodeList values; |
---|
| 134 | AbstractNodeList overrides; // For use when processing object inheritance and overriding |
---|
| 135 | public: |
---|
| 136 | ObjectAbstractNode(AbstractNode *ptr); |
---|
| 137 | AbstractNode *clone() const; |
---|
| 138 | String getValue() const; |
---|
| 139 | |
---|
| 140 | void addVariable(const String &name); |
---|
| 141 | void setVariable(const String &name, const String &value); |
---|
| 142 | std::pair<bool,String> getVariable(const String &name) const; |
---|
| 143 | const map<String,String>::type &getVariables() const; |
---|
| 144 | }; |
---|
| 145 | |
---|
| 146 | /** This abstract node represents a script property */ |
---|
| 147 | class _OgreExport PropertyAbstractNode : public AbstractNode |
---|
| 148 | { |
---|
| 149 | public: |
---|
| 150 | String name; |
---|
| 151 | uint32 id; |
---|
| 152 | AbstractNodeList values; |
---|
| 153 | public: |
---|
| 154 | PropertyAbstractNode(AbstractNode *ptr); |
---|
| 155 | AbstractNode *clone() const; |
---|
| 156 | String getValue() const; |
---|
| 157 | }; |
---|
| 158 | |
---|
| 159 | /** This abstract node represents an import statement */ |
---|
| 160 | class _OgreExport ImportAbstractNode : public AbstractNode |
---|
| 161 | { |
---|
| 162 | public: |
---|
| 163 | String target, source; |
---|
| 164 | public: |
---|
| 165 | ImportAbstractNode(); |
---|
| 166 | AbstractNode *clone() const; |
---|
| 167 | String getValue() const; |
---|
| 168 | }; |
---|
| 169 | |
---|
| 170 | /** This abstract node represents a variable assignment */ |
---|
| 171 | class _OgreExport VariableAccessAbstractNode : public AbstractNode |
---|
| 172 | { |
---|
| 173 | public: |
---|
| 174 | String name; |
---|
| 175 | public: |
---|
| 176 | VariableAccessAbstractNode(AbstractNode *ptr); |
---|
| 177 | AbstractNode *clone() const; |
---|
| 178 | String getValue() const; |
---|
| 179 | }; |
---|
| 180 | |
---|
| 181 | class ScriptCompilerEvent; |
---|
| 182 | class ScriptCompilerListener; |
---|
| 183 | |
---|
| 184 | /** This is the main class for the compiler. It calls the parser |
---|
| 185 | and processes the CST into an AST and then uses translators |
---|
| 186 | to translate the AST into the final resources. |
---|
| 187 | */ |
---|
| 188 | class _OgreExport ScriptCompiler : public ScriptCompilerAlloc |
---|
| 189 | { |
---|
| 190 | public: // Externally accessible types |
---|
| 191 | //typedef map<String,uint32>::type IdMap; |
---|
| 192 | typedef HashMap<String,uint32> IdMap; |
---|
| 193 | |
---|
| 194 | // The container for errors |
---|
| 195 | struct Error : public ScriptCompilerAlloc |
---|
| 196 | { |
---|
| 197 | String file, message; |
---|
| 198 | int line; |
---|
| 199 | uint32 code; |
---|
| 200 | }; |
---|
| 201 | typedef SharedPtr<Error> ErrorPtr; |
---|
| 202 | typedef list<ErrorPtr>::type ErrorList; |
---|
| 203 | |
---|
| 204 | // These are the built-in error codes |
---|
| 205 | enum{ |
---|
| 206 | CE_STRINGEXPECTED, |
---|
| 207 | CE_NUMBEREXPECTED, |
---|
| 208 | CE_FEWERPARAMETERSEXPECTED, |
---|
| 209 | CE_VARIABLEEXPECTED, |
---|
| 210 | CE_UNDEFINEDVARIABLE, |
---|
| 211 | CE_OBJECTNAMEEXPECTED, |
---|
| 212 | CE_OBJECTALLOCATIONERROR, |
---|
| 213 | CE_INVALIDPARAMETERS, |
---|
| 214 | CE_DUPLICATEOVERRIDE, |
---|
| 215 | CE_UNEXPECTEDTOKEN, |
---|
| 216 | CE_OBJECTBASENOTFOUND, |
---|
| 217 | CE_UNSUPPORTEDBYRENDERSYSTEM, |
---|
| 218 | CE_REFERENCETOANONEXISTINGOBJECT |
---|
| 219 | }; |
---|
| 220 | static String formatErrorCode(uint32 code); |
---|
| 221 | public: |
---|
| 222 | ScriptCompiler(); |
---|
| 223 | virtual ~ScriptCompiler() {} |
---|
| 224 | |
---|
| 225 | /// Takes in a string of script code and compiles it into resources |
---|
| 226 | /** |
---|
| 227 | * @param str The script code |
---|
| 228 | * @param source The source of the script code (e.g. a script file) |
---|
| 229 | * @param group The resource group to place the compiled resources into |
---|
| 230 | */ |
---|
| 231 | bool compile(const String &str, const String &source, const String &group); |
---|
| 232 | /// Compiles resources from the given concrete node list |
---|
| 233 | bool compile(const ConcreteNodeListPtr &nodes, const String &group); |
---|
| 234 | /// Generates the AST from the given string script |
---|
| 235 | AbstractNodeListPtr _generateAST(const String &str, const String &source, bool doImports = false, bool doObjects = false, bool doVariables = false); |
---|
| 236 | /// Compiles the given abstract syntax tree |
---|
| 237 | bool _compile(AbstractNodeListPtr nodes, const String &group, bool doImports = true, bool doObjects = true, bool doVariables = true); |
---|
| 238 | /// Adds the given error to the compiler's list of errors |
---|
| 239 | void addError(uint32 code, const String &file, int line, const String &msg = ""); |
---|
| 240 | /// Sets the listener used by the compiler |
---|
| 241 | void setListener(ScriptCompilerListener *listener); |
---|
| 242 | /// Returns the currently set listener |
---|
| 243 | ScriptCompilerListener *getListener(); |
---|
| 244 | /// Returns the resource group currently set for this compiler |
---|
| 245 | const String &getResourceGroup() const; |
---|
| 246 | /// Adds a name exclusion to the map |
---|
| 247 | /** |
---|
| 248 | * Name exclusions identify object types which cannot accept |
---|
| 249 | * names. This means that excluded types will always have empty names. |
---|
| 250 | * All values in the object header are stored as object values. |
---|
| 251 | */ |
---|
| 252 | void addNameExclusion(const String &type); |
---|
| 253 | /// Removes a name exclusion |
---|
| 254 | void removeNameExclusion(const String &type); |
---|
| 255 | /// Internal method for firing the handleEvent method |
---|
| 256 | bool _fireEvent(ScriptCompilerEvent *evt, void *retval); |
---|
| 257 | private: // Tree processing |
---|
| 258 | AbstractNodeListPtr convertToAST(const ConcreteNodeListPtr &nodes); |
---|
| 259 | /// This built-in function processes import nodes |
---|
| 260 | void processImports(AbstractNodeListPtr &nodes); |
---|
| 261 | /// Loads the requested script and converts it to an AST |
---|
| 262 | AbstractNodeListPtr loadImportPath(const String &name); |
---|
| 263 | /// Returns the abstract nodes from the given tree which represent the target |
---|
| 264 | AbstractNodeListPtr locateTarget(AbstractNodeList *nodes, const String &target); |
---|
| 265 | /// Handles object inheritance and variable expansion |
---|
| 266 | void processObjects(AbstractNodeList *nodes, const AbstractNodeListPtr &top); |
---|
| 267 | /// Handles processing the variables |
---|
| 268 | void processVariables(AbstractNodeList *nodes); |
---|
| 269 | /// This function overlays the given object on the destination object following inheritance rules |
---|
| 270 | void overlayObject(const AbstractNodePtr &source, ObjectAbstractNode *dest); |
---|
| 271 | /// Returns true if the given class is name excluded |
---|
| 272 | bool isNameExcluded(const String &cls, AbstractNode *parent); |
---|
| 273 | /// This function sets up the initial values in word id map |
---|
| 274 | void initWordMap(); |
---|
| 275 | private: |
---|
| 276 | // Resource group |
---|
| 277 | String mGroup; |
---|
| 278 | // The word -> id conversion table |
---|
| 279 | IdMap mIds; |
---|
| 280 | // This is an environment map |
---|
| 281 | typedef map<String,String>::type Environment; |
---|
| 282 | Environment mEnv; |
---|
| 283 | |
---|
| 284 | typedef map<String,AbstractNodeListPtr>::type ImportCacheMap; |
---|
| 285 | ImportCacheMap mImports; // The set of imported scripts to avoid circular dependencies |
---|
| 286 | typedef multimap<String,String>::type ImportRequestMap; |
---|
| 287 | ImportRequestMap mImportRequests; // This holds the target objects for each script to be imported |
---|
| 288 | |
---|
| 289 | // This stores the imports of the scripts, so they are separated and can be treated specially |
---|
| 290 | AbstractNodeList mImportTable; |
---|
| 291 | |
---|
| 292 | // Error list |
---|
| 293 | ErrorList mErrors; |
---|
| 294 | |
---|
| 295 | // The listener |
---|
| 296 | ScriptCompilerListener *mListener; |
---|
| 297 | private: // Internal helper classes and processors |
---|
| 298 | class AbstractTreeBuilder |
---|
| 299 | { |
---|
| 300 | private: |
---|
| 301 | AbstractNodeListPtr mNodes; |
---|
| 302 | AbstractNode *mCurrent; |
---|
| 303 | ScriptCompiler *mCompiler; |
---|
| 304 | public: |
---|
| 305 | AbstractTreeBuilder(ScriptCompiler *compiler); |
---|
| 306 | const AbstractNodeListPtr &getResult() const; |
---|
| 307 | void visit(ConcreteNode *node); |
---|
| 308 | static void visit(AbstractTreeBuilder *visitor, const ConcreteNodeList &nodes); |
---|
| 309 | }; |
---|
| 310 | friend class AbstractTreeBuilder; |
---|
| 311 | public: // Public translator definitions |
---|
| 312 | // This enum are built-in word id values |
---|
| 313 | enum |
---|
| 314 | { |
---|
| 315 | ID_ON = 1, |
---|
| 316 | ID_OFF = 2, |
---|
| 317 | ID_TRUE = 1, |
---|
| 318 | ID_FALSE = 2, |
---|
| 319 | ID_YES = 1, |
---|
| 320 | ID_NO = 2 |
---|
| 321 | }; |
---|
| 322 | }; |
---|
| 323 | |
---|
| 324 | /** |
---|
| 325 | * This struct is a base class for events which can be thrown by the compilers and caught by |
---|
| 326 | * subscribers. There are a set number of standard events which are used by Ogre's core. |
---|
| 327 | * New event types may be derived for more custom compiler processing. |
---|
| 328 | */ |
---|
| 329 | class ScriptCompilerEvent |
---|
| 330 | { |
---|
| 331 | public: |
---|
| 332 | String mType; |
---|
| 333 | |
---|
| 334 | ScriptCompilerEvent(const String &type):mType(type){} |
---|
| 335 | virtual ~ScriptCompilerEvent(){} |
---|
| 336 | private: // Non-copyable |
---|
| 337 | ScriptCompilerEvent(const ScriptCompilerEvent&); |
---|
| 338 | ScriptCompilerEvent &operator = (const ScriptCompilerEvent&); |
---|
| 339 | }; |
---|
| 340 | |
---|
| 341 | /** This is a listener for the compiler. The compiler can be customized with |
---|
| 342 | this listener. It lets you listen in on events occurring during compilation, |
---|
| 343 | hook them, and change the behavior. |
---|
| 344 | */ |
---|
| 345 | class _OgreExport ScriptCompilerListener |
---|
| 346 | { |
---|
| 347 | public: |
---|
| 348 | ScriptCompilerListener(); |
---|
| 349 | virtual ~ScriptCompilerListener() {} |
---|
| 350 | |
---|
| 351 | /// Returns the concrete node list from the given file |
---|
| 352 | virtual ConcreteNodeListPtr importFile(ScriptCompiler *compiler, const String &name); |
---|
| 353 | /// Allows for responding to and overriding behavior before a CST is translated into an AST |
---|
| 354 | virtual void preConversion(ScriptCompiler *compiler, ConcreteNodeListPtr nodes); |
---|
| 355 | /// Allows vetoing of continued compilation after the entire AST conversion process finishes |
---|
| 356 | /** |
---|
| 357 | @remarks Once the script is turned completely into an AST, including import |
---|
| 358 | and override handling, this function allows a listener to exit |
---|
| 359 | the compilation process. |
---|
| 360 | @return True continues compilation, false aborts |
---|
| 361 | */ |
---|
| 362 | virtual bool postConversion(ScriptCompiler *compiler, const AbstractNodeListPtr&); |
---|
| 363 | /// Called when an error occurred |
---|
| 364 | virtual void handleError(ScriptCompiler *compiler, uint32 code, const String &file, int line, const String &msg); |
---|
| 365 | /// Called when an event occurs during translation, return true if handled |
---|
| 366 | /** |
---|
| 367 | @remarks This function is called from the translators when an event occurs that |
---|
| 368 | that can be responded to. Often this is overriding names, or it can be a request for |
---|
| 369 | custom resource creation. |
---|
| 370 | @arg compiler A reference to the compiler |
---|
| 371 | @arg evt The event object holding information about the event to be processed |
---|
| 372 | @arg retval A possible return value from handlers |
---|
| 373 | @return True if the handler processed the event |
---|
| 374 | */ |
---|
| 375 | virtual bool handleEvent(ScriptCompiler *compiler, ScriptCompilerEvent *evt, void *retval); |
---|
| 376 | }; |
---|
| 377 | |
---|
| 378 | class ScriptTranslator; |
---|
| 379 | class ScriptTranslatorManager; |
---|
| 380 | |
---|
| 381 | /** Manages threaded compilation of scripts. This script loader forwards |
---|
| 382 | scripts compilations to a specific compiler instance. |
---|
| 383 | */ |
---|
| 384 | class _OgreExport ScriptCompilerManager : public Singleton<ScriptCompilerManager>, public ScriptLoader, public ScriptCompilerAlloc |
---|
| 385 | { |
---|
| 386 | private: |
---|
| 387 | OGRE_AUTO_MUTEX; |
---|
| 388 | |
---|
| 389 | // A list of patterns loaded by this compiler manager |
---|
| 390 | StringVector mScriptPatterns; |
---|
| 391 | |
---|
| 392 | // A pointer to the listener used for compiling scripts |
---|
| 393 | ScriptCompilerListener *mListener; |
---|
| 394 | |
---|
| 395 | // Stores a map from object types to the translators that handle them |
---|
| 396 | vector<ScriptTranslatorManager*>::type mManagers; |
---|
| 397 | |
---|
| 398 | // A pointer to the built-in ScriptTranslatorManager |
---|
| 399 | ScriptTranslatorManager *mBuiltinTranslatorManager; |
---|
| 400 | |
---|
| 401 | // A pointer to the specific compiler instance used |
---|
| 402 | OGRE_THREAD_POINTER(ScriptCompiler, mScriptCompiler); |
---|
| 403 | public: |
---|
| 404 | ScriptCompilerManager(); |
---|
| 405 | virtual ~ScriptCompilerManager(); |
---|
| 406 | |
---|
| 407 | /// Sets the listener used for compiler instances |
---|
| 408 | void setListener(ScriptCompilerListener *listener); |
---|
| 409 | /// Returns the currently set listener used for compiler instances |
---|
| 410 | ScriptCompilerListener *getListener(); |
---|
| 411 | |
---|
| 412 | /// Adds the given translator manager to the list of managers |
---|
| 413 | void addTranslatorManager(ScriptTranslatorManager *man); |
---|
| 414 | /// Removes the given translator manager from the list of managers |
---|
| 415 | void removeTranslatorManager(ScriptTranslatorManager *man); |
---|
| 416 | /// Clears all translator managers |
---|
| 417 | void clearTranslatorManagers(); |
---|
| 418 | /// Retrieves a ScriptTranslator from the supported managers |
---|
| 419 | ScriptTranslator *getTranslator(const AbstractNodePtr &node); |
---|
| 420 | |
---|
| 421 | /// Adds a script extension that can be handled (e.g. *.material, *.pu, etc.) |
---|
| 422 | void addScriptPattern(const String &pattern); |
---|
| 423 | /// @copydoc ScriptLoader::getScriptPatterns |
---|
| 424 | const StringVector& getScriptPatterns(void) const; |
---|
| 425 | /// @copydoc ScriptLoader::parseScript |
---|
| 426 | void parseScript(DataStreamPtr& stream, const String& groupName); |
---|
| 427 | /// @copydoc ScriptLoader::getLoadingOrder |
---|
| 428 | Real getLoadingOrder(void) const; |
---|
| 429 | |
---|
| 430 | /** Override standard Singleton retrieval. |
---|
| 431 | @remarks |
---|
| 432 | Why do we do this? Well, it's because the Singleton |
---|
| 433 | implementation is in a .h file, which means it gets compiled |
---|
| 434 | into anybody who includes it. This is needed for the |
---|
| 435 | Singleton template to work, but we actually only want it |
---|
| 436 | compiled into the implementation of the class based on the |
---|
| 437 | Singleton, not all of them. If we don't change this, we get |
---|
| 438 | link errors when trying to use the Singleton-based class from |
---|
| 439 | an outside dll. |
---|
| 440 | @par |
---|
| 441 | This method just delegates to the template version anyway, |
---|
| 442 | but the implementation stays in this single compilation unit, |
---|
| 443 | preventing link errors. |
---|
| 444 | */ |
---|
| 445 | static ScriptCompilerManager& getSingleton(void); |
---|
| 446 | /** Override standard Singleton retrieval. |
---|
| 447 | @remarks |
---|
| 448 | Why do we do this? Well, it's because the Singleton |
---|
| 449 | implementation is in a .h file, which means it gets compiled |
---|
| 450 | into anybody who includes it. This is needed for the |
---|
| 451 | Singleton template to work, but we actually only want it |
---|
| 452 | compiled into the implementation of the class based on the |
---|
| 453 | Singleton, not all of them. If we don't change this, we get |
---|
| 454 | link errors when trying to use the Singleton-based class from |
---|
| 455 | an outside dll. |
---|
| 456 | @par |
---|
| 457 | This method just delegates to the template version anyway, |
---|
| 458 | but the implementation stays in this single compilation unit, |
---|
| 459 | preventing link errors. |
---|
| 460 | */ |
---|
| 461 | static ScriptCompilerManager* getSingletonPtr(void); |
---|
| 462 | }; |
---|
| 463 | |
---|
| 464 | // Standard event types |
---|
| 465 | class _OgreExport PreApplyTextureAliasesScriptCompilerEvent : public ScriptCompilerEvent |
---|
| 466 | { |
---|
| 467 | public: |
---|
| 468 | Material *mMaterial; |
---|
| 469 | AliasTextureNamePairList *mAliases; |
---|
| 470 | static String eventType; |
---|
| 471 | |
---|
| 472 | PreApplyTextureAliasesScriptCompilerEvent(Material *material, AliasTextureNamePairList *aliases) |
---|
| 473 | :ScriptCompilerEvent(eventType), mMaterial(material), mAliases(aliases){} |
---|
| 474 | }; |
---|
| 475 | |
---|
| 476 | class _OgreExport ProcessResourceNameScriptCompilerEvent : public ScriptCompilerEvent |
---|
| 477 | { |
---|
| 478 | public: |
---|
| 479 | enum ResourceType |
---|
| 480 | { |
---|
| 481 | TEXTURE, |
---|
| 482 | MATERIAL, |
---|
| 483 | GPU_PROGRAM, |
---|
| 484 | COMPOSITOR |
---|
| 485 | }; |
---|
| 486 | ResourceType mResourceType; |
---|
| 487 | String mName; |
---|
| 488 | static String eventType; |
---|
| 489 | |
---|
| 490 | ProcessResourceNameScriptCompilerEvent(ResourceType resourceType, const String &name) |
---|
| 491 | :ScriptCompilerEvent(eventType), mResourceType(resourceType), mName(name){} |
---|
| 492 | }; |
---|
| 493 | |
---|
| 494 | class _OgreExport ProcessNameExclusionScriptCompilerEvent : public ScriptCompilerEvent |
---|
| 495 | { |
---|
| 496 | public: |
---|
| 497 | String mClass; |
---|
| 498 | AbstractNode *mParent; |
---|
| 499 | static String eventType; |
---|
| 500 | |
---|
| 501 | ProcessNameExclusionScriptCompilerEvent(const String &cls, AbstractNode *parent) |
---|
| 502 | :ScriptCompilerEvent(eventType), mClass(cls), mParent(parent){} |
---|
| 503 | }; |
---|
| 504 | |
---|
| 505 | class _OgreExport CreateMaterialScriptCompilerEvent : public ScriptCompilerEvent |
---|
| 506 | { |
---|
| 507 | public: |
---|
| 508 | String mFile, mName, mResourceGroup; |
---|
| 509 | static String eventType; |
---|
| 510 | |
---|
| 511 | CreateMaterialScriptCompilerEvent(const String &file, const String &name, const String &resourceGroup) |
---|
| 512 | :ScriptCompilerEvent(eventType), mFile(file), mName(name), mResourceGroup(resourceGroup){} |
---|
| 513 | }; |
---|
| 514 | |
---|
| 515 | class _OgreExport CreateGpuProgramScriptCompilerEvent : public ScriptCompilerEvent |
---|
| 516 | { |
---|
| 517 | public: |
---|
| 518 | String mFile, mName, mResourceGroup, mSource, mSyntax; |
---|
| 519 | GpuProgramType mProgramType; |
---|
| 520 | static String eventType; |
---|
| 521 | |
---|
| 522 | CreateGpuProgramScriptCompilerEvent(const String &file, const String &name, const String &resourceGroup, const String &source, |
---|
| 523 | const String &syntax, GpuProgramType programType) |
---|
| 524 | :ScriptCompilerEvent(eventType), mFile(file), mName(name), mResourceGroup(resourceGroup), mSource(source), |
---|
| 525 | mSyntax(syntax), mProgramType(programType) |
---|
| 526 | {} |
---|
| 527 | }; |
---|
| 528 | |
---|
| 529 | class _OgreExport CreateHighLevelGpuProgramScriptCompilerEvent : public ScriptCompilerEvent |
---|
| 530 | { |
---|
| 531 | public: |
---|
| 532 | String mFile, mName, mResourceGroup, mSource, mLanguage; |
---|
| 533 | GpuProgramType mProgramType; |
---|
| 534 | static String eventType; |
---|
| 535 | |
---|
| 536 | CreateHighLevelGpuProgramScriptCompilerEvent(const String &file, const String &name, const String &resourceGroup, const String &source, |
---|
| 537 | const String &language, GpuProgramType programType) |
---|
| 538 | :ScriptCompilerEvent(eventType), mFile(file), mName(name), mResourceGroup(resourceGroup), mSource(source), |
---|
| 539 | mLanguage(language), mProgramType(programType) |
---|
| 540 | {} |
---|
| 541 | }; |
---|
| 542 | |
---|
| 543 | class _OgreExport CreateGpuSharedParametersScriptCompilerEvent : public ScriptCompilerEvent |
---|
| 544 | { |
---|
| 545 | public: |
---|
| 546 | String mFile, mName, mResourceGroup; |
---|
| 547 | static String eventType; |
---|
| 548 | |
---|
| 549 | CreateGpuSharedParametersScriptCompilerEvent(const String &file, const String &name, const String &resourceGroup) |
---|
| 550 | :ScriptCompilerEvent(eventType), mFile(file), mName(name), mResourceGroup(resourceGroup){} |
---|
| 551 | }; |
---|
| 552 | |
---|
| 553 | class _OgreExport CreateParticleSystemScriptCompilerEvent : public ScriptCompilerEvent |
---|
| 554 | { |
---|
| 555 | public: |
---|
| 556 | String mFile, mName, mResourceGroup; |
---|
| 557 | static String eventType; |
---|
| 558 | |
---|
| 559 | CreateParticleSystemScriptCompilerEvent(const String &file, const String &name, const String &resourceGroup) |
---|
| 560 | :ScriptCompilerEvent(eventType), mFile(file), mName(name), mResourceGroup(resourceGroup){} |
---|
| 561 | }; |
---|
| 562 | |
---|
| 563 | class _OgreExport CreateCompositorScriptCompilerEvent : public ScriptCompilerEvent |
---|
| 564 | { |
---|
| 565 | public: |
---|
| 566 | String mFile, mName, mResourceGroup; |
---|
| 567 | static String eventType; |
---|
| 568 | |
---|
| 569 | CreateCompositorScriptCompilerEvent(const String &file, const String &name, const String &resourceGroup) |
---|
| 570 | :ScriptCompilerEvent(eventType), mFile(file), mName(name), mResourceGroup(resourceGroup){} |
---|
| 571 | }; |
---|
| 572 | |
---|
| 573 | /// This enum defines the integer ids for keywords this compiler handles |
---|
| 574 | enum |
---|
| 575 | { |
---|
| 576 | ID_MATERIAL = 3, |
---|
| 577 | ID_VERTEX_PROGRAM, |
---|
| 578 | ID_GEOMETRY_PROGRAM, |
---|
| 579 | ID_FRAGMENT_PROGRAM, |
---|
| 580 | ID_TECHNIQUE, |
---|
| 581 | ID_PASS, |
---|
| 582 | ID_TEXTURE_UNIT, |
---|
| 583 | ID_VERTEX_PROGRAM_REF, |
---|
| 584 | ID_GEOMETRY_PROGRAM_REF, |
---|
| 585 | ID_FRAGMENT_PROGRAM_REF, |
---|
| 586 | ID_SHADOW_CASTER_VERTEX_PROGRAM_REF, |
---|
| 587 | ID_SHADOW_CASTER_FRAGMENT_PROGRAM_REF, |
---|
| 588 | ID_SHADOW_RECEIVER_VERTEX_PROGRAM_REF, |
---|
| 589 | ID_SHADOW_RECEIVER_FRAGMENT_PROGRAM_REF, |
---|
| 590 | ID_SHADOW_CASTER_MATERIAL, |
---|
| 591 | ID_SHADOW_RECEIVER_MATERIAL, |
---|
| 592 | |
---|
| 593 | ID_LOD_VALUES, |
---|
| 594 | ID_LOD_STRATEGY, |
---|
| 595 | ID_LOD_DISTANCES, |
---|
| 596 | ID_RECEIVE_SHADOWS, |
---|
| 597 | ID_TRANSPARENCY_CASTS_SHADOWS, |
---|
| 598 | ID_SET_TEXTURE_ALIAS, |
---|
| 599 | |
---|
| 600 | ID_SOURCE, |
---|
| 601 | ID_SYNTAX, |
---|
| 602 | ID_DEFAULT_PARAMS, |
---|
| 603 | ID_PARAM_INDEXED, |
---|
| 604 | ID_PARAM_NAMED, |
---|
| 605 | ID_PARAM_INDEXED_AUTO, |
---|
| 606 | ID_PARAM_NAMED_AUTO, |
---|
| 607 | |
---|
| 608 | ID_SCHEME, |
---|
| 609 | ID_LOD_INDEX, |
---|
| 610 | ID_GPU_VENDOR_RULE, |
---|
| 611 | ID_GPU_DEVICE_RULE, |
---|
| 612 | ID_INCLUDE, |
---|
| 613 | ID_EXCLUDE, |
---|
| 614 | |
---|
| 615 | ID_AMBIENT, |
---|
| 616 | ID_DIFFUSE, |
---|
| 617 | ID_SPECULAR, |
---|
| 618 | ID_EMISSIVE, |
---|
| 619 | ID_VERTEXCOLOUR, |
---|
| 620 | ID_SCENE_BLEND, |
---|
| 621 | ID_COLOUR_BLEND, |
---|
| 622 | ID_ONE, |
---|
| 623 | ID_ZERO, |
---|
| 624 | ID_DEST_COLOUR, |
---|
| 625 | ID_SRC_COLOUR, |
---|
| 626 | ID_ONE_MINUS_DEST_COLOUR, |
---|
| 627 | ID_ONE_MINUS_SRC_COLOUR, |
---|
| 628 | ID_DEST_ALPHA, |
---|
| 629 | ID_SRC_ALPHA, |
---|
| 630 | ID_ONE_MINUS_DEST_ALPHA, |
---|
| 631 | ID_ONE_MINUS_SRC_ALPHA, |
---|
| 632 | ID_SEPARATE_SCENE_BLEND, |
---|
| 633 | ID_SCENE_BLEND_OP, |
---|
| 634 | ID_REVERSE_SUBTRACT, |
---|
| 635 | ID_MIN, |
---|
| 636 | ID_MAX, |
---|
| 637 | ID_SEPARATE_SCENE_BLEND_OP, |
---|
| 638 | ID_DEPTH_CHECK, |
---|
| 639 | ID_DEPTH_WRITE, |
---|
| 640 | ID_DEPTH_FUNC, |
---|
| 641 | ID_DEPTH_BIAS, |
---|
| 642 | ID_ITERATION_DEPTH_BIAS, |
---|
| 643 | ID_ALWAYS_FAIL, |
---|
| 644 | ID_ALWAYS_PASS, |
---|
| 645 | ID_LESS_EQUAL, |
---|
| 646 | ID_LESS, |
---|
| 647 | ID_EQUAL, |
---|
| 648 | ID_NOT_EQUAL, |
---|
| 649 | ID_GREATER_EQUAL, |
---|
| 650 | ID_GREATER, |
---|
| 651 | ID_ALPHA_REJECTION, |
---|
| 652 | ID_ALPHA_TO_COVERAGE, |
---|
| 653 | ID_LIGHT_SCISSOR, |
---|
| 654 | ID_LIGHT_CLIP_PLANES, |
---|
| 655 | ID_TRANSPARENT_SORTING, |
---|
| 656 | ID_ILLUMINATION_STAGE, |
---|
| 657 | ID_DECAL, |
---|
| 658 | ID_CULL_HARDWARE, |
---|
| 659 | ID_CLOCKWISE, |
---|
| 660 | ID_ANTICLOCKWISE, |
---|
| 661 | ID_CULL_SOFTWARE, |
---|
| 662 | ID_BACK, |
---|
| 663 | ID_FRONT, |
---|
| 664 | ID_NORMALISE_NORMALS, |
---|
| 665 | ID_LIGHTING, |
---|
| 666 | ID_SHADING, |
---|
| 667 | ID_FLAT, |
---|
| 668 | ID_GOURAUD, |
---|
| 669 | ID_PHONG, |
---|
| 670 | ID_POLYGON_MODE, |
---|
| 671 | ID_SOLID, |
---|
| 672 | ID_WIREFRAME, |
---|
| 673 | ID_POINTS, |
---|
| 674 | ID_POLYGON_MODE_OVERRIDEABLE, |
---|
| 675 | ID_FOG_OVERRIDE, |
---|
| 676 | ID_NONE, |
---|
| 677 | ID_LINEAR, |
---|
| 678 | ID_EXP, |
---|
| 679 | ID_EXP2, |
---|
| 680 | ID_COLOUR_WRITE, |
---|
| 681 | ID_MAX_LIGHTS, |
---|
| 682 | ID_START_LIGHT, |
---|
| 683 | ID_ITERATION, |
---|
| 684 | ID_ONCE, |
---|
| 685 | ID_ONCE_PER_LIGHT, |
---|
| 686 | ID_PER_LIGHT, |
---|
| 687 | ID_PER_N_LIGHTS, |
---|
| 688 | ID_POINT, |
---|
| 689 | ID_SPOT, |
---|
| 690 | ID_DIRECTIONAL, |
---|
| 691 | ID_LIGHT_MASK, |
---|
| 692 | ID_POINT_SIZE, |
---|
| 693 | ID_POINT_SPRITES, |
---|
| 694 | ID_POINT_SIZE_ATTENUATION, |
---|
| 695 | ID_POINT_SIZE_MIN, |
---|
| 696 | ID_POINT_SIZE_MAX, |
---|
| 697 | |
---|
| 698 | ID_TEXTURE_ALIAS, |
---|
| 699 | ID_TEXTURE, |
---|
| 700 | ID_1D, |
---|
| 701 | ID_2D, |
---|
| 702 | ID_3D, |
---|
| 703 | ID_CUBIC, |
---|
| 704 | ID_2DARRAY, |
---|
| 705 | ID_UNLIMITED, |
---|
| 706 | ID_ALPHA, |
---|
| 707 | ID_GAMMA, |
---|
| 708 | ID_ANIM_TEXTURE, |
---|
| 709 | ID_CUBIC_TEXTURE, |
---|
| 710 | ID_SEPARATE_UV, |
---|
| 711 | ID_COMBINED_UVW, |
---|
| 712 | ID_TEX_COORD_SET, |
---|
| 713 | ID_TEX_ADDRESS_MODE, |
---|
| 714 | ID_WRAP, |
---|
| 715 | ID_CLAMP, |
---|
| 716 | ID_BORDER, |
---|
| 717 | ID_MIRROR, |
---|
| 718 | ID_TEX_BORDER_COLOUR, |
---|
| 719 | ID_FILTERING, |
---|
| 720 | ID_BILINEAR, |
---|
| 721 | ID_TRILINEAR, |
---|
| 722 | ID_ANISOTROPIC, |
---|
| 723 | ID_CMPTEST, |
---|
| 724 | ID_ON, |
---|
| 725 | ID_OFF, |
---|
| 726 | ID_CMPFUNC, |
---|
| 727 | ID_MAX_ANISOTROPY, |
---|
| 728 | ID_MIPMAP_BIAS, |
---|
| 729 | ID_COLOUR_OP, |
---|
| 730 | ID_REPLACE, |
---|
| 731 | ID_ADD, |
---|
| 732 | ID_MODULATE, |
---|
| 733 | ID_ALPHA_BLEND, |
---|
| 734 | ID_COLOUR_OP_EX, |
---|
| 735 | ID_SOURCE1, |
---|
| 736 | ID_SOURCE2, |
---|
| 737 | ID_MODULATE_X2, |
---|
| 738 | ID_MODULATE_X4, |
---|
| 739 | ID_ADD_SIGNED, |
---|
| 740 | ID_ADD_SMOOTH, |
---|
| 741 | ID_SUBTRACT, |
---|
| 742 | ID_BLEND_DIFFUSE_COLOUR, |
---|
| 743 | ID_BLEND_DIFFUSE_ALPHA, |
---|
| 744 | ID_BLEND_TEXTURE_ALPHA, |
---|
| 745 | ID_BLEND_CURRENT_ALPHA, |
---|
| 746 | ID_BLEND_MANUAL, |
---|
| 747 | ID_DOT_PRODUCT, |
---|
| 748 | ID_SRC_CURRENT, |
---|
| 749 | ID_SRC_TEXTURE, |
---|
| 750 | ID_SRC_DIFFUSE, |
---|
| 751 | ID_SRC_SPECULAR, |
---|
| 752 | ID_SRC_MANUAL, |
---|
| 753 | ID_COLOUR_OP_MULTIPASS_FALLBACK, |
---|
| 754 | ID_ALPHA_OP_EX, |
---|
| 755 | ID_ENV_MAP, |
---|
| 756 | ID_SPHERICAL, |
---|
| 757 | ID_PLANAR, |
---|
| 758 | ID_CUBIC_REFLECTION, |
---|
| 759 | ID_CUBIC_NORMAL, |
---|
| 760 | ID_SCROLL, |
---|
| 761 | ID_SCROLL_ANIM, |
---|
| 762 | ID_ROTATE, |
---|
| 763 | ID_ROTATE_ANIM, |
---|
| 764 | ID_SCALE, |
---|
| 765 | ID_WAVE_XFORM, |
---|
| 766 | ID_SCROLL_X, |
---|
| 767 | ID_SCROLL_Y, |
---|
| 768 | ID_SCALE_X, |
---|
| 769 | ID_SCALE_Y, |
---|
| 770 | ID_SINE, |
---|
| 771 | ID_TRIANGLE, |
---|
| 772 | ID_SQUARE, |
---|
| 773 | ID_SAWTOOTH, |
---|
| 774 | ID_INVERSE_SAWTOOTH, |
---|
| 775 | ID_TRANSFORM, |
---|
| 776 | ID_BINDING_TYPE, |
---|
| 777 | ID_VERTEX, |
---|
| 778 | ID_FRAGMENT, |
---|
| 779 | ID_CONTENT_TYPE, |
---|
| 780 | ID_NAMED, |
---|
| 781 | ID_SHADOW, |
---|
| 782 | ID_TEXTURE_SOURCE, |
---|
| 783 | ID_SHARED_PARAMS, |
---|
| 784 | ID_SHARED_PARAM_NAMED, |
---|
| 785 | ID_SHARED_PARAMS_REF, |
---|
| 786 | |
---|
| 787 | ID_PARTICLE_SYSTEM, |
---|
| 788 | ID_EMITTER, |
---|
| 789 | ID_AFFECTOR, |
---|
| 790 | |
---|
| 791 | ID_COMPOSITOR, |
---|
| 792 | ID_TARGET, |
---|
| 793 | ID_TARGET_OUTPUT, |
---|
| 794 | |
---|
| 795 | ID_INPUT, |
---|
| 796 | ID_PREVIOUS, |
---|
| 797 | ID_TARGET_WIDTH, |
---|
| 798 | ID_TARGET_HEIGHT, |
---|
| 799 | ID_TARGET_WIDTH_SCALED, |
---|
| 800 | ID_TARGET_HEIGHT_SCALED, |
---|
| 801 | ID_COMPOSITOR_LOGIC, |
---|
| 802 | ID_TEXTURE_REF, |
---|
| 803 | ID_SCOPE_LOCAL, |
---|
| 804 | ID_SCOPE_CHAIN, |
---|
| 805 | ID_SCOPE_GLOBAL, |
---|
| 806 | ID_POOLED, |
---|
| 807 | //ID_GAMMA, - already registered for material |
---|
| 808 | ID_NO_FSAA, |
---|
| 809 | ID_DEPTH_POOL, |
---|
| 810 | ID_ONLY_INITIAL, |
---|
| 811 | ID_VISIBILITY_MASK, |
---|
| 812 | ID_LOD_BIAS, |
---|
| 813 | ID_MATERIAL_SCHEME, |
---|
| 814 | ID_SHADOWS_ENABLED, |
---|
| 815 | |
---|
| 816 | ID_CLEAR, |
---|
| 817 | ID_STENCIL, |
---|
| 818 | ID_RENDER_SCENE, |
---|
| 819 | ID_RENDER_QUAD, |
---|
| 820 | ID_IDENTIFIER, |
---|
| 821 | ID_FIRST_RENDER_QUEUE, |
---|
| 822 | ID_LAST_RENDER_QUEUE, |
---|
| 823 | ID_QUAD_NORMALS, |
---|
| 824 | ID_CAMERA_FAR_CORNERS_VIEW_SPACE, |
---|
| 825 | ID_CAMERA_FAR_CORNERS_WORLD_SPACE, |
---|
| 826 | |
---|
| 827 | ID_BUFFERS, |
---|
| 828 | ID_COLOUR, |
---|
| 829 | ID_DEPTH, |
---|
| 830 | ID_COLOUR_VALUE, |
---|
| 831 | ID_DEPTH_VALUE, |
---|
| 832 | ID_STENCIL_VALUE, |
---|
| 833 | |
---|
| 834 | ID_CHECK, |
---|
| 835 | ID_COMP_FUNC, |
---|
| 836 | ID_REF_VALUE, |
---|
| 837 | ID_MASK, |
---|
| 838 | ID_FAIL_OP, |
---|
| 839 | ID_KEEP, |
---|
| 840 | ID_INCREMENT, |
---|
| 841 | ID_DECREMENT, |
---|
| 842 | ID_INCREMENT_WRAP, |
---|
| 843 | ID_DECREMENT_WRAP, |
---|
| 844 | ID_INVERT, |
---|
| 845 | ID_DEPTH_FAIL_OP, |
---|
| 846 | ID_PASS_OP, |
---|
| 847 | ID_TWO_SIDED, |
---|
| 848 | #ifdef RTSHADER_SYSTEM_BUILD_CORE_SHADERS |
---|
| 849 | ID_RT_SHADER_SYSTEM, |
---|
| 850 | #endif |
---|
| 851 | /// Suport for shader model 5.0 |
---|
| 852 | // More program IDs |
---|
| 853 | ID_TESSELATION_HULL_PROGRAM, |
---|
| 854 | ID_TESSELATION_DOMAIN_PROGRAM, |
---|
| 855 | ID_COMPUTE_PROGRAM, |
---|
| 856 | ID_TESSELATION_HULL_PROGRAM_REF, |
---|
| 857 | ID_TESSELATION_DOMAIN_PROGRAM_REF, |
---|
| 858 | ID_COMPUTE_PROGRAM_REF, |
---|
| 859 | // More binding IDs |
---|
| 860 | ID_GEOMETRY, |
---|
| 861 | ID_TESSELATION_HULL, |
---|
| 862 | ID_TESSELATION_DOMAIN, |
---|
| 863 | ID_COMPUTE, |
---|
| 864 | |
---|
| 865 | // Support for subroutine |
---|
| 866 | ID_SUBROUTINE, |
---|
| 867 | |
---|
| 868 | ID_END_BUILTIN_IDS |
---|
| 869 | }; |
---|
| 870 | /** @} */ |
---|
| 871 | /** @} */ |
---|
| 872 | } |
---|
| 873 | |
---|
| 874 | #include "OgreHeaderSuffix.h" |
---|
| 875 | |
---|
| 876 | #endif |
---|