Skip to content

Commit

Permalink
fix: sdk7 tween reset + tween transform pos update (#6057)
Browse files Browse the repository at this point in the history
* The TweenComponent DOTween tweener was being wrongly reset when it wasn't needed, specifically affecting cases of applying different kind of tweens on the same transform one after the other.
* Transform component position was being updated wrongly for entities that were child of other displaced entities instead of the scene root transform.
  • Loading branch information
pravusjif authored Jan 17, 2024
1 parent 536a00d commit 857fc5c
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -84,17 +84,10 @@ public void OnComponentModelUpdated(IParcelScene scene, IDCLEntity entity, PBTwe
float durationInSeconds = model.Duration / 1000;
currentTweener = internalComponentModel.tweener;

if (currentTweener == null)
{
// There may be a tween running for the entity transform, even though internalComponentModel.tweener
// is null, e.g: during preview mode hot-reload.
var transformTweens = DOTween.TweensByTarget(entityTransform, true);
transformTweens?[0].Rewind(false);
}
else
{
currentTweener.Rewind(false);
}
// There may be a tween running for the entity transform, even with internalComponentModel.tweener
// as null, e.g: during preview mode hot-reload.
var transformTweens = DOTween.TweensByTarget(entityTransform, true);
transformTweens?[0].Rewind(false);

internalComponentModel.transform = entityTransform;
internalComponentModel.currentTime = model.CurrentTime;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -465,5 +465,47 @@ public void KillTweenerImmediatelyOnComponentRemove()
tweens = DOTween.PlayingTweens();
Assert.IsNull(tweens);
}

[Test]
public void NotResetPreviousTweenerOnComponentUpdate()
{
Vector3 startPosition = Vector3.zero;
Vector3 endPosition = new Vector3(57f, 41f, 5f);
float duration = 3000;
Transform entityTransform = entity.gameObject.transform;

var model = new PBTween()
{
Duration = duration,
Move = new Move()
{
Start = new Decentraland.Common.Vector3() { X = startPosition.x, Y = startPosition.y, Z = startPosition.z },
End = new Decentraland.Common.Vector3() { X = endPosition.x, Y = endPosition.y, Z = endPosition.z },
FaceDirection = true
}
};

componentHandler.OnComponentModelUpdated(scene, entity, model);

// Check it moved
var tweener = internalComponents.TweenComponent.GetFor(scene, entity).Value.model.tweener;
tweener.Goto(duration / 1000 / 2);
Assert.AreEqual(endPosition / 2, entityTransform.position);

// Put new different component
model = new PBTween()
{
Duration = duration,
Rotate = new Rotate()
{
Start = new Decentraland.Common.Quaternion() { X = 1f, Y = 1f, Z = 1f, W = 1f },
End = new Decentraland.Common.Quaternion() { X = 5f, Y = 5f, Z = 5f, W = 5f }
}
};
componentHandler.OnComponentModelUpdated(scene, entity, model);

// Check transform position hasn't been reset
Assert.AreEqual(endPosition / 2, entityTransform.position);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ private void UpdateTweenComponentModel(KeyValueSetTriplet<IParcelScene, long, EC

writer.Put(entityId, ComponentID.TWEEN_STATE, tweenStatePooledComponent);

UpdateTransformComponent(scene, entity, model.transform, writer);
UpdateTransformComponent(entity, model.transform, writer);

model.currentTime = currentTime;
tweenInternalComponent.PutFor(scene, entityId, model);
Expand All @@ -99,13 +99,11 @@ private void UpdateTweenComponentModel(KeyValueSetTriplet<IParcelScene, long, EC
entity.OnTransformChange?.Invoke(model.transform.localPosition, model.transform.localRotation);
}

private void UpdateTransformComponent(IParcelScene scene, IDCLEntity entity, Transform entityTransform, ComponentWriter writer)
private void UpdateTransformComponent(IDCLEntity entity, Transform entityTransform, ComponentWriter writer)
{
var transformComponent = transformComponentPool.Get();
var transformComponentModel = transformComponent.WrappedComponent.Model;
Vector3 currentWorldOffset = worldOffset.Get();
var newUnityGlobalPosition = entityTransform.position;
transformComponentModel.position = UtilsScene.GlobalToScenePosition(ref scene.sceneData.basePosition, ref newUnityGlobalPosition, ref currentWorldOffset);
transformComponentModel.position = entityTransform.localPosition;
transformComponentModel.rotation = entityTransform.localRotation;
transformComponentModel.scale = entityTransform.localScale;
transformComponentModel.parentId = entity.parentId;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,10 +100,15 @@ public void AttachAndUpdateTweenStateComponent()
[Test]
public void UpdateTransformComponentCorrectly()
{
var parentEntity = scene.CreateEntity(6966);
entity.parentId = 6966;
parentEntity.gameObject.transform.position = new Vector3(10, 10, 10);

float currentTime = 0.666f;
float duration = 9f;
Transform entityTransform = entity.gameObject.transform;
entityTransform.SetParent(parentEntity.gameObject.transform);
entityTransform.localPosition = Vector3.zero;

// Stuff that the handler does
Tweener tweener = entityTransform.DOLocalMove(Vector3.up, duration);
Expand All @@ -119,12 +124,15 @@ public void UpdateTransformComponentCorrectly()
tweener.Goto(duration * currentTime);
systemUpdate();

// Note: if these `Put_Called<ECSTransform>()` throw a 'System.Exception : Unexpected
// component value. was: DCL.ECSComponents.ECSTransform', That's because componentModel.position
// values are not the same as entityTransform.localPosition values.
outgoingMessages.Put_Called<ECSTransform>(
entity.entityId,
ComponentID.TRANSFORM,
componentModel =>
componentModel.position == entityTransform.localPosition
&& componentModel.parentId == entity.parentId
componentModel.position.Equals(entityTransform.localPosition)
&& componentModel.parentId == entity.parentId
);
Vector3 midPosition = entityTransform.localPosition;

Expand All @@ -135,7 +143,7 @@ public void UpdateTransformComponentCorrectly()
entity.entityId,
ComponentID.TRANSFORM,
componentModel =>
componentModel.position == entityTransform.localPosition
componentModel.position.Equals(entityTransform.localPosition)
&& componentModel.parentId == entity.parentId
);
Assert.AreNotEqual(midPosition, entityTransform.localPosition);
Expand Down
2 changes: 1 addition & 1 deletion unity-renderer/Packages/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
"com.unity.ai.navigation": "1.1.4",
"com.unity.build-report-inspector": "https://github.com/needle-mirror/com.unity.build-report-inspector.git",
"com.unity.cinemachine": "2.9.5",
"com.unity.ide.rider": "3.0.26",
"com.unity.ide.rider": "3.0.27",
"com.unity.ide.visualstudio": "2.0.18",
"com.unity.ide.vscode": "1.2.5",
"com.unity.memoryprofiler": "1.0.0",
Expand Down
2 changes: 1 addition & 1 deletion unity-renderer/Packages/packages-lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@
"url": "https://packages.unity.com"
},
"com.unity.ide.rider": {
"version": "3.0.26",
"version": "3.0.27",
"depth": 0,
"source": "registry",
"dependencies": {
Expand Down

0 comments on commit 857fc5c

Please sign in to comment.