- Only export interface functions if there isn't already a function with this name on the type.
- Added tests for interfaces, including interface inheritance, and multiple inheritance on an object.
#jira UE-112343, UE-112342
#rb Jurre.deBarre
#ROBOMERGE-SOURCE: CL 15876710 in //UE5/Release-5.0-EarlyAccess/...
#ROBOMERGE-BOT: STARSHIP (Release-5.0-EarlyAccess -> Main) (v786-15839533)
[CL 15876772 by jamie dale in ue5-main branch]
- Fixed Python container wrappers leaking transient property instances.
- PyUtil::TPropOnScope will manage an optionally owned property instance, deleting it if required when it goes out-of-scope.
- Fixed Python container wrappers crashing during GC due to calling FReferenceCollector::AddReferencedObjects passing a FProperty-based type.
- Fixed Python delegate wrappers crashing when called with arguments due to checking Children rather than ChildProperties.
#rb Robert.Manuszewski
#rnx
[CL 10791312 by Jamie Dale in Main branch]
This is the first phase of allowing Blueprint types to be generated for Python, which must be accessed via unreal.get_blueprint_generated_types(...) as asset names are not guaranteed to be unique, so they're not added to the unreal module.
Once a type has been generated for Python, it will be updated if the underlying asset is changed. Should the asset be deleted then the Python type will be reset to clean state and become mostly unusable.
This change also ensures that the Unreal type pointers referenced by the Python meta-data are ARO'd correctly. This will cause a warning if you try and delete an asset with a type used by Python.
MyEnum = unreal.get_blueprint_generated_types('/Game/MyEnum') # This can also accept multiple arguments or a list, and will return a tuple of types
print(MyEnum.MY_ENTRY)
#jira UE-81862, UE-81859
#rb Lauren.Barnes
[CL 10227467 by Jamie Dale in Dev-Editor branch]
The existing Python code has been ported to use this, and this can also be used by Blueprints (or other C++ setting properties) to allow property changes that emit change notifications.
#jira UE-77388
#rb Chris.Gagnon
[CL 9706346 by Jamie Dale in Dev-Editor branch]
The old logic for dealing with the parameters within the Unreal function thunk (UPythonGeneratedClass::CallPythonFunction and UPythonCallableForDelegate::CallPythonNative) assumed that Stack.Locals would be set-up correctly for input, and could be written to for output. This isn't true, as Stack.Locals is populated by a memcpy in UObject::ProcessEvent (so isn't safe to write to for non-POD data), and Blueprints just pass along their existing frame data since they skip the call to ProcessScriptFunction (as Python generated functions are marked FUNC_Native).
This change adds a common thunk processing function (PyGenUtil::InvokePythonCallableFromUnrealFunctionThunk) which is used when calling into Python from an Unreal function thunk. This function steps the data off the stack frame for each property, copying input data to Python, and building the output chain (FOutParmRec) from output data addresses. This matches what the UHT generated thunk does for native functions (via P_GET_PROPERTY and P_GET_PROPERTY_REF), as well as what ProcessScriptFunction does for functions with Blueprint bytecode.
#jira UE-75405
#jira UE-75449
[FYI] Rex.Hill
#rb Dan.OConnor
#ROBOMERGE-SOURCE: CL 7064650 in //UE4/Release-4.23/...
#ROBOMERGE-BOT: RELEASE (Release-4.23 -> Main) (v367-6836689)
[CL 7064651 by jamie dale in Main branch]