A CustomDataTag is a BaseTag that stores custom point or polygon data. It is a generalized tag type to store mesh-based data like normals, UVs, vertex colors etc. It can replace dedicated tags like NormalTag, UVWTag or VertexColorTag.

A CustomDataTag gives access to data and functionality implemented with maxon::MeshAttribute, maxon::MeshAttributeClassInterface, maxon::CustomDataTagClassInterface and maxon::CustomDataTagDisplayInterface (see Mesh Attributes Interfaces).


A CustomDataTag object is created using the usual tools and the specific data type ID:

// This example creates a CustomDataTag of the given type, adds
// it to the given polygon object and sets it to vertex mode.
// create tag
BaseTag* const tag = CustomDataTag::Alloc(ID_VERTEXSCALARTAG);
if (tag == nullptr)
return maxon::OutOfMemoryError(MAXON_SOURCE_LOCATION);
// insert tag
// init tag
CustomDataTag* const customDataTag = static_cast<CustomDataTag*>(tag);
customDataTag->InitData() iferr_return;

Data Type

The data type stored in a given CustomDataTag is obtained with:


A CustomDataTag can stores either point data (CUSTOMDATATAG_MODE::VERTEX) or polygon point data (CUSTOMDATATAG_MODE::POLYVERTEX):

The number of stored elements is returned with:

The stored vertex data is accessed with these functions:

// This example fills the given CustomDataTag with random values for each point.
// get number of components
const Int count = customDataTag->GetComponentCount();
// for each component, set a random value
for (Int32 i = 0; i < count; ++i)
Float value = random.Get01();
customDataTag->SetVertexData<Float>(i, std::move(value));

The stored polygon data is accessed with:

// This example fills the given CustomDataTag with random values for each polygon vertex.
// get number for components
const Int count = customDataTag->GetComponentCount();
// for each polygon set random values
for (Int32 i = 0; i < count; ++i)
// create polygon value
maxon::Float value = random.Get01();
// set each point of the given polygon to that value
for (Int32 polyvertexIndex = 0; polyvertexIndex < 4; ++polyvertexIndex)
customDataTag->SetPolyVertexData<maxon::Float>(i, polyvertexIndex, std::move(value));

The maxon::PolyData template class stores data for either a triangle or quad:

// This example accesses the polygon point values of the
// given CustomDataTag within MeshAttributeDisplay::DisplayControl().
// for each polygon of the object set the polygon vertex colors
for (Int32 polygonIndex = 0; polygonIndex < polyCount; ++polygonIndex)
// get polygon vertex data for the given polygon
maxon::PolyData<Float> polygonData = customDataTag->GetPolygonData<Float>(polygonIndex);
// set the color of each polygon vertex
// the CustomDataTag always stores four point values for each polygon
for (Int32 pointIndex = 0; pointIndex < 4; ++pointIndex)
// get polygon vertex color
// float value dispalyed in the red channel
Vector32 color { 0.0 };
color.x = maxon::Float32(polygonData[pointIndex]);
// store polygon vertex color
// "cds" is the ControlDisplayStruct argument
const maxon::Int colorIndex = 4 * polygonIndex + pointIndex;
cds.vertex_color[colorIndex] = static_cast<Vector32>(color);
// show polygon vertex color
cds.perPolygonVertexColor = true;

Further Reading