#include "orconstraint3Dcurvedeformer_constraint.h"
#define ORCONSTRAINT3DCURVEDEFORMER__CLASS ORCONSTRAINT3DCURVEDEFORMER__CLASSNAME
#define ORCONSTRAINT3DCURVEDEFORMER__NAME "3DCurve Deformer"
#define ORCONSTRAINT3DCURVEDEFORMER__LABEL "OR - 3DCurve Deformer"
#define ORCONSTRAINT3DCURVEDEFORMER__DESC "OR - 3DCurve Deformation Constraint"
ORCONSTRAINT3DCURVEDEFORMER__CLASS,
ORCONSTRAINT3DCURVEDEFORMER__LABEL,
ORCONSTRAINT3DCURVEDEFORMER__DESC,
bool ORConstraint3DCurveDeformer::FBCreate()
{
Deformer = false;
HasLayout = false;
Description = "3D Curve Deformer Constraint";
mReferenceGroup_3DCurve = ReferenceGroupAdd( "Constrained Path", 1 );
mReferenceGroup_Point = ReferenceGroupAdd( "Point", MAX_POINT_NUMBER );
mReferenceGroup_Point_Tangent_In = ReferenceGroupAdd( "Tangent In", MAX_POINT_NUMBER );
mReferenceGroup_Point_Tangent_Out = ReferenceGroupAdd( "Tangent Out", MAX_POINT_NUMBER );
mDummy_AnimationNode =
NULL;
m3DCurve_Valid = false;
return true;
}
void ORConstraint3DCurveDeformer::FBDestroy()
{
}
void ORConstraint3DCurveDeformer::SetupAllAnimationNodes()
{
if(m3DCurve)
{
FBPropertyAnimatable* lLinkToRenderingProperty = (FBPropertyAnimatable*)m3DCurve->PropertyList.Find("Main Color",false);
if(lLinkToRenderingProperty)
{
lLinkToRenderingProperty->SetAnimated(true);
mDummy_AnimationNode = AnimationNodeInCreate ( 0, lLinkToRenderingProperty );
}
}
}
bool ORConstraint3DCurveDeformer::ReferenceAddNotify( int pGroupIndex, FBModel* pModel )
{
if ( pGroupIndex == mReferenceGroup_3DCurve )
{
if ( pModel->Is( FBModelPath3D::TypeInfo) ){
m3DCurve_Valid = true;
m3DCurve = (FBModelPath3D*)pModel;
}
else {
m3DCurve_Valid = false;
}
}
return true;
}
bool ORConstraint3DCurveDeformer::ReferenceRemoveNotify( int pGroupIndex, FBModel* pModel )
{
if ( pGroupIndex == mReferenceGroup_3DCurve )
{
m3DCurve_Valid = false;
}
return true;
}
bool ORConstraint3DCurveDeformer::AnimationNodeNotify(
FBAnimationNode* pConnector,
FBEvaluateInfo* pEvaluateInfo,
FBConstraintInfo* pConstraintInfo
)
{
if ( m3DCurve_Valid ) {
for (
int i = 0;
i < m3DCurve->PathKeyGetCount();
i++ )
{
if ( ReferenceGet( mReferenceGroup_Point,
i ) )
{
if ( ReferenceGet( mReferenceGroup_Point_Tangent_Out,
i ) && ReferenceGet( mReferenceGroup_Point_Tangent_In,
i ) )
{
ReferenceGet( mReferenceGroup_Point_Tangent_In,
i )->GetVector( posPoint_TangentIn,
kModelTranslation,
true );
ReferenceGet( mReferenceGroup_Point_Tangent_Out,
i )->GetVector( posPoint_TangentOut,
kModelTranslation,
true );
}
else
{
m3DCurve->PathKeySet(
i , (
FBVector4d)posPoint,
false );
}
}
}
m3DCurve->UpdateGeometry();
}
return true;
}
void ORConstraint3DCurveDeformer::SnapSuggested()
{
if ( m3DCurve_Valid ) {
}
}