mirror of
https://github.com/BlackMATov/unity-flash-tools.git
synced 2026-04-30 07:53:08 +07:00
grab blend modes wip
This commit is contained in:
@@ -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}",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -112,8 +112,13 @@ namespace FlashTools {
|
||||
Multiply,
|
||||
Screen,
|
||||
Lighten,
|
||||
Darken,
|
||||
Difference,
|
||||
Add,
|
||||
Subtract
|
||||
Subtract,
|
||||
Invert,
|
||||
Overlay,
|
||||
Hardlight
|
||||
}
|
||||
public Types type;
|
||||
|
||||
|
||||
@@ -236,7 +236,7 @@ namespace FlashTools {
|
||||
}
|
||||
_meshRenderer.GetPropertyBlock(_curPropBlock);
|
||||
_curPropBlock.SetColor(
|
||||
"_Color",
|
||||
"_Tint",
|
||||
tint);
|
||||
_curPropBlock.SetTexture(
|
||||
"_MainTex",
|
||||
|
||||
Reference in New Issue
Block a user