-
Notifications
You must be signed in to change notification settings - Fork 17
Expand file tree
/
Copy pathLightSourcePlugin.cs
More file actions
100 lines (88 loc) · 4.12 KB
/
Copy pathLightSourcePlugin.cs
File metadata and controls
100 lines (88 loc) · 4.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using Arch.SystemGroups;
using CrdtEcsBridge.Components.Conversion;
using Cysharp.Threading.Tasks;
using DCL.AssetsProvision;
using DCL.ECSComponents;
using DCL.Optimization.Pools;
using DCL.PluginSystem.World.Dependencies;
using DCL.ResourcesUnloading;
using DCL.SDKComponents.LightSource;
using DCL.SDKComponents.LightSource.Systems;
using ECS.LifeCycle;
using ECS.LifeCycle.Systems;
using System;
using System.Collections.Generic;
using System.Threading;
using Unity.Mathematics;
using UnityEngine;
using UnityEngine.AddressableAssets;
using Object = UnityEngine.Object;
namespace DCL.PluginSystem.World
{
public class LightSourcePlugin : IDCLWorldPlugin<LightSourcePlugin.LightSourceSettings>
{
private static LightSourceDefaults lightSourceDefaults;
private readonly IComponentPoolsRegistry poolsRegistry;
private readonly IAssetsProvisioner assetsProvisioner;
private readonly CacheCleaner cacheCleaner;
private IComponentPool<Light>? lightPoolRegistry;
public LightSourcePlugin(
IComponentPoolsRegistry poolsRegistry,
IAssetsProvisioner assetsProvisioner,
CacheCleaner cacheCleaner)
{
this.assetsProvisioner = assetsProvisioner;
this.poolsRegistry = poolsRegistry;
this.cacheCleaner = cacheCleaner;
}
public void Dispose() { }
public void InjectToWorld(ref ArchSystemsWorldBuilder<Arch.Core.World> builder, in ECSWorldInstanceSharedDependencies sharedDependencies, in PersistentEntities persistentEntities, List<IFinalizeWorldSystem> finalizeWorldSystems, List<ISceneIsCurrentListener> sceneIsCurrentListeners)
{
finalizeWorldSystems.Add(LightSourceSystem.InjectToWorld(
ref builder,
sharedDependencies.SceneData,
sharedDependencies.SceneStateProvider,
sharedDependencies.ScenePartition,
lightPoolRegistry
));
ResetDirtyFlagSystem<PBLightSource>.InjectToWorld(ref builder);
}
public async UniTask InitializeAsync(LightSourceSettings settings, CancellationToken ct) =>
await CreateLightSourcePoolAsync(settings, ct);
private async UniTask CreateLightSourcePoolAsync(LightSourceSettings settings, CancellationToken ct)
{
lightSourceDefaults = (await assetsProvisioner.ProvideMainAssetAsync(settings.LightSourceDefaultValues, ct: ct)).Value;
Light light = (await assetsProvisioner.ProvideMainAssetAsync(settings.LightSourcePrefab, ct: ct)).Value.GetComponent<Light>();
lightPoolRegistry = poolsRegistry.AddGameObjectPool(() => Object.Instantiate(light, Vector3.zero, quaternion.identity), onRelease: OnPoolRelease, onGet: OnPoolGet);
cacheCleaner.Register(lightPoolRegistry);
}
private static void OnPoolRelease(Light light) =>
light.enabled = false;
private static void OnPoolGet(Light light)
{
light.enabled = lightSourceDefaults.active;
light.transform.SetParent(null);
light.transform.SetLocalPositionAndRotation(Vector3.zero, Quaternion.identity);
light.color = lightSourceDefaults.color;
light.intensity = PrimitivesConversionExtensions.PBBrightnessInLumensToUnityCandels(lightSourceDefaults.brightness);
light.range = lightSourceDefaults.range;
light.type = LightType.Spot;
light.shadows = LightShadows.None;
light.innerSpotAngle = lightSourceDefaults.innerAngle;
light.spotAngle = lightSourceDefaults.outerAngle;
light.cookie = null;
}
public struct LightSourceSettings : IDCLPluginSettings
{
[field: SerializeField]
public AssetReferenceGameObject LightSourcePrefab;
[field: SerializeField]
public LightDefaultsRef LightSourceDefaultValues;
[Serializable]
public class LightDefaultsRef : AssetReferenceT<LightSourceDefaults>
{
public LightDefaultsRef(string guid) : base(guid) { }
}
}
}
}