| | 1 | | using DCL.CameraTool; |
| | 2 | | using DCL.Controllers; |
| | 3 | | using DCL.ECS7; |
| | 4 | | using DCL.ECS7.ComponentWrapper.Generic; |
| | 5 | | using DCL.ECSComponents; |
| | 6 | | using DCL.ECSRuntime; |
| | 7 | | using DCL.Helpers; |
| | 8 | | using DCL.Models; |
| | 9 | | using System; |
| | 10 | | using System.Collections.Generic; |
| | 11 | | using UnityEngine; |
| | 12 | |
|
| | 13 | | namespace ECSSystems.CameraSystem |
| | 14 | | { |
| | 15 | | public class ECSCameraEntitySystem : IDisposable |
| | 16 | | { |
| | 17 | | private readonly WrappedComponentPool<IWrappedComponent<PBCameraMode>> cameraModePool; |
| | 18 | | private readonly WrappedComponentPool<IWrappedComponent<PBPointerLock>> pointerLockPool; |
| | 19 | | private readonly WrappedComponentPool<IWrappedComponent<ECSTransform>> transformPool; |
| | 20 | | private readonly BaseVariable<Transform> cameraTransform; |
| | 21 | | private readonly Vector3Variable worldOffset; |
| | 22 | | private readonly BaseList<IParcelScene> loadedScenes; |
| | 23 | | private readonly IReadOnlyDictionary<int, ComponentWriter> componentsWriter; |
| | 24 | | private readonly BaseVariableAsset<CameraMode.ModeId> cameraMode; |
| | 25 | | private readonly ECSComponent<ECSTransform> transformComponent; |
| | 26 | |
|
| 5 | 27 | | private Vector3 lastCameraPosition = Vector3.zero; |
| 5 | 28 | | private Quaternion lastCameraRotation = Quaternion.identity; |
| | 29 | | private bool newSceneAdded = false; |
| | 30 | |
|
| 5 | 31 | | public ECSCameraEntitySystem(IReadOnlyDictionary<int, ComponentWriter> componentsWriter, |
| | 32 | | WrappedComponentPool<IWrappedComponent<PBCameraMode>> cameraModePool, |
| | 33 | | WrappedComponentPool<IWrappedComponent<PBPointerLock>> pointerLockPool, |
| | 34 | | WrappedComponentPool<IWrappedComponent<ECSTransform>> transformPool, |
| | 35 | | ECSComponent<ECSTransform> transformComponent, |
| | 36 | | BaseList<IParcelScene> loadedScenes, BaseVariable<Transform> cameraTransform, Vector3Variable worldOffset, |
| | 37 | | BaseVariableAsset<CameraMode.ModeId> cameraMode) |
| | 38 | | { |
| 5 | 39 | | this.cameraTransform = cameraTransform; |
| 5 | 40 | | this.worldOffset = worldOffset; |
| 5 | 41 | | this.loadedScenes = loadedScenes; |
| 5 | 42 | | this.componentsWriter = componentsWriter; |
| 5 | 43 | | this.cameraMode = cameraMode; |
| 5 | 44 | | this.cameraModePool = cameraModePool; |
| 5 | 45 | | this.pointerLockPool = pointerLockPool; |
| 5 | 46 | | this.transformPool = transformPool; |
| 5 | 47 | | this.transformComponent = transformComponent; |
| | 48 | |
|
| 5 | 49 | | loadedScenes.OnAdded += LoadedScenesOnOnAdded; |
| 5 | 50 | | } |
| | 51 | |
|
| | 52 | | public void Dispose() |
| | 53 | | { |
| 5 | 54 | | loadedScenes.OnAdded -= LoadedScenesOnOnAdded; |
| 5 | 55 | | } |
| | 56 | |
|
| | 57 | | public void Update() |
| | 58 | | { |
| 8 | 59 | | var currentCameraTransform = cameraTransform.Get(); |
| | 60 | |
|
| 8 | 61 | | if (currentCameraTransform == null) |
| 0 | 62 | | return; |
| | 63 | |
|
| 8 | 64 | | Vector3 cameraPosition = currentCameraTransform.position; |
| 8 | 65 | | Quaternion cameraRotation = currentCameraTransform.rotation; |
| | 66 | |
|
| 8 | 67 | | bool updateTransform = newSceneAdded || (lastCameraPosition != cameraPosition || lastCameraRotation != camer |
| 8 | 68 | | newSceneAdded = false; |
| | 69 | |
|
| 8 | 70 | | lastCameraPosition = cameraPosition; |
| 8 | 71 | | lastCameraRotation = cameraRotation; |
| | 72 | |
|
| 8 | 73 | | var currentCameraMode = cameraMode.Get(); |
| | 74 | |
|
| 8 | 75 | | var cameraModeId = ProtoConvertUtils.UnityEnumToPBCameraEnum(currentCameraMode); |
| 8 | 76 | | var isCursorLocked = Utils.IsCursorLocked; |
| | 77 | |
|
| 8 | 78 | | Vector3 currentWorldOffset = worldOffset.Get(); |
| 8 | 79 | | IReadOnlyList<IParcelScene> loadedScenes = this.loadedScenes; |
| | 80 | |
|
| | 81 | | IParcelScene scene; |
| | 82 | |
|
| 32 | 83 | | for (int i = 0; i < loadedScenes.Count; i++) |
| | 84 | | { |
| 8 | 85 | | scene = loadedScenes[i]; |
| | 86 | |
|
| 8 | 87 | | if (!componentsWriter.TryGetValue(scene.sceneData.sceneNumber, out ComponentWriter writer)) |
| | 88 | | continue; |
| | 89 | |
|
| 8 | 90 | | var cameraModeWrappedComponent = cameraModePool.Get(); |
| 8 | 91 | | var pooledWrappedComponent = pointerLockPool.Get(); |
| 8 | 92 | | cameraModeWrappedComponent.WrappedComponent.Model.Mode = cameraModeId; |
| 8 | 93 | | pooledWrappedComponent.WrappedComponent.Model.IsPointerLocked = isCursorLocked; |
| | 94 | |
|
| 8 | 95 | | writer.Put(SpecialEntityId.CAMERA_ENTITY, ComponentID.CAMERA_MODE, cameraModeWrappedComponent); |
| 8 | 96 | | writer.Put(SpecialEntityId.CAMERA_ENTITY, ComponentID.POINTER_LOCK, pooledWrappedComponent); |
| | 97 | |
|
| 8 | 98 | | if (!updateTransform) |
| | 99 | | continue; |
| | 100 | |
|
| 5 | 101 | | var pooledTransformComponent = transformPool.Get(); |
| 5 | 102 | | var t = pooledTransformComponent.WrappedComponent.Model; |
| 5 | 103 | | t.position = UtilsScene.GlobalToScenePosition(ref scene.sceneData.basePosition, ref cameraPosition, ref |
| 5 | 104 | | t.rotation = cameraRotation; |
| | 105 | |
|
| 5 | 106 | | writer.Put(SpecialEntityId.CAMERA_ENTITY, ComponentID.TRANSFORM, pooledTransformComponent); |
| | 107 | |
|
| 5 | 108 | | if (scene.entities.TryGetValue(SpecialEntityId.CAMERA_ENTITY, out var entity)) |
| | 109 | | { |
| 0 | 110 | | ECSTransform stored = transformComponent.Get(scene, entity.entityId)?.model ?? new ECSTransform(); |
| 0 | 111 | | stored.position = t.position; |
| 0 | 112 | | stored.rotation = t.rotation; |
| 0 | 113 | | stored.scale = t.scale; |
| 0 | 114 | | stored.parentId = t.parentId; |
| 0 | 115 | | transformComponent.SetModel(scene, entity, stored); |
| | 116 | | } |
| | 117 | | } |
| 8 | 118 | | } |
| | 119 | |
|
| | 120 | | private void LoadedScenesOnOnAdded(IParcelScene obj) |
| | 121 | | { |
| 0 | 122 | | newSceneAdded = true; |
| 0 | 123 | | } |
| | 124 | | } |
| | 125 | | } |