Shader

Object Hierarchy | Related C++ Class: Shader

Inheritance

SIObject
   ProjectItem
       Shader

Introduced

1.5

Description

The Shader object represents a node in the render tree of an object. The initial Shader of a render tree can be created with SceneItem.AddMaterial and additional shaders can be created and connected together with Parameter.ConnectFromPreset and Parameter.Connect.

A Shader is a type of DataSource.

Methods

AddCustomOp

AddProperty

AddScriptedOp

AddScriptedOpFromFile

AddSharedTextureLayer

AnimatedParameters2

BelongsTo

CodePath

CodeText

CreateTextureLayer

EvaluateAt

GetAllShaders

GetICEAttributeFromName

GetPortDisplayName

GetShaderContainer

GetShaderInputType

GetShaderParameterTargets

GetShaderParameterType

HasRenderer

IsA

IsAnimated2

IsClassOf

IsEqualTo

IsKindOf

IsLocked

IsSelected

LockOwners

PutPortDisplayName

RemoveTextureLayer

RendererOptionValue

SetAsSelected

SetCapabilityFlag

SetLock

SymbolName

TaggedParameters

UnSetLock

Properties

AllImageClips

Application

BranchFlag

Capabilities

Categories

Families

FullName

Help

ICEAttributes

ImageClips

LockLevel

LockMasters

LockType

Model

Name

NestedObjects

ObjectID

Origin

OriginPath

OutputType

Owners

Parameters

Parent

Parent3DObject

PPGLayout

ProgID

Properties

Root

Selected

Shaders

ShaderType

TextureLayers

Type

 

 

 

Examples

1. VBScript Example

'
'  This example shows how to access the shader on an object
'
NewScene , false
dim root, grid

set root = ActiveProject.ActiveScene.Root
set grid = root.AddGeometry("Grid", "MeshSurface")

'Create a Lambert shader
grid.AddMaterial "Lambert" 

'Access the new Shader
LogMessage "Shader name:" & grid.Material.Shaders(0).Name

2. VBScript Example

'
'  This example shows how to recursively search a render tree
'
'  It shows how to access Shaders via the Source property of a Parameter
'  It also shows how to use XSICollection object to accumulate a list of objects
'
'  Note: to find ImageClips the Material.ImageClips property can be used rather
'  a recursive scan like this.  And the FindObjects command can be used to find
'  all shaders of a particular type.
'

set oObj = BuildDemoScene ' Create a little sample render tree
FindShaders(oObj) ' Search the scene to find and log shaders

' ---------------------------------------------------
' Expected results:
' INFO : Skipping Sources.Materials.DefaultLib.Material.Phong
' INFO : SUMMARY: Searched 2 shader(s)
' INFO : SHADERS SEARCHED:
' INFO : Sources.Materials.DefaultLib.Material.Phong
' INFO : Sources.Materials.DefaultLib.Material.Lambert


' ---------------------------------------------------
' This is the actual code doing the searching
sub FindShaders( in_oObj )
   dim oShaderList, oImageClipList
   set oShaderList = CreateObject("XSI.Collection")
   oShaderList.Unique = true

   ' We expect the input object to be a "SceneItem" object
   set oMat = in_oObj.Material

   ' Although not actually a shader, we start searching
   ' for shaders from the parameters of the material
   SearchShader oMat, oShaderList
   Application.LogMessage "SUMMARY: Searched " & oShaderList.Count & " shader(s)"
   if ( oShaderList.Count > 0 ) then
       Application.LogMessage "SHADERS SEARCHED:"
       for each oShader in oShaderList
          Application.LogMessage oShader.Fullname
       next
   end if
end sub

' Recursively search any connected shaders
' Each shader is visited only once
sub SearchShader( in_oShader, io_oVisitedShaderList)
   for each oParam in in_oShader.Parameters
       if typename( oParam.Source ) = "Shader" then
          if ( NOT IsShaderInList(oParam.Source, io_oVisitedShaderList) ) then
              io_oVisitedShaderList.Add(oParam.Source)
              ' Recursively search this shader
              SearchShader oParam.Source, io_oVisitedShaderList 
          end if 
       end if
   next
end sub

' Determines if a shader is already in an XSICollection
function IsShaderInList( oShader, io_oVisitedShaderList )
   for each oVisitedShader in io_oVisitedShaderList
       if (oVisitedShader.FullName = oShader.FullName) then
          Application.LogMessage "Skipping " & oShader.FullName
          IsShaderInList = true
          exit function
       end if
   next

   IsShaderInList = false 
end function


' ---------------------------------------------------
' Create a little sample render tree
' It has no interesting visual appearance but is a render tree with
' various shaders and two images so that we can demonstrate the 
' FindImageClips routine
'
' Return value is the X3DObject
function BuildDemoScene
   ImageFile1 = XSIUtils.BuildPath(_
       Application.InstallationPath(siFactoryPath), _
       "Data", "XSI_SAMPLES", "Pictures", "jaiqua_face.jpg" )
                 
   ImageFile2 = XSIUtils.BuildPath(_ 
       Application.InstallationPath(siFactoryPath), _
       "Data", "XSI_SAMPLES", "Pictures", "ehair_08.jpg" )
                 
   NewScene , false
   set oObj = ActiveSceneRoot.AddGeometry("Sphere", "MeshSurface")
   oObj.AddMaterial "Phong" 

   dim oPhongShader, oAmbientParam, oDiffuseParam, oShinyParam
   set oPhongShader = oObj.Material.Shaders(0)
   set oAmbientParam = oPhongShader.Parameters("ambient")
   set oDiffuseParam = oPhongShader.Parameters("diffuse")
   set oShinyParam = oPhongShader.Parameters("shiny")
       
   dim oImageClip1, oImageClip2
   SICreateImageClip ImageFile1, ,oImageClip1
   SICreateImageClip ImageFile2, ,oImageClip2

   dim oImageNode1,oImageNode2
   set oImageNode1 = oAmbientParam.connectfrompreset("Image", siTextureShaderFamily)
   oDiffuseParam.Connect(oImageNode1)
   oImageNode1.Parameters("tex").Connect(oImageClip1)

   set oImageNode2 = oShinyParam.connectfrompreset("Image", siTextureShaderFamily)
   oImageNode2.Parameters("tex").Connect(oImageClip2)

   ' Commands can also be used to build a render tree
   CreateShaderFromPreset "Shaders\Material\Lambert.Preset", "Sources.Materials.DefaultLib.Material"
   SIConnectShaderToCnxPoint "Sources.Materials.DefaultLib.Material.Lambert", oObj.Material & ".Photon"

   ' Return the sphere
   set BuildDemoScene = oObj
end function

3. JScript Example

/*
   This example lists all installed shaders with their ProgId and OutputType, 
   plus all texturable parameters and their shader input type.
*/
var re = / /g;
var strShaderNames = Dictionary.info("",siShaderFamily).replace(re,"");
var aShaders = strShaderNames.split(",");
XSIUtils.QuickSort( aShaders );

var colitem = XSIFactory.CreateObject("XSI.CollectionItem");

var cShaders = 0;
for ( var i = 0; i < aShaders.length; i++ )
{
   var shader = null;
   var progid = "Softimage." + aShaders[i];

   if ( progid == "Softimage.TraversalCallback" ) continue;

   try {
       shader = XSIFactory.CreateObject( progid );
   } catch (e) {
       logmessage( "Error: can't create shader : " + progid );
       continue;
   }
   cShaders++;

   logmessage( progid + " " + ShaderParameterTypeAsText(shader.OutputType) );

   var params = shader.parameters;

   for ( var j = 0; j < params.count; j++ )
   {
       var param = shader.parameters(j);

       if ( param.capabilities & siTexturable )
          logmessage( "\t" + param.name + " " + ShaderParameterTypeAsText(shader.GetShaderInputType(param.scriptname)));
   }
}
logmessage( "Shaders found = " + cShaders );

function ShaderParameterTypeAsText(type)
{
   switch (type)
   {
       case siUnknownParameterType : return "siUnknownParameterType";
       case siBooleanParameterType : return "siBooleanParameterType";
       case siColorParameterType : return "siColorParameterType";
       case siDataParameterType : return "siDataParameterType";
       case siIntegerParameterType : return "siIntegerParameterType";
       case siLensParameterType : return "siLensParameterType";
       case siLightParameterType : return "siLightParameterType";
       case siMaterialParameterType : return "siMaterialParameterType";
       case siMatrixParameterType : return "siMatrixParameterType";
       case siModelParameterType : return "siModelParameterType";
       case siRealTimeParameterType : return "siRealTimeParameterType";
       case siReferenceParameterType : return "siReferenceParameterType";
       case siScalarParameterType : return "siScalarParameterType";
       case siShaderParameterType : return "siShaderParameterType";
       case siStringParameterType : return "siStringParameterType";
       case siStructParameterType : return "siStructParameterType";
       case siTextureParameterType : return "siTextureParameterType";
       case siTextureSpaceParameterType : return "siTextureSpaceParameterType";
       case siVectorParameterType : return "siVectorParameterType";
                 
       default: return type;
   }
}
// 

See Also

Material.Shaders

Light.Shaders

Camera.Shaders

ImageClip

Parameter.Source

Texture

TextureLayer

 



Autodesk Softimage v7.5