Skip to content
PRODUCT GITHUB  ↗

Migration Notes

This page covers behavior changes that can affect an existing project when upgrading to v5.4 — not new features (see the changelog for those). Read through it before upgrading a shipping project, particularly the replication change below, which is silent unless you’re looking for it.


Previously, ARealtimeMeshActor::BeginPlay force-enabled replication on every RealtimeMesh actor by calling SetReplicates(true) unconditionally. It now respects the actor’s configured bReplicates value instead — the remote role and physics replication mode are only wired up when bReplicates is already true on the authority.

This is a silent behavior change if your project relied on the old automatic replication:

  • If your RealtimeMesh actors need to replicate, set bReplicates = true explicitly on your actor’s class defaults, Blueprint, or the placed actor’s details — the same as any other actor.
  • Actors that never needed replication get the benefit of no longer being forced into the replication graph.

Distance-field and Lumen card generators are removed

Section titled “Distance-field and Lumen card generators are removed”

URealtimeMeshDistanceFieldGeneration and URealtimeMeshCardRepresentationGenerator (formerly in RealtimeMeshExt) have been removed. They spent an interim period as deprecated shims that funneled into the shared SDF core; that shim layer is now gone and calls to the old classes no longer compile.

Replacements:

  • URealtimeMeshSDFLibrary for the high-level “apply to mesh” flows.
  • The RealtimeMesh::SDF API in RealtimeMeshSDF directly: GenerateDistanceFieldCPU + PackToDistanceFieldVolumeData for distance fields, GenerateCardRepresentationCPU for Lumen cards, and their ...Async variants.

Behavior notes when migrating from the old generators:

  • Output is engine-equivalent, not bit-identical to the old generators — the same FDistanceFieldVolumeData / FMeshCardsBuildData formats come out, but exact values can differ. Don’t rely on byte-for-byte reproducibility of prior output.
  • There is no pre-built BVH input — the core always builds its own BVH internally.
  • Card generation derives bounds from the mesh (no distance-field input), and returns Failure (rather than a zero-card Success) when no cards can be produced.
  • The old bUsePointQuery / bMultiThreadedGeneration style options have no equivalent — generation is always BVH-based and internally parallelized.

The key/config/collision structs and enums it mirrored are now reflected directly at their native declarations in the Core/*.h headers. Struct paths and reflected fields are unchanged, so existing Blueprint assets load as before — but if your C++ includes RealtimeMeshNoExportTypes.h directly, include the relevant Core/*.h header instead (most code already gets these transitively). This change also fixes Blueprint memory corruption caused by the old mirrors’ wrong-size struct registration.

The Blueprint/editor-reflected default for FRealtimeMeshSectionConfig::bForceOpaque previously showed as true, even though the native C++ default has always been false. This was a drift between the native struct and its editor-reflected mirror, now fixed — the reflected default is false, matching the native default and matching actual runtime behavior (sections have always been constructed with bForceOpaque = false).

Runtime behavior does not change. If a Blueprint graph read the previously-displayed true default and depended on it, set the value explicitly now that the displayed default has changed.


Two changes are landing that aren’t yet in a tagged release — flagging them now so they aren’t a surprise:

  • Raw meshoptimizer includes are no longer supported. If any of your code includes MeshOptimizer/meshoptimizer.h directly, switch to the canonical RealtimeMeshMeshOptimizer.h include instead. The underlying library is vendored with a symbol prefix, and only the canonical header is guaranteed to resolve against it going forward.
  • Debug CVars are being renamed from r.RealtimeMesh.Nanite.* to r.TriAxisNanite.RMC.*. Update any project config, console command bindings, or automation scripts that reference the old names.