diff --git a/Assets/FlashTools/Resources/Materials/SwfBaseCG.cginc b/Assets/FlashTools/Resources/Materials/SwfBaseCG.cginc index 7aac043..0246912 100644 --- a/Assets/FlashTools/Resources/Materials/SwfBaseCG.cginc +++ b/Assets/FlashTools/Resources/Materials/SwfBaseCG.cginc @@ -23,6 +23,14 @@ inline fixed4 swf_invert(fixed4 ca, fixed4 cb) { return r; } +inline fixed4 swf_alpha(fixed4 ca, fixed4 cb) { + return cb; +} + +inline fixed4 swf_erase(fixed4 ca, fixed4 cb) { + return cb; +} + inline fixed4 swf_overlay(fixed4 ca, fixed4 cb) { fixed4 r = ca > 0.5 ? 1.0 - 2.0 * (1.0 - ca) * (1.0 - cb) : 2.0 * ca * cb; r.a = cb.a; @@ -48,6 +56,10 @@ inline fixed4 grab_blend(sampler2D grab_tex, float4 screenpos, fixed4 c) { c = swf_difference(grab_c, c); #elif SWF_INVERT_BLEND c = swf_invert(grab_c, c); + #elif SWF_ALPHA_BLEND + c = swf_alpha(grab_c, c); + #elif SWF_ERASE_BLEND + c = swf_erase(grab_c, c); #elif SWF_OVERLAY_BLEND c = swf_overlay(grab_c, c); #elif SWF_HARDLIGHT_BLEND diff --git a/Assets/FlashTools/Resources/Materials/SwfMaskedGrabShader.shader b/Assets/FlashTools/Resources/Materials/SwfMaskedGrabShader.shader index 4713f53..d399572 100644 --- a/Assets/FlashTools/Resources/Materials/SwfMaskedGrabShader.shader +++ b/Assets/FlashTools/Resources/Materials/SwfMaskedGrabShader.shader @@ -39,7 +39,7 @@ Shader "FlashTools/SwfMaskedGrab" { sampler2D _MainTex; sampler2D _GrabTexture; - #pragma multi_compile SWF_DARKEN_BLEND SWF_DIFFERENCE_BLEND SWF_INVERT_BLEND SWF_OVERLAY_BLEND SWF_HARDLIGHT_BLEND + #pragma multi_compile SWF_DARKEN_BLEND SWF_DIFFERENCE_BLEND SWF_INVERT_BLEND SWF_ALPHA_BLEND SWF_ERASE_BLEND SWF_OVERLAY_BLEND SWF_HARDLIGHT_BLEND #include "UnityCG.cginc" #include "SwfBaseCG.cginc" diff --git a/Assets/FlashTools/Resources/Materials/SwfSimpleGrabShader.shader b/Assets/FlashTools/Resources/Materials/SwfSimpleGrabShader.shader index 859aa7a..ba66773 100644 --- a/Assets/FlashTools/Resources/Materials/SwfSimpleGrabShader.shader +++ b/Assets/FlashTools/Resources/Materials/SwfSimpleGrabShader.shader @@ -34,7 +34,7 @@ Shader "FlashTools/SwfSimpleGrab" { sampler2D _MainTex; sampler2D _GrabTexture; - #pragma multi_compile SWF_DARKEN_BLEND SWF_DIFFERENCE_BLEND SWF_INVERT_BLEND SWF_OVERLAY_BLEND SWF_HARDLIGHT_BLEND + #pragma multi_compile SWF_DARKEN_BLEND SWF_DIFFERENCE_BLEND SWF_INVERT_BLEND SWF_ALPHA_BLEND SWF_ERASE_BLEND SWF_OVERLAY_BLEND SWF_HARDLIGHT_BLEND #include "UnityCG.cginc" #include "SwfBaseCG.cginc" diff --git a/Assets/FlashTools/Scripts/Internal/Editor/Postprocessors/SwfPostprocessor.cs b/Assets/FlashTools/Scripts/Internal/Editor/Postprocessors/SwfPostprocessor.cs index a8b313c..3f0d768 100644 --- a/Assets/FlashTools/Scripts/Internal/Editor/Postprocessors/SwfPostprocessor.cs +++ b/Assets/FlashTools/Scripts/Internal/Editor/Postprocessors/SwfPostprocessor.cs @@ -97,12 +97,12 @@ namespace FlashTools.Internal { library, display_list, Matrix4x4.identity, - SwfColorModeData.identity, SwfBlendModeData.identity, SwfColorTransData.identity, 0, 0, null, + false, frame); } @@ -110,34 +110,34 @@ namespace FlashTools.Internal { SwfLibrary library, SwfDisplayList display_list, Matrix4x4 parent_matrix, - SwfColorModeData parent_color_mode, SwfBlendModeData parent_blend_mode, SwfColorTransData parent_color_transform, ushort parent_masked, ushort parent_mask, List parent_masks, + bool erasable, SwfFrameData frame) { var self_masks = new List(); foreach ( var inst in display_list.Instances.Values.Where(p => p.Visible) ) { CheckSelfMasks(self_masks, inst.Depth, frame); var child_matrix = parent_matrix * inst.Matrix .ToUMatrix(); - var child_color_mode = parent_color_mode; var child_blend_mode = parent_blend_mode * inst.BlendMode .ToBlendModeData(); var child_color_transform = parent_color_transform * inst.ColorTransform.ToColorTransData(); + var child_erasable = (erasable || inst.BlendMode.Value != SwfBlendMode.Mode.Normal); switch ( inst.Type ) { case SwfDisplayInstanceType.Shape: AddShapeInstanceToFrame( library, inst as SwfDisplayShapeInstance, child_matrix, - child_color_mode, child_blend_mode, child_color_transform, parent_masked, parent_mask, parent_masks, self_masks, + child_erasable, frame); break; case SwfDisplayInstanceType.Sprite: @@ -145,13 +145,13 @@ namespace FlashTools.Internal { library, inst as SwfDisplaySpriteInstance, child_matrix, - child_color_mode, child_blend_mode, child_color_transform, parent_masked, parent_mask, parent_masks, self_masks, + child_erasable, frame); break; default: @@ -167,13 +167,13 @@ namespace FlashTools.Internal { SwfLibrary library, SwfDisplayShapeInstance inst, Matrix4x4 inst_matrix, - SwfColorModeData inst_color_mode, SwfBlendModeData inst_blend_mode, SwfColorTransData inst_color_transform, ushort parent_masked, ushort parent_mask, List parent_masks, List self_masks, + bool erasable, SwfFrameData frame) { var shape_def = library.FindDefine(inst.Id); @@ -200,7 +200,7 @@ namespace FlashTools.Internal { ClipDepth = (ushort)frame_inst_clip_depth, Bitmap = bitmap_id, Matrix = SwfMatrixData.FromUMatrix(inst_matrix * bitmap_matrix.ToUMatrix()), - ColorMode = inst_color_mode, + ColorMode = SwfColorModeData.identity, BlendMode = inst_blend_mode, ColorTrans = inst_color_transform}); if ( parent_mask > 0 ) { @@ -217,13 +217,13 @@ namespace FlashTools.Internal { SwfLibrary library, SwfDisplaySpriteInstance inst, Matrix4x4 inst_matrix, - SwfColorModeData inst_color_mode, SwfBlendModeData inst_blend_mode, SwfColorTransData inst_color_transform, ushort parent_masked, ushort parent_mask, List parent_masks, List self_masks, + bool erasable, SwfFrameData frame) { var sprite_def = library.FindDefine(inst.Id); @@ -232,7 +232,6 @@ namespace FlashTools.Internal { library, inst.DisplayList, inst_matrix, - inst_color_mode, inst_blend_mode, inst_color_transform, (ushort)(parent_masked + self_masks.Count), @@ -246,6 +245,7 @@ namespace FlashTools.Internal { : (inst.ClipDepth > 0 ? self_masks : null), + erasable, frame); } } diff --git a/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfTypes/SwfBlendMode.cs b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfTypes/SwfBlendMode.cs index c140e08..b0be4e4 100644 --- a/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfTypes/SwfBlendMode.cs +++ b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfTypes/SwfBlendMode.cs @@ -61,8 +61,10 @@ namespace FlashTools.Internal.SwfTools.SwfTypes { return new SwfBlendModeData(SwfBlendModeData.Types.Subtract); case Mode.Invert: return new SwfBlendModeData(SwfBlendModeData.Types.Invert); - case Mode.Overlay: - return new SwfBlendModeData(SwfBlendModeData.Types.Overlay); + case Mode.Alpha: + return new SwfBlendModeData(SwfBlendModeData.Types.Alpha); + case Mode.Erase: + return new SwfBlendModeData(SwfBlendModeData.Types.Erase); case Mode.Hardlight: return new SwfBlendModeData(SwfBlendModeData.Types.Hardlight); default: diff --git a/Assets/FlashTools/Scripts/Internal/SwfSettings.cs b/Assets/FlashTools/Scripts/Internal/SwfSettings.cs index f30d33a..bd2ee69 100644 --- a/Assets/FlashTools/Scripts/Internal/SwfSettings.cs +++ b/Assets/FlashTools/Scripts/Internal/SwfSettings.cs @@ -172,6 +172,8 @@ namespace FlashTools.Internal { case SwfBlendModeData.Types.Darken: case SwfBlendModeData.Types.Difference: case SwfBlendModeData.Types.Invert: + case SwfBlendModeData.Types.Alpha: + case SwfBlendModeData.Types.Erase: case SwfBlendModeData.Types.Overlay: case SwfBlendModeData.Types.Hardlight: return CheckAndGetShader(masked ? MaskedGrabShader : SimpleGrabShader); @@ -268,6 +270,18 @@ namespace FlashTools.Internal { material.SetInt("_DstBlend", (int)BlendMode.OneMinusSrcAlpha); material.EnableKeyword("SWF_INVERT_BLEND"); break; + case SwfBlendModeData.Types.Alpha: + material.SetInt("_BlendOp" , (int)BlendOp.Add); + material.SetInt("_SrcBlend", (int)BlendMode.One); + material.SetInt("_DstBlend", (int)BlendMode.OneMinusSrcAlpha); + material.EnableKeyword("SWF_ALPHA_BLEND"); + break; + case SwfBlendModeData.Types.Erase: + material.SetInt("_BlendOp" , (int)BlendOp.Add); + material.SetInt("_SrcBlend", (int)BlendMode.One); + material.SetInt("_DstBlend", (int)BlendMode.OneMinusSrcAlpha); + material.EnableKeyword("SWF_ERASE_BLEND"); + break; case SwfBlendModeData.Types.Overlay: material.SetInt("_BlendOp" , (int)BlendOp.Add); material.SetInt("_SrcBlend", (int)BlendMode.One); diff --git a/Assets/FlashTools/Scripts/SwfAsset.cs b/Assets/FlashTools/Scripts/SwfAsset.cs index ad34833..077f0da 100644 --- a/Assets/FlashTools/Scripts/SwfAsset.cs +++ b/Assets/FlashTools/Scripts/SwfAsset.cs @@ -138,6 +138,8 @@ namespace FlashTools { Add, Subtract, Invert, // GrabPass + Alpha, // GrabPass + Erase, // GrabPass Overlay, // GrabPass Hardlight // GrabPass } @@ -157,6 +159,9 @@ namespace FlashTools { public static SwfBlendModeData operator*( SwfBlendModeData a, SwfBlendModeData b) { + if ( b.type == Types.Alpha || b.type == Types.Erase ) { + return b; + } return (a.type == Types.Normal || a.type == Types.Layer) ? b : a; } }