NormalTag Manual

About

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

NormalTag objects are an instance of Tnormal.

Allocation/Deallocation

NormalTag instances are created with the usual tools.

// This example checks if the given object hosts a Normal tag.
// If not, a Normal tag is created.
NormalTag* normalTag = static_cast<NormalTag*>(polyObject->GetTag(Tnormal));
if (normalTag == nullptr)
{
const Int32 polyCnt = polyObject->GetPolygonCount();
normalTag = NormalTag::Alloc(polyCnt);
if (normalTag == nullptr)
return maxon::OutOfMemoryError(MAXON_SOURCE_LOCATION);
polyObject->InsertTag(normalTag);
}

Edit

The normal vectors stored in a NormalTag are accessed by obtaining data handles that are used with static functions:

// This example calculates normal vectors, changes them and stores them in the given Normal tag.
// make sure a Phong tag exists
if (polyObject->GetTag(Tphong) == nullptr)
{
BaseTag* phongTag = polyObject->MakeTag(Tphong);
if (phongTag == nullptr)
return maxon::OutOfMemoryError(MAXON_SOURCE_LOCATION);
}
Random random;
NormalHandle handle = normalTag->GetDataAddressW();
for (Int32 i = 0; i < polygonCount; ++i)
{
const CPolygon polygon = polygons[i];
// calculate default face normal
Vector normal = CalcFaceNormal(points, polygon);
NormalStruct normals;
// add random variation
normal.x += ((random.Get01() * 0.2) - 0.1);
normal.y += ((random.Get01() * 0.2) - 0.1);
normal.z += ((random.Get01() * 0.2) - 0.1);
normal.Normalize();
// define polygon normals
normals.a = normal;
normals.b = normal;
normals.c = normal;
normals.d = normal;
NormalTag::Set(handle, i, normals);
}
polyObject->Message(MSG_UPDATE);

Further Reading

Tnormal
#define Tnormal
Definition: ge_prepass.h:1273
maxon::Vec3::Normalize
constexpr void Normalize()
Normalizes this vector, so that GetLength()==1.0.
Definition: vec.h:469
Tphong
#define Tphong
Phong.
Definition: ge_prepass.h:1241
CPolygon
Represents a polygon that can be either a triangle or a quadrangle.
Definition: c4d_baseobject.h:43
BaseTag
Definition: c4d_basetag.h:46
MAXON_SOURCE_LOCATION
#define MAXON_SOURCE_LOCATION
Definition: memoryallocationbase.h:66
NormalTag::Set
static void Set(NormalHandle dataptr, Int32 i, const NormalStruct &s)
Definition: c4d_basetag.h:627
BaseObject::MakeTag
BaseTag * MakeTag(Int32 type, BaseTag *pred=nullptr)
maxon::Vec3::z
T z
Definition: vec.h:34
MSG_UPDATE
#define MSG_UPDATE
Must be sent if the bounding box has to be recalculated. (Otherwise use MSG_CHANGE....
Definition: c4d_baselist.h:340
NormalStruct::d
Vector d
The vertex normal for the fourth point.
Definition: operatingsystem.h:630
maxon::Vec3< maxon::Float64, 1 >
maxon::Vec3::x
T x
Definition: vec.h:32
PolygonObject::GetPolygonCount
Int32 GetPolygonCount(void) const
Definition: c4d_baseobject.h:1773
NormalTag::Alloc
static NormalTag * Alloc(Int32 count)
NormalTag
Represents a Point Normal tag.
Definition: c4d_basetag.h:557
NormalStruct::b
Vector b
The vertex normal for the second point.
Definition: operatingsystem.h:628
maxon::Vec3::y
T y
Definition: vec.h:33
Int32
maxon::Int32 Int32
Definition: ge_sys_math.h:60
C4DAtom::Message
Bool Message(Int32 type, void *data=nullptr)
Definition: c4d_baselist.h:1424
NormalStruct::a
Vector a
The vertex normal for the first point.
Definition: operatingsystem.h:627
BaseObject::GetTag
BaseTag * GetTag(Int32 type, Int32 nr=0)
Definition: c4d_baseobject.h:674
NormalTag::GetDataAddressW
NormalHandle GetDataAddressW(void)
Random::Get01
Float Get01(void)
NormalHandle
void * NormalHandle
Handle for normal data. See also: NormalTag.
Definition: operatingsystem.h:459
Random
Definition: c4d_tools.h:811
NormalStruct
Definition: operatingsystem.h:596
BaseObject::InsertTag
void InsertTag(BaseTag *tp, BaseTag *pred=nullptr)
NormalStruct::c
Vector c
The vertex normal for the third point.
Definition: operatingsystem.h:629
CalcFaceNormal
Vector CalcFaceNormal(const Vector *padr, const CPolygon &v)
Definition: c4d_baseobject.h:2206