#pragma once #include "../../DataView.hpp" #include "../../utils.hpp" #include "../../Result.hpp" #include "CommonShader.hpp" #include "ShaderVec.hpp" #include #include #include #include #include namespace amalgine { class ShaderTooManyAttributes : public std::runtime_error { public: ShaderTooManyAttributes(i32 maxAttributes); }; class ShaderAttributeAlreadyDefined : public std::runtime_error { public: ShaderAttributeAlreadyDefined(const std::string &attributeName); }; class ShaderInvalidAttributeName : public std::runtime_error { public: ShaderInvalidAttributeName(const std::string &attributeName); }; class ShaderFunctionAlreadyDefined : public std::runtime_error { public: ShaderFunctionAlreadyDefined(const std::string &funcName); }; class Shader { DISABLE_COPY(Shader) friend class ShaderProgram; public: Shader(); const std::string& getOutputAttributeName(i32 attributeIndex); const std::string& getInputAttributeName(i32 attributeIndex) const; AttributeType getInputAttributeType(i32 attributeIndex) const; ShaderOutputVec4 defineOutputVec4(const std::string &name); ShaderGlobalVec3 defineGlobalVec3(const std::string &name); ShaderInputVec2 defineInputVec2(const std::string &name); i32 defineInputVariable(const std::string &variableName, const char *typeName); void assign(const ShaderOutputVec4 &lhsVariable, const ShaderVec4 &rhsVariable); protected: void writeHeader(const std::string &code); void writeBody(const std::string &code); std::string build() const; /* * Throws ShaderTooManyAttributes if too many attributes are defined for the platform. * Throws ShaderAttributeAlreadyDefined if a attribute with the same name has already been defined. */ i32 defineOutputVariable(const std::string &variableName, const char *typeName); protected: std::string header; std::string body; int inputLocationCounter; int outputLocationCounter; // TOOD: Verify if this is correct. This same variable is used for both output and input variables i32 maxAttribs; // Could make this static std::unordered_map inputAttributes; std::vector inputAttributeNames; std::unordered_map outputAttributes; std::vector outputAttributeNames; std::unordered_map uniforms; bool mainFuncDefined; }; }