[UE 5.8.3][Editor] With an actor selected, the Details panel labels each component's Custom Primitive Data with every component's material parameters, and warns of overlaps that don't exist

Summary

When an actor is selected in the level, the Details panel shows its components’ properties inline. In that view, each component’s Custom Primitive Data Defaults rows are labelled with the Custom Primitive Data parameters of the materials on ALL of the actor’s primitive components, not just that component’s own materials. Where two components’ materials declare different names at the same index, every component shows “Primitive index has overlapping parameter names declared”, and parameters from other components’ materials appear as “Undeclared” rows, even on a component whose array is empty. Rendering is unaffected: each component’s material still reads only that component’s own array.

Cause, from reading the source: FCustomPrimitiveDataCustomization::ForEachSelectedComponent (Editor/DetailCustomizations/Private/CustomPrimitiveDataCustomization.cpp) gathers declarations from PropertyUtils->GetSelectedObjects(), and when a selected object is an AActor it loops over every primitive component of that actor. A component’s Custom Primitive Data customized inside the actor’s Details panel therefore gets every component’s materials.

Possible fix (not tested): gather from the objects that own the customized property, e.g. PropertyHandle->GetOuterObjects() in CustomizeChildren, and fall back to the actor’s components only when the struct belongs to the actor itself.

What Type of Bug are you experiencing?

Editor

Steps to Reproduce

  1. Create two materials that use Custom Primitive Data:
    • Material A: a scalar parameter “AlphaParam” with Use Custom Primitive Data on, Primitive Data Index 0.
    • Material B: a scalar parameter “BetaParam” at index 0, and a vector parameter “GammaColor” at index 1.
  2. Create a C++ actor with two UStaticMeshComponent properties marked UPROPERTY(VisibleAnywhere), MeshA and MeshB. Give MeshA a mesh using Material A and MeshB a mesh using Material B (in a Blueprint subclass or on the placed instance).
  3. Place the actor in a level and select it.
  4. In the Details panel, expand MeshA > Rendering > Custom Primitive Data Defaults, then do the same for MeshB.

Expected Result

MeshA’s rows show only Material A’s parameters: index 0 is AlphaParam, with no warning. MeshB’s rows show only BetaParam and GammaColor.

Observed Result

On both components, index 0 lists both AlphaParam and BetaParam under the warning “Primitive index has overlapping parameter names declared, make sure scalar and/or vector channel names match to remove warning”, and GammaColor appears as an “Undeclared” vector group. A component’s own values are drawn under the other material’s labels (e.g. as a colour swatch under GammaColor), so the colour picker there writes RGBA into indices 1-4 of that component, overwriting whatever its own material uses those indices for.

Tested on UE 5.8.3 (CL 58210709, launcher build), macOS 27.0.1, Apple Silicon. Also seen on Windows 11 by a teammate.

Affects Versions

5.8

Platform(s)

Mac
Windows

Additional Notes

We hit this on our own actor: a door whose frame and panel meshes use one material (Custom Primitive Data at indices 0-7) and whose header mesh uses another (indices 0-1), all three components being VisibleAnywhere C++ properties. The steps above are a reduced version of that setup, written from what we saw and from the source; we did not build the reduced case separately.