From 2d2cbdf5258e737a3b192afe6bad39900a6789a3 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Wed, 28 Sep 2016 02:50:14 +0700 Subject: [PATCH] custom color mask for shaders --- .../FlashTools/Examples/Scenes/Scene00.unity | 2 +- .../Materials/SwfMaskedGrabShader.shader | 14 ++-- .../Materials/SwfMaskedShader.shader | 14 ++-- .../Materials/SwfSimpleGrabShader.shader | 14 ++-- .../Materials/SwfSimpleShader.shader | 14 ++-- .../Postprocessors/SwfAssetPostprocessor.cs | 25 ++++--- .../Editor/Postprocessors/SwfPostprocessor.cs | 2 + .../Editor/SwfTools/SwfTypes/SwfBlendMode.cs | 10 +-- .../Scripts/Internal/SwfSettings.cs | 70 ++++++++++++------- Assets/FlashTools/Scripts/SwfAsset.cs | 17 +++-- 10 files changed, 112 insertions(+), 70 deletions(-) diff --git a/Assets/FlashTools/Examples/Scenes/Scene00.unity b/Assets/FlashTools/Examples/Scenes/Scene00.unity index 9f769d3..4cd75b3 100644 --- a/Assets/FlashTools/Examples/Scenes/Scene00.unity +++ b/Assets/FlashTools/Examples/Scenes/Scene00.unity @@ -145,7 +145,7 @@ Camera: far clip plane: 1000 field of view: 60 orthographic: 1 - orthographic size: 1.03 + orthographic size: 1.3 m_Depth: 0 m_CullingMask: serializedVersion: 2 diff --git a/Assets/FlashTools/Resources/Materials/SwfMaskedGrabShader.shader b/Assets/FlashTools/Resources/Materials/SwfMaskedGrabShader.shader index e4dae1e..03d133f 100644 --- a/Assets/FlashTools/Resources/Materials/SwfMaskedGrabShader.shader +++ b/Assets/FlashTools/Resources/Materials/SwfMaskedGrabShader.shader @@ -4,9 +4,10 @@ Shader "FlashTools/SwfGrabMasked" { [PerRendererData] _Tint ("Tint" , Color) = (1,1,1,1) _StencilID ("Stencil ID", Int) = 0 - [Enum(UnityEngine.Rendering.BlendOp )] _BlendOp ("BlendOp" , Int) = 0 - [Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("SrcBlend", Int) = 1 - [Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("DstBlend", Int) = 10 + [Enum(UnityEngine.Rendering.BlendOp )] _BlendOp ("BlendOp" , Int) = 0 + [Enum(UnityEngine.Rendering.BlendMode )] _SrcBlend ("SrcBlend" , Int) = 1 + [Enum(UnityEngine.Rendering.BlendMode )] _DstBlend ("DstBlend" , Int) = 10 + [Enum(UnityEngine.Rendering.ColorWriteMask)] _ColorMask ("ColorMask", Int) = 15 } SubShader { @@ -18,9 +19,10 @@ Shader "FlashTools/SwfGrabMasked" { "CanUseSpriteAtlas" = "True" } - Cull Off - Lighting Off - ZWrite Off + Cull Off + Lighting Off + ZWrite Off + ColorMask [_ColorMask] BlendOp [_BlendOp] Blend [_SrcBlend] [_DstBlend] diff --git a/Assets/FlashTools/Resources/Materials/SwfMaskedShader.shader b/Assets/FlashTools/Resources/Materials/SwfMaskedShader.shader index e2aa592..534362e 100644 --- a/Assets/FlashTools/Resources/Materials/SwfMaskedShader.shader +++ b/Assets/FlashTools/Resources/Materials/SwfMaskedShader.shader @@ -4,9 +4,10 @@ Shader "FlashTools/SwfMasked" { [PerRendererData] _Tint ("Tint" , Color) = (1,1,1,1) _StencilID ("Stencil ID", Int) = 0 - [Enum(UnityEngine.Rendering.BlendOp )] _BlendOp ("BlendOp" , Int) = 0 - [Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("SrcBlend", Int) = 1 - [Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("DstBlend", Int) = 10 + [Enum(UnityEngine.Rendering.BlendOp )] _BlendOp ("BlendOp" , Int) = 0 + [Enum(UnityEngine.Rendering.BlendMode )] _SrcBlend ("SrcBlend" , Int) = 1 + [Enum(UnityEngine.Rendering.BlendMode )] _DstBlend ("DstBlend" , Int) = 10 + [Enum(UnityEngine.Rendering.ColorWriteMask)] _ColorMask ("ColorMask", Int) = 15 } SubShader { @@ -18,9 +19,10 @@ Shader "FlashTools/SwfMasked" { "CanUseSpriteAtlas" = "True" } - Cull Off - Lighting Off - ZWrite Off + Cull Off + Lighting Off + ZWrite Off + ColorMask [_ColorMask] BlendOp [_BlendOp] Blend [_SrcBlend] [_DstBlend] diff --git a/Assets/FlashTools/Resources/Materials/SwfSimpleGrabShader.shader b/Assets/FlashTools/Resources/Materials/SwfSimpleGrabShader.shader index f70236d..27bd902 100644 --- a/Assets/FlashTools/Resources/Materials/SwfSimpleGrabShader.shader +++ b/Assets/FlashTools/Resources/Materials/SwfSimpleGrabShader.shader @@ -3,9 +3,10 @@ Shader "FlashTools/SwfGrabSimple" { [PerRendererData] _MainTex ("Main Texture", 2D ) = "white" {} [PerRendererData] _Tint ("Tint" , Color) = (1,1,1,1) - [Enum(UnityEngine.Rendering.BlendOp )] _BlendOp ("BlendOp" , Int) = 0 - [Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("SrcBlend", Int) = 1 - [Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("DstBlend", Int) = 10 + [Enum(UnityEngine.Rendering.BlendOp )] _BlendOp ("BlendOp" , Int) = 0 + [Enum(UnityEngine.Rendering.BlendMode )] _SrcBlend ("SrcBlend" , Int) = 1 + [Enum(UnityEngine.Rendering.BlendMode )] _DstBlend ("DstBlend" , Int) = 10 + [Enum(UnityEngine.Rendering.ColorWriteMask)] _ColorMask ("ColorMask", Int) = 15 } SubShader { @@ -17,9 +18,10 @@ Shader "FlashTools/SwfGrabSimple" { "CanUseSpriteAtlas" = "True" } - Cull Off - Lighting Off - ZWrite Off + Cull Off + Lighting Off + ZWrite Off + ColorMask [_ColorMask] BlendOp [_BlendOp] Blend [_SrcBlend] [_DstBlend] diff --git a/Assets/FlashTools/Resources/Materials/SwfSimpleShader.shader b/Assets/FlashTools/Resources/Materials/SwfSimpleShader.shader index 5d96c5f..98543e8 100644 --- a/Assets/FlashTools/Resources/Materials/SwfSimpleShader.shader +++ b/Assets/FlashTools/Resources/Materials/SwfSimpleShader.shader @@ -3,9 +3,10 @@ Shader "FlashTools/SwfSimple" { [PerRendererData] _MainTex ("Main Texture", 2D ) = "white" {} [PerRendererData] _Tint ("Tint" , Color) = (1,1,1,1) - [Enum(UnityEngine.Rendering.BlendOp )] _BlendOp ("BlendOp" , Int) = 0 - [Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("SrcBlend", Int) = 1 - [Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("DstBlend", Int) = 10 + [Enum(UnityEngine.Rendering.BlendOp )] _BlendOp ("BlendOp" , Int) = 0 + [Enum(UnityEngine.Rendering.BlendMode )] _SrcBlend ("SrcBlend" , Int) = 1 + [Enum(UnityEngine.Rendering.BlendMode )] _DstBlend ("DstBlend" , Int) = 10 + [Enum(UnityEngine.Rendering.ColorWriteMask)] _ColorMask ("ColorMask", Int) = 15 } SubShader { @@ -17,9 +18,10 @@ Shader "FlashTools/SwfSimple" { "CanUseSpriteAtlas" = "True" } - Cull Off - Lighting Off - ZWrite Off + Cull Off + Lighting Off + ZWrite Off + ColorMask [_ColorMask] BlendOp [_BlendOp] Blend [_SrcBlend] [_DstBlend] diff --git a/Assets/FlashTools/Scripts/Internal/Editor/Postprocessors/SwfAssetPostprocessor.cs b/Assets/FlashTools/Scripts/Internal/Editor/Postprocessors/SwfAssetPostprocessor.cs index 95e0db4..2904215 100644 --- a/Assets/FlashTools/Scripts/Internal/Editor/Postprocessors/SwfAssetPostprocessor.cs +++ b/Assets/FlashTools/Scripts/Internal/Editor/Postprocessors/SwfAssetPostprocessor.cs @@ -313,12 +313,13 @@ namespace FlashTools.Internal { } class BakedGroup { - public SwfInstanceData.Types Type; - public SwfBlendModeData.Types BlendType; - public int ClipDepth; - public int StartVertex; - public int TriangleCount; - public Material Material; + public SwfInstanceData.Types Type; + public SwfInstanceData.ColorModes ColorMode; + public SwfBlendModeData.Types BlendMode; + public int ClipDepth; + public int StartVertex; + public int TriangleCount; + public Material Material; } static SwfClipAsset.Frame BakeClipFrame( @@ -375,12 +376,14 @@ namespace FlashTools.Internal { if ( baked_groups.Count == 0 || baked_groups[baked_groups.Count - 1].Type != inst.Type || - baked_groups[baked_groups.Count - 1].BlendType != inst.BlendMode.type || + baked_groups[baked_groups.Count - 1].ColorMode != inst.ColorMode || + baked_groups[baked_groups.Count - 1].BlendMode != inst.BlendMode.type || baked_groups[baked_groups.Count - 1].ClipDepth != inst.ClipDepth ) { baked_groups.Add(new BakedGroup{ Type = inst.Type, - BlendType = inst.BlendMode.type, + ColorMode = inst.ColorMode, + BlendMode = inst.BlendMode.type, ClipDepth = inst.ClipDepth, StartVertex = baked_vertices.Count - 4, TriangleCount = 0, @@ -400,10 +403,12 @@ namespace FlashTools.Internal { group.Material = settings_holder.GetIncrMaskMaterial(); break; case SwfInstanceData.Types.Group: - group.Material = settings_holder.GetSimpleMaterial(group.BlendType); + group.Material = settings_holder.GetSimpleMaterial( + group.ColorMode, group.BlendMode); break; case SwfInstanceData.Types.Masked: - group.Material = settings_holder.GetMaskedMaterial(group.BlendType, group.ClipDepth); + group.Material = settings_holder.GetMaskedMaterial( + group.ColorMode, group.BlendMode, group.ClipDepth); break; case SwfInstanceData.Types.MaskReset: group.Material = settings_holder.GetDecrMaskMaterial(); diff --git a/Assets/FlashTools/Scripts/Internal/Editor/Postprocessors/SwfPostprocessor.cs b/Assets/FlashTools/Scripts/Internal/Editor/Postprocessors/SwfPostprocessor.cs index 213ebd8..2fe9862 100644 --- a/Assets/FlashTools/Scripts/Internal/Editor/Postprocessors/SwfPostprocessor.cs +++ b/Assets/FlashTools/Scripts/Internal/Editor/Postprocessors/SwfPostprocessor.cs @@ -145,6 +145,7 @@ namespace FlashTools.Internal { : parent_masked + self_masks.Count; frame.Instances.Add(new SwfInstanceData{ Type = frame_inst_type, + ColorMode = SwfInstanceData.ColorModes.RGBA, ClipDepth = (ushort)frame_inst_clip_depth, Bitmap = bitmap_id, Matrix = SwfMatrixData.FromUMatrix(child_matrix * bitmap_matrix.ToUMatrix()), @@ -191,6 +192,7 @@ namespace FlashTools.Internal { if ( mask.ClipDepth < depth ) { frame.Instances.Add(new SwfInstanceData{ Type = SwfInstanceData.Types.MaskReset, + ColorMode = SwfInstanceData.ColorModes.RGBA, ClipDepth = 0, Bitmap = mask.Bitmap, Matrix = mask.Matrix, diff --git a/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfTypes/SwfBlendMode.cs b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfTypes/SwfBlendMode.cs index f45e261..84358eb 100644 --- a/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfTypes/SwfBlendMode.cs +++ b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfTypes/SwfBlendMode.cs @@ -8,15 +8,15 @@ namespace FlashTools.Internal.SwfTools.SwfTypes { Multiply, // + Screen, // + Lighten, // + - Darken, // + GrabPass - Difference, // + GrabPass + Darken, // + + Difference, // + Add, // + Subtract, // + - Invert, // + GrabPass + Invert, // + Alpha, // - Erase, // - - Overlay, // + GrabPass - Hardlight // + GrabPass + Overlay, // + + Hardlight // + } public Mode Value; diff --git a/Assets/FlashTools/Scripts/Internal/SwfSettings.cs b/Assets/FlashTools/Scripts/Internal/SwfSettings.cs index 73e6738..2d2b3a0 100644 --- a/Assets/FlashTools/Scripts/Internal/SwfSettings.cs +++ b/Assets/FlashTools/Scripts/Internal/SwfSettings.cs @@ -99,11 +99,14 @@ namespace FlashTools.Internal { } void PregenerateMaterials() { - var blend_types = System.Enum.GetValues(typeof(SwfBlendModeData.Types)); - foreach ( SwfBlendModeData.Types blend_type in blend_types ) { - GetSimpleMaterial(blend_type); - for ( var i = 0; i < 10; ++i ) { - GetMaskedMaterial(blend_type, i); + var color_modes = System.Enum.GetValues(typeof(SwfInstanceData.ColorModes)); + var blend_modes = System.Enum.GetValues(typeof(SwfBlendModeData.Types)); + foreach ( SwfInstanceData.ColorModes color_mode in color_modes ) { + foreach ( SwfBlendModeData.Types blend_mode in blend_modes ) { + GetSimpleMaterial(color_mode, blend_mode); + for ( var i = 0; i < 10; ++i ) { + GetMaskedMaterial(color_mode, blend_mode, i); + } } } GetIncrMaskMaterial(); @@ -193,9 +196,21 @@ namespace FlashTools.Internal { } static Material FillMaterial( - Material material, SwfBlendModeData.Types blend_type, int stencil_id) + Material material, SwfInstanceData.ColorModes color_mode, SwfBlendModeData.Types blend_mode, int stencil_id) { - switch ( blend_type ) { + switch ( color_mode ) { + case SwfInstanceData.ColorModes.RGBA: + material.SetInt("_ColorMask", (int)ColorWriteMask.All); + break; + case SwfInstanceData.ColorModes.A: + material.SetInt("_ColorMask", (int)ColorWriteMask.Alpha); + break; + default: + throw new UnityException(string.Format( + "SwfSettings. Incorrect color mode: {0}", + color_mode)); + } + switch ( blend_mode ) { case SwfBlendModeData.Types.Normal: material.SetInt("_BlendOp" , (int)BlendOp.Add); material.SetInt("_SrcBlend", (int)BlendMode.One); @@ -258,8 +273,8 @@ namespace FlashTools.Internal { break; default: throw new UnityException(string.Format( - "SwfSettings. Incorrect blend type: {0}", - blend_type)); + "SwfSettings. Incorrect blend mode: {0}", + blend_mode)); } material.SetInt("_StencilID", stencil_id); return material; @@ -271,26 +286,33 @@ namespace FlashTools.Internal { // // --------------------------------------------------------------------- - public Material GetSimpleMaterial(SwfBlendModeData.Types blend_type) { + public Material GetSimpleMaterial( + SwfInstanceData.ColorModes color_mode, + SwfBlendModeData.Types blend_mode) + { return LoadOrCreateMaterial( - CheckAndGetShader(SelectShader(false, blend_type)), - (dir_path, filename) => { - return string.Format( - "{0}/{1}_{2}.mat", - dir_path, filename, blend_type); - }, - material => FillMaterial(material, blend_type, 0)); - } - - public Material GetMaskedMaterial(SwfBlendModeData.Types blend_type, int stencil_id) { - return LoadOrCreateMaterial( - CheckAndGetShader(SelectShader(true, blend_type)), + CheckAndGetShader(SelectShader(false, blend_mode)), (dir_path, filename) => { return string.Format( "{0}/{1}_{2}_{3}.mat", - dir_path, filename, blend_type, stencil_id); + dir_path, filename, color_mode, blend_mode); }, - material => FillMaterial(material, blend_type, stencil_id)); + material => FillMaterial(material, color_mode, blend_mode, 0)); + } + + public Material GetMaskedMaterial( + SwfInstanceData.ColorModes color_mode, + SwfBlendModeData.Types blend_mode, + int stencil_id) + { + return LoadOrCreateMaterial( + CheckAndGetShader(SelectShader(true, blend_mode)), + (dir_path, filename) => { + return string.Format( + "{0}/{1}_{2}_{3}_{4}.mat", + dir_path, filename, color_mode, blend_mode, stencil_id); + }, + material => FillMaterial(material, color_mode, blend_mode, stencil_id)); } public Material GetIncrMaskMaterial() { diff --git a/Assets/FlashTools/Scripts/SwfAsset.cs b/Assets/FlashTools/Scripts/SwfAsset.cs index 4dd9385..c39a1dd 100644 --- a/Assets/FlashTools/Scripts/SwfAsset.cs +++ b/Assets/FlashTools/Scripts/SwfAsset.cs @@ -112,13 +112,13 @@ namespace FlashTools { Multiply, Screen, Lighten, - Darken, - Difference, + Darken, // GrabPass + Difference, // GrabPass Add, Subtract, - Invert, - Overlay, - Hardlight + Invert, // GrabPass + Overlay, // GrabPass + Hardlight // GrabPass } public Types type; @@ -137,7 +137,7 @@ namespace FlashTools { SwfBlendModeData a, SwfBlendModeData b) { return new SwfBlendModeData{ - type = (a.type == Types.Normal ? b.type : a.type)}; + type = a.type == Types.Normal ? b.type : a.type}; } } @@ -187,7 +187,12 @@ namespace FlashTools { Masked, MaskReset } + public enum ColorModes { + RGBA, + A + } public Types Type = Types.Group; + public ColorModes ColorMode = ColorModes.RGBA; public ushort ClipDepth = 0; public ushort Bitmap = 0; public SwfMatrixData Matrix = SwfMatrixData.identity;