Skip to content

Commit

Permalink
feat(Tracking): add allow mutate option to transform property applier
Browse files Browse the repository at this point in the history
The TransformPropertyApplier now has an AllowMutate property the same
as the TransformPropertyMutator, which can be used to prevent mutations
occurring and will raise a skipped event if mutations are turned off.

The before update event is always raised.
  • Loading branch information
thestonefox committed Jul 10, 2023
1 parent d5dd0bc commit 1d30393
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 2 deletions.
4 changes: 2 additions & 2 deletions Runtime/Data/Operation/Mutation/TransformPropertyMutator.cs
Expand Up @@ -36,11 +36,11 @@ public GameObject Target
target = value;
}
}
[Tooltip("Determines whether to mutate the local or global values.")]
[Tooltip("Determines whether to allow any mutation to take place.")]
[SerializeField]
private bool allowMutate = true;
/// <summary>
/// Determines whether to mutate the local or global values.
/// Determines whether to allow any mutation to take place.
/// </summary>
public bool AllowMutate
{
Expand Down
27 changes: 27 additions & 0 deletions Runtime/Tracking/Modification/TransformPropertyApplier.cs
Expand Up @@ -157,6 +157,23 @@ public GameObject Offset

#region Apply Settings
[Header("Apply Settings")]
[Tooltip("Determines whether to allow any mutation to take place.")]
[SerializeField]
private bool allowMutate = true;
/// <summary>
/// Determines whether to allow any mutation to take place.
/// </summary>
public bool AllowMutate
{
get
{
return allowMutate;
}
set
{
allowMutate = value;
}
}
[Tooltip("Determines which axes to apply on when utilizing the position offset.")]
[SerializeField]
private Vector3State applyPositionOffsetOnAxis = Vector3State.True;
Expand Down Expand Up @@ -293,6 +310,10 @@ public bool IsTransitionDestinationDynamic
/// Emitted after the transformation process has occured.
/// </summary>
public UnityEvent AfterTransformUpdated = new UnityEvent();
/// <summary>
/// Emitted if the mutation is skipped due to <see cref="AllowMutate"/> being false.
/// </summary>
public UnityEvent TransformUpdateSkipped = new UnityEvent();
#endregion

/// <summary>
Expand Down Expand Up @@ -583,6 +604,12 @@ protected virtual void ProcessTransform(TransformData source, TransformData targ

BeforeTransformUpdated?.Invoke(eventData.Set(source, target));

if (!AllowMutate)
{
TransformUpdateSkipped?.Invoke(eventData.Set(source, target));
return;
}

if (TransitionDuration.ApproxEquals(0f))
{
UpdateTransformProperties(target.Transform, destinationScale, destinationRotation, destinationPosition, target.UseLocalValues);
Expand Down
35 changes: 35 additions & 0 deletions Tests/Editor/Tracking/Modification/TransformPropertyApplierTest.cs
Expand Up @@ -348,55 +348,86 @@ public void ModifyEvents()
{
UnityEventListenerMock beforeTransformUpdatedMock = new UnityEventListenerMock();
UnityEventListenerMock afterTransformUpdatedMock = new UnityEventListenerMock();
UnityEventListenerMock transformUpdateSkippedMock = new UnityEventListenerMock();
subject.BeforeTransformUpdated.AddListener(beforeTransformUpdatedMock.Listen);
subject.AfterTransformUpdated.AddListener(afterTransformUpdatedMock.Listen);
subject.TransformUpdateSkipped.AddListener(transformUpdateSkippedMock.Listen);

subject.Source = new TransformData(sourceObject);
subject.Target = targetObject;
sourceTransformData.Transform.position = Vector3.one;
subject.Apply();
Assert.IsTrue(beforeTransformUpdatedMock.Received);
Assert.IsTrue(afterTransformUpdatedMock.Received);
Assert.IsFalse(transformUpdateSkippedMock.Received);
}

[Test]
public void ModifyEventsDisallowMutate()
{
UnityEventListenerMock beforeTransformUpdatedMock = new UnityEventListenerMock();
UnityEventListenerMock afterTransformUpdatedMock = new UnityEventListenerMock();
UnityEventListenerMock transformUpdateSkippedMock = new UnityEventListenerMock();
subject.BeforeTransformUpdated.AddListener(beforeTransformUpdatedMock.Listen);
subject.AfterTransformUpdated.AddListener(afterTransformUpdatedMock.Listen);
subject.TransformUpdateSkipped.AddListener(transformUpdateSkippedMock.Listen);

subject.Source = new TransformData(sourceObject);
subject.Target = targetObject;
subject.AllowMutate = false;
sourceTransformData.Transform.position = Vector3.one;
subject.Apply();
Assert.IsTrue(beforeTransformUpdatedMock.Received);
Assert.IsFalse(afterTransformUpdatedMock.Received);
Assert.IsTrue(transformUpdateSkippedMock.Received);
}

[Test]
public void NoEventsWhenNoChange()
{
UnityEventListenerMock beforeTransformUpdatedMock = new UnityEventListenerMock();
UnityEventListenerMock afterTransformUpdatedMock = new UnityEventListenerMock();
UnityEventListenerMock transformUpdateSkippedMock = new UnityEventListenerMock();
subject.BeforeTransformUpdated.AddListener(beforeTransformUpdatedMock.Listen);
subject.AfterTransformUpdated.AddListener(afterTransformUpdatedMock.Listen);
subject.TransformUpdateSkipped.AddListener(transformUpdateSkippedMock.Listen);

subject.Source = new TransformData(sourceObject);
subject.Target = targetObject;
subject.Apply();
Assert.IsFalse(beforeTransformUpdatedMock.Received);
Assert.IsFalse(afterTransformUpdatedMock.Received);
Assert.IsFalse(transformUpdateSkippedMock.Received);
}

[Test]
public void EventsWhenNoChangeWhenApplyingOnEqualProperties()
{
UnityEventListenerMock beforeTransformUpdatedMock = new UnityEventListenerMock();
UnityEventListenerMock afterTransformUpdatedMock = new UnityEventListenerMock();
UnityEventListenerMock transformUpdateSkippedMock = new UnityEventListenerMock();
subject.BeforeTransformUpdated.AddListener(beforeTransformUpdatedMock.Listen);
subject.AfterTransformUpdated.AddListener(afterTransformUpdatedMock.Listen);
subject.TransformUpdateSkipped.AddListener(transformUpdateSkippedMock.Listen);

subject.Source = new TransformData(sourceObject);
subject.Target = targetObject;
subject.ShouldApplyToEqualProperties = true;
subject.Apply();
Assert.IsTrue(beforeTransformUpdatedMock.Received);
Assert.IsTrue(afterTransformUpdatedMock.Received);
Assert.IsFalse(transformUpdateSkippedMock.Received);
}

[Test]
public void EventsNotEmittedOnInactiveGameObject()
{
UnityEventListenerMock beforeTransformUpdatedMock = new UnityEventListenerMock();
UnityEventListenerMock afterTransformUpdatedMock = new UnityEventListenerMock();
UnityEventListenerMock transformUpdateSkippedMock = new UnityEventListenerMock();
subject.BeforeTransformUpdated.AddListener(beforeTransformUpdatedMock.Listen);
subject.AfterTransformUpdated.AddListener(afterTransformUpdatedMock.Listen);
subject.TransformUpdateSkipped.AddListener(transformUpdateSkippedMock.Listen);

subject.Source = new TransformData(sourceObject);
subject.Target = targetObject;
Expand All @@ -407,15 +438,18 @@ public void EventsNotEmittedOnInactiveGameObject()

Assert.IsFalse(beforeTransformUpdatedMock.Received);
Assert.IsFalse(afterTransformUpdatedMock.Received);
Assert.IsFalse(transformUpdateSkippedMock.Received);
}

[Test]
public void EventsNotEmittedOnDisabledComponent()
{
UnityEventListenerMock beforeTransformUpdatedMock = new UnityEventListenerMock();
UnityEventListenerMock afterTransformUpdatedMock = new UnityEventListenerMock();
UnityEventListenerMock transformUpdateSkippedMock = new UnityEventListenerMock();
subject.BeforeTransformUpdated.AddListener(beforeTransformUpdatedMock.Listen);
subject.AfterTransformUpdated.AddListener(afterTransformUpdatedMock.Listen);
subject.TransformUpdateSkipped.AddListener(transformUpdateSkippedMock.Listen);

subject.Source = new TransformData(sourceObject);
subject.Target = targetObject;
Expand All @@ -426,6 +460,7 @@ public void EventsNotEmittedOnDisabledComponent()

Assert.IsFalse(beforeTransformUpdatedMock.Received);
Assert.IsFalse(afterTransformUpdatedMock.Received);
Assert.IsFalse(transformUpdateSkippedMock.Received);
}

[Test]
Expand Down

0 comments on commit 1d30393

Please sign in to comment.