using System.Numerics; namespace AcDream.Core.Vfx; /// /// Read-only view of the final pose used by entity-attached effects. /// Implementations publish poses on the update/render thread after root motion, /// animation, and equipped-child composition have completed. /// public interface IEntityEffectPoseSource { bool TryGetRootPose(uint localEntityId, out Matrix4x4 rootWorld); bool TryGetPartPose(uint localEntityId, int partIndex, out Matrix4x4 partLocal); } /// /// Optional update-thread notification surface for pose registries. Effect /// consumers use this to refresh only owners whose final root, part, or cell /// pose actually changed instead of polling every retained owner each frame. /// /// /// Notifications are synchronous and occur after the new pose is published. /// Implementations must suppress notifications when a publish is byte-for-byte /// equivalent to the current pose. Consumers must not mutate the pose source /// from inside the callback. /// public interface IEntityEffectPoseChangeSource { event Action? EffectPoseChanged; } /// /// Optional spatial companion for consumers, such as object lights, whose /// render registration is scoped to the owner's current AC cell. /// public interface IEntityEffectCellSource { bool TryGetCellId(uint localEntityId, out uint cellId); }