## Define (Shader)

### Description

Defines the shader definition, including all parameters that underlie the controls on the property page. This is where you define the number of parameters, their type, any defaults, value limitations, and so on.

This callback is fired the first time a shader is initialized. Once the definition is intialized, the shader definition is in the system and does not need to be redefined.

### Applies To

Custom Shaders

### Syntax

    public class <plugin-item_name>
    {
            public bool Define( Context in_context )
            {
                    ...
            }
    }

    CStatus <plugin-item_name>_Define( CRef& in_context )
    {
            ...
    }

    function <plugin-item_name>_Define( in_context )
    {
            ...
    }

    def <plugin-item_name>_Define( in_context ):
            ...

    Function <plugin-item_name>_Define( in_context )
            ...
    End Function

    sub <plugin-item_name>_Define
    {
            my $in_context = shift;
    }

<plugin-item-name> is a special string constructed from the plug-in name, the name specified in the call to PluginRegistrar.RegisterShader, and the major and minor version numbers, with any spaces converted to underscores. For example, if you register a shader definition in a plug-in called "MyPlugin" with the shader class name "My Shader", and the version number 1.0, the callback function names start with "MyPlugin_My_Shader_1_0".

### Parameters

Parameter | Language | Type | Description
--- | --- | --- | ---
in_context | Scripting and C# | Context | Context.GetAttribute("Definition") returns the ShaderDef.
| C++ | CRef& | Context::GetAttribute("Definition") returns a reference to the ShaderDef.

### Context Attributes

Attribute | Get/Set | Description
--- | --- | ---
Definition | Returns or sets a ShaderDef | The shader definition to populate/query.
Errors | Returns a String or CString | The parser can output parse errors.
Warnings | Returns a String or CString | The parser can output parse warnings.

### Example

    SICALLBACK UtShaderPlugin_ColorShare_1_0_Define( CRef& in_ctxt  )
    {
            XSI::Context ctxt(in_ctxt);
            XSI::ShaderDef shaderDef = ctxt.GetAttribute( L"Definition" );

            // Check if the user attribute is there
            {
                    CValue valDune = shaderDef.GetAttributes().GetAttribute( L"{F2EF07FE-1B57-4245-BF08-F5556212BFDF}" );
                    assert( !valDune.IsEmpty() );
            }

            // Define PassThrough ports
            definePassThroughPorts( shaderDef, XSI::siColorParameterType );

            // Fill Meta shader section
            {
                    shaderDef.AddType( L"texture" );

                    MetaShaderRendererDef rendererDef = shaderDef.AddRendererDef( L"Mental Ray");
                    assert( rendererDef.IsValid() );
                    rendererDef.PutSymbolName( L"sib_color_passthrough" );
                    rendererDef.PutCodePath( L"{LIBS}/sibase.{EXT}" );
                    rendererDef.GetRendererOptions().SetAttribute( L"version", CValue((LONG)1) );
            }

            return CStatus::OK;
    }

    // Helper function
    void definePassThroughPorts( ShaderDef& in_ShaderDef, XSI::siShaderParameterType in_eParamType )
    {
            XSI::Application app;
            XSI::Factory fact=app.GetFactory();

            XSI::ShaderParamDefOptions optDefault= fact.CreateShaderParamDefOptions();
            optDefault.SetTexturable(true);

            ShaderParamDefOptions opt= fact.CreateShaderParamDefOptions();
            opt.SetTexturable(true);

            // Add input + 8 channels + output
            if( in_eParamType==XSI::siColorParameterType )
            {
                    XSI::CValueArray valArray;
                    valArray.Add( 0.5f );
                    valArray.Add( 0.5f );
                    valArray.Add( 0.5f );
                    valArray.Add( 1.0f );
                    optDefault.SetDefaultValue( valArray );
            }

            XSI::ShaderParamDef pdef;
            pdef = in_ShaderDef.GetInputParamDefs().AddParamDef( L"input", in_eParamType, optDefault );
            pdef = in_ShaderDef.GetInputParamDefs().AddParamDef( L"channel1", in_eParamType, opt );
            pdef = in_ShaderDef.GetInputParamDefs().AddParamDef( L"channel2", in_eParamType, opt );
            pdef = in_ShaderDef.GetInputParamDefs().AddParamDef( L"channel3", in_eParamType, opt );
            pdef = in_ShaderDef.GetInputParamDefs().AddParamDef( L"channel4", in_eParamType, opt );
            pdef = in_ShaderDef.GetInputParamDefs().AddParamDef( L"channel5", in_eParamType, opt );
            pdef = in_ShaderDef.GetInputParamDefs().AddParamDef( L"channel6", in_eParamType, opt );
            pdef = in_ShaderDef.GetInputParamDefs().AddParamDef( L"channel7", in_eParamType, opt );
            pdef = in_ShaderDef.GetInputParamDefs().AddParamDef( L"channel8", in_eParamType, opt );
            pdef = in_ShaderDef.GetOutputParamDefs().AddParamDef( L"out_result", in_eParamType );

            // Get the ShaderDefs Layouts
            XSI::PPGLayout layoutPPG = in_ShaderDef.GetPPGLayout();
            XSI::PPGLayout layoutRT = in_ShaderDef.GetRenderTreeLayout();

            // Define the PPG Layout.. only input should be visible
            layoutPPG.AddItem( L"name", L"Name" );
            layoutPPG.AddItem( L"input", L"Input" );

            // Define the RT Layout.. input alone, then all the channels in a group
            {
                    layoutRT.AddItem( L"input", L"Input" );
                    layoutRT.AddGroup( L"Channels", false );
                            layoutRT.AddItem( L"channel1", L"Channel 1" );
                            layoutRT.AddItem( L"channel2", L"Channel 2" );
                            layoutRT.AddItem( L"channel3", L"Channel 3" );
                            layoutRT.AddItem( L"channel4", L"Channel 4" );
                            layoutRT.AddItem( L"channel5", L"Channel 5" );
                            layoutRT.AddItem( L"channel6", L"Channel 6" );
                            layoutRT.AddItem( L"channel7", L"Channel 7" );
                            layoutRT.AddItem( L"channel8", L"Channel 8" );
                    layoutRT.EndGroup();
            }
    }

### See Also

- PluginRegistrar.RegisterShader
- DefineInfo
- Shader Callbacks