Skip to content

Commit f864be2

Browse files
author
Roberto De Ioris
committed
added create_blueprint() function
1 parent 701b035 commit f864be2

File tree

4 files changed

+55
-21
lines changed

4 files changed

+55
-21
lines changed

Source/UnrealEnginePython/Private/UEPyEngine.cpp

Lines changed: 45 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
#include "Kismet/KismetSystemLibrary.h"
44
#include "Kismet/KismetMathLibrary.h"
55

6+
#if WITH_EDITOR
7+
#include "Kismet2/KismetEditorUtilities.h"
8+
#endif
9+
610
#include "PythonGeneratedClass.h"
711

812
PyObject *py_unreal_engine_log(PyObject * self, PyObject * args) {
@@ -481,15 +485,15 @@ PyObject *py_unreal_engine_new_object(PyObject * self, PyObject * args) {
481485
return (PyObject *)ret;
482486
}
483487

484-
PyObject *py_unreal_engine_new_blueprint_class(PyObject * self, PyObject * args) {
488+
#if WITH_EDITOR
489+
PyObject *py_unreal_engine_create_blueprint(PyObject * self, PyObject * args) {
485490

486491
PyObject *py_parent;
487492
char *name;
488-
if (!PyArg_ParseTuple(args, "Os:new_blueprint_class", &py_parent, &name)) {
493+
if (!PyArg_ParseTuple(args, "Os:create_blueprint", &py_parent, &name)) {
489494
return NULL;
490495
}
491496

492-
UObject *outer = CreatePackage(nullptr, TEXT("/Script/Python"));
493497
UClass *parent = UObject::StaticClass();
494498

495499
if (py_parent != Py_None) {
@@ -501,7 +505,40 @@ PyObject *py_unreal_engine_new_blueprint_class(PyObject * self, PyObject * args)
501505
return PyErr_Format(PyExc_Exception, "uobject is not a UClass");
502506
parent = (UClass *)py_obj->ue_object;
503507
}
504-
508+
509+
UObject *outer = CreatePackage(nullptr, TEXT("/Game/"));
510+
UBlueprint *bp = FKismetEditorUtilities::CreateBlueprint(parent, outer, UTF8_TO_TCHAR(name), EBlueprintType::BPTYPE_Normal, UBlueprint::StaticClass(), UBlueprintGeneratedClass::StaticClass());
511+
512+
ue_PyUObject *ret = ue_get_python_wrapper(bp);
513+
if (!ret)
514+
return PyErr_Format(PyExc_Exception, "uobject is in invalid state");
515+
Py_INCREF(ret);
516+
return (PyObject *)ret;
517+
518+
}
519+
#endif
520+
521+
PyObject *py_unreal_engine_new_class(PyObject * self, PyObject * args) {
522+
523+
PyObject *py_parent;
524+
char *name;
525+
if (!PyArg_ParseTuple(args, "Os:new_class", &py_parent, &name)) {
526+
return NULL;
527+
}
528+
529+
UObject *outer = GetTransientPackage();
530+
UClass *parent = UObject::StaticClass();
531+
532+
if (py_parent != Py_None) {
533+
if (!ue_is_pyuobject(py_parent)) {
534+
return PyErr_Format(PyExc_Exception, "argument is not a UObject");
535+
}
536+
ue_PyUObject *py_obj = (ue_PyUObject *)py_parent;
537+
if (!py_obj->ue_object->IsA<UClass>())
538+
return PyErr_Format(PyExc_Exception, "uobject is not a UClass");
539+
parent = (UClass *)py_obj->ue_object;
540+
}
541+
505542
UBlueprintGeneratedClass *new_object = nullptr;
506543

507544
if (Cast<UBlueprintGeneratedClass>(parent)) {
@@ -510,32 +547,22 @@ PyObject *py_unreal_engine_new_blueprint_class(PyObject * self, PyObject * args)
510547
}
511548
else {
512549
UE_LOG(LogPython, Warning, TEXT("Parent class is NOT blueprint generated"));
513-
new_object = NewObject<UPythonGeneratedClass>(outer, UTF8_TO_TCHAR(name), RF_Public);
550+
new_object = NewObject<UBlueprintGeneratedClass>(outer, UTF8_TO_TCHAR(name), RF_Public);
514551
new_object->ClassFlags |= CLASS_Native;
515552
}
516553

517554
if (!new_object)
518-
return PyErr_Format(PyExc_Exception, "unable to create blueprint class");
519-
520-
UBlueprint *blueprint = NewObject<UBlueprint>(outer);
521-
blueprint->GeneratedClass = new_object;
522-
new_object->ClassGeneratedBy = blueprint;
523-
555+
return PyErr_Format(PyExc_Exception, "unable to create class");
524556

525-
auto ClassConstructor = [](const FObjectInitializer& ObjectInitializer) {
526-
auto _class = ObjectInitializer.GetClass();
527-
UE_LOG(LogPython, Warning, TEXT("CALLING CONSTRUCTOR OF %s"), *_class->GetName());
528-
_class->GetSuperClass()->ClassConstructor(ObjectInitializer);
529-
};
530557

531-
new_object->ClassConstructor = ClassConstructor;
558+
new_object->ClassConstructor = parent->ClassConstructor;
532559
new_object->SetSuperStruct(parent);
533560

534561
new_object->PropertyLink = parent->PropertyLink;
535562
new_object->ClassWithin = parent->ClassWithin;
536563
new_object->ClassConfigName = parent->ClassConfigName;
537564

538-
new_object->ClassFlags |= (parent->ClassFlags & (CLASS_Inherit | CLASS_ScriptInherit | CLASS_CompiledFromBlueprint));
565+
new_object->ClassFlags |= (parent->ClassFlags & (CLASS_Inherit | CLASS_ScriptInherit | CLASS_HideDropDown));
539566
new_object->ClassCastFlags |= parent->ClassCastFlags;
540567

541568
new_object->Bind();

Source/UnrealEnginePython/Private/UEPyEngine.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ PyObject *py_unreal_engine_vector_mul_vector(PyObject *, PyObject *);
3232
PyObject *py_unreal_engine_vector_mul_float(PyObject *, PyObject *);
3333
PyObject *py_unreal_engine_new_object(PyObject *, PyObject *);
3434
PyObject *py_unreal_engine_new_class(PyObject *, PyObject *);
35-
PyObject *py_unreal_engine_new_blueprint_class(PyObject *, PyObject *);
35+
36+
#if WITH_EDITOR
37+
PyObject *py_unreal_engine_create_blueprint(PyObject *, PyObject *);
38+
#endif
39+
3640

3741
PyObject *py_unreal_engine_message_dialog_open(PyObject *, PyObject *);

Source/UnrealEnginePython/Private/UEPyModule.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,13 @@ static PyMethodDef unreal_engine_methods[] = {
8181
{ "editor_deselect_actors", py_unreal_engine_editor_deselect_actors, METH_VARARGS, "" },
8282
{ "import_asset", py_unreal_engine_import_asset, METH_VARARGS, "" },
8383
{ "get_asset", py_unreal_engine_get_asset, METH_VARARGS, "" },
84+
{ "create_blueprint", py_unreal_engine_create_blueprint, METH_VARARGS, "" },
8485
#endif
8586

8687
{ "new_object", py_unreal_engine_new_object, METH_VARARGS, "" },
87-
{ "new_blueprint_class", py_unreal_engine_new_blueprint_class, METH_VARARGS, "" },
88+
89+
90+
{ "new_class", py_unreal_engine_new_class, METH_VARARGS, "" },
8891

8992
{ "message_dialog_open", py_unreal_engine_message_dialog_open, METH_VARARGS, "" },
9093

Source/UnrealEnginePython/Private/UEPyObject.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ PyObject *py_ue_add_property(ue_PyUObject * self, PyObject * args) {
423423
if (!u_property)
424424
return PyErr_Format(PyExc_Exception, "unable to allocate new UProperty");
425425

426-
uint64 flags = CPF_Edit;
426+
uint64 flags = CPF_Edit|CPF_BlueprintVisible;
427427
if (replicate && PyObject_IsTrue(replicate)) {
428428
flags |= CPF_Net;
429429
}

0 commit comments

Comments
 (0)