aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2017-12-21 22:52:12 +0100
committerdec05eba <dec05eba@protonmail.com>2021-11-18 15:21:48 +0100
commitbfd21732b35a3856b1f72c826816c2857710fcb3 (patch)
tree4a3f19551c744db3e339a64ac1afa2ebe1ec015f /include
parentca92d8c90f7103db6d7cae4cef49b278d804b474 (diff)
Added shader program
Diffstat (limited to 'include')
-rw-r--r--include/RenderBackend/OpenGL/PixelShader.hpp14
-rw-r--r--include/RenderBackend/OpenGL/ShaderProgram.hpp34
-rw-r--r--include/RenderBackend/OpenGL/ShaderVec.hpp8
-rw-r--r--include/RenderBackend/OpenGL/VertexShader.hpp2
-rw-r--r--include/Result.hpp48
5 files changed, 88 insertions, 18 deletions
diff --git a/include/RenderBackend/OpenGL/PixelShader.hpp b/include/RenderBackend/OpenGL/PixelShader.hpp
index 3d33155..b869a8f 100644
--- a/include/RenderBackend/OpenGL/PixelShader.hpp
+++ b/include/RenderBackend/OpenGL/PixelShader.hpp
@@ -45,27 +45,15 @@ namespace amalgine
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();
+ std::string build() const;
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;
};
}
diff --git a/include/RenderBackend/OpenGL/ShaderProgram.hpp b/include/RenderBackend/OpenGL/ShaderProgram.hpp
new file mode 100644
index 0000000..efeae5b
--- /dev/null
+++ b/include/RenderBackend/OpenGL/ShaderProgram.hpp
@@ -0,0 +1,34 @@
+#pragma once
+
+#include "VertexShader.hpp"
+#include "PixelShader.hpp"
+#include "../../Result.hpp"
+#include "../../types.hpp"
+#include <vector>
+
+namespace amalgine
+{
+ class ShaderProgram
+ {
+ public:
+ ShaderProgram();
+
+ const std::string& getOutputAttributeName(i32 attributeIndex);
+ ShaderOutputVec4 defineOutputVec4(const std::string &name);
+ //Result<std::string> addVertexShader(const VertexShader &vertexShader);
+ //Result<std::string> addPixelShader(const PixelShader &pixelShader);
+ //void build();
+ private:
+ /*
+ * 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:
+ int locationCounter;
+ i32 maxPixelAttribs; // Could make this static
+ std::unordered_map<std::string, i32> pixelAttributes;
+ std::vector<std::string> pixelAttributeNames;
+ std::vector<u32> shaderIds;
+ };
+}
diff --git a/include/RenderBackend/OpenGL/ShaderVec.hpp b/include/RenderBackend/OpenGL/ShaderVec.hpp
index 10e628c..0c0a88a 100644
--- a/include/RenderBackend/OpenGL/ShaderVec.hpp
+++ b/include/RenderBackend/OpenGL/ShaderVec.hpp
@@ -6,7 +6,7 @@
namespace amalgine
{
class VertexShader;
- class PixelShader;
+ class ShaderProgram;
class ShaderInputVec2
{
@@ -62,20 +62,20 @@ namespace amalgine
class ShaderOutputVec4
{
- friend class PixelShader;
+ friend class ShaderProgram;
public:
const std::string& getName() const;
void operator=(const ShaderVec4 &shaderVec4);
private:
- ShaderOutputVec4(PixelShader *_pixelShader, i32 _attributeIndex) :
+ ShaderOutputVec4(ShaderProgram *_pixelShader, i32 _attributeIndex) :
pixelShader(_pixelShader),
attributeIndex(_attributeIndex)
{
}
private:
- PixelShader *pixelShader;
+ ShaderProgram *shaderProgram;
i32 attributeIndex;
};
}
diff --git a/include/RenderBackend/OpenGL/VertexShader.hpp b/include/RenderBackend/OpenGL/VertexShader.hpp
index ec8be22..3239be2 100644
--- a/include/RenderBackend/OpenGL/VertexShader.hpp
+++ b/include/RenderBackend/OpenGL/VertexShader.hpp
@@ -48,7 +48,7 @@ namespace amalgine
const std::string& getInputAttributeName(i32 attributeIndex);
ShaderInputVec2 defineInputVec2(const std::string &name);
void defineMain(VertexShaderMainFunc mainFunc);
- std::string build();
+ std::string build() const;
private:
void writeHeader(const std::string &code);
void writeBody(const std::string &code);
diff --git a/include/Result.hpp b/include/Result.hpp
new file mode 100644
index 0000000..316e45a
--- /dev/null
+++ b/include/Result.hpp
@@ -0,0 +1,48 @@
+#pragma once
+
+#include <string>
+
+namespace amalgine
+{
+ template <typename T>
+ class Result
+ {
+ public:
+ static Result<T> Ok(const T &data)
+ {
+ Result<T> result;
+ result.data = data;
+ result.errorCode = 0;
+ return result;
+ }
+
+ static Result<T> Err(const std::string &errorMsg, int errorCode = -1)
+ {
+ Result<T> result;
+ result.errorMsg = errorMsg;
+ result.errorCode = errorCode;
+ return result;
+ }
+
+ template <typename OtherType>
+ static Result<T> Err(const Result<OtherType> &otherResult)
+ {
+ Result<T> result;
+ result.errorMsg = otherResult.errorMsg;
+ result.errorCode = otherResult.errorCode;
+ return result;
+ }
+
+ bool isOk() const { return errorCode == 0; }
+ bool isErr() const { return !isOk(); }
+ operator bool() const { return isOk(); }
+
+ const std::string& getErrorMsg() const { return errorMsg; }
+ private:
+ Result(){}
+ private:
+ T data;
+ int errorCode;
+ std::string errorMsg;
+ };
+}