summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorcedemax <[email protected]>2020-09-01 21:33:49 +0300
committerGitHub <[email protected]>2020-09-01 20:33:49 +0200
commitbfafb80cdeed9703a2e13479a39a42ba7efb1328 (patch)
treea3f6542d48daa46d0f0c83ff76e86128a5d2e772
parentdcbe481a2845dc33d2e716703a9d8344fea3c28d (diff)
downloadraylib-bfafb80cdeed9703a2e13479a39a42ba7efb1328.tar.gz
raylib-bfafb80cdeed9703a2e13479a39a42ba7efb1328.zip
Multiple blendmodes (#1324)
Co-authored-by: max <[email protected]>
-rw-r--r--src/raylib.h5
-rw-r--r--src/rlgl.h39
2 files changed, 31 insertions, 13 deletions
diff --git a/src/raylib.h b/src/raylib.h
index c5c278e9..83b71d11 100644
--- a/src/raylib.h
+++ b/src/raylib.h
@@ -808,7 +808,8 @@ typedef enum {
BLEND_ALPHA = 0, // Blend textures considering alpha (default)
BLEND_ADDITIVE, // Blend textures adding colors
BLEND_MULTIPLIED, // Blend textures multiplying colors
- BLEND_ADD_COLORS // Blend textures adding colors (alternative)
+ BLEND_ADD_COLORS, // Blend textures adding colors (alternative)
+ BLEND_SUBTRACT_COLORS // Blend textures subtracting colors (alternative)
} BlendMode;
// Gestures type
@@ -1390,8 +1391,10 @@ RLAPI Texture2D GenTextureBRDF(Shader shader, int size); // Gen
RLAPI void BeginShaderMode(Shader shader); // Begin custom shader drawing
RLAPI void EndShaderMode(void); // End custom shader drawing (use default shader)
RLAPI void BeginBlendMode(int mode); // Begin blending mode (alpha, additive, multiplied)
+RLAPI void BeginBlendModeEx(int sFactor, int dFactor, int equation); // Begin blending mode (full options)
RLAPI void EndBlendMode(void); // End blending mode (reset to default: alpha blending)
+
// VR control functions
RLAPI void InitVrSimulator(void); // Init VR simulator for selected device parameters
RLAPI void CloseVrSimulator(void); // Close VR simulator for current device
diff --git a/src/rlgl.h b/src/rlgl.h
index 3837dfc5..9c3e6dd0 100644
--- a/src/rlgl.h
+++ b/src/rlgl.h
@@ -589,6 +589,7 @@ RLAPI Texture2D GenTextureBRDF(Shader shader, int size); // Gen
RLAPI void BeginShaderMode(Shader shader); // Begin custom shader drawing
RLAPI void EndShaderMode(void); // End custom shader drawing (use default shader)
RLAPI void BeginBlendMode(int mode); // Begin blending mode (alpha, additive, multiplied)
+RLAPI void BeginBlendModeEx(int sFactor, int dFactor, int equation); // Begin blending mode (full options)
RLAPI void EndBlendMode(void); // End blending mode (reset to default: alpha blending)
// VR control functions
@@ -3608,26 +3609,40 @@ Texture2D GenTextureBRDF(Shader shader, int size)
return brdf;
}
+
+void BeginBlendModeEx(int sFactor, int dFactor, int equation)
+{
+ static int glSFactor = 0; // Track current blending mode
+ static int glDFactor = 0; // Track current blending mode
+ static int glEquation = 0; // Track current blending mode
+
+ if (glSFactor != sFactor || glDFactor != dFactor || glEquation != equation) {
+
+ rlglDraw();
+ glBlendFunc(sFactor, dFactor);
+ glBlendEquation(equation);
+
+ glSFactor = sFactor;
+ glDFactor = dFactor;
+ glEquation = equation;
+ }
+}
+
// Begin blending mode (alpha, additive, multiplied)
// NOTE: Only 3 blending modes supported, default blend mode is alpha
void BeginBlendMode(int mode)
{
- static int blendMode = 0; // Track current blending mode
-
- if ((blendMode != mode) && (mode < 4))
+ if (mode < 5)
{
- rlglDraw();
-
switch (mode)
{
- case BLEND_ALPHA: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); break;
- case BLEND_ADDITIVE: glBlendFunc(GL_SRC_ALPHA, GL_ONE); break;
- case BLEND_MULTIPLIED: glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA); break;
- case BLEND_ADD_COLORS: glBlendFunc(GL_ONE, GL_ONE); break;
- default: break;
+ case BLEND_ALPHA: BeginBlendModeEx(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_FUNC_ADD); break;
+ case BLEND_ADDITIVE: BeginBlendModeEx(GL_SRC_ALPHA, GL_ONE, GL_FUNC_ADD); break;
+ case BLEND_MULTIPLIED: BeginBlendModeEx(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA, GL_FUNC_ADD); break;
+ case BLEND_ADD_COLORS: BeginBlendModeEx(GL_ONE, GL_ONE, GL_FUNC_ADD); break;
+ case BLEND_SUBTRACT_COLORS: BeginBlendModeEx(GL_ONE, GL_ONE, GL_FUNC_SUBTRACT); break;
+ default: break;
}
-
- blendMode = mode;
}
}