aboutsummaryrefslogtreecommitdiff
path: root/include/RenderBackend/OpenGL/PixelShader.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/RenderBackend/OpenGL/PixelShader.hpp')
-rw-r--r--include/RenderBackend/OpenGL/PixelShader.hpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/include/RenderBackend/OpenGL/PixelShader.hpp b/include/RenderBackend/OpenGL/PixelShader.hpp
new file mode 100644
index 0000000..3d33155
--- /dev/null
+++ b/include/RenderBackend/OpenGL/PixelShader.hpp
@@ -0,0 +1,71 @@
+#pragma once
+
+#include "../../DataView.hpp"
+#include "ShaderVec.hpp"
+#include <string>
+#include <unordered_map>
+#include <vector>
+#include <stdexcept>
+#include <functional>
+
+namespace amalgine
+{
+ class PixelShaderTooManyAttributes : public std::runtime_error
+ {
+ public:
+ PixelShaderTooManyAttributes(i32 maxPixelAttributes);
+ };
+
+ class PixelShaderAttributeAlreadyDefined : public std::runtime_error
+ {
+ public:
+ PixelShaderAttributeAlreadyDefined(const std::string &attributeName);
+ };
+
+ class PixelShaderInvalidAttributeName : public std::runtime_error
+ {
+ public:
+ PixelShaderInvalidAttributeName(const std::string &attributeName);
+ };
+
+ class PixelShaderFunctionAlreadyDefined : public std::runtime_error
+ {
+ public:
+ PixelShaderFunctionAlreadyDefined(const std::string &funcName);
+ };
+
+ using PixelShaderMainFunc = std::function<void()>;
+
+ /*
+ * Using the same PixelShader instance in multiple threads to define data is not thread safe.
+ * All get*** functions are thread safe.
+ */
+ class PixelShader
+ {
+ public:
+ PixelShader();
+
+ const std::string& getOutputAttributeName(i32 attributeIndex);
+ ShaderOutputVec4 defineOutputVec4(const std::string &name);
+ void defineMain(PixelShaderMainFunc mainFunc);
+ void assign(const ShaderOutputVec4 &lhsVariable, const ShaderVec4 &rhsVariable);
+ std::string build();
+ private:
+ void writeHeader(const std::string &code);
+ void writeBody(const std::string &code);
+
+ /*
+ * Throws PixelShaderTooManyAttributes if too many pixel attributes are defined for the platform.
+ * Throws PixelShaderAttributeAlreadyDefined if a pixel attribute with the same name has already been defined.
+ */
+ i32 defineOutputVariable(const std::string &variableName, const char *typeName);
+ private:
+ std::string header;
+ std::string body;
+ int locationCounter;
+ i32 maxPixelAttribs; // Could make this static
+ std::unordered_map<std::string, i32> pixelAttributes;
+ std::vector<std::string> pixelAttributeNames;
+ bool mainFuncDefined;
+ };
+}