About

The CAPoseMorphTag class represents a pose morph tag. Such a tag stores multiple morphs that can be applied to the host object (and it's child objects) to modify and animate it. The class is defined in the lib_ca.h header file.

CAPoseMorphTag objects are an instance of Tposemorph.

// This example creates a cube with a CAPoseMorphTag.
// A base morph and an additional morph are added to the tag.
// create cube
if (cube == nullptr)
return maxon::OutOfMemoryError(MAXON_SOURCE_LOCATION);
doc->InsertObject(cube, nullptr, nullptr);
// create morph tag
CAPoseMorphTag* const poseMorphTag = CAPoseMorphTag::Alloc();
if (poseMorphTag == nullptr)
return maxon::OutOfMemoryError(MAXON_SOURCE_LOCATION);
cube->InsertTag(poseMorphTag);
poseMorphTag->InitMorphs();
// configure tag
// edit morphs
poseMorphTag->ExitEdit(doc, true);
// add base morph
CAMorph* const baseMorph = poseMorphTag->AddMorph();
if (baseMorph == nullptr)
return maxon::OutOfMemoryError(MAXON_SOURCE_LOCATION);
baseMorph->Store(doc, poseMorphTag, CAMORPH_DATA_FLAGS::ASTAG);
// modify cube
// add morph
CAMorph* const morph = poseMorphTag->AddMorph();
if (morph == nullptr)
return maxon::OutOfMemoryError(MAXON_SOURCE_LOCATION);
// store current state in morph
morph->SetName("Scaled Size");
morph->Store(doc, poseMorphTag, CAMORPH_DATA_FLAGS::ASTAG);
poseMorphTag->UpdateMorphs();
// switch to "Animate" mode
// set strength
const DescID sliderID = poseMorphTag->GetMorphID(1);
poseMorphTag->SetParameter(sliderID, 0.5, DESCFLAGS_SET::NONE);

Access

A CAPoseMorphTag tag can be accessed like any other tag, see BaseTag and VariableTag Manual.

// This example accesses the selected pose morph tag and
// prints the names of all it's morphs.
// get tag
BaseTag* const tag = doc->GetActiveTag();
if (tag == nullptr || !tag->IsInstanceOf(Tposemorph))
return maxon::IllegalArgumentError(MAXON_SOURCE_LOCATION);
CAPoseMorphTag* const poseMorphTag = static_cast<CAPoseMorphTag*>(tag);
// loop through all morphs
const Int32 morphCount = poseMorphTag->GetMorphCount();
for (Int32 i = 0; i < morphCount; ++i)
{
CAMorph* const morph = poseMorphTag->GetMorph(i);
if (morph != nullptr)
{
// print morph name
ApplicationOutput("Morph: " + morph->GetName());
}
}

Allocation/Deallocation

CAPoseMorphTag instances are created with the usual tools, see Entity Creation and Destruction Manual (Classic).

// This example creates a new CAPoseMorphTag
// and adds it to the given polygon object.
CAPoseMorphTag* const poseMorphTag = CAPoseMorphTag::Alloc();
if (poseMorphTag == nullptr)
return maxon::OutOfMemoryError(MAXON_SOURCE_LOCATION);
polyObject->InsertTag(poseMorphTag);

After creation, the tag must be initialized.

Properties

The parameters of CAPoseMorphTag can be edited with C4DAtom::SetParameter() and C4DAtom::GetParameter(). The parameter IDs are defined in tcaposemorph.h.

Note
Several settings of the active morph must be set on the morph tag using C4DAtom::SetParameter().
// This example enables "Points", adds a new morph and
// switches to "Animate" mode.
// mix points
// add new morph
CAMorph* const morph = poseMorphTag->AddMorph();
if (morph == nullptr)
return maxon::OutOfMemoryError(MAXON_SOURCE_LOCATION);
morph->SetName("New Morph");
// set morph as the active morph
const Int32 index = poseMorphTag->GetMorphIndex(morph);
poseMorphTag->SetActiveMorphIndex(index);
// update
poseMorphTag->UpdateMorphs(doc);
// enable "Post Deformers" for the active morph
// switch to animate mode

Morphs

Any change to the morph data must be encompassed by the following functions:

The stored morphs are accessed with:

See also CAMorph Manual.

// This example lists the names and strengths
// of all morphs in the given tag.
const Int32 morphCount = poseMorphTag->GetMorphCount();
for (Int32 i = 0; i < morphCount; ++i)
{
CAMorph* const morph = poseMorphTag->GetMorph(i);
if (morph == nullptr)
return maxon::UnexpectedError(MAXON_SOURCE_LOCATION);
// print morph name
ApplicationOutput("Morph: " + morph->GetName());
// ignore base morph
if (i != 0)
{
// print current strength of the morph
const DescID id = poseMorphTag->GetMorphID(i);
GeData data;
poseMorphTag->GetParameter(id, data, DESCFLAGS_GET::NONE);
const Float strength = data.GetFloat();
ApplicationOutput("Strength: " + String::FloatToString(strength));
}
}
// This example deletes the currently selected morph.
poseMorphTag->ExitEdit(doc, true);
// delete active morph
const Int32 activeIndex = poseMorphTag->GetActiveMorphIndex();
poseMorphTag->RemoveMorph(activeIndex);
poseMorphTag->UpdateMorphs();

PSD

Several Pose Space Deformation related settings can be edited with these functions:

See also CAReferencePSD Manual.

// This example changes the PSD display settings on the given pose morph tag.
CAPoseMorphTag* const poseMorphTag = static_cast<CAPoseMorphTag*>(tag);
if (poseMorphTag)
{
// enable color
poseMorphTag->SetPSDFeedbackColorEnabled(true);
// set color to red
poseMorphTag->SetPSDFeedbackColor(Vector(1.0, 0.0, 0.0));
}

Mode

A CAPoseMorphTag can either be in "edit" or "animate" mode:

Note
To change the mode use C4DAtom::SetParameter() with DescID ID_CA_POSE_MODE.

Further Reading

String::FloatToString
static String FloatToString(Float32 v, Int32 vvk=-1, Int32 nnk=-3)
Definition: c4d_string.h:529
CAPoseMorphTag::Alloc
static CAPoseMorphTag * Alloc()
Definition: lib_ca.h:1631
CAMORPH_DATA_FLAGS::ASTAG
@ ASTAG
CAMorph::Store
Bool Store(BaseDocument *doc, CAPoseMorphTag *tag, CAMORPH_DATA_FLAGS flags)
ID_CA_POSE_PARAM
@ ID_CA_POSE_PARAM
Definition: tcaposemorph.h:30
CAMorph::GetName
String GetName()
BaseDocument::InsertObject
void InsertObject(BaseObject *op, BaseObject *parent, BaseObject *pred, Bool checknames=false)
CAPoseMorphTag
Definition: lib_ca.h:1617
ID_CA_POSE_MODE_ANIMATE
@ ID_CA_POSE_MODE_ANIMATE
Definition: tcaposemorph.h:86
CAPoseMorphTag::InitMorphs
void InitMorphs()
BaseObject
Definition: c4d_baseobject.h:224
CAPoseMorphTag::SetActiveMorphIndex
void SetActiveMorphIndex(Int32 index)
DescID
Definition: lib_description.h:328
CAPoseMorphTag::GetMorphCount
Int32 GetMorphCount()
ID_CA_POSE_POINTS
@ ID_CA_POSE_POINTS
Definition: tcaposemorph.h:34
Float
maxon::Float Float
Definition: ge_sys_math.h:66
BaseTag
Definition: c4d_basetag.h:46
CAPoseMorphTag::AddMorph
CAMorph * AddMorph()
ID_CA_POSE_MODE
@ ID_CA_POSE_MODE
Definition: tcaposemorph.h:18
Ocube
#define Ocube
Cube.
Definition: ge_prepass.h:1047
MAXON_SOURCE_LOCATION
#define MAXON_SOURCE_LOCATION
Definition: memoryallocationbase.h:66
BaseDocument::GetActiveTag
BaseTag * GetActiveTag(void)
CAPoseMorphTag::GetActiveMorphIndex
Int32 GetActiveMorphIndex()
DESCFLAGS_SET::NONE
@ NONE
None.
CAPoseMorphTag::RemoveMorph
void RemoveMorph(Int32 index)
CAPoseMorphTag::GetMorphID
DescID GetMorphID(Int32 index)
CAPoseMorphTag::UpdateMorphs
void UpdateMorphs(BaseDocument *doc=nullptr)
C4DAtom::SetParameter
Bool SetParameter(const DescID &id, const GeData &t_data, DESCFLAGS_SET flags)
Tposemorph
#define Tposemorph
Pose morph.
Definition: ge_prepass.h:1284
CAPoseMorphTag::ExitEdit
Bool ExitEdit(BaseDocument *doc, Bool noapply)
CAPoseMorphTag::GetMorphIndex
Int32 GetMorphIndex(CAMorph *morph)
CAMorph
Definition: lib_ca.h:1428
ID_CA_POSE_MIXING_DEFORMED
@ ID_CA_POSE_MIXING_DEFORMED
Definition: tcaposemorph.h:42
GeData
Definition: c4d_gedata.h:82
Int32
maxon::Int32 Int32
Definition: ge_sys_math.h:60
ApplicationOutput
#define ApplicationOutput(formatString,...)
Definition: debugdiagnostics.h:208
PRIM_CUBE_LEN
@ PRIM_CUBE_LEN
Definition: ocube.h:6
Vector
maxon::Vec3< maxon::Float64, 1 > Vector
Definition: ge_math.h:145
BaseObject::Alloc
static BaseObject * Alloc(Int32 type)
CAMorph::SetName
void SetName(const String &name)
DESCFLAGS_GET::NONE
@ NONE
None.
CAPoseMorphTag::SetPSDFeedbackColor
Bool SetPSDFeedbackColor(const Vector &color)
C4DAtom::IsInstanceOf
Bool IsInstanceOf(Int32 id) const
Definition: c4d_baselist.h:1403
CAPoseMorphTag::SetPSDFeedbackColorEnabled
Bool SetPSDFeedbackColorEnabled(Bool active)
CAPoseMorphTag::GetMorph
CAMorph * GetMorph(Int32 index)
C4DAtom::GetParameter
Bool GetParameter(const DescID &id, GeData &t_data, DESCFLAGS_GET flags)
BaseObject::InsertTag
void InsertTag(BaseTag *tp, BaseTag *pred=nullptr)
GeData::GetFloat
Float GetFloat(void) const
Definition: c4d_gedata.h:439