## Shader.Root

### Introduced

v5.0

### Description

Returns the root of the shader tree, which may be a Material, Light, or Camera.

### C# Syntax

    // get accessor
    Object rtn = Shader.Root;

### Examples

#### JScript Example

    /*
            This example shows how to find the material from a shader even when the
            shader is buried deeply in a shader tree.
    */
    // Create an object with a texture shader
    newscene(null,false);
    var root = Application.ActiveProject.ActiveScene.Root;
    var model = root.AddModel();
    model.name = "MyModel";
    var sphere = model.AddGeometry( "Sphere", "MeshSurface" );
    var grid = model.AddGeometry( "Grid", "MeshSurface" );
    var col = XSIFactory.CreateObject("XSI.Collection");
    col.add(sphere);
    col.add(grid);
    BlendInPresets( "Image", col, false, false );
    CreateProjection( col, siTxtSpherical, siTxtDefaultSpherical, "TxtSupport", "TxtProjection" );
    var filename = Application.InstallationPath( siFactoryPath ) +
            "\\Data\\XSI_SAMPLES\\Pictures\\xsilogo.jpg";
    var imageclip = CreateImageClip( filename, "XSILogo" );
    // Set up the texture space on texture shader
    var mat = sphere.Material;
    var textureshader = sphere.Material.CurrentTexture;
    // Set the texturespace parameter
    textureshader.parameters("tspace_id").Value = "TxtProjection";
    textureshader.parameters("tex").Connect(imageclip);
    // Select the texture shader
    SelectObj("MyModel.sphere.Scene_Material.Phong.ambient_blend.Image", null, null);
    // Get the sphere from the selection list
    var obj = selection(0);
    // Set up the sharee material with a specific txtuv for the sphere.
    if ( obj.isclassof( siShaderID ) )
    {
            var tspace_id = obj.parameters("tspace_id");
            var tex = obj.parameters("tex");
            if ( tspace_id && tex )
            {
                    // If the object has a texture shader then change the
                    // material hardware display settings to explicitly
                    // track the shader's texture uvws and image clip
                    // Get material from shader
                    var mat = obj.Root;
                    // A material may be used by many objects, just pick the first one
                    // with a uvw and image clip setting
                    var eUsedBy = new Enumerator(mat.usedby);
                    for ( ; !eUsedBy.atEnd(); eUsedBy.moveNext() )
                    {
                            var curObj = eUsedBy.item();
                            var uvw = tspace_id.getinstancevalue( curObj, true );
                            var imageclip = tex.source;
                            if ( uvw && imageclip )
                            {
                                    mat.parameters("TextureSel").value = 3; // Specific TxtUVW & ImageClip
                                    mat.parameters("UV").setinstancevalue( curObj, uvw );
                                    mat.parameters("ImageClipName").value = imageclip.name;
                            }
                    }
            }
    }
    // Log the hardware display settings for txtuvw on the scene material
    mat = ActiveSceneRoot.Material;
    var eUsedBy = new Enumerator(mat.usedby);
    var uvparam = mat.parameters("UV");
    for ( ; !eUsedBy.atEnd(); eUsedBy.moveNext() )
    {
            var curObj = eUsedBy.item();
            var uvwObj = uvparam.getinstancevalue( curObj, true );
            var uvwval = "\"\"";
            if (uvwObj!=null)
                    uvwval = uvwObj.fullname;
            logmessage( mat.fullname + " " + curObj.fullname + " " + uvwval );
    }
    //INFO : Scene_Material MyModel.sphere MyModel.sphere.polymsh.cls.Texture_Coordinates_AUTO.TxtProjection
    //INFO : Scene_Material MyModel.grid ""