To get this script to work in 2011 and later, you need to do this to find the Blinn shaders:
// Get a collection of all Blinn nodes
var sProgID = "Softimage.material-blinn.1.0"
var oShaderDef = Application.GetShaderDef( sProgID ) ;
var oBlinnCollection = oShaderDef.ShaderInstances ;
if (debug) LogMessage( "Found " + oBlinnCollection.Count + " Blinn shaders" );
The rest of the script can stay the same.
Note: I split the script into two parts below, for the purposes of this blog post. Just combine them to get the full script.
Here’s a script that shows how to replace every Blinn shader in a scene with a Phong shader.
There’s other ways to do it, but I used the connection stack.
var debug = 0;
// Class ID of the Blinn shader in XSI
var sClassID = "{8FAC63AC-E392-11D1-804C-00A0C906835D}";
SetValue("preferences.scripting.cmdlog", false, null);
// Get a collection of all Blinn nodes
var oBlinnCollection = FindObjects( null, sClassID );
if (debug) LogMessage( "Found " + oBlinnCollection.Count + " Blinn shaders" );
// Loop over the Blinn collection and replace all Blinn nodes with Phongs
var s = new Date();
oEnum = new Enumerator( oBlinnCollection ) ;
for (;!oEnum.atEnd();oEnum.moveNext() )
{
var oBlinn = oEnum.item() ;
// try catch will skip over any TransientObjectContainer.Blinn shaders we find
try
{
var oMaterial = oBlinn.Owners(0);
}
catch(e)
{
LogMessage( "Skipping " + oBlinn );
continue;
}
LogMessage( "Replacing " + oBlinn );
blinn2phong( oMaterial, oBlinn );
}
var e = new Date();
LogMessage( "Finished replacing Blinn shaders. Elapsed time: " + (e-s)/1000 + "s" );
function blinn2phong( oMaterial, oBlinn )
{
// Create a new Phong node
var oPhong = CreateShaderFromPreset("$XSI_DSPRESETS\\Shaders\\Material\\Phong.Preset", oMaterial, null);
// Get the node connections from the ConnectionStack
// And then insert the Phong node
var oDR = XSIUtils.DataRepository ;
var strOpInfo = oDR.GetConnectionStackInfo( oBlinn );
var oTopNode = ParseXML( strOpInfo ) ;
var oConnections = oTopNode.childNodes ;
if ( oConnections.length == 0 )
{
LogMessage( "Cannot replace the Blinn node " + oBlinn + " .It has no connections." );
}
else
{
for ( var i = 0 ; i < oConnections.length ; i++ )
{
var oConnection = oConnections(i) ;
strtype = SafeGetNodeValue( oConnection, "type", "Unknown" ) ;
strobj = SafeGetNodeValue( oConnection, "object", "Not Connected" ) ;
localparam = SafeGetNodeValue( oConnection, "localparameter", " " ) ;
destparam = SafeGetNodeValue( oConnection, "remoteparameter", " " ) ;
if ( strtype == "in" )
{
var oParam = oPhong.Parameters( localparam );
if ( oParam == null )
{
LogMessage( "Cannot connect " + strobj + " to Phong." + localparam + ". That parameter does not exist.", siWarning );
}
else
{
//SIConnectShaderToCnxPoint("Sources.Materials.Proteus_Body_MatLib_Proteus.MAT_Brass11.Image5", oPhong + ".ambient", false);
SIConnectShaderToCnxPoint( strobj, oParam );
if( debug ) LogMessage( "IN: " + strobj + ", " + oParam );
}
}
if ( strtype == "out" )
{
var oTarget = Dictionary.GetObject( strobj );
var oParam = oTarget.Parameters( destparam );
//SIConnectShaderToCnxPoint("Sources.Materials.Proteus_Body_MatLib_Proteus.MAT_Brass11.Phong1", "Sources.Materials.Proteus_Body_MatLib_Proteus.MAT_Brass11.Mix_2colors.base_color", false);
SIConnectShaderToCnxPoint( oPhong, oParam );
if( debug ) LogMessage( "OUT: " + oPhong + ", " + oParam );
}
}
}
}
The bling2phong() function is based on the code that builds this HTML page in the SDK Explorer:

Notice how the Connection Stack Details give you everything you need to replace a Blinn node with some other node in the render tree:

See below the cut for the code for the helper functions ParseXML() and SafeGetNodeValue().
Continue reading →