1818#include " Sections/MovieSceneBoolSection.h"
1919#include " Sections/MovieScene3DTransformSection.h"
2020#include " Sections/MovieSceneVectorSection.h"
21+ #include " Runtime/MovieScene/Public/MovieSceneFolder.h"
22+ #include " Runtime/MovieScene/Public/MovieSceneSpawnable.h"
2123#endif
2224
2325#if WITH_EDITOR
@@ -129,6 +131,32 @@ PyObject *py_ue_sequencer_find_possessable(ue_PyUObject *self, PyObject * args)
129131 return ret;
130132}
131133
134+ PyObject *py_ue_sequencer_find_spawnable (ue_PyUObject *self, PyObject * args) {
135+
136+ ue_py_check (self);
137+
138+ char *guid;
139+ if (!PyArg_ParseTuple (args, " s:sequencer_find_spawnable" , &guid)) {
140+ return NULL ;
141+ }
142+
143+ if (!self->ue_object ->IsA <ULevelSequence>())
144+ return PyErr_Format (PyExc_Exception, " uobject is not a LevelSequence" );
145+
146+ FGuid f_guid;
147+ if (!FGuid::Parse (FString (guid), f_guid)) {
148+ return PyErr_Format (PyExc_Exception, " invalid GUID" );
149+ }
150+
151+ ULevelSequence *seq = (ULevelSequence *)self->ue_object ;
152+
153+ FMovieSceneSpawnable *spawnable = seq->MovieScene ->FindSpawnable (f_guid);
154+ PyObject *ret = py_ue_new_uscriptstruct (spawnable->StaticStruct (), (uint8 *)spawnable);
155+ Py_INCREF (ret);
156+ return ret;
157+ }
158+
159+ #if WITH_EDITOR
132160PyObject *py_ue_sequencer_add_possessable (ue_PyUObject *self, PyObject * args) {
133161
134162 ue_py_check (self);
@@ -213,6 +241,45 @@ PyObject *py_ue_sequencer_add_actor(ue_PyUObject *self, PyObject * args) {
213241 return PyUnicode_FromString (TCHAR_TO_UTF8 (*new_guid.ToString ()));
214242}
215243
244+ PyObject *py_ue_sequencer_make_new_spawnable (ue_PyUObject *self, PyObject * args) {
245+
246+ ue_py_check (self);
247+
248+ PyObject *py_obj;
249+ if (!PyArg_ParseTuple (args, " O:sequencer_add_spawnable" , &py_obj)) {
250+ return NULL ;
251+ }
252+
253+ if (!self->ue_object ->IsA <ULevelSequence>())
254+ return PyErr_Format (PyExc_Exception, " uobject is not a LevelSequence" );
255+
256+ ue_PyUObject *py_ue_obj = ue_is_pyuobject (py_obj);
257+ if (!py_ue_obj)
258+ return PyErr_Format (PyExc_Exception, " argument is not a uobject" );
259+
260+ if (!py_ue_obj->ue_object ->IsA <AActor>())
261+ return PyErr_Format (PyExc_Exception, " argument is not an actor" );
262+
263+ AActor *actor = (AActor *)py_ue_obj->ue_object ;
264+
265+ ULevelSequence *seq = (ULevelSequence *)self->ue_object ;
266+
267+ // try to open the editor for the asset
268+ FAssetEditorManager::Get ().OpenEditorForAsset (seq);
269+
270+ IAssetEditorInstance *editor = FAssetEditorManager::Get ().FindEditorForAsset (seq, true );
271+ if (!editor) {
272+ return PyErr_Format (PyExc_Exception, " unable to access sequencer" );
273+ }
274+
275+ FLevelSequenceEditorToolkit *toolkit = (FLevelSequenceEditorToolkit *)editor;
276+ ISequencer *sequencer = toolkit->GetSequencer ().Get ();
277+ FGuid new_guid = sequencer->MakeNewSpawnable (*actor);
278+
279+ return PyUnicode_FromString (TCHAR_TO_UTF8 (*new_guid.ToString ()));
280+ }
281+ #endif
282+
216283PyObject *py_ue_sequencer_master_tracks (ue_PyUObject *self, PyObject * args) {
217284
218285 ue_py_check (self);
@@ -287,12 +354,35 @@ PyObject *py_ue_sequencer_folders(ue_PyUObject *self, PyObject * args) {
287354 if (!self->ue_object ->IsA <ULevelSequence>())
288355 return PyErr_Format (PyExc_Exception, " uobject is not a LevelSequence" );
289356
357+ PyObject *py_obj = nullptr ;
358+ if (!PyArg_ParseTuple (args, " |O:sequencer_folders" , &py_obj)) {
359+ return NULL ;
360+ }
361+
362+ UMovieSceneFolder *parent_folder = nullptr ;
363+
364+ if (py_obj) {
365+ ue_PyUObject *ue_py_obj = ue_is_pyuobject (py_obj);
366+ if (!ue_py_obj) {
367+ return PyErr_Format (PyExc_Exception, " argument is not a UObject" );
368+ }
369+ parent_folder = Cast<UMovieSceneFolder>(ue_py_obj->ue_object );
370+ if (!parent_folder) {
371+ return PyErr_Format (PyExc_Exception, " argument is not a UMovieSceneFolder" );
372+ }
373+ }
374+
290375 ULevelSequence *seq = (ULevelSequence *)self->ue_object ;
291376 UMovieScene *scene = seq->GetMovieScene ();
292377
293378 PyObject *py_folders = PyList_New (0 );
294379
295- TArray<UMovieSceneFolder *> folders = scene->GetRootFolders ();
380+ TArray<UMovieSceneFolder *> folders;
381+ if (!parent_folder)
382+ folders = scene->GetRootFolders ();
383+ else {
384+ folders = parent_folder->GetChildFolders ();
385+ }
296386
297387 for (UMovieSceneFolder *folder : folders) {
298388 ue_PyUObject *ret = ue_get_python_wrapper ((UObject *)folder);
@@ -305,6 +395,54 @@ PyObject *py_ue_sequencer_folders(ue_PyUObject *self, PyObject * args) {
305395
306396 return py_folders;
307397}
398+
399+ PyObject *py_ue_sequencer_create_folder (ue_PyUObject *self, PyObject * args) {
400+
401+ ue_py_check (self);
402+
403+ if (!self->ue_object ->IsA <ULevelSequence>())
404+ return PyErr_Format (PyExc_Exception, " uobject is not a LevelSequence" );
405+
406+ PyObject *py_obj = nullptr ;
407+ char *name;
408+ if (!PyArg_ParseTuple (args, " s|O:sequencer_create_folder" , &name, &py_obj)) {
409+ return NULL ;
410+ }
411+
412+ UMovieSceneFolder *parent_folder = nullptr ;
413+
414+ if (py_obj) {
415+ ue_PyUObject *ue_py_obj = ue_is_pyuobject (py_obj);
416+ if (!ue_py_obj) {
417+ return PyErr_Format (PyExc_Exception, " argument is not a UObject" );
418+ }
419+ parent_folder = Cast<UMovieSceneFolder>(ue_py_obj->ue_object );
420+ if (!parent_folder) {
421+ return PyErr_Format (PyExc_Exception, " argument is not a UMovieSceneFolder" );
422+ }
423+ }
424+
425+ ULevelSequence *seq = (ULevelSequence *)self->ue_object ;
426+ UMovieScene *scene = seq->GetMovieScene ();
427+
428+ UMovieSceneFolder *new_folder = NewObject<UMovieSceneFolder>(scene, NAME_None, RF_Transactional);
429+ new_folder->SetFolderName (FName (name));
430+
431+ if (parent_folder) {
432+ parent_folder->Modify ();
433+ parent_folder->AddChildFolder (new_folder);
434+ }
435+ else {
436+ scene->Modify ();
437+ scene->GetRootFolders ().Add (new_folder);
438+ }
439+
440+ PyObject *ret = (PyObject *)ue_get_python_wrapper (new_folder);
441+ if (!ret) {
442+ return PyErr_Format (PyExc_Exception, " PyUObject is in invalid state" );
443+ }
444+ return ret;
445+ }
308446#endif
309447
310448PyObject *py_ue_sequencer_sections (ue_PyUObject *self, PyObject * args) {
@@ -358,6 +496,7 @@ PyObject *py_ue_sequencer_track_sections(ue_PyUObject *self, PyObject * args) {
358496 return py_sections;
359497}
360498
499+ #if WITH_EDITOR
361500PyObject *py_ue_sequencer_track_add_section (ue_PyUObject *self, PyObject * args) {
362501
363502 ue_py_check (self);
@@ -378,6 +517,7 @@ PyObject *py_ue_sequencer_track_add_section(ue_PyUObject *self, PyObject * args)
378517 Py_INCREF (ret);
379518 return ret;
380519}
520+ #endif
381521
382522PyObject *py_ue_sequencer_add_master_track (ue_PyUObject *self, PyObject * args) {
383523
@@ -418,6 +558,7 @@ PyObject *py_ue_sequencer_add_master_track(ue_PyUObject *self, PyObject * args)
418558 return ret;
419559}
420560
561+ #if WITH_EDITOR
421562PyObject *py_ue_sequencer_section_add_key (ue_PyUObject *self, PyObject * args) {
422563
423564 ue_py_check (self);
@@ -526,6 +667,7 @@ PyObject *py_ue_sequencer_add_camera_cut_track(ue_PyUObject *self, PyObject * ar
526667 Py_INCREF (ret);
527668 return ret;
528669}
670+ #endif
529671
530672PyObject *py_ue_sequencer_add_track (ue_PyUObject *self, PyObject * args) {
531673
0 commit comments