Răsfoiți Sursa

Added blend mode "screen".

Alex Szpakowski 11 ani în urmă
părinte
comite
146b3cff19

+ 1 - 0
src/modules/graphics/Graphics.cpp

@@ -144,6 +144,7 @@ StringMap<Graphics::BlendMode, Graphics::BLEND_MAX_ENUM>::Entry Graphics::blendM
 	{ "subtractive", Graphics::BLEND_SUBTRACTIVE },
 	{ "subtractive", Graphics::BLEND_SUBTRACTIVE },
 	{ "multiplicative", Graphics::BLEND_MULTIPLICATIVE },
 	{ "multiplicative", Graphics::BLEND_MULTIPLICATIVE },
 	{ "premultiplied", Graphics::BLEND_PREMULTIPLIED },
 	{ "premultiplied", Graphics::BLEND_PREMULTIPLIED },
+	{ "screen", Graphics::BLEND_SCREEN },
 	{ "replace", Graphics::BLEND_REPLACE },
 	{ "replace", Graphics::BLEND_REPLACE },
 };
 };
 
 

+ 1 - 0
src/modules/graphics/Graphics.h

@@ -57,6 +57,7 @@ public:
 		BLEND_SUBTRACTIVE,
 		BLEND_SUBTRACTIVE,
 		BLEND_MULTIPLICATIVE,
 		BLEND_MULTIPLICATIVE,
 		BLEND_PREMULTIPLIED,
 		BLEND_PREMULTIPLIED,
+		BLEND_SCREEN,
 		BLEND_REPLACE,
 		BLEND_REPLACE,
 		BLEND_MAX_ENUM
 		BLEND_MAX_ENUM
 	};
 	};

+ 6 - 0
src/modules/graphics/opengl/Graphics.cpp

@@ -642,6 +642,10 @@ void Graphics::setBlendMode(Graphics::BlendMode mode)
 		state.srcRGB = state.srcA = GL_SRC_ALPHA;
 		state.srcRGB = state.srcA = GL_SRC_ALPHA;
 		state.dstRGB = state.dstA = GL_ONE;
 		state.dstRGB = state.dstA = GL_ONE;
 		break;
 		break;
+	case BLEND_SCREEN:
+		state.srcRGB = state.srcA = GL_ONE;
+		state.dstRGB = state.dstA = GL_ONE_MINUS_SRC_COLOR;
+		break;
 	case BLEND_REPLACE:
 	case BLEND_REPLACE:
 	default:
 	default:
 		state.srcRGB = state.srcA = GL_ONE;
 		state.srcRGB = state.srcA = GL_ONE;
@@ -669,6 +673,8 @@ Graphics::BlendMode Graphics::getBlendMode() const
 			return BLEND_MULTIPLICATIVE;
 			return BLEND_MULTIPLICATIVE;
 		else if (state.srcRGB == GL_ONE && state.dstRGB == GL_ONE_MINUS_SRC_ALPHA)
 		else if (state.srcRGB == GL_ONE && state.dstRGB == GL_ONE_MINUS_SRC_ALPHA)
 			return BLEND_PREMULTIPLIED;
 			return BLEND_PREMULTIPLIED;
+		else if (state.srcRGB == GL_ONE && state.dstRGB == GL_ONE_MINUS_SRC_COLOR)
+			return BLEND_SCREEN;
 		else if (state.srcRGB == GL_ONE && state.dstRGB == GL_ZERO)
 		else if (state.srcRGB == GL_ONE && state.dstRGB == GL_ZERO)
 			return BLEND_REPLACE;
 			return BLEND_REPLACE;
 	}
 	}