source "renderLayerBuiltinPreset.mel";

//****************************************************************************
// Define a function that adds to the renderLayer presets.
//
//****************************************************************************
proc mrApplyOcclusion(string $node)
//
// Description:
//      Procedure to apply the built-in occlusion preset to a layer.
//
{
    // Set renderer
    miLoadMayatomr();
    miCreateDefaultNodes();
    string $renderer = getLayerRenderer($node);
    if ($renderer != "mentalRay") {
        setLayerString($node, "defaultRenderGlobals.currentRenderer", "mentalRay");
    }
    
    // Set render globals
    setLayerInt($node, "defaultRenderGlobals.enableDefaultLight", off);
    setLayerInt($node, "miDefaultOptions.minSamples", 0);
    setLayerInt($node, "miDefaultOptions.maxSamples", 2);
    setLayerInt($node, "miDefaultOptions.filter", 1); // triangle
    setLayerFloat($node, "miDefaultOptions.filterWidth", 1.0);
    setLayerFloat($node, "miDefaultOptions.filterHeight", 1.0);
    setLayerFloat($node, "miDefaultOptions.contrastR", 0.02);
    setLayerFloat($node, "miDefaultOptions.contrastG", 0.02);
    setLayerFloat($node, "miDefaultOptions.contrastB", 0.02);
    setLayerFloat($node, "miDefaultOptions.contrastA", 0.02);
    setLayerInt($node, "miDefaultOptions.rayTracing", on);
    setLayerInt($node, "miDefaultOptions.maxReflectionRays", 1);
    setLayerInt($node, "miDefaultOptions.maxRefractionRays", 1);
    setLayerInt($node, "miDefaultOptions.maxRayDepth", 1);
    setLayerInt($node, "miDefaultOptions.maxShadowRayDepth", 2);
    
    // Camera background color
    string $cameras[] = `listCameras`;
    for ($camera in $cameras) {
        setLayerFloat3($node, ($camera+".backgroundColor"), 1.0, 1.0, 1.0);
    }

    // Create shader override
    string $tex = `mrCreateCustomNode -asTexture "" mib_amb_occlusion`;
    string $sdr = `shadingNode -asShader surfaceShader`;
    string $set = `sets -renderable true -noSurfaceShader true -empty`;
    connectAttr ($tex+".outValue") ($sdr+".outColor");
    connectAttr ($sdr+".outColor") ($set+".surfaceShader");
    connectAttr -f ($set+".message") ($node+".shadingGroupOverride");
}

proc mrApplyNormal(string $node)
//
// Description:
//      Procedure to apply the built-in occlusion preset to a layer.
//
{
    // Set renderer
    miLoadMayatomr();
    miCreateDefaultNodes();
    string $renderer = getLayerRenderer($node);
    if ($renderer != "mentalRay") {
        setLayerString($node, "defaultRenderGlobals.currentRenderer", "mentalRay");
    }
    
    // Set render globals
    setLayerInt($node, "defaultRenderGlobals.enableDefaultLight", off);
    setLayerInt($node, "miDefaultOptions.minSamples", 0);
    setLayerInt($node, "miDefaultOptions.maxSamples", 2);
    setLayerInt($node, "miDefaultOptions.filter", 1); // triangle
    setLayerFloat($node, "miDefaultOptions.filterWidth", 2.0);
    setLayerFloat($node, "miDefaultOptions.filterHeight", 2.0);
    setLayerFloat($node, "miDefaultOptions.contrastR", 0.02);
    setLayerFloat($node, "miDefaultOptions.contrastG", 0.02);
    setLayerFloat($node, "miDefaultOptions.contrastB", 0.02);
    setLayerFloat($node, "miDefaultOptions.contrastA", 0.02);
    setLayerInt($node, "miDefaultOptions.rayTracing", 0);
    setLayerInt($node, "miDefaultOptions.maxReflectionRays", 1);
    setLayerInt($node, "miDefaultOptions.maxRefractionRays", 1);
    setLayerInt($node, "miDefaultOptions.maxRayDepth", 1);
    setLayerInt($node, "miDefaultOptions.maxShadowRayDepth", 2);
    
    // Camera background color
    string $cameras[] = `listCameras`;
    for ($camera in $cameras) {
        setLayerFloat3($node, ($camera+".backgroundColor"), 1.0, 1.0, 1.0);
    }

    // Create shader override
    string $tex = `mrCreateCustomNode -asTexture "" mib_amb_occlusion`;
    string $sdr = `shadingNode -asShader surfaceShader`;
    string $set = `sets -renderable true -noSurfaceShader true -empty`;
    connectAttr ($tex+".outValue") ($sdr+".outColor");
    connectAttr ($sdr+".outColor") ($set+".surfaceShader");
    connectAttr -f ($set+".message") ($node+".shadingGroupOverride");
    setAttr ($tex+".output_mode") 3;
}

global proc mrRenderLayerBuiltinPreset(string $name, string $node)
{
    if ($name == "occlusion") {
        mrApplyOcclusion($node);
    }
    else if ($name == "normal") {
        mrApplyNormal($node);
    }
    else {
	    string $msgFormat = getPluginResource("Mayatomr", "kUnknownMentalrayPreset");
        error (`format -s $name $msgFormat`);
    }
}

global proc mrRenderLayerPresetMenu(string $node)
{
	menuItem -label (getPluginResource("Mayatomr", "kmrRenderlayerPresMenuOcclusion")) 
		-command ("mrRenderLayerBuiltinPreset occlusion "+$node);

	menuItem -label (getPluginResource("Mayatomr", "kNormalMap")) 
		-command ("mrRenderLayerBuiltinPreset normal "+$node);
}

