UVWTag Manual

About

A UVWTag stores UVW coordinates for a (polygon) object. For each polygon a set of four UVW coordinates is stored (UVWStruct). The class UVWTag is based on VariableTag so the typical workflows on handling tags apply, see BaseTag and VariableTag Manual.

UVWTag objects are an instance of Tuvw.

Access

A UVWTag is typically attached to a polygon object.

Note
A polygon object can host multiple UVW tags.

Allocation/Deallocation

UVWTag instances are created with the usual tools.

A UVW tag with projection-based UVs can be created with:

// This example checks if the given object hosts a UVW tag.
// If not, a UVW tag is created.
BaseTag* const foundTag = object->GetTag(Tuvw);
UVWTag* uvwTag = static_cast<UVWTag*>(foundTag);
if (uvwTag == nullptr)
{
// check if the given object is a polygon object
if (object->IsInstanceOf(Opolygon))
{
PolygonObject* const polyObject = static_cast<PolygonObject*>(object);
const Int32 polyCount = polyObject->GetPolygonCount();
uvwTag = UVWTag::Alloc(polyCount);
if (uvwTag == nullptr)
return maxon::OutOfMemoryError(MAXON_SOURCE_LOCATION);
polyObject->InsertTag(uvwTag);
}
}

Access Data

There are two ways to edit the data stored inside a UVWTag. The "slow" way is to access every set of UVW coordinate independently. The "fast" way works with a data handle that allows direct access to the internal memory.

Slow

The UVW coordinates stored in a UVWTag can be accessed with:

// This example loops through the UVW data stored in the given UVW tag.
const Int32 count = uvwTag->GetDataCount();
for (Int32 i = 0; i < count; ++i)
{
ApplicationOutput("UVW Polygon " + String::IntToString(i));
const UVWStruct uvwData = uvwTag->GetSlow(i);
}

Fast

The fast access to the UVW coordinates stored in the UVWTag is provided by a data handle and static functions:

// This example calculates UVW coordinates based on the polygon's world space position.
UVWHandle handle = uvwTag->GetDataAddressW();
const Int32 count = uvwTag->GetDataCount();
for (Int32 i = 0; i < count; ++i)
{
UVWStruct uvwData;
// get points in world space
CPolygon polygon = polygons[i];
const Vector a = mg * points[polygon.a];
const Vector b = mg * points[polygon.b];
const Vector c = mg * points[polygon.c];
const Vector d = mg * points[polygon.d];
// define UV coordinates based on the world space position
// CalculateUVCoordinates() is a custom function
CalculateUVCoordinates(a, uvwData.a);
CalculateUVCoordinates(b, uvwData.b);
CalculateUVCoordinates(c, uvwData.c);
CalculateUVCoordinates(d, uvwData.d);
UVWTag::Set(handle, i, uvwData);
}
polyObject->Message(MSG_UPDATE);

Further Reading

UVWStruct::b
Vector b
The UVW coordinate for the second point.
Definition: operatingsystem.h:503
Opolygon
#define Opolygon
Polygon - PolygonObject.
Definition: ge_prepass.h:967
VariableTag::GetDataCount
Int32 GetDataCount(void) const
UVWStruct::c
Vector c
The UVW coordinate for the third point.
Definition: operatingsystem.h:503
UVWHandle
void * UVWHandle
Handle for UVW data. See also: UVWTag.
Definition: operatingsystem.h:449
CPolygon::b
Int32 b
Index of the second point in the polygon.
Definition: c4d_baseobject.h:41
UVWTag::GetSlow
UVWStruct GetSlow(Int32 i)
Definition: c4d_basetag.h:401
CPolygon
Represents a polygon that can be either a triangle or a quadrangle.
Definition: c4d_baseobject.h:39
BaseTag
Definition: c4d_basetag.h:40
CPolygon::d
Int32 d
Index of the fourth point in the polygon.
Definition: c4d_baseobject.h:41
MAXON_SOURCE_LOCATION
#define MAXON_SOURCE_LOCATION
Definition: memoryallocationbase.h:66
MSG_UPDATE
#define MSG_UPDATE
Must be sent if the bounding box has to be recalculated. (Otherwise use MSG_CHANGE....
Definition: c4d_baselist.h:335
String::IntToString
static String IntToString(Int32 v)
Definition: c4d_string.h:493
UVWTag
Definition: c4d_basetag.h:368
maxon::Vec3< maxon::Float64, 1 >
UVWTag::Alloc
static UVWTag * Alloc(Int32 count)
UVWStruct
Definition: operatingsystem.h:465
UVWTag::Set
static void Set(UVWHandle dataptr, Int32 i, const UVWStruct &s)
Definition: c4d_basetag.h:460
Tuvw
#define Tuvw
UVW data - UVWTag.
Definition: ge_prepass.h:1238
Int32
maxon::Int32 Int32
Definition: ge_sys_math.h:45
ApplicationOutput
#define ApplicationOutput(formatString,...)
Definition: debugdiagnostics.h:209
C4DAtom::Message
Bool Message(Int32 type, void *data=nullptr)
Definition: c4d_baselist.h:1350
PolygonObject
Definition: c4d_baseobject.h:1537
CPolygon::c
Int32 c
Index of the third point in the polygon.
Definition: c4d_baseobject.h:41
UVWStruct::d
Vector d
The UVW coordinate for the fourth point.
Definition: operatingsystem.h:503
C4DAtom::IsInstanceOf
Bool IsInstanceOf(Int32 id) const
Definition: c4d_baselist.h:1329
UVWStruct::a
Vector a
The UVW coordinate for the first point.
Definition: operatingsystem.h:503
String::VectorToString
static String VectorToString(const Vector32 &v, Int32 nnk=-1)
Definition: c4d_string.h:569
CPolygon::a
Int32 a
Index of the first point in the polygon.
Definition: c4d_baseobject.h:41
UVWTag::GetDataAddressW
UVWHandle GetDataAddressW(void)
PolygonObject::GetPolygonCount
Int32 GetPolygonCount(void)
Definition: c4d_baseobject.h:1692
BaseObject::InsertTag
void InsertTag(BaseTag *tp, BaseTag *pred=nullptr)