- fbx: generate inverse nodeanim channels for pivots.
parent
3c37c8e7da
commit
ffd084a7a7
|
@ -1435,6 +1435,13 @@ private:
|
|||
|
||||
for (size_t i = 0; i < TransformationComp_MAXIMUM; ++i) {
|
||||
const TransformationComp comp = static_cast<TransformationComp>(i);
|
||||
|
||||
// inverse pivots don't exist in the input, we just generate them
|
||||
if (comp == TransformationComp_RotationPivotInverse || comp == TransformationComp_ScalingPivotInverse) {
|
||||
chain[i] = node_property_map.end();
|
||||
continue;
|
||||
}
|
||||
|
||||
chain[i] = node_property_map.find(NameTransformationCompProperty(comp));
|
||||
if (chain[i] != node_property_map.end()) {
|
||||
has_any = true;
|
||||
|
@ -1507,8 +1514,36 @@ private:
|
|||
(*chain[i]).second,
|
||||
layer_map,
|
||||
max_time,
|
||||
min_time
|
||||
);
|
||||
min_time);
|
||||
|
||||
// pivoting requires us to generate an inverse channel to undo the pivot translation
|
||||
if (comp == TransformationComp_RotationPivot) {
|
||||
const std::string& invName = NameTransformationChainNode(kv.first, TransformationComp_RotationPivotInverse);
|
||||
aiNodeAnim* const inv = GenerateTranslationNodeAnim(invName,
|
||||
target,
|
||||
(*chain[i]).second,
|
||||
layer_map,
|
||||
max_time,
|
||||
min_time,
|
||||
true);
|
||||
|
||||
ai_assert(inv);
|
||||
node_anims.push_back(inv);
|
||||
}
|
||||
else if (comp == TransformationComp_ScalingPivot) {
|
||||
const std::string& invName = NameTransformationChainNode(kv.first, TransformationComp_ScalingPivotInverse);
|
||||
aiNodeAnim* const inv = GenerateTranslationNodeAnim(invName,
|
||||
target,
|
||||
(*chain[i]).second,
|
||||
layer_map,
|
||||
max_time,
|
||||
min_time,
|
||||
true);
|
||||
|
||||
ai_assert(inv);
|
||||
node_anims.push_back(inv);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case TransformationComp_Scaling:
|
||||
|
@ -1626,13 +1661,20 @@ private:
|
|||
const std::vector<const AnimationCurveNode*>& curves,
|
||||
const LayerMap& layer_map,
|
||||
double& max_time,
|
||||
double& min_time)
|
||||
double& min_time,
|
||||
bool inverse = false)
|
||||
{
|
||||
ScopeGuard<aiNodeAnim> na(new aiNodeAnim());
|
||||
na->mNodeName.Set(name);
|
||||
|
||||
ConvertTranslationKeys(na, curves, layer_map, max_time,min_time);
|
||||
|
||||
if (inverse) {
|
||||
for (unsigned int i = 0; i < na->mNumPositionKeys; ++i) {
|
||||
na->mPositionKeys[i].mValue *= -1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
// dummy scaling key
|
||||
na->mScalingKeys = new aiVectorKey[1];
|
||||
na->mNumScalingKeys = 1;
|
||||
|
|
Loading…
Reference in New Issue