v3.5
Calculates the UVW values based on the current OGL hardware
display settings for the material. The values are read from cluster
properties, and the following texture objects are used in the
calculation:
- Texture projection definition
- Texture shader
- Image clip
You use bit flags to specify the texture transformation effects you
want to apply. Note that some texture transformation effects are
approximations. For example, GetTransformValues cannot resample the
surface to create the additional sample points required by texture
repeats.
Object Texture.GetTransformValues( Int32 ); |
oVariant = Texture.GetTransformValues( Flags ); |
A Variant containing an Array of Double values. This array is in the same order as the Material.CurrentUV.
| Parameter | Type | Description |
|---|---|---|
| Flags | Long | siTextureEffectsComputation bit flags that specify the result of the transformation you want to compute. To apply multiple effects, add the constant values together. For example, to set all the flags, use the decimal value 127, which is the sum of all the flag constants. |
'
' This example shows how to use this Texture.GetTransformValues to bake the UVW effects directly in the cluster property
' This is done on the object material and assumes only one TextureProjection definition.
'
' Create scene content
NewScene , false
set oGrid = CreatePrim( "Grid", "MeshSurface" )
SetValue oGrid & ".polymsh.geom.subdivu", 2
SetValue oGrid & ".polymsh.geom.subdivv", 1
ApplyShader ,,,, siLetLocalMaterialsOverlap
BlendInPresetsInsp ,,, True, True
CreateProjection oGrid, siTxtPlanarXZ, siTxtDefaultSpherical, "Texture_Support", "Texture_Projection"
SetInstanceDataValue , oGrid & ".Material.Phong.ambient_blend.Image.tspace_id", "Texture_Projection"
' Set a translation in U of 0.5
SetValue oGrid & ".polymsh.cls.Texture_Coordinates_AUTO.Texture_Projection.Texture_Projection_Def.projtrsu", 0.5
' Freeze everything ;-)
FreezeCurrentUV 127
sub FreezeCurrentUV( in_lFlags )
set oMy3DObject = Application.Selection(0)
if TypeName(oMy3DObject) <> "X3DObject" then
Application.LogMessage "The command won't perform it should be connected to an X3DObject"
else
if TypeName(oMy3DObject.ActivePrimitive.Geometry) = "PolygonMesh" then
set oMaterial = oMy3DObject.Material
set oClusterProperty = oMaterial.CurrentUV
set oTexture = oMaterial.CurrentTexture
if TypeName(oTexture) <> "Nothing" then
aUVWValues = oTexture.GetTransformValues( in_lFlags )
FreezeUVWValues oClusterProperty, aUVWValues
SetDefaultValues oMaterial, oTexture, oClusterProperty, in_lflags
else
Application.LogMessage "There's no current texture"
end if
else
Application.LogMessage "The command won't perform it should be connected to a PolygonMesh object"
end if
end if
end sub
' The array is already in cluster offset order
sub FreezeUVWValues(in_oClusterProperty, in_aUVWValues)
aOLDUVWValues = in_oClusterProperty.Elements.Array
for i = 0 to ubound(aOLDUVWValues,2)
aOLDUVWValues(0,i) = in_aUVWValues(i*3)
aOLDUVWValues(1,i) = in_aUVWValues(i*3 + 1)
aOLDUVWValues(2,i) = in_aUVWValues(i*3 + 2)
next
in_oClusterProperty.Elements.Array = aOLDUVWValues
end sub
' Reset the default values, so to remove the actions of those effects on the
' Texture projection cluster property.
sub SetDefaultValues(in_oMaterial, in_oTexture, in_oClusterProperty, in_lflags)
if in_lflags and siTextureComputeTransformation then
strClusterProperty = in_oClusterProperty.FullName
' Set translation
SetValue strClusterProperty & ".Texture_Projection_Def.projtrsu", 0
SetValue strClusterProperty & ".Texture_Projection_Def.projtrsv", 0
SetValue strClusterProperty & ".Texture_Projection_Def.projtrsw", 0
' Set scaling
SetValue strClusterProperty & ".Texture_Projection_Def.projsclu", 1
SetValue strClusterProperty & ".Texture_Projection_Def.projsclv", 1
SetValue strClusterProperty & ".Texture_Projection_Def.projsclw", 1
' Set rotation
SetValue strClusterProperty & ".Texture_Projection_Def.projrotu", 0
SetValue strClusterProperty & ".Texture_Projection_Def.projrotv", 0
SetValue strClusterProperty & ".Texture_Projection_Def.projrotw", 0
end if
if in_lflags and siTextureComputeWrapping then
strClusterProperty = in_oClusterProperty.FullName
' Set wrapping
SetValue strClusterProperty & ".Texture_Projection_Def.wrap_u", false
SetValue strClusterProperty & ".Texture_Projection_Def.wrap_v", false
SetValue strClusterProperty & ".Texture_Projection_Def.wrap_w", false
end if
if in_lflags and siTextureComputeRepeats then
strTexture = in_oTexture.FullName
SetValue strTexture & ".repeats.x", 1
SetValue strTexture & ".repeats.y", 1
SetValue strTexture & ".repeats.z", 1
end if
if in_lflags and siTextureComputeUVRemap then
strTexture = in_oTexture.FullName
SetValue strTexture & ".min.x", 0
SetValue strTexture & ".min.y", 0
SetValue strTexture & ".min.z", 0
SetValue strTexture & ".max.x", 1
SetValue strTexture & ".max.y", 1
SetValue strTexture & ".max.z", 1
end if
if in_lflags and siTextureComputeAlternate then
strTexture = in_oTexture.FullName
SetValue strTexture & ".alt_x", 0
SetValue strTexture & ".alt_y", 0
end if
if in_lflags and siTextureComputeCropping then
set oImageClip = in_oMaterial.CurrentImageClip
strImageClip = oImageClip.FullName
SetValue strImageClip & ".Xmin", 0
SetValue strImageClip & ".Ymin", 0
SetValue strImageClip & ".Xmax", 1
SetValue strImageClip & ".Ymax", 1
end if
if in_lflags and siTextureComputeFlip then
set oImageClip = in_oMaterial.CurrentImageClip
strImageClip = oImageClip.FullName
SetValue strImageClip & ".FlipX", False
SetValue strImageClip & ".FlipY", False
end if
end sub
|
// This example demonstrated the relationship
// between Texture.GetTransformValues, the Texture Projection
// and the Cluster Property
var sProjectionName = "MyProjection" ;
var oCylinder = CreateCylinderWithMaterial() ;
var oCurrentTexture = oCylinder.Material.CurrentTexture ;
logmessage( "Current Texture: " + oCurrentTexture.FullName ) ;
logmessage( "Current UV: " + oCylinder.Material.CurrentUV.FullName ) ;
logmessage( "Current ImageClip: " + oCylinder.Material.CurrentImageClip ) ;
logmessage( "-------------Before applying a repeat----------" ) ;
PrintTransformValues( oCurrentTexture ) ;
// Now actually apply a transformation at the Texture level
oCurrentTexture.Parameters( "repeats" ).Parameters("x").Value = 2 ;
logmessage( "-------------After applying a repeat----------" ) ;
PrintTransformValues( oCurrentTexture ) ;
// Show that the raw data was not affected
logmessage( "-------------Raw UV----------" ) ;
PrintRawProjectionData( oCylinder ) ;
SetDisplayMode("Camera", "texturedecal");
function CreateCylinderWithMaterial()
{
// Function to create a sample scene. It has a Cylinder
// with a simple render tree of an image connected to a Phong.
// To simplify the example it does not load a specific image
// clip so it is using the default noIcon image.
// Create a cylinder
newscene(null,false) ;
var oCylinder = ActiveSceneRoot.AddGeometry( "Cylinder", "MeshSurface" ) ;
// Reduce the size of the geometry to reduce the amount of UV values we will print out
var oGeometryParams = GetValue( oCylinder + ".polymsh.geom" ).Parameters
oGeometryParams("subdivu").Value = 2
oGeometryParams("subdivv").Value = 1
oGeometryParams("subdivbase").Value = 1
var oMaterial = oCylinder.AddMaterial( "Phong" ) ;
var oPhong = oMaterial.Shaders(0)
var oPhongParams = oPhong.Parameters ;
// Create a texture node and connect it to both ambient and diffuse
var oTextureShader = oPhongParams( "ambient" ).ConnectFromPreset("Image", siTextureShaderFamily) ;
oPhongParams( "diffuse" ).Connect( oTextureShader ) ;
// At this point the texture will not draw because there is
// no projection to map the 2D onto the 3D
// This command creates the projection and the support
CreateProjection(
oCylinder,
siTxtCylindrical,
siTxtDefaultCylindrical,
"MySupport", // Name to give new support
sProjectionName, // Name to give new projection
null,
null,
null);
// Connect the projection
oTextureShader.Parameters("tspace_id").SetInstanceValue( oCylinder,sProjectionName ) ;
return oCylinder ;
}
function PrintRawProjectionData( in_oObj )
{
// Find the ClusterProperty that contains the raw UVW values
// of the current texture
var oTextureClusterProperty = in_oObj.Material.CurrentUV ;
PrintUVWClusterProperty( oTextureClusterProperty ) ;
}
function PrintUVWClusterProperty( in_oTextureClusterProperty )
{
// Print the UVW cluster property. It shows how to read
// the 2-Dimensional data with JScript VBArray object
logmessage( "Contents of " + in_oTextureClusterProperty.FullName ) ;
var aRawUVValues = new VBArray( in_oTextureClusterProperty.Elements.Array ) ;
for ( i = 0 ; i <= aRawUVValues.ubound(2) ; i++ )
{
logmessage( "UVW["+i+"] = "
+ XSIRound( aRawUVValues.getItem( 0, i ), 2) + "," +
+ XSIRound( aRawUVValues.getItem( 1, i ), 2) + "," +
+ XSIRound( aRawUVValues.getItem( 2, i ), 2)) ;
}
}
function PrintTransformValues( in_oTexture )
{
// Print the transformed UVW values associated with the texture
// It shows how the data is structured as a flattened 1D array
logmessage( "Fully transformed contents of " + in_oTexture.FullName ) ;
aTransformedTexture = new VBArray(in_oTexture.GetTransformValues(127)) ;
// We have a 1 dimensional array, with the U,V,W values flattened
cntItems = ( aTransformedTexture.ubound(1) + 1 ) / 3 ;
for ( i = 0 ; i < cntItems ; i++ )
{
logmessage( "UVW["+i+"] = "
+ XSIRound( aTransformedTexture.getItem( 3*i ), 2) + "," +
+ XSIRound( aTransformedTexture.getItem( 3*i+1 ), 2) + "," +
+ XSIRound( aTransformedTexture.getItem( 3*i+2 ), 2)) ;
}
}
// Output:
//
//INFO : Current Texture: cylinder.Material.Phong.Image
//INFO : Current UV: cylinder.polymsh.cls.Texture_Coordinates_AUTO.MyProjection
//INFO : Current ImageClip: Clips.noIcon_pic
//INFO : -------------Before applying a repeat----------
//INFO : Fully transformed contents of cylinder.Material.Phong.Image
//INFO : UVW[0] = 0.61,0,0
//INFO : UVW[1] = 0.25,0,0
//INFO : UVW[2] = 0.75,0,0
//...snip...
//INFO : UVW[28] = 1.25,1,0
//INFO : UVW[29] = 0.75,1,0
//INFO : -------------After applying a repeat----------
//INFO : Fully transformed contents of cylinder.Material.Phong.Image
//INFO : UVW[0] = 1.23,0,0
//INFO : UVW[1] = 0.5,0,0
//INFO : UVW[2] = 1.5,0,0
//...snip...
//INFO : UVW[28] = 1.5,1,0
//INFO : UVW[29] = 0.5,1,0
//INFO : -------------Raw UV----------
//INFO : Contents of cylinder.polymsh.cls.Texture_Coordinates_AUTO.MyProjection
//INFO : UVW[0] = 0.61,0,0
//INFO : UVW[1] = 0.25,0,0
//INFO : UVW[2] = 0.75,0,0
//...snip...
//INFO : UVW[28] = 1.25,1,0
//INFO : UVW[29] = 0.75,1,0
|