summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/Gal.hpp7
-rw-r--r--src/GalOgl.cpp21
-rw-r--r--src/Rml.cpp2
3 files changed, 29 insertions, 1 deletions
diff --git a/src/Gal.hpp b/src/Gal.hpp
index 76db560..fe99dc7 100644
--- a/src/Gal.hpp
+++ b/src/Gal.hpp
@@ -86,6 +86,11 @@ namespace Gal {
TriangleFan,
};
+ enum class Blending {
+ Opaque,
+ Additive,
+ };
+
struct VertexAttribute {
std::string name;
Type type;
@@ -186,6 +191,8 @@ namespace Gal {
virtual void SetPrimitive(Primitive primitive) = 0;
+ virtual void SetBlending(Blending blendingMode) = 0;
+
virtual std::shared_ptr<BufferBinding> BindVertexBuffer(std::vector<VertexAttribute> &&bufferLayout) = 0;
virtual std::shared_ptr<BufferBinding> BindIndexBuffer() = 0;
diff --git a/src/GalOgl.cpp b/src/GalOgl.cpp
index c7344fe..4ac6c84 100644
--- a/src/GalOgl.cpp
+++ b/src/GalOgl.cpp
@@ -89,6 +89,7 @@ class OglState {
GLuint activeTextureUnit = 0;
GLint vpX = 0, vpY = 0;
GLsizei vpW = 0, vpH = 0;
+ bool blending = false;
public:
@@ -162,6 +163,16 @@ public:
glCheckError();
}
+ void EnableBlending(bool enable) {
+ if (enable != blending) {
+ blending = enable;
+ if (blending)
+ glEnable(GL_BLEND);
+ else
+ glDisable(GL_BLEND);
+ }
+ }
+
} oglState;
std::unique_ptr<ImplOgl> impl;
@@ -791,6 +802,7 @@ struct PipelineConfigOgl : public PipelineConfig {
std::shared_ptr<FramebufferOgl> targetFb;
std::vector<std::vector<VertexAttribute>> vertexBuffers;
Primitive vertexPrimitive = Primitive::Triangle;
+ Blending blending = Blending::Opaque;
virtual void SetVertexShader(std::shared_ptr<Shader> shader) override {
vertexShader = std::static_pointer_cast<ShaderOgl,Shader>(shader);
@@ -818,6 +830,10 @@ struct PipelineConfigOgl : public PipelineConfig {
vertexPrimitive = primitive;
}
+ virtual void SetBlending(Blending blendingMode) override {
+ blending = blendingMode;
+ }
+
virtual std::shared_ptr<BufferBinding> BindVertexBuffer(std::vector<VertexAttribute> &&bufferLayout) override {
auto binding = std::make_shared<BufferBindingOgl>(vertexBuffers.size());
vertexBuffers.push_back(bufferLayout);
@@ -901,12 +917,14 @@ struct PipelineOgl : public Pipeline {
};
std::vector<VertexBindingCommand> vertexBindCmds;
Primitive primitive;
+ Blending blending;
std::shared_ptr<FramebufferOgl> target;
virtual void Activate() override {
oglState.UseProgram(program);
oglState.BindFbo(target->fbo);
oglState.SetViewport(target->vpX, target->vpY, target->vpW, target->vpH);
+ oglState.EnableBlending(blending == Blending::Additive);
if (target->fbo)
glDrawBuffers(target->attachments.size(), target->attachments.data());
@@ -1076,7 +1094,7 @@ struct ImplOgl : public Impl {
glCullFace(GL_BACK);
glFrontFace(GL_CCW);
- glEnable(GL_BLEND);
+ oglState.EnableBlending(true);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glCheckError();
if (glActiveTexture == nullptr) {
@@ -1201,6 +1219,7 @@ struct ImplOgl : public Impl {
auto config = std::static_pointer_cast<PipelineConfigOgl, PipelineConfig>(pipelineConfig);
pipeline->primitive = config->vertexPrimitive;
+ pipeline->blending = config->blending;
pipeline->target = config->targetFb;
if (!pipeline->target)
diff --git a/src/Rml.cpp b/src/Rml.cpp
index 746f6a4..f6fff44 100644
--- a/src/Rml.cpp
+++ b/src/Rml.cpp
@@ -68,6 +68,7 @@ RmlRenderInterface::RmlRenderInterface() {
pipelineConfig->SetTarget(gal->GetDefaultFramebuffer());
pipelineConfig->SetVertexShader(gal->LoadVertexShader(vertexSource));
pipelineConfig->SetPixelShader(gal->LoadPixelShader(pixelSource));
+ pipelineConfig->SetBlending(Gal::Blending::Additive);
auto vertBuffBind = pipelineConfig->BindVertexBuffer({
{"pos", Gal::Type::Vec2},
@@ -92,6 +93,7 @@ RmlRenderInterface::RmlRenderInterface() {
texPipelineConfig->SetTarget(gal->GetDefaultFramebuffer());
texPipelineConfig->SetVertexShader(gal->LoadVertexShader(vertexSource));
texPipelineConfig->SetPixelShader(gal->LoadPixelShader(texPixelSource));
+ texPipelineConfig->SetBlending(Gal::Blending::Additive);
auto texVertBuffBind = texPipelineConfig->BindVertexBuffer({
{"pos", Gal::Type::Vec2},