| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- #ifndef __BASIC_SHADER_LOADER_H__
- #define __BASIC_SHADER_LOADER_H__
- #include <irrlicht/irrlicht.h>
- #include <iostream>
- #include <vector>
- #include <map>
- #include <wallpaperengine/fs/fileResolver.h>
- namespace wp
- {
- namespace shaders
- {
- /**
- * A basic shader loader that adds basic function definitions to every loaded shader
- */
- class compiler
- {
- public:
- /**
- * Basic struct used to define all the shader variables
- * the compiler will replace in pre-processing time
- * to make sure the shaders compile under OpenGL
- */
- struct VariableReplacement
- {
- const char* original;
- const char* replacement;
- };
- struct TypeName
- {
- const char* name;
- int size;
- };
- /**
- * Types of shaders
- */
- enum Type
- {
- Type_Vertex = 0,
- Type_Pixel = 1,
- };
- /**
- * List of variables to replace when pre-process is performed
- */
- static std::map<std::string, std::string> sVariableReplacement;
- /**
- * Types of variables the pre-processor understands
- */
- static std::vector<std::string> sTypes;
- /**
- * Compiler constructor, loads the given shader file and prepares
- * the pre-processing and compilation of the shader, adding
- * required definitions if needed
- *
- * @param file The file to load
- * @param type The type of shader
- * @param recursive Whether the compiler should add base definitions or not
- */
- compiler (irr::io::path file, Type type, bool recursive = false);
- /**
- * Performs the actual pre-compilation/pre-processing over the shader files
- * This step is kinda big, replaces variables names on sVariableReplacement,
- * ensures #include directives are correctly handled
- * and takes care of attribute comments for the wallpaper engine specifics
- *
- * @return The shader contents ready to be used by OpenGL
- */
- std::string precompile();
- private:
- /**
- * Checks if there is "str" in the current position without advancing the
- * iterator in use
- *
- * @param str The string to check for
- * @param it The position to start checking at
- *
- * @return
- */
- bool peekString (std::string str, std::string::const_iterator& it);
- /**
- * Checks for a semicolon as current character, advancing the iterator
- * after finding it, otherwise returns an error
- *
- * @param it The position where to expect the semicolon
- *
- * @return
- */
- bool expectSemicolon (std::string::const_iterator& it);
- /**
- * Ignores contiguous space characters in the string advancing the iterator
- * until the first non-space character
- *
- * @param it The iterator to increase
- */
- void ignoreSpaces (std::string::const_iterator& it);
- /**
- * Ignores all characters until next line-fee (\n) advancing the interator
- *
- * @param it The iterator to increase
- */
- void ignoreUpToNextLineFeed (std::string::const_iterator& it);
- /**
- * Ignores all characters until a block comment end is found, advancing the iterator
- *
- * @param it The iterator to increase
- */
- void ignoreUpToBlockCommentEnd (std::string::const_iterator& it);
- /**
- * Parses the current position as a variable type, extracts it and compares it
- * to the registered types in the pre-processor, returning it's name if valid
- * increasing the iterator at the same time
- *
- * @param it The position to extract it from
- *
- * @return The type name
- */
- std::string extractType (std::string::const_iterator& it);
- /**
- * Parses the current position as a variable name, extractig it's name and
- * increasing the iterator as the name is extracted
- *
- * @param it The position to start extracting the variable name from
- *
- * @return The variable name
- */
- std::string extractName (std::string::const_iterator& it);
- /**
- * Parses the current position as a quoted value, extracting it's value
- * and increasing the iterator at the same time
- *
- * @param it The position to start extracting the value from
- *
- * @return The value
- */
- std::string extractQuotedValue (std::string::const_iterator& it);
- /**
- * Tries to find the given shader file and compile it
- *
- * @param filename The shader's filename
- *
- * @return The compiled contents
- */
- std::string lookupShaderFile (std::string filename);
- /**
- * Searches for the given symbol in the replace table
- *
- * @param symbol The symbol to look for
- *
- * @return The symbol it should be replaced with
- */
- std::string lookupReplaceSymbol (std::string symbol);
- /**
- * @return Whether the character in the current position is a character or not
- */
- bool isChar (std::string::const_iterator& it);
- /**
- * @return Whether the character in the current position is a number or not
- */
- bool isNumeric (std::string::const_iterator& it);
- /**
- * The shader file this instance is loading
- */
- irr::io::path m_file;
- /**
- * The original file content
- */
- std::string m_content;
- /**
- * The final, compiled content ready to be used by OpenGL
- */
- std::string m_compiledContent;
- /**
- * Whether there was any kind of error in the compilation or not
- */
- bool m_error;
- /**
- * Extra information about the error (if any)
- */
- std::string m_errorInfo;
- /**
- * The type of shader
- */
- Type m_type;
- /**
- * The file resolver to be used by the compiler to load the files
- */
- wp::fs::fileResolver m_resolver;
- };
- }
- }
- #endif /* !__BASIC_SHADER_LOADER_H__ */
|