aboutsummaryrefslogtreecommitdiff
path: root/include/RenderBackend/OpenGL/Shader.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/RenderBackend/OpenGL/Shader.hpp')
-rw-r--r--include/RenderBackend/OpenGL/Shader.hpp79
1 files changed, 79 insertions, 0 deletions
diff --git a/include/RenderBackend/OpenGL/Shader.hpp b/include/RenderBackend/OpenGL/Shader.hpp
new file mode 100644
index 0000000..7aecc4e
--- /dev/null
+++ b/include/RenderBackend/OpenGL/Shader.hpp
@@ -0,0 +1,79 @@
+#pragma once
+
+#include "../../DataView.hpp"
+#include "../../utils.hpp"
+#include "../../Result.hpp"
+#include "CommonShader.hpp"
+#include "ShaderVec.hpp"
+#include <string>
+#include <unordered_map>
+#include <vector>
+#include <stdexcept>
+#include <functional>
+
+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<std::string, i32> inputAttributes;
+ std::vector<ShaderAttribute> inputAttributeNames;
+ std::unordered_map<std::string, i32> outputAttributes;
+ std::vector<ShaderAttribute> outputAttributeNames;
+ std::unordered_map<std::string, ShaderGlobalVec> uniforms;
+ bool mainFuncDefined;
+ };
+}