Shader

Object Hierarchy | Related C++ Class: Shader

Inheritance

SIObject

ProjectItem

Shader

Introduced

v1.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 AddICEAttribute AddProperty AddScriptedOp
AddScriptedOpFromFile AddSharedTextureLayer AnimatedParameters2 BelongsTo operator
CodePath CodeText CreateTextureLayer EvaluateAt
GetAllShaders GetICEAttributeFromName GetPortDisplayName GetShaderContainer
GetShaderInputType GetShaderParameterTargets GetShaderParameterType HasRenderer
IsA IsAnimated2 IsClassOf operator IsEqualTo operator
IsKindOf IsLocked operator IsSelected operator LockOwners
PutPortDisplayName RemoveICEAttribute RemoveTextureLayer RendererOptionValue
SetAsSelected operator SetCapabilityFlag operator SetLock SymbolName
TaggedParameters UnSetLock    
       

Properties

AllImageClips Application BranchFlag operator Capabilities operator
Categories EvaluationID Families operator FullName operator
Help HierarchicalEvaluationID ICEAttributes ImageClips
LockLevel operator LockMasters operator LockType operator Model
Name operator NestedObjects ObjectID Origin
OriginPath OutputType Owners PPGLayout operator
Parameters operator Parent Parent3DObject ProgID
Properties Root Selected operator ShaderDef operator
ShaderType Shaders TextureLayers Type operator

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