+ color mode for instances

This commit is contained in:
2016-09-30 21:30:56 +07:00
parent c0a7121f60
commit f5315ad47f
8 changed files with 110 additions and 43 deletions

View File

@@ -4,9 +4,10 @@ Shader "FlashTools/SwfMaskedGrab" {
[PerRendererData] _Tint ("Tint" , Color) = (1,1,1,1) [PerRendererData] _Tint ("Tint" , Color) = (1,1,1,1)
_StencilID ("Stencil ID", Int) = 0 _StencilID ("Stencil ID", Int) = 0
[Enum(UnityEngine.Rendering.BlendOp )] _BlendOp ("BlendOp" , Int) = 0 [Enum(UnityEngine.Rendering.BlendOp )] _BlendOp ("BlendOp" , Int) = 0
[Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("SrcBlend", Int) = 1 [Enum(UnityEngine.Rendering.BlendMode )] _SrcBlend ("SrcBlend" , Int) = 1
[Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("DstBlend", Int) = 10 [Enum(UnityEngine.Rendering.BlendMode )] _DstBlend ("DstBlend" , Int) = 10
[Enum(UnityEngine.Rendering.ColorWriteMask)] _ColorMask("ColorMask", Int) = 15
} }
SubShader { SubShader {
@@ -18,9 +19,10 @@ Shader "FlashTools/SwfMaskedGrab" {
"CanUseSpriteAtlas" = "True" "CanUseSpriteAtlas" = "True"
} }
Cull Off Cull Off
Lighting Off Lighting Off
ZWrite Off ZWrite Off
ColorMask [_ColorMask]
BlendOp [_BlendOp] BlendOp [_BlendOp]
Blend [_SrcBlend] [_DstBlend] Blend [_SrcBlend] [_DstBlend]

View File

@@ -4,9 +4,10 @@ Shader "FlashTools/SwfMasked" {
[PerRendererData] _Tint ("Tint" , Color) = (1,1,1,1) [PerRendererData] _Tint ("Tint" , Color) = (1,1,1,1)
_StencilID ("Stencil ID", Int) = 0 _StencilID ("Stencil ID", Int) = 0
[Enum(UnityEngine.Rendering.BlendOp )] _BlendOp ("BlendOp" , Int) = 0 [Enum(UnityEngine.Rendering.BlendOp )] _BlendOp ("BlendOp" , Int) = 0
[Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("SrcBlend", Int) = 1 [Enum(UnityEngine.Rendering.BlendMode )] _SrcBlend ("SrcBlend" , Int) = 1
[Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("DstBlend", Int) = 10 [Enum(UnityEngine.Rendering.BlendMode )] _DstBlend ("DstBlend" , Int) = 10
[Enum(UnityEngine.Rendering.ColorWriteMask)] _ColorMask("ColorMask", Int) = 15
} }
SubShader { SubShader {
@@ -18,9 +19,10 @@ Shader "FlashTools/SwfMasked" {
"CanUseSpriteAtlas" = "True" "CanUseSpriteAtlas" = "True"
} }
Cull Off Cull Off
Lighting Off Lighting Off
ZWrite Off ZWrite Off
ColorMask [_ColorMask]
BlendOp [_BlendOp] BlendOp [_BlendOp]
Blend [_SrcBlend] [_DstBlend] Blend [_SrcBlend] [_DstBlend]

View File

@@ -3,9 +3,10 @@ Shader "FlashTools/SwfSimpleGrab" {
[PerRendererData] _MainTex ("Main Texture", 2D ) = "white" {} [PerRendererData] _MainTex ("Main Texture", 2D ) = "white" {}
[PerRendererData] _Tint ("Tint" , Color) = (1,1,1,1) [PerRendererData] _Tint ("Tint" , Color) = (1,1,1,1)
[Enum(UnityEngine.Rendering.BlendOp )] _BlendOp ("BlendOp" , Int) = 0 [Enum(UnityEngine.Rendering.BlendOp )] _BlendOp ("BlendOp" , Int) = 0
[Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("SrcBlend", Int) = 1 [Enum(UnityEngine.Rendering.BlendMode )] _SrcBlend ("SrcBlend" , Int) = 1
[Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("DstBlend", Int) = 10 [Enum(UnityEngine.Rendering.BlendMode )] _DstBlend ("DstBlend" , Int) = 10
[Enum(UnityEngine.Rendering.ColorWriteMask)] _ColorMask("ColorMask", Int) = 15
} }
SubShader { SubShader {
@@ -17,9 +18,10 @@ Shader "FlashTools/SwfSimpleGrab" {
"CanUseSpriteAtlas" = "True" "CanUseSpriteAtlas" = "True"
} }
Cull Off Cull Off
Lighting Off Lighting Off
ZWrite Off ZWrite Off
ColorMask [_ColorMask]
BlendOp [_BlendOp] BlendOp [_BlendOp]
Blend [_SrcBlend] [_DstBlend] Blend [_SrcBlend] [_DstBlend]

View File

@@ -3,9 +3,10 @@ Shader "FlashTools/SwfSimple" {
[PerRendererData] _MainTex ("Main Texture", 2D ) = "white" {} [PerRendererData] _MainTex ("Main Texture", 2D ) = "white" {}
[PerRendererData] _Tint ("Tint" , Color) = (1,1,1,1) [PerRendererData] _Tint ("Tint" , Color) = (1,1,1,1)
[Enum(UnityEngine.Rendering.BlendOp )] _BlendOp ("BlendOp" , Int) = 0 [Enum(UnityEngine.Rendering.BlendOp )] _BlendOp ("BlendOp" , Int) = 0
[Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("SrcBlend", Int) = 1 [Enum(UnityEngine.Rendering.BlendMode )] _SrcBlend ("SrcBlend" , Int) = 1
[Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("DstBlend", Int) = 10 [Enum(UnityEngine.Rendering.BlendMode )] _DstBlend ("DstBlend" , Int) = 10
[Enum(UnityEngine.Rendering.ColorWriteMask)] _ColorMask("ColorMask", Int) = 15
} }
SubShader { SubShader {
@@ -17,9 +18,10 @@ Shader "FlashTools/SwfSimple" {
"CanUseSpriteAtlas" = "True" "CanUseSpriteAtlas" = "True"
} }
Cull Off Cull Off
Lighting Off Lighting Off
ZWrite Off ZWrite Off
ColorMask [_ColorMask]
BlendOp [_BlendOp] BlendOp [_BlendOp]
Blend [_SrcBlend] [_DstBlend] Blend [_SrcBlend] [_DstBlend]

View File

@@ -314,6 +314,7 @@ namespace FlashTools.Internal {
class BakedGroup { class BakedGroup {
public SwfInstanceData.Types Type; public SwfInstanceData.Types Type;
public SwfColorModeData.Types ColorMode;
public SwfBlendModeData.Types BlendMode; public SwfBlendModeData.Types BlendMode;
public int ClipDepth; public int ClipDepth;
public int StartVertex; public int StartVertex;
@@ -375,11 +376,13 @@ namespace FlashTools.Internal {
if ( baked_groups.Count == 0 || if ( baked_groups.Count == 0 ||
baked_groups[baked_groups.Count - 1].Type != inst.Type || baked_groups[baked_groups.Count - 1].Type != inst.Type ||
baked_groups[baked_groups.Count - 1].ColorMode != inst.ColorMode.type ||
baked_groups[baked_groups.Count - 1].BlendMode != inst.BlendMode.type || baked_groups[baked_groups.Count - 1].BlendMode != inst.BlendMode.type ||
baked_groups[baked_groups.Count - 1].ClipDepth != inst.ClipDepth ) baked_groups[baked_groups.Count - 1].ClipDepth != inst.ClipDepth )
{ {
baked_groups.Add(new BakedGroup{ baked_groups.Add(new BakedGroup{
Type = inst.Type, Type = inst.Type,
ColorMode = inst.ColorMode.type,
BlendMode = inst.BlendMode.type, BlendMode = inst.BlendMode.type,
ClipDepth = inst.ClipDepth, ClipDepth = inst.ClipDepth,
StartVertex = baked_vertices.Count - 4, StartVertex = baked_vertices.Count - 4,
@@ -400,10 +403,10 @@ namespace FlashTools.Internal {
group.Material = settings_holder.GetIncrMaskMaterial(); group.Material = settings_holder.GetIncrMaskMaterial();
break; break;
case SwfInstanceData.Types.Group: case SwfInstanceData.Types.Group:
group.Material = settings_holder.GetSimpleMaterial(group.BlendMode); group.Material = settings_holder.GetSimpleMaterial(group.ColorMode, group.BlendMode);
break; break;
case SwfInstanceData.Types.Masked: case SwfInstanceData.Types.Masked:
group.Material = settings_holder.GetMaskedMaterial(group.BlendMode, group.ClipDepth); group.Material = settings_holder.GetMaskedMaterial(group.ColorMode, group.BlendMode, group.ClipDepth);
break; break;
case SwfInstanceData.Types.MaskReset: case SwfInstanceData.Types.MaskReset:
group.Material = settings_holder.GetDecrMaskMaterial(); group.Material = settings_holder.GetDecrMaskMaterial();

View File

@@ -97,6 +97,7 @@ namespace FlashTools.Internal {
library, library,
display_list, display_list,
Matrix4x4.identity, Matrix4x4.identity,
SwfColorModeData.identity,
SwfBlendModeData.identity, SwfBlendModeData.identity,
SwfColorTransData.identity, SwfColorTransData.identity,
0, 0,
@@ -109,6 +110,7 @@ namespace FlashTools.Internal {
SwfLibrary library, SwfLibrary library,
SwfDisplayList display_list, SwfDisplayList display_list,
Matrix4x4 parent_matrix, Matrix4x4 parent_matrix,
SwfColorModeData parent_color_mode,
SwfBlendModeData parent_blend_mode, SwfBlendModeData parent_blend_mode,
SwfColorTransData parent_color_transform, SwfColorTransData parent_color_transform,
ushort parent_masked, ushort parent_masked,
@@ -120,6 +122,7 @@ namespace FlashTools.Internal {
foreach ( var inst in display_list.Instances.Values.Where(p => p.Visible) ) { foreach ( var inst in display_list.Instances.Values.Where(p => p.Visible) ) {
CheckSelfMasks(self_masks, inst.Depth, frame); CheckSelfMasks(self_masks, inst.Depth, frame);
var child_matrix = parent_matrix * inst.Matrix .ToUMatrix(); 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_blend_mode = parent_blend_mode * inst.BlendMode .ToBlendModeData();
var child_color_transform = parent_color_transform * inst.ColorTransform.ToColorTransData(); var child_color_transform = parent_color_transform * inst.ColorTransform.ToColorTransData();
switch ( inst.Type ) { switch ( inst.Type ) {
@@ -128,6 +131,7 @@ namespace FlashTools.Internal {
library, library,
inst as SwfDisplayShapeInstance, inst as SwfDisplayShapeInstance,
child_matrix, child_matrix,
child_color_mode,
child_blend_mode, child_blend_mode,
child_color_transform, child_color_transform,
parent_masked, parent_masked,
@@ -141,6 +145,7 @@ namespace FlashTools.Internal {
library, library,
inst as SwfDisplaySpriteInstance, inst as SwfDisplaySpriteInstance,
child_matrix, child_matrix,
child_color_mode,
child_blend_mode, child_blend_mode,
child_color_transform, child_color_transform,
parent_masked, parent_masked,
@@ -162,6 +167,7 @@ namespace FlashTools.Internal {
SwfLibrary library, SwfLibrary library,
SwfDisplayShapeInstance inst, SwfDisplayShapeInstance inst,
Matrix4x4 inst_matrix, Matrix4x4 inst_matrix,
SwfColorModeData inst_color_mode,
SwfBlendModeData inst_blend_mode, SwfBlendModeData inst_blend_mode,
SwfColorTransData inst_color_transform, SwfColorTransData inst_color_transform,
ushort parent_masked, ushort parent_masked,
@@ -194,6 +200,7 @@ namespace FlashTools.Internal {
ClipDepth = (ushort)frame_inst_clip_depth, ClipDepth = (ushort)frame_inst_clip_depth,
Bitmap = bitmap_id, Bitmap = bitmap_id,
Matrix = SwfMatrixData.FromUMatrix(inst_matrix * bitmap_matrix.ToUMatrix()), Matrix = SwfMatrixData.FromUMatrix(inst_matrix * bitmap_matrix.ToUMatrix()),
ColorMode = inst_color_mode,
BlendMode = inst_blend_mode, BlendMode = inst_blend_mode,
ColorTrans = inst_color_transform}); ColorTrans = inst_color_transform});
if ( parent_mask > 0 ) { if ( parent_mask > 0 ) {
@@ -210,6 +217,7 @@ namespace FlashTools.Internal {
SwfLibrary library, SwfLibrary library,
SwfDisplaySpriteInstance inst, SwfDisplaySpriteInstance inst,
Matrix4x4 inst_matrix, Matrix4x4 inst_matrix,
SwfColorModeData inst_color_mode,
SwfBlendModeData inst_blend_mode, SwfBlendModeData inst_blend_mode,
SwfColorTransData inst_color_transform, SwfColorTransData inst_color_transform,
ushort parent_masked, ushort parent_masked,
@@ -224,6 +232,7 @@ namespace FlashTools.Internal {
library, library,
inst.DisplayList, inst.DisplayList,
inst_matrix, inst_matrix,
inst_color_mode,
inst_blend_mode, inst_blend_mode,
inst_color_transform, inst_color_transform,
(ushort)(parent_masked + self_masks.Count), (ushort)(parent_masked + self_masks.Count),
@@ -253,6 +262,7 @@ namespace FlashTools.Internal {
ClipDepth = 0, ClipDepth = 0,
Bitmap = mask.Bitmap, Bitmap = mask.Bitmap,
Matrix = mask.Matrix, Matrix = mask.Matrix,
ColorMode = mask.ColorMode,
BlendMode = mask.BlendMode, BlendMode = mask.BlendMode,
ColorTrans = mask.ColorTrans}); ColorTrans = mask.ColorTrans});
} }

View File

@@ -99,11 +99,14 @@ namespace FlashTools.Internal {
} }
void PregenerateMaterials() { void PregenerateMaterials() {
var color_modes = System.Enum.GetValues(typeof(SwfColorModeData.Types));
var blend_modes = System.Enum.GetValues(typeof(SwfBlendModeData.Types)); var blend_modes = System.Enum.GetValues(typeof(SwfBlendModeData.Types));
foreach ( SwfBlendModeData.Types blend_mode in blend_modes ) { foreach ( SwfColorModeData.Types color_mode in color_modes ) {
GetSimpleMaterial(blend_mode); foreach ( SwfBlendModeData.Types blend_mode in blend_modes ) {
for ( var i = 0; i < 10; ++i ) { GetSimpleMaterial(color_mode, blend_mode);
GetMaskedMaterial(blend_mode, i); for ( var i = 0; i < 10; ++i ) {
GetMaskedMaterial(color_mode, blend_mode, i);
}
} }
} }
GetIncrMaskMaterial(); GetIncrMaskMaterial();
@@ -156,8 +159,8 @@ namespace FlashTools.Internal {
return material; return material;
} }
Shader SelectShader(bool masked, SwfBlendModeData.Types blend_type) { Shader SelectShader(bool masked, SwfBlendModeData.Types blend_mode) {
switch ( blend_type ) { switch ( blend_mode ) {
case SwfBlendModeData.Types.Normal: case SwfBlendModeData.Types.Normal:
case SwfBlendModeData.Types.Layer: case SwfBlendModeData.Types.Layer:
case SwfBlendModeData.Types.Multiply: case SwfBlendModeData.Types.Multiply:
@@ -174,8 +177,8 @@ namespace FlashTools.Internal {
return CheckAndGetShader(masked ? MaskedGrabShader : SimpleGrabShader); return CheckAndGetShader(masked ? MaskedGrabShader : SimpleGrabShader);
default: default:
throw new UnityException(string.Format( throw new UnityException(string.Format(
"SwfSettings. Incorrect blend type: {0}", "SwfSettings. Incorrect blend mode: {0}",
blend_type)); blend_mode));
} }
} }
@@ -194,8 +197,23 @@ namespace FlashTools.Internal {
} }
static Material FillMaterial( static Material FillMaterial(
Material material, SwfBlendModeData.Types blend_mode, int stencil_id) Material material,
SwfColorModeData.Types color_mode,
SwfBlendModeData.Types blend_mode,
int stencil_id)
{ {
switch ( color_mode ) {
case SwfColorModeData.Types.RGBA:
material.SetInt("_ColorMask", (int)ColorWriteMask.All);
break;
case SwfColorModeData.Types.A:
material.SetInt("_ColorMask", (int)ColorWriteMask.Alpha);
break;
default:
throw new UnityException(string.Format(
"SwfSettings. Incorrect color mode: {0}",
color_mode));
}
switch ( blend_mode ) { switch ( blend_mode ) {
case SwfBlendModeData.Types.Normal: case SwfBlendModeData.Types.Normal:
material.SetInt("_BlendOp" , (int)BlendOp.Add); material.SetInt("_BlendOp" , (int)BlendOp.Add);
@@ -277,26 +295,33 @@ namespace FlashTools.Internal {
// //
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
public Material GetSimpleMaterial(SwfBlendModeData.Types blend_mode) { public Material GetSimpleMaterial(
SwfColorModeData.Types color_mode,
SwfBlendModeData.Types blend_mode)
{
return LoadOrCreateMaterial( return LoadOrCreateMaterial(
CheckAndGetShader(SelectShader(false, blend_mode)), CheckAndGetShader(SelectShader(false, blend_mode)),
(dir_path, filename) => { (dir_path, filename) => {
return string.Format( return string.Format(
"{0}/{1}_{2}.mat", "{0}/{1}_{2}_{3}.mat",
dir_path, filename, blend_mode); dir_path, filename, color_mode, blend_mode);
}, },
material => FillMaterial(material, blend_mode, 0)); material => FillMaterial(material, color_mode, blend_mode, 0));
} }
public Material GetMaskedMaterial(SwfBlendModeData.Types blend_mode, int stencil_id) { public Material GetMaskedMaterial(
SwfColorModeData.Types color_mode,
SwfBlendModeData.Types blend_mode,
int stencil_id)
{
return LoadOrCreateMaterial( return LoadOrCreateMaterial(
CheckAndGetShader(SelectShader(true, blend_mode)), CheckAndGetShader(SelectShader(true, blend_mode)),
(dir_path, filename) => { (dir_path, filename) => {
return string.Format( return string.Format(
"{0}/{1}_{2}_{3}.mat", "{0}/{1}_{2}_{3}_{4}.mat",
dir_path, filename, blend_mode, stencil_id); dir_path, filename, color_mode, blend_mode, stencil_id);
}, },
material => FillMaterial(material, blend_mode, stencil_id)); material => FillMaterial(material, color_mode, blend_mode, stencil_id));
} }
public Material GetIncrMaskMaterial() { public Material GetIncrMaskMaterial() {

View File

@@ -105,6 +105,26 @@ namespace FlashTools {
} }
} }
[System.Serializable]
public struct SwfColorModeData {
public enum Types : byte {
RGBA,
A
}
public Types type;
public SwfColorModeData(Types type) {
this.type = type;
}
public static SwfColorModeData identity {
get {
return new SwfColorModeData{
type = Types.RGBA};
}
}
}
[System.Serializable] [System.Serializable]
public struct SwfBlendModeData { public struct SwfBlendModeData {
public enum Types : byte { public enum Types : byte {
@@ -191,6 +211,7 @@ namespace FlashTools {
public ushort ClipDepth = 0; public ushort ClipDepth = 0;
public ushort Bitmap = 0; public ushort Bitmap = 0;
public SwfMatrixData Matrix = SwfMatrixData.identity; public SwfMatrixData Matrix = SwfMatrixData.identity;
public SwfColorModeData ColorMode = SwfColorModeData.identity;
public SwfBlendModeData BlendMode = SwfBlendModeData.identity; public SwfBlendModeData BlendMode = SwfBlendModeData.identity;
public SwfColorTransData ColorTrans = SwfColorTransData.identity; public SwfColorTransData ColorTrans = SwfColorTransData.identity;
} }