Parameter.HasInstanceValue

Introduced

v5.0

Description

Returns a Boolean value indicating whether the parameter is an instance value (true) or not (false). An instance parameter is a parameter belonging to an object that can be shared but which can have a unique value for each place that it is shared.

Instance values include: ImageShader.tspace_id, Material.ImageClipName, Material.UV, Material.CAV. For example, the material is owned by the MaterialLibrary but may be used by many objects. Each object may have a unique value for the ImageShader.tspace_id parameter.

C# Syntax

// get accessor
Boolean rtn = Parameter.HasInstanceValue;

Examples

JScript Example

/*
	This example illustrates how to detect all parameters that support instance values 
	and determine which parameters are currently in use based on the usage of the material.
	Parameters with instances values include: ImageShader.tspace_id, Material.ImageClipName, 
	Material.UV, Material.CAV.
*/
NewScene( null, false );
// Create an object with its own material
var cube = Application.ActiveSceneRoot.AddGeometry( "Cube", "MeshSurface", "MyCube" );
var mat = cube.AddMaterial( "Blinn", false, "MyMaterial" );
// Create an object with a material on a polygon cluster
var torus = Application.ActiveSceneRoot.AddGeometry( "Torus", "MeshSurface", "MyTorus" );
var cluster = torus.ActivePrimitive.Geometry.AddCluster( siPolygonCluster, "MyPolygonCluster" );
var clsmat = cluster.AddMaterial( "Phong", false, "MyMaterialOnCluster" );
// This object will get the material from the scene root.
var sphere = Application.ActiveSceneRoot.AddGeometry( "Sphere", "MeshSurface", "MySphere" );
// Create an unused material
SICreateMaterial( "Lambert", "UnusedMaterial"  );
var matlib = Application.ActiveProject.ActiveScene.ActiveMaterialLibrary;
for ( var i = 0; i < matlib.Items.Count; i++ )
{
	var mat = matlib.Items(i);
	if ( mat.UsedBy.Count == 0 )
	{
		Application.LogMessage( mat.fullname + " is unused" );
		continue;
	}
	for ( var j = 0; j < mat.Parameters.Count; j++ )
	{
		var param = mat.Parameters(j);
		if ( param.HasInstanceValue )
		{
			var colUsedBy = XSIFactory.CreateObject( "XSI.Collection" );
			colUsedBy.AddItems( mat.UsedBy );
			colUsedBy.RemoveItems( Application.ActiveSceneRoot );
			// Don't consider scene material in use - if there are no renderable objects.
			if ( colUsedBy.Count == 0 )
				Application.LogMessage( param.FullName + " belongs to the scene material and is currently unused" );
			else
				Application.LogMessage( param.FullName + " is an instance value and is being used by " 
								+ colUsedBy.GetAsText() );
		}	
	}
}
// Expected results:
//INFO : Sources.Materials.DefaultLib.Scene_Material.CAV is an instance value and is being used by MyTorus,MySphere
//INFO : Sources.Materials.DefaultLib.Scene_Material.UV is an instance value and is being used by MyTorus,MySphere
//INFO : Sources.Materials.DefaultLib.Material.CAV is an instance value and is being used by MyCube
//INFO : Sources.Materials.DefaultLib.Material.UV is an instance value and is being used by MyCube
//INFO : Sources.Materials.DefaultLib.Material1.CAV is an instance value and is being used by MyTorus.polymsh.cls.MyPolygonCluster
//INFO : Sources.Materials.DefaultLib.Material1.UV is an instance value and is being used by MyTorus.polymsh.cls.MyPolygonCluster
//INFO : Sources.Materials.DefaultLib.UnusedMaterial is unused