X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogrambuilder.h;h=0883f6a74fd07a6479dc1b01fa62424882455042;hb=70663ae97d5b70a6b468e07dd7e73475a175dc9b;hp=6845f4a9450590b7ab5c01e37b3ab99fbd886086;hpb=dd6b80599116d6e61f3ea6c7a917586def15e3a3;p=libs%2Fgl.git diff --git a/source/programbuilder.h b/source/programbuilder.h index 6845f4a9..0883f6a7 100644 --- a/source/programbuilder.h +++ b/source/programbuilder.h @@ -11,9 +11,22 @@ namespace GL { class Program; +class invalid_variable_definition: public std::invalid_argument +{ +public: + invalid_variable_definition(const std::string &w): std::invalid_argument(w) { } + virtual ~invalid_variable_definition() throw() { } +}; + +/** +Generates shaders with common features. +*/ class ProgramBuilder { public: + /** + Describes the features of a standard shader program. + */ struct StandardFeatures { class Loader: public DataFile::ObjectLoader @@ -25,19 +38,21 @@ public: bool texture; bool material; bool lighting; + unsigned max_lights; + bool skylight; bool specular; bool normalmap; bool shadow; bool reflection; - bool transform; - bool colorify; bool legacy; + std::string custom; StandardFeatures(); std::string create_flags() const; }; +private: enum VariableScope { NO_SCOPE, @@ -47,8 +62,16 @@ public: FRAGMENT }; -private: - struct StandardVariable + enum InterfaceFlags + { + NO_INTERFACE = 0, + INPUT = 1, + OUTPUT = 2, + PASSTHROUGH = INPUT|OUTPUT, + GOAL = 4 + }; + + struct VariableDefinition { VariableScope scope; const char *name; @@ -60,39 +83,50 @@ private: struct ShaderVariable { std::string name; - const StandardVariable *variable; + const VariableDefinition *variable; std::string resolved_name; bool fuzzy_space; std::string resolved_space; + bool array_sum; + std::string array_subscript; + unsigned array_size; std::list referenced_vars; std::list referenced_by; bool inlined; bool inline_parens; + bool in_loop; ShaderVariable(const std::string &); - void resolve(const StandardVariable &); + void resolve(const VariableDefinition &); void resolve(ShaderVariable &); void resolve_space(const std::string &); + void resolve_array(const StandardFeatures &, unsigned = 0); void add_reference(ShaderVariable &); void update_reference(ShaderVariable &, ShaderVariable &); - void check_inline(bool); + void check_inline(bool, bool); bool is_referenced_from(VariableScope) const; - std::string get_expression() const; + InterfaceFlags get_interface_flags(VariableScope) const; + std::string create_declaration(char = 0, bool = false) const; + std::string create_replacement(VariableScope, const char * = 0) const; + std::string create_expression(const char * = 0) const; }; - enum MatchLevel + enum MatchType { NO_MATCH, EXACT, - FUZZY + FUZZY, + ARRAY }; StandardFeatures features; + std::list custom_variables; std::string feature_flags; bool optimize; - static const StandardVariable standard_variables[]; + static const VariableDefinition standard_variables[]; + static const char interfaces[]; public: ProgramBuilder(const StandardFeatures &); @@ -103,7 +137,7 @@ public: private: std::string create_source(const std::list &, VariableScope) const; bool evaluate_flags(const char *) const; - static MatchLevel name_match(const char *, const char *, const char ** = 0); + static MatchType name_match(const char *, const char *, const char ** = 0); static bool parse_identifier(const char *, unsigned &, unsigned &); static std::vector extract_identifiers(const char *); static std::string replace_identifiers(const char *, const std::map &);