| | 1 | | using DCL.Controllers; |
| | 2 | | using DCL.ECS7.InternalComponents; |
| | 3 | | using DCL.ECSRuntime; |
| | 4 | | using DCL.Helpers; |
| | 5 | | using DCL.Models; |
| | 6 | | using System.Collections.Generic; |
| | 7 | | using UnityEngine; |
| | 8 | |
|
| | 9 | | namespace DCL.ECSComponents |
| | 10 | | { |
| | 11 | | public class MeshRendererHandler : IECSComponentHandler<PBMeshRenderer> |
| | 12 | | { |
| | 13 | | private readonly IInternalECSComponent<InternalTexturizable> texturizableInternalComponent; |
| | 14 | | private readonly IInternalECSComponent<InternalRenderers> renderersInternalComponent; |
| | 15 | | private readonly DataStore_ECS7 ecs7DataStore; |
| | 16 | | private readonly DataStore_WorldObjects dataStoreWorldObjects; |
| | 17 | | private readonly bool isDebugMode = false; |
| | 18 | | private IParcelScene scene; |
| | 19 | | private GameObject componentGameObject; |
| | 20 | | private MeshFilter componentMeshFilter; |
| | 21 | | private MeshRenderer componentMeshRenderer; |
| | 22 | | private AssetPromise_PrimitiveMesh primitiveMeshPromise; |
| | 23 | | private PBMeshRenderer prevModel; |
| 7 | 24 | | private Rendereable currentRendereable = new Rendereable(); |
| | 25 | |
|
| 7 | 26 | | public MeshRendererHandler( |
| | 27 | | DataStore_ECS7 dataStoreEcs7, |
| | 28 | | IInternalECSComponent<InternalTexturizable> texturizableComponent, |
| | 29 | | IInternalECSComponent<InternalRenderers> renderersComponent, |
| | 30 | | DataStore_WorldObjects dataStoreWorldObjects, |
| | 31 | | DebugConfig debugConfig) |
| | 32 | | { |
| 7 | 33 | | texturizableInternalComponent = texturizableComponent; |
| 7 | 34 | | renderersInternalComponent = renderersComponent; |
| 7 | 35 | | ecs7DataStore = dataStoreEcs7; |
| 7 | 36 | | this.dataStoreWorldObjects = dataStoreWorldObjects; |
| 7 | 37 | | isDebugMode = debugConfig.isDebugMode.Get(); |
| 7 | 38 | | } |
| | 39 | |
|
| | 40 | | public void OnComponentCreated(IParcelScene scene, IDCLEntity entity) |
| | 41 | | { |
| 11 | 42 | | this.scene = scene; |
| | 43 | |
|
| 11 | 44 | | componentGameObject = new GameObject("MeshRenderer"); |
| 11 | 45 | | componentGameObject.transform.SetParent(entity.gameObject.transform); |
| 11 | 46 | | componentGameObject.transform.ResetLocalTRS(); |
| 11 | 47 | | componentMeshFilter = componentGameObject.AddComponent<MeshFilter>(); |
| 11 | 48 | | componentMeshRenderer = componentGameObject.AddComponent<MeshRenderer>(); |
| 11 | 49 | | componentMeshRenderer.sharedMaterial = Utils.EnsureResourcesMaterial("Materials/Default"); |
| 11 | 50 | | texturizableInternalComponent.AddRenderer(scene, entity, componentMeshRenderer); |
| 11 | 51 | | renderersInternalComponent.AddRenderer(scene, entity, componentMeshRenderer); |
| 11 | 52 | | } |
| | 53 | |
|
| | 54 | | public void OnComponentRemoved(IParcelScene scene, IDCLEntity entity) |
| | 55 | | { |
| 12 | 56 | | if (isDebugMode) |
| 0 | 57 | | RemoveMeshFromDatastoreSceneMetrics(); |
| | 58 | |
|
| 12 | 59 | | texturizableInternalComponent.RemoveRenderer(scene, entity, componentMeshRenderer); |
| 12 | 60 | | renderersInternalComponent.RemoveRenderer(scene, entity, componentMeshRenderer); |
| | 61 | |
|
| 12 | 62 | | if (prevModel != null) |
| 9 | 63 | | ecs7DataStore.RemovePendingResource(scene.sceneData.sceneNumber, prevModel); |
| | 64 | |
|
| 12 | 65 | | AssetPromiseKeeper_PrimitiveMesh.i.Forget(primitiveMeshPromise); |
| 12 | 66 | | Object.Destroy(componentGameObject); |
| 12 | 67 | | } |
| | 68 | |
|
| | 69 | | public void OnComponentModelUpdated(IParcelScene scene, IDCLEntity entity, PBMeshRenderer model) |
| | 70 | | { |
| 11 | 71 | | AssetPromise_PrimitiveMesh_Model? promiseModel = null; |
| | 72 | |
|
| 11 | 73 | | switch (model.MeshCase) |
| | 74 | | { |
| | 75 | | case PBMeshRenderer.MeshOneofCase.Box: |
| 6 | 76 | | promiseModel = AssetPromise_PrimitiveMesh_Model.CreateBox(model.Box.Uvs); |
| 6 | 77 | | break; |
| | 78 | | case PBMeshRenderer.MeshOneofCase.Sphere: |
| 1 | 79 | | promiseModel = AssetPromise_PrimitiveMesh_Model.CreateSphere(); |
| 1 | 80 | | break; |
| | 81 | | case PBMeshRenderer.MeshOneofCase.Cylinder: |
| 2 | 82 | | promiseModel = AssetPromise_PrimitiveMesh_Model.CreateCylinder(model.Cylinder.GetTopRadius(), model. |
| 2 | 83 | | break; |
| | 84 | | case PBMeshRenderer.MeshOneofCase.Plane: |
| 1 | 85 | | promiseModel = AssetPromise_PrimitiveMesh_Model.CreatePlane(model.Plane.Uvs); |
| | 86 | | break; |
| | 87 | | } |
| | 88 | |
|
| 11 | 89 | | if (!promiseModel.HasValue) |
| | 90 | | { |
| 1 | 91 | | AssetPromiseKeeper_PrimitiveMesh.i.Forget(primitiveMeshPromise); |
| | 92 | |
|
| 1 | 93 | | if (prevModel != null) |
| 0 | 94 | | ecs7DataStore.RemovePendingResource(scene.sceneData.sceneNumber, prevModel); |
| | 95 | |
|
| 1 | 96 | | return; |
| | 97 | | } |
| | 98 | |
|
| 10 | 99 | | AssetPromise_PrimitiveMesh prevPromise = primitiveMeshPromise; |
| 10 | 100 | | prevModel = model; |
| | 101 | |
|
| 10 | 102 | | primitiveMeshPromise = new AssetPromise_PrimitiveMesh(promiseModel.Value); |
| 10 | 103 | | primitiveMeshPromise.OnSuccessEvent += shape => |
| | 104 | | { |
| 10 | 105 | | componentMeshFilter.sharedMesh = shape.mesh; |
| 10 | 106 | | ecs7DataStore.RemovePendingResource(scene.sceneData.sceneNumber, model); |
| | 107 | |
|
| 10 | 108 | | if (isDebugMode) |
| | 109 | | { |
| 0 | 110 | | RemoveMeshFromDatastoreSceneMetrics(); |
| 0 | 111 | | AddMeshToDatastoreSceneMetrics(entity, shape.mesh); |
| | 112 | | } |
| 10 | 113 | | }; |
| 10 | 114 | | primitiveMeshPromise.OnFailEvent += (mesh, exception) => |
| | 115 | | { |
| 0 | 116 | | ecs7DataStore.RemovePendingResource(scene.sceneData.sceneNumber, model); |
| 0 | 117 | | Debug.LogException(exception); |
| 0 | 118 | | }; |
| | 119 | |
|
| 10 | 120 | | ecs7DataStore.AddPendingResource(scene.sceneData.sceneNumber, model); |
| 10 | 121 | | AssetPromiseKeeper_PrimitiveMesh.i.Keep(primitiveMeshPromise); |
| 10 | 122 | | AssetPromiseKeeper_PrimitiveMesh.i.Forget(prevPromise); |
| 10 | 123 | | } |
| | 124 | |
|
| | 125 | | private void AddMeshToDatastoreSceneMetrics(IDCLEntity entity, Mesh mesh) |
| | 126 | | { |
| 0 | 127 | | int triangleCount = mesh.triangles.Length; |
| 0 | 128 | | currentRendereable.totalTriangleCount = triangleCount; |
| 0 | 129 | | currentRendereable.meshes = new HashSet<Mesh>() { mesh }; |
| 0 | 130 | | currentRendereable.meshToTriangleCount = new Dictionary<Mesh, int>() { { mesh, triangleCount } }; |
| 0 | 131 | | currentRendereable.ownerId = entity.entityId; |
| 0 | 132 | | dataStoreWorldObjects.AddRendereable(entity.scene.sceneData.sceneNumber, currentRendereable); |
| 0 | 133 | | } |
| | 134 | |
|
| | 135 | | private void RemoveMeshFromDatastoreSceneMetrics() |
| | 136 | | { |
| 0 | 137 | | dataStoreWorldObjects.RemoveRendereable(scene.sceneData.sceneNumber, currentRendereable); |
| 0 | 138 | | } |
| | 139 | | } |
| | 140 | | } |