grab blend modes wip

This commit is contained in:
2016-09-27 17:32:10 +07:00
parent 792becc261
commit a49a1081c5
154 changed files with 387 additions and 4108 deletions

View File

@@ -3,20 +3,20 @@
namespace FlashTools.Internal.SwfTools.SwfTypes {
public struct SwfBlendMode {
public enum Mode {
Normal,
Layer,
Multiply,
Screen,
Lighten,
Darken,
Difference,
Add,
Subtract,
Invert,
Alpha,
Erase,
Overlay,
Hardlight
Normal, // +
Layer, // -
Multiply, // +
Screen, // +
Lighten, // +
Darken, // + GrabPass
Difference, // + GrabPass
Add, // +
Subtract, // +
Invert, // + GrabPass
Alpha, // -
Erase, // -
Overlay, // + GrabPass
Hardlight // + GrabPass
}
public Mode Value;
@@ -49,10 +49,20 @@ namespace FlashTools.Internal.SwfTools.SwfTypes {
return new SwfBlendModeData(SwfBlendModeData.Types.Screen);
case Mode.Lighten:
return new SwfBlendModeData(SwfBlendModeData.Types.Lighten);
case Mode.Darken:
return new SwfBlendModeData(SwfBlendModeData.Types.Darken);
case Mode.Difference:
return new SwfBlendModeData(SwfBlendModeData.Types.Difference);
case Mode.Add:
return new SwfBlendModeData(SwfBlendModeData.Types.Add);
case Mode.Subtract:
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.Hardlight:
return new SwfBlendModeData(SwfBlendModeData.Types.Hardlight);
default:
Debug.LogWarningFormat(
"<b>[FlashTools]</b> SwfBlendMode. Unsupported blend mode {0}",

View File

@@ -67,6 +67,8 @@ namespace FlashTools.Internal {
[HideInInspector] public Shader SimpleShader;
[HideInInspector] public Shader MaskedShader;
[HideInInspector] public Shader SimpleGrabShader;
[HideInInspector] public Shader MaskedGrabShader;
[HideInInspector] public Shader IncrMaskShader;
[HideInInspector] public Shader DecrMaskShader;
@@ -78,16 +80,20 @@ namespace FlashTools.Internal {
//
// ---------------------------------------------------------------------
const string SwfSimpleShaderName = "SwfSimpleShader";
const string SwfMaskedShaderName = "SwfMaskedShader";
const string SwfIncrMaskShaderName = "SwfIncrMaskShader";
const string SwfDecrMaskShaderName = "SwfDecrMaskShader";
const string SwfSimpleShaderName = "SwfSimpleShader";
const string SwfMaskedShaderName = "SwfMaskedShader";
const string SwfSimpleGrabShaderName = "SwfSimpleGrabShader";
const string SwfMaskedGrabShaderName = "SwfMaskedGrabShader";
const string SwfIncrMaskShaderName = "SwfIncrMaskShader";
const string SwfDecrMaskShaderName = "SwfDecrMaskShader";
void FillShadersCache() {
SimpleShader = SafeLoadShader(SwfSimpleShaderName);
MaskedShader = SafeLoadShader(SwfMaskedShaderName);
IncrMaskShader = SafeLoadShader(SwfIncrMaskShaderName);
DecrMaskShader = SafeLoadShader(SwfDecrMaskShaderName);
SimpleShader = SafeLoadShader(SwfSimpleShaderName);
MaskedShader = SafeLoadShader(SwfMaskedShaderName);
SimpleGrabShader = SafeLoadShader(SwfSimpleGrabShaderName);
MaskedGrabShader = SafeLoadShader(SwfMaskedGrabShaderName);
IncrMaskShader = SafeLoadShader(SwfIncrMaskShaderName);
DecrMaskShader = SafeLoadShader(SwfDecrMaskShaderName);
EditorUtility.SetDirty(this);
AssetDatabase.SaveAssets();
}
@@ -150,6 +156,28 @@ namespace FlashTools.Internal {
return material;
}
Shader SelectShader(bool masked, SwfBlendModeData.Types blend_type) {
switch ( blend_type ) {
case SwfBlendModeData.Types.Normal:
case SwfBlendModeData.Types.Multiply:
case SwfBlendModeData.Types.Screen:
case SwfBlendModeData.Types.Lighten:
case SwfBlendModeData.Types.Add:
case SwfBlendModeData.Types.Subtract:
return CheckAndGetShader(masked ? MaskedShader : SimpleShader);
case SwfBlendModeData.Types.Darken:
case SwfBlendModeData.Types.Difference:
case SwfBlendModeData.Types.Invert:
case SwfBlendModeData.Types.Overlay:
case SwfBlendModeData.Types.Hardlight:
return CheckAndGetShader(masked ? MaskedGrabShader : SimpleGrabShader);
default:
throw new UnityException(string.Format(
"SwfSettings. Incorrect blend type: {0}",
blend_type));
}
}
Shader CheckAndGetShader(Shader shader) {
if ( !shader ) {
FillShadersCache();
@@ -188,6 +216,18 @@ namespace FlashTools.Internal {
material.SetInt("_SrcBlend", (int)BlendMode.One);
material.SetInt("_DstBlend", (int)BlendMode.OneMinusSrcAlpha);
break;
case SwfBlendModeData.Types.Darken:
material.SetInt("_BlendOp" , (int)BlendOp.Add);
material.SetInt("_SrcBlend", (int)BlendMode.One);
material.SetInt("_DstBlend", (int)BlendMode.OneMinusSrcAlpha);
material.EnableKeyword("FT_DARKEN_BLEND");
break;
case SwfBlendModeData.Types.Difference:
material.SetInt("_BlendOp" , (int)BlendOp.Add);
material.SetInt("_SrcBlend", (int)BlendMode.One);
material.SetInt("_DstBlend", (int)BlendMode.OneMinusSrcAlpha);
material.EnableKeyword("FT_DIFFERENCE_BLEND");
break;
case SwfBlendModeData.Types.Add:
material.SetInt("_BlendOp" , (int)BlendOp.Add);
material.SetInt("_SrcBlend", (int)BlendMode.One);
@@ -198,6 +238,24 @@ namespace FlashTools.Internal {
material.SetInt("_SrcBlend", (int)BlendMode.One);
material.SetInt("_DstBlend", (int)BlendMode.One);
break;
case SwfBlendModeData.Types.Invert:
material.SetInt("_BlendOp" , (int)BlendOp.Add);
material.SetInt("_SrcBlend", (int)BlendMode.One);
material.SetInt("_DstBlend", (int)BlendMode.OneMinusSrcAlpha);
material.EnableKeyword("FT_INVERT_BLEND");
break;
case SwfBlendModeData.Types.Overlay:
material.SetInt("_BlendOp" , (int)BlendOp.Add);
material.SetInt("_SrcBlend", (int)BlendMode.One);
material.SetInt("_DstBlend", (int)BlendMode.OneMinusSrcAlpha);
material.EnableKeyword("FT_OVERLAY_BLEND");
break;
case SwfBlendModeData.Types.Hardlight:
material.SetInt("_BlendOp" , (int)BlendOp.Add);
material.SetInt("_SrcBlend", (int)BlendMode.One);
material.SetInt("_DstBlend", (int)BlendMode.OneMinusSrcAlpha);
material.EnableKeyword("FT_HARDLIGHT_BLEND");
break;
default:
throw new UnityException(string.Format(
"SwfSettings. Incorrect blend type: {0}",
@@ -215,7 +273,7 @@ namespace FlashTools.Internal {
public Material GetSimpleMaterial(SwfBlendModeData.Types blend_type) {
return LoadOrCreateMaterial(
CheckAndGetShader(SimpleShader),
CheckAndGetShader(SelectShader(false, blend_type)),
(dir_path, filename) => {
return string.Format(
"{0}/{1}_{2}.mat",
@@ -226,7 +284,7 @@ namespace FlashTools.Internal {
public Material GetMaskedMaterial(SwfBlendModeData.Types blend_type, int stencil_id) {
return LoadOrCreateMaterial(
CheckAndGetShader(MaskedShader),
CheckAndGetShader(SelectShader(true, blend_type)),
(dir_path, filename) => {
return string.Format(
"{0}/{1}_{2}_{3}.mat",

View File

@@ -112,8 +112,13 @@ namespace FlashTools {
Multiply,
Screen,
Lighten,
Darken,
Difference,
Add,
Subtract
Subtract,
Invert,
Overlay,
Hardlight
}
public Types type;

View File

@@ -236,7 +236,7 @@ namespace FlashTools {
}
_meshRenderer.GetPropertyBlock(_curPropBlock);
_curPropBlock.SetColor(
"_Color",
"_Tint",
tint);
_curPropBlock.SetTexture(
"_MainTex",