| | 1 | | using DCL.Controllers; |
| | 2 | | using DCL.ECS7; |
| | 3 | | using DCL.ECS7.ComponentWrapper.Generic; |
| | 4 | | using DCL.ECS7.InternalComponents; |
| | 5 | | using DCL.ECSComponents; |
| | 6 | | using DCL.ECSRuntime; |
| | 7 | | using DCL.Models; |
| | 8 | | using DG.Tweening; |
| | 9 | | using System.Collections.Generic; |
| | 10 | | using UnityEngine; |
| | 11 | |
|
| | 12 | | namespace ECSSystems.TweenSystem |
| | 13 | | { |
| | 14 | | public class ECSTweenSystem |
| | 15 | | { |
| | 16 | | private readonly IInternalECSComponent<InternalTween> tweenInternalComponent; |
| | 17 | | private readonly IReadOnlyDictionary<int, ComponentWriter> componentsWriter; |
| | 18 | | private readonly WrappedComponentPool<IWrappedComponent<PBTweenState>> tweenStateComponentPool; |
| | 19 | | private readonly WrappedComponentPool<IWrappedComponent<ECSTransform>> transformComponentPool; |
| | 20 | | private readonly Vector3Variable worldOffset; |
| | 21 | | private readonly IInternalECSComponent<InternalSceneBoundsCheck> sbcInternalComponent; |
| | 22 | |
|
| 4 | 23 | | public ECSTweenSystem(IInternalECSComponent<InternalTween> tweenInternalComponent, |
| | 24 | | IReadOnlyDictionary<int, ComponentWriter> componentsWriter, |
| | 25 | | WrappedComponentPool<IWrappedComponent<PBTweenState>> tweenStateComponentPool, |
| | 26 | | WrappedComponentPool<IWrappedComponent<ECSTransform>> transformComponentPool, |
| | 27 | | Vector3Variable worldOffset, |
| | 28 | | IInternalECSComponent<InternalSceneBoundsCheck> sbcInternalComponent) |
| | 29 | | { |
| 4 | 30 | | this.tweenInternalComponent = tweenInternalComponent; |
| 4 | 31 | | this.componentsWriter = componentsWriter; |
| 4 | 32 | | this.tweenStateComponentPool = tweenStateComponentPool; |
| 4 | 33 | | this.transformComponentPool = transformComponentPool; |
| 4 | 34 | | this.worldOffset = worldOffset; |
| 4 | 35 | | this.sbcInternalComponent = sbcInternalComponent; |
| 4 | 36 | | } |
| | 37 | |
|
| | 38 | | public void Update() |
| | 39 | | { |
| 5 | 40 | | var tweenComponentGroup = tweenInternalComponent.GetForAll(); |
| | 41 | |
|
| 20 | 42 | | for (var i = 0; i < tweenComponentGroup.Count; i++) |
| | 43 | | { |
| 5 | 44 | | UpdateTweenComponentModel(tweenComponentGroup[i]); |
| | 45 | | } |
| 5 | 46 | | } |
| | 47 | |
|
| | 48 | | private void UpdateTweenComponentModel(KeyValueSetTriplet<IParcelScene, long, ECSComponentData<InternalTween>> t |
| | 49 | | { |
| 5 | 50 | | var tweenStatePooledComponent = tweenStateComponentPool.Get(); |
| 5 | 51 | | var tweenStateComponentModel = tweenStatePooledComponent.WrappedComponent.Model; |
| 5 | 52 | | IParcelScene scene = tweenComponentGroup.key1; |
| 5 | 53 | | if (!componentsWriter.TryGetValue(scene.sceneData.sceneNumber, out var writer)) |
| 0 | 54 | | return; |
| | 55 | |
|
| 5 | 56 | | long entityId = tweenComponentGroup.key2; |
| 5 | 57 | | InternalTween model = tweenComponentGroup.value.model; |
| 5 | 58 | | scene.entities.TryGetValue(entityId, out IDCLEntity entity); |
| | 59 | |
|
| 5 | 60 | | switch (model.tweenMode) |
| | 61 | | { |
| | 62 | | case PBTween.ModeOneofCase.Move: |
| 5 | 63 | | sbcInternalComponent.SetPosition(scene, entity, model.transform.position); |
| 5 | 64 | | break; |
| | 65 | | case PBTween.ModeOneofCase.Rotate: |
| | 66 | | case PBTween.ModeOneofCase.Scale: |
| 0 | 67 | | sbcInternalComponent.OnTransformScaleRotationChanged(scene, entity); |
| | 68 | | break; |
| | 69 | | } |
| | 70 | |
|
| 5 | 71 | | if (model.removed) |
| | 72 | | { |
| 0 | 73 | | writer.Remove(entityId, ComponentID.TWEEN_STATE); |
| 0 | 74 | | return; |
| | 75 | | } |
| | 76 | |
|
| 5 | 77 | | float currentTime = model.tweener.ElapsedPercentage(); |
| 5 | 78 | | if (currentTime.Equals(1f) && model.currentTime.Equals(1f)) |
| 0 | 79 | | return; |
| | 80 | |
|
| 5 | 81 | | if (model.playing) |
| | 82 | | { |
| 5 | 83 | | tweenStateComponentModel.State = currentTime.Equals(1f) ? TweenStateStatus.TsCompleted : TweenStateStatu |
| 5 | 84 | | tweenStateComponentModel.CurrentTime = currentTime; |
| | 85 | | } |
| | 86 | | else |
| | 87 | | { |
| 0 | 88 | | tweenStateComponentModel.State = TweenStateStatus.TsPaused; |
| | 89 | | } |
| | 90 | |
|
| 5 | 91 | | writer.Put(entityId, ComponentID.TWEEN_STATE, tweenStatePooledComponent); |
| | 92 | |
|
| 5 | 93 | | UpdateTransformComponent(entity, model.transform, writer); |
| | 94 | |
|
| 5 | 95 | | model.currentTime = currentTime; |
| 5 | 96 | | tweenInternalComponent.PutFor(scene, entityId, model); |
| | 97 | |
|
| | 98 | | // Same AvatarShape interpolation used at DCLTransform from SDK6 |
| 5 | 99 | | entity.OnTransformChange?.Invoke(model.transform.localPosition, model.transform.localRotation); |
| 0 | 100 | | } |
| | 101 | |
|
| | 102 | | private void UpdateTransformComponent(IDCLEntity entity, Transform entityTransform, ComponentWriter writer) |
| | 103 | | { |
| 5 | 104 | | var transformComponent = transformComponentPool.Get(); |
| 5 | 105 | | var transformComponentModel = transformComponent.WrappedComponent.Model; |
| 5 | 106 | | transformComponentModel.position = entityTransform.localPosition; |
| 5 | 107 | | transformComponentModel.rotation = entityTransform.localRotation; |
| 5 | 108 | | transformComponentModel.scale = entityTransform.localScale; |
| 5 | 109 | | transformComponentModel.parentId = entity.parentId; |
| 5 | 110 | | writer.Put(entity.entityId, ComponentID.TRANSFORM, transformComponent); |
| 5 | 111 | | } |
| | 112 | | } |
| | 113 | | } |