aboutsummaryrefslogtreecommitdiff
path: root/include/RenderBackend/OpenGL/Shader.hpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2019-10-27 01:30:34 +0200
committerdec05eba <dec05eba@protonmail.com>2021-11-18 15:21:48 +0100
commitfbd2e5d9a802db4fb5e056705ec599ac423e09be (patch)
treeebe71975909a0767b5de045c28fc28d09292bca3 /include/RenderBackend/OpenGL/Shader.hpp
parent24934c7823457767855bd0abb249a55b8a8c077d (diff)
Create Shader class as a base for vertex and pixel shader
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;
+ };
+}