@@ -66,6 +66,84 @@ static bool magic_get_frame_number(UMovieScene *MovieScene, PyObject *py_obj, FF
6666 return false ;
6767
6868}
69+ void ImportTransformChannel (const FInterpCurveFloat& Source, FMovieSceneFloatChannel* Dest, FFrameRate DestFrameRate, bool bNegateTangents)
70+ {
71+ TMovieSceneChannelData<FMovieSceneFloatValue> ChannelData = Dest->GetData ();
72+ ChannelData.Reset ();
73+ double DecimalRate = DestFrameRate.AsDecimal ();
74+ for (int32 KeyIndex = 0 ; KeyIndex < Source.Points .Num (); ++KeyIndex)
75+ {
76+ float ArriveTangent = Source.Points [KeyIndex].ArriveTangent ;
77+ if (KeyIndex > 0 )
78+ {
79+ ArriveTangent = ArriveTangent / ((Source.Points [KeyIndex].InVal - Source.Points [KeyIndex-1 ].InVal ) * DecimalRate);
80+ }
81+
82+ float LeaveTangent = Source.Points [KeyIndex].LeaveTangent ;
83+ if (KeyIndex < Source.Points .Num () - 1 )
84+ {
85+ LeaveTangent = LeaveTangent / ((Source.Points [KeyIndex+1 ].InVal - Source.Points [KeyIndex].InVal ) * DecimalRate);
86+ }
87+
88+ if (bNegateTangents)
89+ {
90+ ArriveTangent = -ArriveTangent;
91+ LeaveTangent = -LeaveTangent;
92+ }
93+
94+ FFrameNumber KeyTime = (Source.Points [KeyIndex].InVal * DestFrameRate).RoundToFrame ();
95+ FMatineeImportTools::SetOrAddKey (ChannelData, KeyTime, Source.Points [KeyIndex].OutVal , ArriveTangent, LeaveTangent, Source.Points [KeyIndex].InterpMode );
96+ }
97+
98+ Dest->AutoSetTangents ();
99+ }
100+ bool ImportFBXTransform (FString NodeName, UMovieScene3DTransformSection* TransformSection, UnFbx::FFbxCurvesAPI& CurveAPI)
101+ {
102+
103+
104+ // Look for transforms explicitly
105+ FInterpCurveFloat Translation[3 ];
106+ FInterpCurveFloat EulerRotation[3 ];
107+ FInterpCurveFloat Scale[3 ];
108+ FTransform DefaultTransform;
109+ CurveAPI.GetConvertedTransformCurveData (NodeName, Translation[0 ], Translation[1 ], Translation[2 ], EulerRotation[0 ], EulerRotation[1 ], EulerRotation[2 ], Scale[0 ], Scale[1 ], Scale[2 ], DefaultTransform);
110+
111+ TransformSection->Modify ();
112+
113+ FFrameRate FrameRate = TransformSection->GetTypedOuter <UMovieScene>()->GetTickResolution ();
114+
115+
116+ FVector Location = DefaultTransform.GetLocation (), Rotation = DefaultTransform.GetRotation ().Euler (), Scale3D = DefaultTransform.GetScale3D ();
117+
118+ TArrayView<FMovieSceneFloatChannel*> Channels = TransformSection->GetChannelProxy ().GetChannels <FMovieSceneFloatChannel>();
119+
120+ Channels[0 ]->SetDefault (Location.X );
121+ Channels[1 ]->SetDefault (Location.Y );
122+ Channels[2 ]->SetDefault (Location.Z );
123+
124+ Channels[3 ]->SetDefault (Rotation.X );
125+ Channels[4 ]->SetDefault (Rotation.Y );
126+ Channels[5 ]->SetDefault (Rotation.Z );
127+
128+ Channels[6 ]->SetDefault (Scale3D.X );
129+ Channels[7 ]->SetDefault (Scale3D.Y );
130+ Channels[8 ]->SetDefault (Scale3D.Z );
131+
132+ ImportTransformChannel (Translation[0 ], Channels[0 ], FrameRate, false );
133+ ImportTransformChannel (Translation[1 ], Channels[1 ], FrameRate, true );
134+ ImportTransformChannel (Translation[2 ], Channels[2 ], FrameRate, false );
135+
136+ ImportTransformChannel (EulerRotation[0 ], Channels[3 ], FrameRate, false );
137+ ImportTransformChannel (EulerRotation[1 ], Channels[4 ], FrameRate, true );
138+ ImportTransformChannel (EulerRotation[2 ], Channels[5 ], FrameRate, true );
139+
140+ ImportTransformChannel (Scale[0 ], Channels[6 ], FrameRate, false );
141+ ImportTransformChannel (Scale[1 ], Channels[7 ], FrameRate, false );
142+ ImportTransformChannel (Scale[2 ], Channels[8 ], FrameRate, false );
143+
144+ return true ;
145+ }
146+
69147#endif
70148
71149#if WITH_EDITOR
@@ -1347,10 +1425,6 @@ PyObject *py_ue_sequencer_import_fbx_transform(ue_PyUObject *self, PyObject * ar
13471425{
13481426 ue_py_check (self);
13491427
1350- #if ENGINE_MINOR_VERSION >= 20
1351- return PyErr_Format (PyExc_Exception, " sequencer_import_fbx_transform() is still not supported in this engine version" );
1352- #else
1353-
13541428 char *filename;
13551429 char *nodename;
13561430 PyObject *py_force_front_x_axis = nullptr ;
@@ -1408,8 +1482,7 @@ PyObject *py_ue_sequencer_import_fbx_transform(ue_PyUObject *self, PyObject * ar
14081482 FTransform DefaultTransform;
14091483#if ENGINE_MINOR_VERSION >= 18
14101484 CurveAPI.GetConvertedTransformCurveData (NodeName, Translation[0 ], Translation[1 ], Translation[2 ], EulerRotation[0 ], EulerRotation[1 ], EulerRotation[2 ], Scale[0 ], Scale[1 ], Scale[2 ], DefaultTransform);
1411-
1412-
1485+ #if ENGINE_MINOR_VERSION < 20
14131486 for (int32 ChannelIndex = 0 ; ChannelIndex < 3 ; ++ChannelIndex)
14141487 {
14151488 EAxis::Type ChannelAxis = EAxis::X;
@@ -1426,13 +1499,13 @@ PyObject *py_ue_sequencer_import_fbx_transform(ue_PyUObject *self, PyObject * ar
14261499 section->GetRotationCurve (ChannelAxis).SetDefaultValue (DefaultTransform.GetRotation ().Euler ()[ChannelIndex]);
14271500 section->GetScaleCurve (ChannelAxis).SetDefaultValue (DefaultTransform.GetScale3D ()[ChannelIndex]);
14281501 }
1429-
1502+ # endif
14301503
14311504#else
14321505 CurveAPI.GetConvertedTransformCurveData (NodeName, Translation[0 ], Translation[1 ], Translation[2 ], EulerRotation[0 ], EulerRotation[1 ], EulerRotation[2 ], Scale[0 ], Scale[1 ], Scale[2 ]);
14331506
14341507#endif
1435-
1508+ # if ENGINE_MINOR_VERSION < 20
14361509 float MinTime = FLT_MAX;
14371510 float MaxTime = -FLT_MAX;
14381511
@@ -1513,13 +1586,17 @@ PyObject *py_ue_sequencer_import_fbx_transform(ue_PyUObject *self, PyObject * ar
15131586 ChannelCurve->RemoveRedundantKeys (KINDA_SMALL_NUMBER);
15141587 ChannelCurve->AutoSetTangents ();
15151588 }
1516- }
15171589 }
1590+ }
15181591
1592+ #else
1593+ ImportFBXTransform (nodename, section, CurveAPI);
1594+ #endif
15191595
1596+ #if ENGINE_MINOR_VERSION < 20
15201597 section->SetStartTime (MinTime);
15211598 section->SetEndTime (MaxTime);
1522-
1599+ # endif
15231600
15241601 FbxImporter->ReleaseScene ();
15251602 ImportOptions->bConvertScene = bConverteScene;
@@ -1533,7 +1610,7 @@ PyObject *py_ue_sequencer_import_fbx_transform(ue_PyUObject *self, PyObject * ar
15331610 ImportOptions->bConvertSceneUnit = bConverteSceneUnit;
15341611 ImportOptions->bForceFrontXAxis = bForceFrontXAxis;
15351612 return PyErr_Format (PyExc_Exception, " unable to find specified node in Fbx file" );
1536- # endif
1613+
15371614}
15381615#endif
15391616
0 commit comments