Skip to content

Commit df79ee9

Browse files
author
Roberto De Ioris
authored
Merge pull request 20tab#493 from heylenz/master
py_ue_sequencer_import_fbx_transform support 4.20
2 parents 020e87c + 8d79d8a commit df79ee9

File tree

1 file changed

+88
-11
lines changed

1 file changed

+88
-11
lines changed

Source/UnrealEnginePython/Private/UObject/UEPySequencer.cpp

Lines changed: 88 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)