From 5a482e2b987d41c7dff782917c0168e4b421b79d Mon Sep 17 00:00:00 2001 From: pspeed42 Date: Wed, 10 Sep 2014 14:00:27 -0400 Subject: [PATCH] Added another Photoshop tyle blend mode: Exclusion Performs a sort of color XOR with source and destination. Very useful for UI highlighting but is a bizarre (and potentially useful) effect in 3D. --- .../com/jme3/renderer/android/OGLESShaderRenderer.java | 3 +++ .../src/main/java/com/jme3/material/RenderState.java | 10 +++++++++- .../main/java/com/jme3/renderer/jogl/JoglRenderer.java | 3 +++ .../java/com/jme3/renderer/lwjgl/LwjglRenderer.java | 3 +++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/jme3-android/src/main/java/com/jme3/renderer/android/OGLESShaderRenderer.java b/jme3-android/src/main/java/com/jme3/renderer/android/OGLESShaderRenderer.java index 5b3e829c1..4c22c2520 100644 --- a/jme3-android/src/main/java/com/jme3/renderer/android/OGLESShaderRenderer.java +++ b/jme3-android/src/main/java/com/jme3/renderer/android/OGLESShaderRenderer.java @@ -559,6 +559,9 @@ public class OGLESShaderRenderer implements Renderer { case Screen: GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_COLOR); break; + case Exclusion: + GLES20.glBlendFunc(GLES20.GL_ONE_MINUS_DST_COLOR, GLES20.GL_ONE_MINUS_SRC_COLOR); + break; default: throw new UnsupportedOperationException("Unrecognized blend mode: " + state.getBlendMode()); diff --git a/jme3-core/src/main/java/com/jme3/material/RenderState.java b/jme3-core/src/main/java/com/jme3/material/RenderState.java index 2cea1c8e6..9359ce7f4 100644 --- a/jme3-core/src/main/java/com/jme3/material/RenderState.java +++ b/jme3-core/src/main/java/com/jme3/material/RenderState.java @@ -183,7 +183,15 @@ public class RenderState implements Cloneable, Savable { *

* Result = 1 - (1 - Source Color) * (1 - Dest Color) -> (GL_ONE, GL_ONE_MINUS_SRC_COLOR) */ - Screen + Screen, + /** + * Mixes the destination and source colors similar to a color-based XOR + * operation. This is directly equivalent to Photoshop's "Exclusion" blend. + *

+ * Result = (Source Color * (1 - Dest Color)) + (Dest Color * (1 - Source Color)) + * -> (GL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_SRC_COLOR) + */ + Exclusion } /** diff --git a/jme3-jogl/src/main/java/com/jme3/renderer/jogl/JoglRenderer.java b/jme3-jogl/src/main/java/com/jme3/renderer/jogl/JoglRenderer.java index 1df80f66a..78c090e05 100644 --- a/jme3-jogl/src/main/java/com/jme3/renderer/jogl/JoglRenderer.java +++ b/jme3-jogl/src/main/java/com/jme3/renderer/jogl/JoglRenderer.java @@ -701,6 +701,9 @@ public class JoglRenderer implements Renderer { case Screen: gl.glBlendFunc(GL.GL_ONE, GL.GL_ONE_MINUS_SRC_COLOR); break; + case Exclusion: + gl.glBlendFunc(GL.GL_ONE_MINUS_DST_COLOR, GL.GL_ONE_MINUS_SRC_COLOR); + break; default: throw new UnsupportedOperationException("Unrecognized blend mode: " + state.getBlendMode()); diff --git a/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/LwjglRenderer.java b/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/LwjglRenderer.java index c30c706f4..fdc908347 100644 --- a/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/LwjglRenderer.java +++ b/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/LwjglRenderer.java @@ -650,6 +650,9 @@ public class LwjglRenderer implements Renderer { case Screen: glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR); break; + case Exclusion: + glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_SRC_COLOR); + break; default: throw new UnsupportedOperationException("Unrecognized blend mode: " + state.getBlendMode());