#*****************************************************************************
# Copyright 1986, 2014 NVIDIA Corporation. All rights reserved.
#*****************************************************************************
# Created:  11.09.13
# Module:   layering_phen
# Purpose:  phenomena for complex efficient layering 
#
# Exports:
#
# Description:
#
#*****************************************************************************

$ifndef "layering_phen_mi_included"
set "layering_phen_mi_included" "true"

link "layering.so"
$include "layering.mi"

declare phenomenon color
    "mila_mix_reflective" (

        color   "tint"               default 0.7 0.7 0.7 1.0,

        # Glossy
        scalar  "glossy_weight"      default 0.5, #: min 0 max 1
        scalar  "glossy_roughness"   default 0.4, #: min 0 max 1

        scalar  "direct"             default 1.0, #: min 0 max 1
        scalar  "indirect"           default 1.0  #: min 0 max 1
    )
    shader "glossy" "mila_glossy_reflection" (
        "tint"               = interface "tint",
        "roughness"          = interface "glossy_roughness",
        "direct"             = interface "direct",
        "indirect"           = interface "indirect"
    )
            
    shader "diffuse" "mila_diffuse_reflection" (
        "tint"               = interface "tint",

        "direct"             = interface "direct",
        "indirect"           = interface "indirect"
    )

    shader "base_mix" "mila_mix" (
        "clamp" on,       # makes the initial weight like a glossy/diffuse blend factor
        "components" [{
            "shader" "glossy",
            "on" on,
            "weight"      = interface "glossy_weight",
            "weight_tint" 1 1 1 1
         },
         {
            "shader" "diffuse",
            "on" on,
            "weight"      1.0, # clamped at 1-glossy_weight
            "weight_tint" 1 1 1 1
        }]
    )
    root = "base_mix"
    version 1
end declare

declare phenomenon color
    "mila_layer_reflective" (

        color   "tint"               default 0.7 0.7 0.7 1.0,

        # Glossy
        scalar  "glossy_weight"      default 0.5, #: min 0 max 1
        scalar  "glossy_roughness"   default 0.4, #: min 0 max 1
        scalar  "ior"                default 1.4, #: min 1 max 20 softmax 2

        scalar  "direct"             default 1.0, #: min 0 max 1
        scalar  "indirect"           default 1.0  #: min 0 max 1
    )
    shader "glossy" "mila_glossy_reflection" (
        "tint"               = interface "tint",
        "roughness"          = interface "glossy_roughness",
        "direct"             = interface "direct",
        "indirect"           = interface "indirect"
    )
            
    shader "diffuse" "mila_diffuse_reflection" (
        "tint"               = interface "tint",

        "direct"             = interface "direct",
        "indirect"           = interface "indirect"
    )

    shader "base_layer" "mila_layer" (
        "layers" [{
            "shader" "glossy",
            "on" on,
            "weight"      = interface "glossy_weight",
            "weight_tint" 1 1 1 1,
            "use_directional_weight" on,
            "directional_weight_mode" 0,
            "ior"         = interface "ior"
         },
         {
            "shader" "diffuse",
            "on" on,
            "weight"      1.0, #
            "weight_tint" 1 1 1 1
         }]
    )
    root = "base_layer"
    version 1
end declare

declare phenomenon color
    "mila_mix_reflective_aniso" (

        color   "tint"               default 0.7 0.7 0.7 1.0,

        # Glossy
        scalar  "glossy_weight"      default 0.5, #: min 0 max 1
        scalar  "glossy_roughness"   default 0.4, #: min 0 max 1

        # Additional Glossy
        scalar  "anisotropy"         default 1.0,
        scalar  "aniso_angle"        default 0.0,
        integer "aniso_channel"      default -1,

        # Diffuse
        scalar  "diffuse_roughness"  default 0.0, #: min 0 max 1

        scalar  "direct"             default 1.0, #: min 0 max 1
        scalar  "indirect"           default 1.0  #: min 0 max 1
    )
    shader "glossy" "mila_glossy_reflection" (
        "tint"               = interface "tint",
        "roughness"          = interface "glossy_roughness",
        "anisotropy"         = interface "anisotropy",
        "aniso_angle"        = interface "aniso_angle",
        "aniso_channel"      = interface "aniso_channel",
        "direct"             = interface "direct",
        "indirect"           = interface "indirect"
    )
            
    shader "diffuse" "mila_diffuse_reflection" (
        "tint"               = interface "tint",
        "roughness"          = interface "diffuse_roughness",

        "direct"             = interface "direct",
        "indirect"           = interface "indirect"
    )

    shader "base_mix" "mila_mix" (
        "clamp" on,       # makes the initial weight like a glossy/diffuse blend factor
        "components" [{
            "shader" "glossy",
            "on" on,
            "weight"      = interface "glossy_weight",
            "weight_tint" 1 1 1 1
         },
         {
            "shader" "diffuse",
            "on" on,
            "weight"      1.0, # clamped at 1-glossy_weight
            "weight_tint" 1 1 1 1
        }]
    )
    root = "base_mix"
    version 1
end declare

declare phenomenon color
    "mila_layer_reflective_aniso" (

        color   "tint"               default 0.7 0.7 0.7 1.0,

        # Glossy
        scalar  "glossy_weight"      default 0.5, #: min 0 max 1
        scalar  "glossy_roughness"   default 0.4, #: min 0 max 1
        scalar  "ior"                default 1.4, #: min 1 max 20 softmax 2

        # Additional Glossy
        scalar  "anisotropy"         default 1.0,
        scalar  "aniso_angle"        default 0.0,
        integer "aniso_channel"      default -1,

        # Diffuse
        scalar  "diffuse_roughness"  default 0.0, #: min 0 max 1

        scalar  "direct"             default 1.0, #: min 0 max 1
        scalar  "indirect"           default 1.0  #: min 0 max 1
    )
    shader "glossy" "mila_glossy_reflection" (
        "tint"               = interface "tint",
        "roughness"          = interface "glossy_roughness",
        "anisotropy"         = interface "anisotropy",
        "aniso_angle"        = interface "aniso_angle",
        "aniso_channel"      = interface "aniso_channel",
        "direct"             = interface "direct",
        "indirect"           = interface "indirect"
    )
            
    shader "diffuse" "mila_diffuse_reflection" (
        "tint"               = interface "tint",
        "roughness"          = interface "diffuse_roughness",

        "direct"             = interface "direct",
        "indirect"           = interface "indirect"
    )

    shader "base_layer" "mila_layer" (
        "layers" [{
            "shader" "glossy",
            "on" on,
            "weight"      = interface "glossy_weight",
            "weight_tint" 1 1 1 1,
            "use_directional_weight" on,
            "directional_weight_mode" 0,
            "ior"         = interface "ior"
         },
         {
            "shader" "diffuse",
            "on" on,
            "weight"      1.0, # clamped at 1-glossy_weight
            "weight_tint" 1 1 1 1
         }]
    )
    root = "base_layer"
    version 1
end declare

declare phenomenon color
    "mila_layer_reflective_plastic" (

        color   "tint"               default 0.7 0.7 0.7 1.0,

        # Glossy
        scalar  "glossy_weight"      default 0.5, #: min 0 max 1
        scalar  "glossy_roughness"   default 0.4, #: min 0 max 1
        scalar  "ior"                default 1.4, #: min 1 max 20 softmax 2

        scalar  "direct"             default 1.0, #: min 0 max 1
        scalar  "indirect"           default 1.0  #: min 0 max 1
    )
    shader "glossy" "mila_glossy_reflection" (
        "tint"               1 1 1 1, # reflection for plastic
        "roughness"          = interface "glossy_roughness",
        "direct"             = interface "direct",
        "indirect"           = interface "indirect"
    )
            
    shader "diffuse" "mila_diffuse_reflection" (
        "tint"               = interface "tint",

        "direct"             = interface "direct",
        "indirect"           = interface "indirect"
    )

    shader "base_layer" "mila_layer" (
        "layers" [{
            "shader" "glossy",
            "on" on,
            "weight"      = interface "glossy_weight",
            "weight_tint" 1 1 1 1,
            "use_directional_weight" on,
            "directional_weight_mode" 0,
            "ior"         = interface "ior"
         },
         {
            "shader" "diffuse",
            "on" on,
            "weight"      1.0, #
            "weight_tint" 1 1 1 1
         }]
    )
    root = "base_layer"
    version 1
end declare

declare phenomenon
    color "mila_layer_reflective_paint" 
    (
        color   "tint"                   default 0.8 0.1 0, #diffuse color

        scalar  "edge_weight"            default 0.0,
        color   "edge_color"             default 0 0 0,     #diffuse color at grazing angles
        scalar  "edge_color_bias"        default 1.0,

        scalar  "glossy_weight"          default 0.2,
        color   "glossy_color"           default 0.8 0.1 0,
        scalar  "glossy_roughness"       default 0.6,
        
        scalar  "flake_weight"           default 1.0,
        color   "flake_color"            default 1 1 1,
        scalar  "flake_roughness"        default 0.4,

        scalar  "flake_scale"            default 0.05,
        scalar  "flake_density"          default 0.8,
        scalar  "flake_strength"         default 0.2,

        integer "flake_type"             default 3,       #: enum "distortion1:distortion2:distortion3:cellular1:cellular2:cellular3"
        integer "flake_cell_style"       default 0, 	  #: enum "edgy:circular"
        scalar  "flake_circle_size"      default 0.3,
        
        scalar  "direct"                 default 1.0,
        scalar  "indirect"               default 1.0
    )

    shader "flakes"  "mila_bump_flakes" (
        "weight"       = interface "flake_weight",
        "scale"        = interface "flake_scale",
        "perturbation" = interface "flake_strength",
        "density"      = interface "flake_density",
        "type"         = interface "flake_type",
        "cell_style"   = interface "flake_cell_style",
        "circle_size"  = interface "flake_circle_size"
    )

    shader "flakes_gloss"  "mila_glossy_reflection" (
        "tint"         = interface "flake_color",
        "roughness"    = interface "flake_roughness",

        "direct"       = interface "direct",
        "indirect"     = interface "indirect"
    )

    shader "glossy_paint" "mila_glossy_reflection" (
        "tint"         = interface "glossy_color",
        "roughness"    = interface "glossy_roughness",
        "direct"       = interface "direct",
        "indirect"     = interface "indirect"
    )
    
    shader "edge_diffuse" "mila_diffuse_reflection" (
        "tint"         = interface "edge_color",
        "direct"       = interface "direct",
        "indirect"     = interface "indirect"
    )

    shader "main_diffuse" "mila_diffuse_reflection" (
        "tint"         = interface "tint",
        "direct"       = interface "direct",
        "indirect"     = interface "indirect"
    )

    shader "base_layer" "mila_layer" (
        "layers" [{
            "shader"               "flakes_gloss",
            "weight"               = "flakes.visibility",
            "weight_tint"          1 1 1,
            "bump"                 = "flakes.normal",
            "on" on
        },
        {
            "shader"               "glossy_paint",
            "weight"               = interface "glossy_weight",
            "weight_tint"          1 1 1,
            "on" on
        },
        {
            "shader"               "edge_diffuse",
            "weight"               = interface "edge_weight",
            "weight_tint"          1 1 1,
            "use_directional_weight" on,
            "directional_weight_mode" 1,
            "normal_reflectivity"  0.0,
            "grazing_reflectivity" 1.0,
            "exponent"  = interface "edge_color_bias",
            "on" on
        },
        {
            "shader"               "main_diffuse",
            "weight_tint"          1 1 1,
            "weight"               1,
            "on" on
        }]
    )

    root = "base_layer"
    version 1
end declare

declare phenomenon color
    "mila_layer_transmissive" (

        color   "tint"               default 1.0 1.0 1.0 1.0,

        # Glossy
        scalar  "reflective_weight"  default 1.0, #: min 0 max 1
        scalar  "roughness"          default 0.4, #: min 0 max 1
        scalar  "ior"                default 1.5, #: min 0 softmin 1 max 10 softmax 2

        # Additional Glossy
        scalar  "anisotropy"         default 1.0,
        scalar  "aniso_angle"        default 0.0,
        integer "aniso_channel"      default -1,

        # Transmission reuses ior, roughness, anisotropy

        scalar  "direct"             default 1.0, #: min 0 max 1
        scalar  "indirect"           default 1.0  #: min 0 max 1
    )
    shader "glossy_reflection" "mila_glossy_reflection" (
        "tint"               = interface "tint",
        "roughness"          = interface "roughness",
        "anisotropy"         = interface "anisotropy",
        "aniso_angle"        = interface "aniso_angle",
        "aniso_channel"      = interface "aniso_channel",
        "direct"             = interface "direct",
        "indirect"           = interface "indirect"
    )
            
    shader "glossy_transmission" "mila_glossy_transmission" (
        "tint"               = interface "tint",
        "roughness"          = interface "roughness",
        "ior"                = interface "ior",
        "anisotropy"         = interface "anisotropy",
        "aniso_angle"        = interface "aniso_angle",
        "aniso_channel"      = interface "aniso_channel",

        "direct"             = interface "direct",
        "indirect"           = interface "indirect"
    )

    shader "base_layer" "mila_layer" (
        "layers" [{
            "shader" "glossy_reflection",
            "on" on,
            "weight"      = interface "reflective_weight",
            "weight_tint" 1 1 1 1,
            "use_directional_weight" on,
            "directional_weight_mode" 0,
            "ior"         = interface "ior"
        },
        {
            "shader" "glossy_transmission",
            "on" on,
            "weight"      1.0, 
            "weight_tint" 1 1 1 1
        }]
    )
    root = "base_layer"
    version 1
end declare

declare phenomenon color
    "mila_layer_transmissive_distance" (

        color   "tint"               default 1.0 1.0 1.0 1.0,

        scalar  "max_dist"           default 2.0, #: min 0 softmax 5
#        color   "max_dist_color"     default 0.7 0.7 0.7 1.0,

        # Glossy
        scalar  "reflective_weight"  default 1.0, #: min 0 max 1
        scalar  "roughness"          default 0.4, #: min 0 max 1
        scalar  "ior"                default 1.5, #: min 0 softmin 1 max 10 softmax 2
                
        # Transmission reuses ior, roughness, anisotropy

        scalar  "direct"             default 1.0, #: min 0 max 1
        scalar  "indirect"           default 1.0 #: min 0 max 1
    )
    shader "glossy_reflection" "mila_glossy_reflection" (
        "tint"               1 1 1 1, #= interface "tint",
        "roughness"          = interface "roughness",
        "anisotropy"         0,
        "use_max_dist"       on,
        "max_dist"           = interface "max_dist",
        "use_max_dist_color" on,
        "max_dist_color"     = interface "max_dist_color",

        "direct"             = interface "direct",
        "indirect"           = interface "indirect"
    )
           
    shader "glossy_transmission" "mila_glossy_transmission" (
        "tint"               1 1 1 1, #= interface "tint",
        "roughness"          = interface "roughness",
        "ior"                = interface "ior",
        "anisotropy"         0,
        "use_max_dist"       on,
        "max_dist"           = interface "max_dist",
        "use_max_dist_color" on,
        "max_dist_color"     = interface "tint", # "max_dist_color",

        "direct"             = interface "direct",
        "indirect"           = interface "indirect"
    )

    shader "base_layer" "mila_layer" (
        "layers" [{
            "shader" "glossy_reflection",
            "on" on,
            "weight"      = interface "reflective_weight",
            "weight_tint" 1 1 1 1,
            "use_directional_weight" on,
            "directional_weight_mode" 0,
            "ior"         = interface "ior"
        },
        {
            "shader" "glossy_transmission",
            "on" on,
            "weight"      1.0, 
            "weight_tint" 1 1 1 1
        }]
    )
    root = "base_layer"
    version 1
end declare

declare phenomenon color
    "mila_layer_transmissive_clear" (

        color   "tint"               default 1.0 1.0 1.0 1.0,

        # Specular
        scalar  "reflective_weight"  default 1.0, #: min 0 max 1
        scalar  "ior"                default 1.5, #: min 0 softmin 1 max 10 softmax 2

        scalar  "direct"             default 1.0, #: min 0 max 1
        scalar  "indirect"           default 1.0  #: min 0 max 1
    )
    shader "specular_reflection" "mila_specular_reflection" (
        "tint"               = interface "tint",
        "direct"             = interface "direct",
        "indirect"           = interface "indirect"
    )
            
    shader "specular_transmission" "mila_specular_transmission" (
        "tint"               = interface "tint",
        "ior"                = interface "ior",
        "direct"             = interface "direct",
        "indirect"           = interface "indirect"
    )

    shader "base_layer" "mila_layer" (
        "layers" [{
            "shader" "specular_reflection",
            "on" on,
            "weight"      = interface "reflective_weight",
            "weight_tint" 1 1 1 1,
            "use_directional_weight" on,
            "directional_weight_mode" 0,
            "ior"         = interface "ior"
        },
        {
            "shader" "specular_transmission",
            "on" on,
            "weight"      1.0, 
            "weight_tint" 1 1 1 1
        }]
    )
    root = "base_layer"
    version 1
end declare

declare phenomenon color
    "mila_mix_subsurface_scatter" (

        # diffuse
        color   "tint"                 default 0.7 0.7 0.7 1.0,
        scalar  "roughness"            default 0.0,
        scalar  "diffuse_weight"       default 0.1, #: min 0 max 1

        # scatter
        scalar  "front_weight"         default 1.0,
        color   "front_color"          default 1.0 0.5 0.25,
        #vector  "front_distance"       default 20 20 20,
        
        scalar  "back_weight"          default 1.0,
        color   "back_color"           default 1.0 0.5 0.25,
        #vector  "back_distance"        default 20 20 20,
        scalar  "back_depth",        # unassigned (zero) means "same as radius"
        
        scalar  "sampling_dist_mult" default 2.0,
        
        #scalar  "light_storage_gamma"  default 0.75,
        scalar  "scale_conversion"      default 1.0,
        
        integer "resolution"           default 1,

        #
        scalar  "direct"               default 1.0, #: min 0 max 1
        scalar  "indirect"             default 1.0  #: min 0 max 1
    )
            
    shader "scatter" "mila_scatter" (
        "front_tint"           = interface "tint",
        "front_weight"         = interface "front_weight",
        "front_radius"         20 20 20,
        "front_radius_mod"     = interface "front_color",
        "back_tint"            = interface "tint",
        "back_weight"          = interface "back_weight",
        "back_radius"          20 20 20,
        "back_radius_mod"      = interface "back_color",
        "back_depth"           = interface "back_depth",
        "sampling_radius_mult" = interface "sampling_dist_mult",
        "scale_conversion"     = interface "scale_conversion",
        "resolution"           = interface "resolution",
 
        "direct"               = interface "direct",
        "indirect"             = interface "indirect"
    )
    shader "diffuse_reflection" "mila_diffuse_reflection" (
        "tint"               = interface "tint",
        "roughness"          = interface "roughness",

        "direct"             = interface "direct",
        "indirect"           = interface "indirect"
    )
    shader "base_mix" "mila_mix" (
        "clamp" on,
        "components" [{
            "shader" "diffuse_reflection",
            "on" on,
            "weight"  = interface "diffuse_weight",
            "weight_tint" 1 1 1
        },
        {
            "shader" "scatter",
            "on" on,
            "weight" 1,
            "weight_tint" 1 1 1
        }]
    )
    root = "base_mix"
    version 1
end declare

declare phenomenon color
    "mila_mix_translucent" (

        color   "tint"               default 0.7 0.7 0.7 1.0,
        scalar  "roughness"          default 0.0, #: min 0 max 1
        scalar  "diffuse_weight"     default 0.1, #: min 0 max 1

        #
        scalar  "direct"             default 1.0, #: min 0 max 1
        scalar  "indirect"           default 1.0  #: min 0 max 1
    )
            
    shader "diffuse_transmission" "mila_diffuse_transmission" (
        "tint"               = interface "tint",
        "roughness"          = interface "roughness",

        "direct"             = interface "direct",
        "indirect"           = interface "indirect"
    )
    shader "diffuse_reflection" "mila_diffuse_reflection" (
        "tint"               = interface "tint",
        "roughness"          = interface "roughness",

        "direct"             = interface "direct",
        "indirect"           = interface "indirect"
    )
    shader "base_mix" "mila_mix" (
        "clamp" on,
        "components" [{
            "shader" "diffuse_reflection",
            "on" on,
            "weight"  = interface "diffuse_weight",
            "weight_tint" 1 1 1
        },
        {
            "shader" "diffuse_transmission",
            "on" on,
            "weight" 1,
            "weight_tint" 1 1 1
        }]
    )
    root = "base_mix"
    version 1
end declare

declare phenomenon color
    "mila_mix_glossy_reflection" (

        color   "tint"               default 1.0 1.0 1.0 1.0,

        # 
        scalar  "weight1"            default 0.3, #: min 0 max 1
        scalar  "roughness1"         default 0.3, #: min 0 max 1        # 
        scalar  "weight2"            default 0.3, #: min 0 max 1
        scalar  "roughness2"         default 0.4, #: min 0 max 1        # 
        scalar  "weight3"            default 0.4, #: min 0 max 1
        scalar  "roughness3"         default 0.5, #: min 0 max 1        # 

        scalar  "direct"             default 1.0, #: min 0 max 1
        scalar  "indirect"           default 1.0  #: min 0 max 1
    )

    shader "glossy_reflection1" "mila_glossy_reflection" (
        "tint"               = interface "tint",
        "roughness"          = interface "roughness1",
        "anisotropy"         0,
        "direct"             = interface "direct",
        "indirect"           = interface "indirect"
        )

    shader "glossy_reflection2" "mila_glossy_reflection" (
        "tint"               = interface "tint",
        "roughness"          = interface "roughness2",
        "anisotropy"         0,
        "direct"             = interface "direct",
        "indirect"           = interface "indirect"
        )
    shader "glossy_reflection3" "mila_glossy_reflection" (
        "tint"               = interface "tint",
        "roughness"          = interface "roughness3",
        "anisotropy"         0,
        "direct"             = interface "direct",
        "indirect"           = interface "indirect"
        )
            
    shader "base_mix" "mila_mix" (
        "clamp" on,
        "components" [{
            "shader" "glossy_reflection1",
            "on" on,
            "weight"  = interface "weight1",
            "weight_tint" 1 1 1
        },
        {
            "shader" "glossy_reflection2",
            "on" on,
            "weight" = interface "weight2",
            "weight_tint" 1 1 1
        },
        {
            "shader" "glossy_reflection3",
            "on" on,
            "weight" = interface "weight3",
            "weight_tint" 1 1 1
        }]
    )
    root = "base_mix"
    version 1
end declare

$endif # "layering_phen_mi_included"

