remove custom color mask

This commit is contained in:
2016-09-29 02:06:22 +07:00
parent 2d2cbdf525
commit f59b207483
10 changed files with 165 additions and 153 deletions

View File

@@ -145,7 +145,7 @@ Camera:
far clip plane: 1000
field of view: 60
orthographic: 1
orthographic size: 1.3
orthographic size: 2.3
m_Depth: 0
m_CullingMask:
serializedVersion: 2

View File

@@ -1,13 +1,12 @@
Shader "FlashTools/SwfGrabMasked" {
Shader "FlashTools/SwfMaskedGrab" {
Properties {
[PerRendererData] _MainTex ("Main Texture", 2D ) = "white" {}
[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.ColorWriteMask)] _ColorMask ("ColorMask", Int) = 15
[Enum(UnityEngine.Rendering.BlendOp )] _BlendOp ("BlendOp" , Int) = 0
[Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("SrcBlend", Int) = 1
[Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("DstBlend", Int) = 10
}
SubShader {
@@ -19,10 +18,9 @@ Shader "FlashTools/SwfGrabMasked" {
"CanUseSpriteAtlas" = "True"
}
Cull Off
Lighting Off
ZWrite Off
ColorMask [_ColorMask]
Cull Off
Lighting Off
ZWrite Off
BlendOp [_BlendOp]
Blend [_SrcBlend] [_DstBlend]

View File

@@ -4,10 +4,9 @@ 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.ColorWriteMask)] _ColorMask ("ColorMask", Int) = 15
[Enum(UnityEngine.Rendering.BlendOp )] _BlendOp ("BlendOp" , Int) = 0
[Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("SrcBlend", Int) = 1
[Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("DstBlend", Int) = 10
}
SubShader {
@@ -19,10 +18,9 @@ Shader "FlashTools/SwfMasked" {
"CanUseSpriteAtlas" = "True"
}
Cull Off
Lighting Off
ZWrite Off
ColorMask [_ColorMask]
Cull Off
Lighting Off
ZWrite Off
BlendOp [_BlendOp]
Blend [_SrcBlend] [_DstBlend]

View File

@@ -1,12 +1,11 @@
Shader "FlashTools/SwfGrabSimple" {
Shader "FlashTools/SwfSimpleGrab" {
Properties {
[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.ColorWriteMask)] _ColorMask ("ColorMask", Int) = 15
[Enum(UnityEngine.Rendering.BlendOp )] _BlendOp ("BlendOp" , Int) = 0
[Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("SrcBlend", Int) = 1
[Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("DstBlend", Int) = 10
}
SubShader {
@@ -18,10 +17,9 @@ Shader "FlashTools/SwfGrabSimple" {
"CanUseSpriteAtlas" = "True"
}
Cull Off
Lighting Off
ZWrite Off
ColorMask [_ColorMask]
Cull Off
Lighting Off
ZWrite Off
BlendOp [_BlendOp]
Blend [_SrcBlend] [_DstBlend]

View File

@@ -3,10 +3,9 @@ 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.ColorWriteMask)] _ColorMask ("ColorMask", Int) = 15
[Enum(UnityEngine.Rendering.BlendOp )] _BlendOp ("BlendOp" , Int) = 0
[Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("SrcBlend", Int) = 1
[Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("DstBlend", Int) = 10
}
SubShader {
@@ -18,10 +17,9 @@ Shader "FlashTools/SwfSimple" {
"CanUseSpriteAtlas" = "True"
}
Cull Off
Lighting Off
ZWrite Off
ColorMask [_ColorMask]
Cull Off
Lighting Off
ZWrite Off
BlendOp [_BlendOp]
Blend [_SrcBlend] [_DstBlend]

View File

@@ -313,13 +313,12 @@ namespace FlashTools.Internal {
}
class BakedGroup {
public SwfInstanceData.Types Type;
public SwfInstanceData.ColorModes ColorMode;
public SwfBlendModeData.Types BlendMode;
public int ClipDepth;
public int StartVertex;
public int TriangleCount;
public Material Material;
public SwfInstanceData.Types Type;
public SwfBlendModeData.Types BlendMode;
public int ClipDepth;
public int StartVertex;
public int TriangleCount;
public Material Material;
}
static SwfClipAsset.Frame BakeClipFrame(
@@ -376,13 +375,11 @@ namespace FlashTools.Internal {
if ( baked_groups.Count == 0 ||
baked_groups[baked_groups.Count - 1].Type != inst.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,
ColorMode = inst.ColorMode,
BlendMode = inst.BlendMode.type,
ClipDepth = inst.ClipDepth,
StartVertex = baked_vertices.Count - 4,
@@ -403,12 +400,10 @@ namespace FlashTools.Internal {
group.Material = settings_holder.GetIncrMaskMaterial();
break;
case SwfInstanceData.Types.Group:
group.Material = settings_holder.GetSimpleMaterial(
group.ColorMode, group.BlendMode);
group.Material = settings_holder.GetSimpleMaterial(group.BlendMode);
break;
case SwfInstanceData.Types.Masked:
group.Material = settings_holder.GetMaskedMaterial(
group.ColorMode, group.BlendMode, group.ClipDepth);
group.Material = settings_holder.GetMaskedMaterial(group.BlendMode, group.ClipDepth);
break;
case SwfInstanceData.Types.MaskReset:
group.Material = settings_holder.GetDecrMaskMaterial();

View File

@@ -96,24 +96,24 @@ namespace FlashTools.Internal {
return AddDisplayListToFrame(
library,
display_list,
0,
0,
null,
Matrix4x4.identity,
SwfBlendModeData.identity,
SwfColorTransData.identity,
0,
0,
null,
frame);
}
static SwfFrameData AddDisplayListToFrame(
SwfLibrary library,
SwfDisplayList display_list,
ushort parent_masked,
ushort parent_mask,
List<SwfInstanceData> parent_masks,
Matrix4x4 parent_matrix,
SwfBlendModeData parent_blend_mode,
SwfColorTransData parent_color_transform,
ushort parent_masked,
ushort parent_mask,
List<SwfInstanceData> parent_masks,
SwfFrameData frame)
{
var self_masks = new List<SwfInstanceData>();
@@ -124,57 +124,30 @@ namespace FlashTools.Internal {
var child_color_transform = parent_color_transform * inst.ColorTransform.ToColorTransData();
switch ( inst.Type ) {
case SwfDisplayInstanceType.Shape:
var shape_def = library.FindDefine<SwfLibraryShapeDefine>(inst.Id);
if ( shape_def != null ) {
for ( var i = 0; i < shape_def.Bitmaps.Length; ++i ) {
var bitmap_id = shape_def.Bitmaps[i];
var bitmap_matrix = i < shape_def.Matrices.Length ? shape_def.Matrices[i] : SwfMatrix.identity;
var bitmap_def = library.FindDefine<SwfLibraryBitmapDefine>(bitmap_id);
if ( bitmap_def != null ) {
var frame_inst_type =
(parent_mask > 0 || inst.ClipDepth > 0)
? SwfInstanceData.Types.Mask
: (parent_masked > 0 || self_masks.Count > 0)
? SwfInstanceData.Types.Masked
: SwfInstanceData.Types.Group;
var frame_inst_clip_depth =
(parent_mask > 0)
? parent_mask
: (inst.ClipDepth > 0)
? inst.ClipDepth
: 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()),
BlendMode = child_blend_mode,
ColorTrans = child_color_transform});
if ( parent_mask > 0 ) {
parent_masks.Add(frame.Instances[frame.Instances.Count - 1]);
} else if ( inst.ClipDepth > 0 ) {
self_masks.Add(frame.Instances[frame.Instances.Count - 1]);
}
}
}
}
AddShapeInstanceToFrame(
library,
inst as SwfDisplayShapeInstance,
child_matrix,
child_blend_mode,
child_color_transform,
parent_masked,
parent_mask,
parent_masks,
self_masks,
frame);
break;
case SwfDisplayInstanceType.Sprite:
var sprite_def = library.FindDefine<SwfLibrarySpriteDefine>(inst.Id);
if ( sprite_def != null ) {
var sprite_inst = inst as SwfDisplaySpriteInstance;
AddDisplayListToFrame(
library,
sprite_inst.DisplayList,
(ushort)(parent_masked + self_masks.Count),
(ushort)(parent_mask > 0 ? parent_mask : (inst.ClipDepth > 0 ? inst.ClipDepth : (ushort)0)),
parent_mask > 0 ? parent_masks : (inst.ClipDepth > 0 ? self_masks : null),
child_matrix,
child_blend_mode,
child_color_transform,
frame);
}
AddSpriteInstanceToFrame(
library,
inst as SwfDisplaySpriteInstance,
child_matrix,
child_blend_mode,
child_color_transform,
parent_masked,
parent_mask,
parent_masks,
self_masks,
frame);
break;
default:
throw new UnityException(string.Format(
@@ -185,14 +158,98 @@ namespace FlashTools.Internal {
return frame;
}
static void AddShapeInstanceToFrame(
SwfLibrary library,
SwfDisplayShapeInstance inst,
Matrix4x4 inst_matrix,
SwfBlendModeData inst_blend_mode,
SwfColorTransData inst_color_transform,
ushort parent_masked,
ushort parent_mask,
List<SwfInstanceData> parent_masks,
List<SwfInstanceData> self_masks,
SwfFrameData frame)
{
var shape_def = library.FindDefine<SwfLibraryShapeDefine>(inst.Id);
if ( shape_def != null ) {
for ( var i = 0; i < shape_def.Bitmaps.Length; ++i ) {
var bitmap_id = shape_def.Bitmaps[i];
var bitmap_matrix = i < shape_def.Matrices.Length ? shape_def.Matrices[i] : SwfMatrix.identity;
var bitmap_def = library.FindDefine<SwfLibraryBitmapDefine>(bitmap_id);
if ( bitmap_def != null ) {
var frame_inst_type =
(parent_mask > 0 || inst.ClipDepth > 0)
? SwfInstanceData.Types.Mask
: (parent_masked > 0 || self_masks.Count > 0)
? SwfInstanceData.Types.Masked
: SwfInstanceData.Types.Group;
var frame_inst_clip_depth =
(parent_mask > 0)
? parent_mask
: (inst.ClipDepth > 0)
? inst.ClipDepth
: parent_masked + self_masks.Count;
frame.Instances.Add(new SwfInstanceData{
Type = frame_inst_type,
ClipDepth = (ushort)frame_inst_clip_depth,
Bitmap = bitmap_id,
Matrix = SwfMatrixData.FromUMatrix(inst_matrix * bitmap_matrix.ToUMatrix()),
BlendMode = inst_blend_mode,
ColorTrans = inst_color_transform});
if ( parent_mask > 0 ) {
parent_masks.Add(frame.Instances[frame.Instances.Count - 1]);
} else if ( inst.ClipDepth > 0 ) {
self_masks.Add(frame.Instances[frame.Instances.Count - 1]);
}
}
}
}
}
static void AddSpriteInstanceToFrame(
SwfLibrary library,
SwfDisplaySpriteInstance inst,
Matrix4x4 inst_matrix,
SwfBlendModeData inst_blend_mode,
SwfColorTransData inst_color_transform,
ushort parent_masked,
ushort parent_mask,
List<SwfInstanceData> parent_masks,
List<SwfInstanceData> self_masks,
SwfFrameData frame)
{
var sprite_def = library.FindDefine<SwfLibrarySpriteDefine>(inst.Id);
if ( sprite_def != null ) {
AddDisplayListToFrame(
library,
inst.DisplayList,
inst_matrix,
inst_blend_mode,
inst_color_transform,
(ushort)(parent_masked + self_masks.Count),
(ushort)(parent_mask > 0
? parent_mask
: (inst.ClipDepth > 0
? inst.ClipDepth
: (ushort)0)),
parent_mask > 0
? parent_masks
: (inst.ClipDepth > 0
? self_masks
: null),
frame);
}
}
static void CheckSelfMasks(
List<SwfInstanceData> masks, ushort depth, SwfFrameData frame)
List<SwfInstanceData> masks,
ushort depth,
SwfFrameData frame)
{
foreach ( var mask in masks ) {
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,

View File

@@ -99,14 +99,11 @@ namespace FlashTools.Internal {
}
void PregenerateMaterials() {
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);
}
foreach ( SwfBlendModeData.Types blend_mode in blend_modes ) {
GetSimpleMaterial(blend_mode);
for ( var i = 0; i < 10; ++i ) {
GetMaskedMaterial(blend_mode, i);
}
}
GetIncrMaskMaterial();
@@ -196,20 +193,8 @@ namespace FlashTools.Internal {
}
static Material FillMaterial(
Material material, SwfInstanceData.ColorModes color_mode, SwfBlendModeData.Types blend_mode, int stencil_id)
Material material, SwfBlendModeData.Types blend_mode, int stencil_id)
{
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);
@@ -286,33 +271,26 @@ namespace FlashTools.Internal {
//
// ---------------------------------------------------------------------
public Material GetSimpleMaterial(
SwfInstanceData.ColorModes color_mode,
SwfBlendModeData.Types blend_mode)
{
public Material GetSimpleMaterial(SwfBlendModeData.Types blend_mode) {
return LoadOrCreateMaterial(
CheckAndGetShader(SelectShader(false, blend_mode)),
(dir_path, filename) => {
return string.Format(
"{0}/{1}_{2}_{3}.mat",
dir_path, filename, color_mode, blend_mode);
"{0}/{1}_{2}.mat",
dir_path, filename, blend_mode);
},
material => FillMaterial(material, color_mode, blend_mode, 0));
material => FillMaterial(material, blend_mode, 0));
}
public Material GetMaskedMaterial(
SwfInstanceData.ColorModes color_mode,
SwfBlendModeData.Types blend_mode,
int stencil_id)
{
public Material GetMaskedMaterial(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);
"{0}/{1}_{2}_{3}.mat",
dir_path, filename, blend_mode, stencil_id);
},
material => FillMaterial(material, color_mode, blend_mode, stencil_id));
material => FillMaterial(material, blend_mode, stencil_id));
}
public Material GetIncrMaskMaterial() {

View File

@@ -136,8 +136,7 @@ namespace FlashTools {
public static SwfBlendModeData operator*(
SwfBlendModeData a, SwfBlendModeData b)
{
return new SwfBlendModeData{
type = a.type == Types.Normal ? b.type : a.type};
return a.type == Types.Normal ? b : a;
}
}
@@ -187,12 +186,7 @@ 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;