#include <fbxsdk/scene/fbxscene.h>
#include <fbxsdk/scene/animation/fbxanimcurve.h>
#include "ortool_customtangent_tool.h"
#define ORTOOLTEMPLATE__CLASS ORTOOLTEMPLATE__CLASSNAME
#define ORTOOLTEMPLATE__LABEL "CustomTangent"
#define ORTOOLTEMPLATE__DESC "FBSDK - Tool Custom Tangente Description"
ORTOOLTEMPLATE__LABEL,
ORTOOLTEMPLATE__DESC,
#define VAR_NOT_USED(X) (void)X;
bool ORTool_CustomTangent::FBCreate()
{
StartSize[0] = 160;
StartSize[1] = 95;
int lB = 10;
int lW = 150;
int lH = 18;
AddRegion( "Label", "Label",
SetControl( "Label", mLabel );
mLabel.Caption = "Custom tangents registered";
FBFCurveCustomTangentManager::TheOne().AddCustomTangentType("Tangent1", "FBXTangent1");
FBFCurveCustomTangentManager::TheOne().AddCustomTangentType("Tangent2", "FBXTangent2");
FBFCurveCustomTangentManager::TheOne().OnEvaluate.Add(
this, (
FBCallback) &ORTool_CustomTangent::EventEvaluate);
FBFCurveCustomTangentManager::TheOne().OnCustomKeyAdd.Add(
this, (
FBCallback) &ORTool_CustomTangent::EventKeyAdd);
FBFCurveCustomTangentManager::TheOne().OnKeyAdd.Add(
this, (
FBCallback) &ORTool_CustomTangent::EventKeyAddGeneric);
FBFCurveCustomTangentManager::TheOne().OnCustomKeyChange.Add(
this, (
FBCallback) &ORTool_CustomTangent::EventKeyChange);
return true;
}
void ORTool_CustomTangent::FBDestroy()
{
FBFCurveCustomTangentManager::TheOne().OnEvaluate.Remove(
this, (
FBCallback) &ORTool_CustomTangent::EventEvaluate);
FBFCurveCustomTangentManager::TheOne().OnCustomKeyAdd.Remove(
this, (
FBCallback) &ORTool_CustomTangent::EventKeyAdd);
FBFCurveCustomTangentManager::TheOne().OnKeyAdd.Remove(
this, (
FBCallback) &ORTool_CustomTangent::EventKeyAdd);
FBFCurveCustomTangentManager::TheOne().OnCustomKeyChange.Remove(
this, (
FBCallback) &ORTool_CustomTangent::EventKeyChange);
}
void ORTool_CustomTangent::EventEvaluate(
HISender pSender,
HKEvent pEvent )
{
FBCurveEvaluationEvent lEvent(pEvent);
double lIndex = lEvent.KeyIndex;
double lKeyBeforeIndex = floor(lIndex);
double lKeyAfterIndex = ceil(lIndex);
FBFCurve* lCurve = lEvent.Curve;
FBXSDK_NAMESPACE::FbxAnimCurve* lFBXCurve = lEvent.GetFBXCurve();
if(lKeyBeforeIndex == lKeyAfterIndex)
{
if(lCurve)
{
lEvent.Result = lCurve->KeyGetValue(lKeyBeforeIndex);
return;
}
else
{
lEvent.Result = lFBXCurve->KeyGet(lKeyBeforeIndex).GetValue();
return;
}
}
else
{
if(lCurve)
{
int lTangentIndex = lCurve->KeyGetTangentCustomIndex(lKeyBeforeIndex);
{
double lRatio = lIndex - lKeyBeforeIndex;
lEvent.Result = ((lCurve->KeyGetValue(lKeyAfterIndex) - lCurve->KeyGetValue(lKeyBeforeIndex)) * lRatio) + lCurve->KeyGetValue(lKeyBeforeIndex);
return;
}
{
double lRatio = lIndex - lKeyBeforeIndex;
lEvent.Result = ((lCurve->KeyGetValue(lKeyAfterIndex) - lCurve->KeyGetValue(lKeyBeforeIndex)) * lRatio) + lCurve->KeyGetValue(lKeyBeforeIndex);
if(lRatio < 0.5)
{
lEvent.Result = lEvent.Result + lRatio* 30.;
}
else
{
lEvent.Result = lEvent.Result + (lRatio-1.) * 30.;
}
return;
}
}
else
{
FBXSDK_NAMESPACE::FbxAnimCurveKey lKey = lFBXCurve->KeyGet(lKeyBeforeIndex);
FBXSDK_NAMESPACE::FbxAnimCurveKey lNextKey = lFBXCurve->KeyGet(lKeyAfterIndex);
int lTangentIndex = lEvent.LeftCustomTangentTypeIndex;
{
double lRatio = lIndex - lKeyBeforeIndex;
lEvent.Result = ((lNextKey.GetValue() - lKey.GetValue()) * lRatio) + lKey.GetValue();
return;
}
{
double lRatio = lIndex - lKeyBeforeIndex;
lEvent.Result = ((lNextKey.GetValue() - lKey.GetValue()) * lRatio) + lKey.GetValue();
if(lRatio < 0.5)
{
lEvent.Result = lEvent.Result + lRatio* 30.;
}
else
{
lEvent.Result = lEvent.Result + (lRatio-1.) * 30.;
}
return;
}
}
}
lEvent.Result = 0;
}
{
FBCurveCustomKeyAddEvent lEvent(pEvent);
int lIndex = lEvent.KeyIndex;
int lKeyBeforeIndex = lIndex -1;
int lKeyAfterIndex = lIndex + 1;
FBFCurve* lCurve = lEvent.Curve;
if(lCurve)
{
if(lCurve->Keys.GetCount() > lKeyAfterIndex)
{
}
if(lKeyBeforeIndex >= 0)
{
}
lCurve->KeySetLeftTangentWeight(lIndex, 30);
lCurve->KeySetRightTangentWeight(lIndex, 30);
lCurve->KeySetLeftBezierTangent(lIndex, 30);
lCurve->KeySetRightBezierTangent(lIndex, 30);
}
}
void ORTool_CustomTangent::EventKeyAddGeneric(
HISender pSender,
HKEvent pEvent )
{
FBCurveCustomKeyAddEvent lEvent(pEvent);
int lIndex = lEvent.KeyIndex;
FBFCurve* lCurve = lEvent.Curve;
if(lCurve)
{
FBAnimationNode* lParentNode = lEvent.GetParentAnimationNode();
VAR_NOT_USED( lParentNode );
FBComponent* lComponent = lEvent.GetParentComponent();
if(lComponent && lComponent->Is(FBModel::TypeInfo))
{
}
}
}
void ORTool_CustomTangent::EventKeyChange(
HISender pSender,
HKEvent pEvent )
{
FBCurveCustomKeyChangeEvent lEvent(pEvent);
int lIndex = lEvent.KeyIndex;
int lKeyBeforeIndex = lIndex -1;
int lKeyAfterIndex = lIndex + 1;
FBFCurve* lCurve = lEvent.Curve;
if(lCurve)
{
if(lCurve->Keys.GetCount() > lKeyAfterIndex)
{
}
if(lKeyBeforeIndex >= 0)
{
}
lCurve->KeySetLeftTangentWeight(lIndex, 30);
lCurve->KeySetRightTangentWeight(lIndex, 30);
lCurve->KeySetLeftBezierTangent(lIndex, 30);
lCurve->KeySetRightBezierTangent(lIndex, 30);
if(lEvent.IsPreCall)
{
{
{
}
}
{
}
}
else
{
{
}
}
}
}