diff options
| author | cedemax <[email protected]> | 2020-09-01 21:33:49 +0300 |
|---|---|---|
| committer | GitHub <[email protected]> | 2020-09-01 20:33:49 +0200 |
| commit | bfafb80cdeed9703a2e13479a39a42ba7efb1328 (patch) | |
| tree | a3f6542d48daa46d0f0c83ff76e86128a5d2e772 | |
| parent | dcbe481a2845dc33d2e716703a9d8344fea3c28d (diff) | |
| download | raylib-bfafb80cdeed9703a2e13479a39a42ba7efb1328.tar.gz raylib-bfafb80cdeed9703a2e13479a39a42ba7efb1328.zip | |
Multiple blendmodes (#1324)
Co-authored-by: max <[email protected]>
| -rw-r--r-- | src/raylib.h | 5 | ||||
| -rw-r--r-- | src/rlgl.h | 39 |
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 @@ -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; } } |
