About
A CAMorph represents a morph of a CAPoseMorphTag. It allows access to the internally stored data and can apply this data to the host object. The class is defined in the lib_ca.h
header file.
Access
CAMorph elements are stored in a CAPoseMorphTag, see CAPoseMorphTag Manual.
const Int32 morphCount = poseMorphTag->GetMorphCount();
for (
Int32 i = 0; i < morphCount; ++i)
{
CAMorph*
const morph = poseMorphTag->GetMorph(i);
if (morph == nullptr)
}
Allocation/Deallocation
CAMorph elements are created and deleted using the parent CAPoseMorphTag, see CAPoseMorphTag Manual.
poseMorphTag->ExitEdit(doc, false);
CAMorph*
const morph = poseMorphTag->AddMorph();
if (morph == nullptr)
poseMorphTag->UpdateMorphs();
Copy
The data stored in one CAMorph can be copied from a CAMorph to another CAMorph:
poseMorphTag->ExitEdit(doc, false);
const Int32 activeIndex = poseMorphTag->GetActiveMorphIndex();
CAMorph*
const activeMorph = poseMorphTag->GetMorph(activeIndex);
if (activeMorph == nullptr)
CAMorph*
const morph = poseMorphTag->AddMorph();
if (morph == nullptr)
const Int32 newIndex = poseMorphTag->GetMorphIndex(morph);
poseMorphTag->SetActiveMorphIndex(newIndex);
poseMorphTag->UpdateMorphs();
Properties
The internal data and several properties of a CAMorph can be edited through dedicated functions. But some properties can only be edited through the parent CAPoseMorphTag when the morph is selected. See Properties.
Name
Every CAMorph has a name:
ID
Every CAMorph has an internal ID:
Post Morph
A morph can be applied as a post-deform morph (ID_CA_POSE_MIXING_DEFORMED). If this is the case can be checked with:
CAMorphNode
The actual morph data is stored internally in CAMorphNode elements. See CAMorphNode Manual.
Mode
To edit or access data stored in a CAMorph one must switch the morph to a certain mode:
Valid flags are:
The data modes are:
poseMorphTag->ExitEdit(doc, false);
const Int32 activeIndex = poseMorphTag->GetActiveMorphIndex();
CAMorph*
const morph = poseMorphTag->GetMorph(activeIndex);
if (morph == nullptr)
if (mnode == nullptr)
{
for (
Int32 i = 0; i < pointCount; ++i)
{
}
}
poseMorphTag->UpdateMorphs();
Target
A CAMorph can use an object as a reference:
poseMorphTag->ExitEdit(doc, false);
CAMorph*
const morph = poseMorphTag->AddMorph();
if (morph == nullptr)
morph->
SetTarget(poseMorphTag, doc, targetObject);
const Int32 newIndex = poseMorphTag->GetMorphIndex(morph);
poseMorphTag->SetActiveMorphIndex(newIndex);
poseMorphTag->UpdateMorphs();
const Int32 index = poseMorphTag->GetMorphIndex(morph);
poseMorphTag->SetActiveMorphIndex(index);
Strength
The strength of a CAMorph controls how strongly it is applied to the host object.
poseMorphTag->ExitEdit(doc, false);
const Int32 activeMorphIndex = poseMorphTag->GetActiveMorphIndex();
const Int32 morphCount = poseMorphTag->GetMorphCount();
for (
Int32 i = 0; i < morphCount; ++i)
{
CAMorph*
const morph = poseMorphTag->GetMorph(i);
if (morph == nullptr)
if (activeMorphIndex != i)
else
}
poseMorphTag->UpdateMorphs(doc);
Object
The data stored in a CAMorph can be read from the host object and applied back to the host object:
The flags used to control what data is stored or applied are defined in CAMORPH_DATA_FLAGS. These flags are also used with CAMorphNode::GetInfo(), see CAMorphNode Manual.
poseMorphTag->ExitEdit(doc, false);
CAMorph*
const morph = poseMorphTag->GetMorph(1);
if (morph)
{
}
Further Reading