- Fix OnAssetLoaded so it is called in -game to match the behavior of the previous loaders
#rnx
#rb kevin.macaulayvacher
[CL 34306179 by danny couture in ue5-main branch]
- Any code causing a linker mismatch needs to explicitly clear loading flags for their object to avoid asserting. This is to make the intention clear that rename will make loading correctly impossible when moving the object to a different linker unintentionally. So either clear the loading flags of the object (i.e. finish loading via load calls such as ConditionalPostLoad) or forcibly allow mismatching via the new flag.
- When marking an export as invalid in FLinkerLoad::InvalidateExport() we now also clear loading flags since it is wasteful to load invalid objects.
- Exports marked as invalid are no longer reset to be valid when the linker is reset for the object instance. This is to prevent reloading invalid objects when re-using a linker already resident in memory if a subsequent package load is requested.
- When UStruct upgrades UFields to FFields, the UStruct objects are marked as invalid to prevent reloading the objects unnecessarily
- Fixes an issue where since Rename can clear the linker for mismatched types, any calls to FLinkerLoad::InvalidateExport needs to be moved before the rename operation to be effective.
- CollectUnreachableObjects will no longer mark unreachable objects as invalid in the linkerloader. That code would mark objects as invalid until the linker is destroyed which incorrectly assumed would happen soon. If however a load for the same package occurs before the linker is destroyed, the in-memory linker would be re-used keeping the marked exports as invalid so those exports would not be loaded (even though they should have been).
#jira UE-212466 UE-214849
#rb Francis.Hurteau, Michael.Galetzka
[RN] UObject::Rename will always remove the renamed object's linker if the rename moves the object into a different package. As a result, any renames occuring while an object is loading will now assert instead of leading to hard to diagnose crashes long after the Rename call has completed. If renaming to a different package is intentional and the linker should not be cleared, the new flag REN_AllowPackageLinkerMismatch can be used to prevent clearing linkers on the object even though the linker is for a different package than the package has been renamed to be part of.
[CL 34304935 by kevin macaulayvacher in ue5-main branch]
- changed the FRedirectedPropertyNode to use UE::FPropertyTypeName for it's types so that containers are distinguishable from one another
- made the fixup tool tabs have the name of the object they're fixing
- fixed the needs fixup warning to open several fixup tools if more than one object needs fixup rather than attempting multi-edit
- exluded VerseFunctionProperty from being made into loose properies since they can't realistically get fixed up
- fixed issue that caused incorrect properties to get marked as set by serialization during object copies
[CL 34210729 by jordan hoffmann in ue5-main branch]
The following additional changes were made:
- The fix up panel can now take an owning object. This is useful to lookup the object used by the component as in cases likes TEDS the object is used as the reference point.
- Added the central function `CreateInstanceDataObjectFixupDialog` to open up the fixup dialog with at least one tab. There are now multiple cases in code where this happens so helps keep consistency and reduce duplicated code.
- Added a new tag to identify loose properties.
- Added new TEDS queries for monitoring loose properties or placeholder tag and alerts so an alert action is added that pops up the fix-up tool.
- Expanded `RequiresFixup` to allow for recursively finding nested objects that require fixing up.
- Added `FindNestedInstanceDataObject` to allow IDOs to be retrieved for nested objects as well. An example is an entity with components that require fixing up, or all known IDOs under an object.
- Removed the memento registration for alerts. After a fix was done the memento would restore the alert again after it was cleared. A finer control over when alerts are recorded as mementos is needed.
#jira UE-215480
#rb jordan.hoffmann, Phillip.Kavan
[RN] Objects that fail to load now display an icon in the Outliner. Clicking the icon will bring up a tool that allows fixing issues.
[CL 34166340 by ronald koppers in ue5-main branch]
#rb Yoan.StAmant
#tests Tested on 30_20 branch, Ran overidable serialization Unittests, Ran overidable serialization Utests,.20 branch.20..20 on a working UEFN builds, Ran Overridable Serialization Unittests
[CL 34129223 by maxime mercier in ue5-main branch]
In both BPVM and VerseVM, methods are no longer stored in object instances, but only in their UClass. (It appears that they were originally added to object instances to support overrides in archetypes.)
This enables the BPVM to switch back to running the VNI pass early, as adding method coercions no longer changes object layout.
Both VObjects and UObjects now attach Self only to VProcedures/VNativeFunctions obtained from their VShape.
#rb Tim.Smith
[CL 34101363 by russell johnston in ue5-main branch]
#rb Per.Larsson
[FYI] Charles.deRousiers
#jira UE-216308
- Currently, if we make a request via the bulkdata streaming api for zero bytes, the IoStore (FFileIoStore) path will return a successful read but if the IoStore is disabled we will go through FPackageResourceIoBackend which will use the IAsyncReadFileHandle api which tends to assert or fail on zero byte reads.
- There is work pending for unifying how all our different file apis behave under these sorts of conditions but for now it's easier to fix FPackageResourceIoBackend to handle 0 byte reads than fix all IAsyncReadFileHandle implementations.
- If we detect a zero byte read in FPackageResourceIoBackend we can immediately pass it back to the IoDispatcher to handle the completed result.
- Note that if no user supplied memory can be found we will make a 0 byte allocation via FIoBuffer. This mirrors the behavour found in FFileIoStore.
- Even though we don't use the file handle, we still attempt to open one before counting the 0 byte read a success. This will cause attempts to make a 0 byte read of a missing file a failure etc. The file handle is then immediately closed.
- Since the zero byte reads will have no handles, there is no need for it to have an entry in FPendingRequests, so FPendingRequests::Remove needs to handle the case where the entry will not be found.
[CL 34087134 by paul chipchase in ue5-main branch]
The game thread now creates one long-lived execution context, rather than using narrower scope guards. Other threads (e.g. outside of a running game) must create their own context in the same way. This will make it possible to use an execution context to invoke the VerseVM from C++, the same way this is done with the BPVM.
The rest of this change consists mostly of renaming things and passing around contexts. The interesting changes are some simplifications to runtime errors (see VerseRuntimeError.cpp and VerseNativeModule.cpp), and that `TVerseFunction` and `FVerseCall::Return` no longer install a redundant execution context.
#rb Tim.Smith
#okforversepublic
[CL 34083101 by russell johnston in ue5-main branch]