Rotation offset in Play Particle Effect

I have a particle system template that tries to play in local space, but upon attempting to play it via an animation notify (Play Particle Effect, unattached), I noticed that it looked like it reset to world space.

When I dug into the AnimNotify_PlayParticleEffect.cpp code, I noticed that after loading, the notify initializes its rotation offset quaternion:

RotationOffsetQuat = FQuat(RotationOffset);

when applied to a default rotation offset of zero, gets us an FQuat of (0,0,0,0).
Later, when spawning the particle effect, we call

SpawnTransform.SetRotation(MeshTransform.GetRotation() * RotationOffsetQuat);

Which should treat the rotation as an offset in addition to the mesh rotation, so the rotation should just be identical to the mesh transform’s. But instead, the rotation is zeroed out, and it looks like the particle system doesn’t get any rotation. (To test this, I tried changing the rotation offset to 0 pitch, 0 roll, 1 yaw… which did apply the rotation.)

To fix this, shouldn’t RotationOffsetQuat be FQuat::Identity if the rotation offset is zero?

Thought I was going crazy experiencing this bug intermittently until I found the problem in code. Based on your post this has been in the engine for a while now, and the bug even was copied into the PlayNiagaraEffect notify.

The FQuat constructor with a Rotator of 0,0,0 Yaw,Pitch,Roll will correctly generate the identity quat(0,0,0,1).

The bug isn’t that the RotationOffsetQuat is being set incorrectly, the bug is that in certain cases, the quat isn’t being initialized at all, and is just filled with zeroes. This would happen if PostLoad or OnChanged was never called on that object, which is possible in certain use-cases (like newly created objects in the editor). The value should be initialized to Identity. I’ll see what the process is for making a pull request to fix this.