ChangeVertexColorDatatype
 
 
 

ChangeVertexColorDatatype

Introduced

v6.5

Description

Adds a Vertex Color Change Datatype operator on the specified VertexColor property. Vertex color properties now support two internal data representations for colors: Short (8-bits colors) or Float (32-bits). RenderMaps can be set to bake 32-bit colors into the CAVs, but the CAVs can also be changed after the fact to 8-bit or 32-bit colors. This would allow, for example, a user to write and read 32-bit precision colors in and from the CAV, using the SDK.

The Vertex Color Change Datatype operator allows you to modify the "datatype" parameter which is normally read-only, and so cannot be changed via SetValue, Parameter.Value, or Parameter.PutValue2. The JScript example below demonstrates this principle.

The DesiredDatatype input parameter is required. If the current VertexColor property already uses the desired datatype, then a warning message is logged and no operator is installed.

Typically, you call this command just once to apply the Vertex Color Change Datatype operator. Then, if you need to change the "datatype" setting again, you can just access the "desireddatatype" parameter on the operator, instead of applying another operator with this command. As the JScript example below demonstrates, if you have several operators applied on the same VertexColor property, you need to be careful that you are modifying the "desireddatatype" parameter on the correct operator.

Scripting Syntax

oReturn = ChangeVertexColorDatatype( [InputObj], DesiredDatatype, [OutputObjs] );

Return Value

An XSICollection containing the newly created Operator.

Parameters

Parameter Type Description
InputObj VertexColor by name, ClusterProperty or XSICollection VertexColor property to change

Default Value: Currently selected objects are used as the main group.

DesiredDatatype Integer Specifies the desired datatype.

Possible Values:

Description:

0 short
1 float (32 bit)
OutputObjs XSICollection of Operator object(s). Returns the new Operator in an XSICollection.

Examples

1. JScript Example

/*
        This example demonstrates how to set the read-only DataType on a VertexColor (CAV) property, including 
        avoiding some of the pitfalls of applying more than one Vertex Color Change Datatype operator.
*/
NewScene( "", false );
var obj = Application.ActiveSceneRoot.AddGeometry( "Cube", "MeshSurface" );
var VtxColors = CreateVertexColorSupport( null, null, obj );
// Get the datatype parameter (on the VertexColor property)
var DataType = VtxColors(0).Parameters("datatype");
Application.LogMessage( "Default DataType: " + DataType.Value );
// The datatype parameter is readonly
try {
        // This will throw an error
        DataType.Value = 1;
} catch(e) {
        Application.LogMessage( "Error on DataType.Value = 1: " + e.description, siWarning );
        try {
                // SetValue will also fail
                SetValue( DataType, 1 );
        } catch(f) {
                Application.LogMessage( "Error on SetValue( DataType, 1 ): " + f.description, siWarning );
        }
}
// Use the VertexColorChangeDatatype operator instead
var DataChgOps1 = ChangeVertexColorDatatype( VtxColors, 1 );
var DesiredDType1 = DataChgOps1(0).Parameters("desireddatatype");
Application.LogMessage( "DataType after 1st operator: " + DataType.Value );
// Now that you have the VertexColorChangeDatatype operator, you can 
// use its DesiredDatatype parameter to toggle back and forth
DesiredDType1.Value = 0;
Application.LogMessage( "Back to default: " + DataType.Value );
DesiredDType1.Value = 1;
Application.LogMessage( "Switched to float again: " + DataType.Value );
// However, if you try to apply another operator, only the last one 
// applied will affect the actual data type
var DataChgOps2 = ChangeVertexColorDatatype( VtxColors, 0 );
var DesiredDType2 = DataChgOps2(0).Parameters("desireddatatype");
Application.LogMessage( "DataType after 2nd operator: " + DataType.Value );
DesiredDType1.Value = 1;
Application.LogMessage( "Changed old operator: " + DataType.Value );
DesiredDType2.Value = 1;
Application.LogMessage( "Changed new operator: " + DataType.Value );
// For the truly cautious, get the last operator applied
var CAVProp = obj.ActivePrimitive.Geometry.VertexColors(0);
var LastChgDataTypeOp;
for ( var i=CAVProp.NestedObjects.Count-1; i>=0; i++ ) {
        if ( CAVProp.NestedObjects.Item(i).Type == "vertexcolorchangedatatype" ) {
                LastChgDataTypeOp = CAVProp.NestedObjects.Item(i);
                break;
        }
}
Application.LogMessage( "LastChgDataTypeOp == DataChgOps1: " + LastChgDataTypeOp.IsEqualTo(DataChgOps1(0)) );
Application.LogMessage( "LastChgDataTypeOp == DataChgOps2: " + LastChgDataTypeOp.IsEqualTo(DataChgOps2(0)) );
var LastDesiredDType = LastChgDataTypeOp.Parameters("desireddatatype");
LastDesiredDType.Value = 0;
Application.LogMessage( "Changed final operator: " + DataType.Value );
// Output:
// INFO : Default DataType: 0
// WARNING : 2011 - Error on DataType.Value = 1: Member not found
// ERROR : 2011-EDIT-SetValue - Member not found
// WARNING : Error on SetValue( DataType, 1 ): Object doesn't support this property or method
// INFO : DataType after 1st operator: 1
// INFO : Back to default: 0
// INFO : Switched to float again: 1
// INFO : DataType after 2nd operator: 0
// INFO : Changed old operator: 0
// INFO : Changed new operator: 1
// INFO : LastChgDataTypeOp == DataChgOps1: false
// INFO : LastChgDataTypeOp == DataChgOps2: true
// INFO : Changed final operator: 0

2. VBScript Example

'
' This example creates a Vertex Color property (CAV) and plays with one of the colors 
' to demonstrate how switching the datatype can affect the color values
'
dim CAVObjs, dtype, chgOp, aColors
NewScene , false
SetDisplayMode "Camera", "constant"
CreatePrim "Sphere", "MeshSurface"
' The VertexColor property is the first element in the returned collection
set CAVObj = CreateVertexColorSupport()(0)
set dtype = CAVObj.Parameters("datatype")
' Print current datatype
Application.LogMessage "CAV datatype = " & dtype.Value
' Change datatype to float and print new datatype
set chgOp = ChangeVertexColorDatatype( CAVObj, 1 )(0)
Application.LogMessage "CAV new datatype = " & dtype.Value
' Set Color 47 (facing front view) to be RGBA ( 0.1 , 0.2 , 0.3, 0.4 )
aColors = CAVObj.Elements.Array
aColors(0,47) = 0.1
aColors(1,47) = 0.2
aColors(2,47) = 0.3
aColors(3,47) = 0.4
CAVObj.Elements.Array = aColors
' Retrieve the color and print it
aColors = CAVObj.Elements.Array
Application.LogMessage "Color 47 is (" & aColors(0,47) & ", " & aColors(1,47) & ", " & aColors(2,47) & ", " & aColors(3,47) & ")" 
' Now switch to short datatype and print it
chgOp.Parameters("desireddatatype").Value = 0           ' == SetValue chgOp & ".desireddatatype", 0
Application.LogMessage "CAV last datatype = " & dtype.Value
' Retrieve the color and print it
aColors = CAVObj.Elements.Array
Application.LogMessage "Color 47 is (" & aColors(0,47) & ", " & aColors(1,47) & ", " & aColors(2,47) & ", " & aColors(3,47) & ")" 
'Output
' INFO : CAV datatype = 0
' INFO : CAV new datatype = 1
' INFO : Color 47 is (0.100000001490116, 0.200000002980232, 0.300000011920929, 0.400000005960464)
' INFO : CAV last datatype = 0
' INFO : Color 47 is (9.80392172932625E-02, 0.200000002980232, 0.298039227724075, 0.400000005960464)

See Also

ApplyOp Operator CreateVertexColorSupport