Exemple #1
0
        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));
            }
        }
Exemple #2
0
        // ---------------------------------------------------------------------
        //
        // 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)));
        }
Exemple #3
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)));
 }
Exemple #4
0
        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);
        }