FindObjects() and shaders in Softimage 2011


Update 10 Dec 2010: See this post about finding shaders using the ProgID.

In Softimage 2011, all [factory] shaders have the same Class ID ({6495C5C1-FD18-474E-9703-
AEA66631F7A7}), so FindObjects returns a collection that contains shaders in the scene.

Note that the returned collection will include the soft_light shader, as well as several hidden Lambert shaders that are used under-the-covers by Softimage.

var x = FindObjects(null, "{6495C5C1-FD18-474E-9703-AEA66631F7A7}" );
LogMessage( x.Count );

oEnum = new Enumerator( x ) ;
for (;!oEnum.atEnd();oEnum.moveNext() )
{
	var oSelItem = oEnum.item() ;
	try {
		LogMessage( oSelItem.fullname );
		i++;
		
	}
	catch(e)
	{
		LogMessage(e.message);
		LogMessage( "\t" + ClassName(oSelItem) + ":" + oSelItem.name);
		LogMessage( "\t" + oSelItem.GetShaderContainer() );
	}
}

You could filter the returned collection for a specific type of shader. For example:

// Get all shaders
var x = FindObjects(null, "{6495C5C1-FD18-474E-9703-AEA66631F7A7}" );
LogMessage( x.Count );
var oShaderCollection = new ActiveXObject( "XSI.Collection" );

// Build up a collection of all Blinn shaders
oEnum = new Enumerator( x ) ;
for (;!oEnum.atEnd();oEnum.moveNext() )
{
	var oShader = oEnum.item() ;
	try {
		//LogMessage( oShader.ProgID );
		if ( oShader.ProgID == "Softimage.material-blinn.1.0" )
		{
			oShaderCollection.Add( oShader );
		}
		
	}
	catch(e)
	{
		LogMessage(e.message);
	}
}