| | 1 | | using DCL.Controllers; |
| | 2 | | using DCL.ECS7.InternalComponents; |
| | 3 | | using DCL.ECSRuntime; |
| | 4 | | using DCL.Helpers; |
| | 5 | | using DCL.Models; |
| | 6 | | using UnityEngine; |
| | 7 | |
|
| | 8 | | namespace DCL.ECSComponents |
| | 9 | | { |
| | 10 | | public class MeshRendererHandler : IECSComponentHandler<PBMeshRenderer> |
| | 11 | | { |
| | 12 | | private readonly IInternalECSComponent<InternalTexturizable> texturizableInternalComponent; |
| | 13 | | private readonly IInternalECSComponent<InternalRenderers> renderersInternalComponent; |
| | 14 | | private readonly DataStore_ECS7 ecs7DataStore; |
| | 15 | |
|
| | 16 | | private GameObject componentGameObject; |
| | 17 | | private MeshFilter componentMeshFilter; |
| | 18 | | private MeshRenderer componentMeshRenderer; |
| | 19 | |
|
| | 20 | | private AssetPromise_PrimitiveMesh primitiveMeshPromise; |
| | 21 | | private PBMeshRenderer prevModel; |
| | 22 | |
|
| 7 | 23 | | public MeshRendererHandler( |
| | 24 | | DataStore_ECS7 dataStoreEcs7, |
| | 25 | | IInternalECSComponent<InternalTexturizable> texturizableComponent, |
| | 26 | | IInternalECSComponent<InternalRenderers> renderersComponent) |
| | 27 | | { |
| 7 | 28 | | texturizableInternalComponent = texturizableComponent; |
| 7 | 29 | | renderersInternalComponent = renderersComponent; |
| 7 | 30 | | ecs7DataStore = dataStoreEcs7; |
| 7 | 31 | | } |
| | 32 | |
|
| | 33 | | public void OnComponentCreated(IParcelScene scene, IDCLEntity entity) |
| | 34 | | { |
| 11 | 35 | | componentGameObject = new GameObject("MeshRenderer"); |
| 11 | 36 | | componentGameObject.transform.SetParent(entity.gameObject.transform); |
| 11 | 37 | | componentGameObject.transform.ResetLocalTRS(); |
| 11 | 38 | | componentMeshFilter = componentGameObject.AddComponent<MeshFilter>(); |
| 11 | 39 | | componentMeshRenderer = componentGameObject.AddComponent<MeshRenderer>(); |
| 11 | 40 | | componentMeshRenderer.sharedMaterial = Utils.EnsureResourcesMaterial("Materials/Default"); |
| 11 | 41 | | texturizableInternalComponent.AddRenderer(scene, entity, componentMeshRenderer); |
| 11 | 42 | | renderersInternalComponent.AddRenderer(scene, entity, componentMeshRenderer); |
| 11 | 43 | | } |
| | 44 | |
|
| | 45 | | public void OnComponentRemoved(IParcelScene scene, IDCLEntity entity) |
| | 46 | | { |
| 12 | 47 | | texturizableInternalComponent.RemoveRenderer(scene, entity, componentMeshRenderer); |
| 12 | 48 | | renderersInternalComponent.RemoveRenderer(scene, entity, componentMeshRenderer); |
| | 49 | |
|
| 12 | 50 | | if (prevModel != null) |
| 9 | 51 | | ecs7DataStore.RemovePendingResource(scene.sceneData.id, prevModel); |
| | 52 | |
|
| 12 | 53 | | AssetPromiseKeeper_PrimitiveMesh.i.Forget(primitiveMeshPromise); |
| 12 | 54 | | Object.Destroy(componentGameObject); |
| 12 | 55 | | } |
| | 56 | |
|
| | 57 | | public void OnComponentModelUpdated(IParcelScene scene, IDCLEntity entity, PBMeshRenderer model) |
| | 58 | | { |
| 11 | 59 | | AssetPromise_PrimitiveMesh_Model? promiseModel = null; |
| | 60 | |
|
| 11 | 61 | | switch (model.MeshCase) |
| | 62 | | { |
| | 63 | | case PBMeshRenderer.MeshOneofCase.Box: |
| 6 | 64 | | promiseModel = AssetPromise_PrimitiveMesh_Model.CreateBox(model.Box.Uvs); |
| 6 | 65 | | break; |
| | 66 | | case PBMeshRenderer.MeshOneofCase.Sphere: |
| 1 | 67 | | promiseModel = AssetPromise_PrimitiveMesh_Model.CreateSphere(); |
| 1 | 68 | | break; |
| | 69 | | case PBMeshRenderer.MeshOneofCase.Cylinder: |
| 2 | 70 | | promiseModel = AssetPromise_PrimitiveMesh_Model.CreateCylinder(model.Cylinder.GetTopRadius(), model. |
| 2 | 71 | | break; |
| | 72 | | case PBMeshRenderer.MeshOneofCase.Plane: |
| 1 | 73 | | promiseModel = AssetPromise_PrimitiveMesh_Model.CreatePlane(model.Plane.Uvs); |
| | 74 | | break; |
| | 75 | | } |
| | 76 | |
|
| 11 | 77 | | if (!promiseModel.HasValue) |
| | 78 | | { |
| 1 | 79 | | AssetPromiseKeeper_PrimitiveMesh.i.Forget(primitiveMeshPromise); |
| | 80 | |
|
| 1 | 81 | | if (prevModel != null) |
| 0 | 82 | | ecs7DataStore.RemovePendingResource(scene.sceneData.id, prevModel); |
| | 83 | |
|
| 1 | 84 | | return; |
| | 85 | | } |
| | 86 | |
|
| 10 | 87 | | AssetPromise_PrimitiveMesh prevPromise = primitiveMeshPromise; |
| 10 | 88 | | prevModel = model; |
| | 89 | |
|
| 10 | 90 | | primitiveMeshPromise = new AssetPromise_PrimitiveMesh(promiseModel.Value); |
| 10 | 91 | | primitiveMeshPromise.OnSuccessEvent += shape => |
| | 92 | | { |
| 10 | 93 | | componentMeshFilter.sharedMesh = shape.mesh; |
| 10 | 94 | | ecs7DataStore.RemovePendingResource(scene.sceneData.id, model); |
| 10 | 95 | | }; |
| 10 | 96 | | primitiveMeshPromise.OnFailEvent += (mesh, exception) => |
| | 97 | | { |
| 0 | 98 | | ecs7DataStore.RemovePendingResource(scene.sceneData.id, model); |
| 0 | 99 | | Debug.LogException(exception); |
| 0 | 100 | | }; |
| | 101 | |
|
| 10 | 102 | | ecs7DataStore.AddPendingResource(scene.sceneData.id, model); |
| 10 | 103 | | AssetPromiseKeeper_PrimitiveMesh.i.Keep(primitiveMeshPromise); |
| 10 | 104 | | AssetPromiseKeeper_PrimitiveMesh.i.Forget(prevPromise); |
| 10 | 105 | | } |
| | 106 | | } |
| | 107 | | } |