diff --git a/source/inochi2d/core/nodes/part/package.d b/source/inochi2d/core/nodes/part/package.d index 0a69fd2..bb7f5c8 100644 --- a/source/inochi2d/core/nodes/part/package.d +++ b/source/inochi2d/core/nodes/part/package.d @@ -124,6 +124,19 @@ enum MaskingMode { DodgeMask } +/** + Blending modes + + TODO: Implement advanced blending system +*/ +enum BlendMode { + // Normal blending mode + Normal, + + // Multiply blending mode + Multiply +} + /** Dynamic Mesh Part */ @@ -160,10 +173,22 @@ private: partMaskShader.setUniform(mmvp, inGetCamera().matrix * transform.matrix()); partMaskShader.setUniform(mthreshold, maskAlphaThreshold); partMaskShader.setUniform(mgopacity, opacity); + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); } else { partShader.use(); partShader.setUniform(mvp, inGetCamera().matrix * transform.matrix()); partShader.setUniform(gopacity, opacity); + + // COMPAT MODE + switch(blendingMode) { + case BlendMode.Normal: + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); break; + case BlendMode.Multiply: + glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA); break; + default: assert(0); + } + + // TODO: EXT MODE } // Bind the texture @@ -233,6 +258,9 @@ protected: serializer.arrayEnd(state); } + serializer.putKey("blend_mode"); + serializer.serializeValue(blendingMode); + if (mask.length > 0) { serializer.putKey("mask_mode"); @@ -280,6 +308,9 @@ protected: serializer.arrayEnd(state); } + serializer.putKey("blend_mode"); + serializer.serializeValue(blendingMode); + serializer.putKey("mask_mode"); serializer.serializeValue(maskingMode); @@ -329,6 +360,9 @@ protected: data["opacity"].deserializeValue(this.opacity); data["mask_threshold"].deserializeValue(this.maskAlphaThreshold); + // Older models may not have blend mode + if (!data["blend_mode"].isEmpty) data["blend_mode"].deserializeValue(this.blendingMode); + if (!data["masked_by"].isEmpty) { data["mask_mode"].deserializeValue(this.maskingMode); @@ -362,6 +396,11 @@ public: Masking mode */ MaskingMode maskingMode = MaskingMode.Mask; + + /** + Blending mode + */ + BlendMode blendingMode = BlendMode.Normal; /** Alpha Threshold for the masking system, the higher the more opaque pixels will be discarded in the masking process diff --git a/source/inochi2d/core/package.d b/source/inochi2d/core/package.d index 366fb53..67a9c6f 100644 --- a/source/inochi2d/core/package.d +++ b/source/inochi2d/core/package.d @@ -114,7 +114,7 @@ void inBeginScene() { // Everything else is the actual texture used by the meshes at id 0 glActiveTexture(GL_TEXTURE0); - glBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); } /** @@ -155,7 +155,7 @@ void inDrawScene(vec4 area) { glDisable(GL_CULL_FACE); glDisable(GL_DEPTH_TEST); glEnable(GL_BLEND); - glBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); sceneShader.use(); sceneShader.setUniform(sceneMVP,