static Shader SelectShader(bool masked, SwfBlendModeData.Types blend_mode) { switch (blend_mode) { case SwfBlendModeData.Types.Normal: case SwfBlendModeData.Types.Layer: case SwfBlendModeData.Types.Multiply: case SwfBlendModeData.Types.Screen: case SwfBlendModeData.Types.Lighten: case SwfBlendModeData.Types.Add: case SwfBlendModeData.Types.Subtract: return(GetShaderByName(masked ? SwfMaskedShaderName : SwfSimpleShaderName)); case SwfBlendModeData.Types.Darken: case SwfBlendModeData.Types.Difference: case SwfBlendModeData.Types.Invert: case SwfBlendModeData.Types.Overlay: case SwfBlendModeData.Types.Hardlight: return(GetShaderByName(masked ? SwfMaskedGrabShaderName : SwfSimpleGrabShaderName)); default: throw new UnityException(string.Format( "SwfMaterialCache. Incorrect blend mode: {0}", blend_mode)); } }
// --------------------------------------------------------------------- // // Functions // // --------------------------------------------------------------------- public static Material GetSimpleMaterial( SwfBlendModeData.Types blend_mode) { return(LoadOrCreateMaterial( SelectShader(false, blend_mode), (dir_path, filename) => { return string.Format( "{0}/{1}_{2}.mat", dir_path, filename, blend_mode); }, material => FillMaterial(material, blend_mode, 0))); }
public static Material GetMaskedMaterial( SwfBlendModeData.Types blend_mode, int stencil_id) { return(LoadOrCreateMaterial( SelectShader(true, blend_mode), (dir_path, filename) => { return string.Format( "{0}/{1}_{2}_{3}.mat", dir_path, filename, blend_mode, stencil_id); }, material => FillMaterial(material, blend_mode, stencil_id))); }
static Material FillMaterial( Material material, SwfBlendModeData.Types blend_mode, int stencil_id) { switch (blend_mode) { case SwfBlendModeData.Types.Normal: material.SetInt("_BlendOp", (int)BlendOp.Add); material.SetInt("_SrcBlend", (int)BlendMode.One); material.SetInt("_DstBlend", (int)BlendMode.OneMinusSrcAlpha); break; case SwfBlendModeData.Types.Layer: material.SetInt("_BlendOp", (int)BlendOp.Add); material.SetInt("_SrcBlend", (int)BlendMode.One); material.SetInt("_DstBlend", (int)BlendMode.OneMinusSrcAlpha); break; case SwfBlendModeData.Types.Multiply: material.SetInt("_BlendOp", (int)BlendOp.Add); material.SetInt("_SrcBlend", (int)BlendMode.DstColor); material.SetInt("_DstBlend", (int)BlendMode.OneMinusSrcAlpha); break; case SwfBlendModeData.Types.Screen: material.SetInt("_BlendOp", (int)BlendOp.Add); material.SetInt("_SrcBlend", (int)BlendMode.OneMinusDstColor); material.SetInt("_DstBlend", (int)BlendMode.One); break; case SwfBlendModeData.Types.Lighten: material.SetInt("_BlendOp", (int)BlendOp.Max); 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("SWF_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("SWF_DIFFERENCE_BLEND"); break; case SwfBlendModeData.Types.Add: material.SetInt("_BlendOp", (int)BlendOp.Add); material.SetInt("_SrcBlend", (int)BlendMode.One); material.SetInt("_DstBlend", (int)BlendMode.One); break; case SwfBlendModeData.Types.Subtract: material.SetInt("_BlendOp", (int)BlendOp.ReverseSubtract); 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("SWF_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("SWF_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("SWF_HARDLIGHT_BLEND"); break; default: throw new UnityException(string.Format( "SwfMaterialCache. Incorrect blend mode: {0}", blend_mode)); } material.SetInt("_StencilID", stencil_id); return(material); }