From 1628290db7f9f75cac522df170c44120d21e5093 Mon Sep 17 00:00:00 2001
From: mob-sakai <12690315+mob-sakai@users.noreply.github.com>
Date: Thu, 27 Jun 2024 12:04:30 +0900
Subject: [PATCH] feat: add project settings for UIParticle

- enableLinearToGamma: Enables LinearToGamma during mesh baking
---
 Assets/ProjectSettings/UIParticle.asset       | 15 ++++++++++
 Assets/ProjectSettings/UIParticle.asset.meta  |  8 ++++++
 .../src/Runtime/UIParticleProjectSettings.cs  | 28 +++++++++++++++++++
 .../Runtime/UIParticleProjectSettings.cs.meta | 11 ++++++++
 Packages/src/Runtime/UIParticleRenderer.cs    | 17 ++---------
 5 files changed, 64 insertions(+), 15 deletions(-)
 create mode 100644 Assets/ProjectSettings/UIParticle.asset
 create mode 100644 Assets/ProjectSettings/UIParticle.asset.meta
 create mode 100644 Packages/src/Runtime/UIParticleProjectSettings.cs
 create mode 100644 Packages/src/Runtime/UIParticleProjectSettings.cs.meta

diff --git a/Assets/ProjectSettings/UIParticle.asset b/Assets/ProjectSettings/UIParticle.asset
new file mode 100644
index 0000000..7b6cd35
--- /dev/null
+++ b/Assets/ProjectSettings/UIParticle.asset
@@ -0,0 +1,15 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f22a23b9d98e440478697f4adf30e61c, type: 3}
+  m_Name: UIParticle
+  m_EditorClassIdentifier: 
+  m_LinearToGamma: 1
diff --git a/Assets/ProjectSettings/UIParticle.asset.meta b/Assets/ProjectSettings/UIParticle.asset.meta
new file mode 100644
index 0000000..2f1f22b
--- /dev/null
+++ b/Assets/ProjectSettings/UIParticle.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e8e7744b163af4869b07b8f192c810ed
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 11400000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Packages/src/Runtime/UIParticleProjectSettings.cs b/Packages/src/Runtime/UIParticleProjectSettings.cs
new file mode 100644
index 0000000..0ffa28b
--- /dev/null
+++ b/Packages/src/Runtime/UIParticleProjectSettings.cs
@@ -0,0 +1,28 @@
+#pragma warning disable CS0414
+using Coffee.UIParticleInternal;
+using UnityEditor;
+using UnityEngine;
+
+namespace Coffee.UIExtensions
+{
+    public class UIParticleProjectSettings : PreloadedProjectSettings<UIParticleProjectSettings>
+    {
+        [Header("Setting")]
+        [SerializeField]
+        internal bool m_EnableLinearToGamma = true;
+
+        public static bool enableLinearToGamma
+        {
+            get => instance.m_EnableLinearToGamma;
+            set => instance.m_EnableLinearToGamma = value;
+        }
+
+#if UNITY_EDITOR
+        [SettingsProvider]
+        private static SettingsProvider CreateSettingsProvider()
+        {
+            return new PreloadedProjectSettingsProvider("Project/UI/UI Particle");
+        }
+#endif
+    }
+}
diff --git a/Packages/src/Runtime/UIParticleProjectSettings.cs.meta b/Packages/src/Runtime/UIParticleProjectSettings.cs.meta
new file mode 100644
index 0000000..22e35af
--- /dev/null
+++ b/Packages/src/Runtime/UIParticleProjectSettings.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f22a23b9d98e440478697f4adf30e61c
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Packages/src/Runtime/UIParticleRenderer.cs b/Packages/src/Runtime/UIParticleRenderer.cs
index dadecb0..e289bee 100644
--- a/Packages/src/Runtime/UIParticleRenderer.cs
+++ b/Packages/src/Runtime/UIParticleRenderer.cs
@@ -417,22 +417,9 @@ namespace Coffee.UIExtensions
                 _lastBounds = bounds;
 
                 // Convert linear color to gamma color.
-                if (QualitySettings.activeColorSpace == ColorSpace.Linear)
+                if (UIParticleProjectSettings.enableLinearToGamma && canvas.ShouldGammaToLinearInMesh())
                 {
-                    Profiler.BeginSample("[UIParticleRenderer] Convert Linear to Gamma");
-                    workerMesh.GetColors(s_Colors);
-                    var count_c = s_Colors.Count;
-                    for (var i = 0; i < count_c; i++)
-                    {
-                        var c = s_Colors[i];
-                        c.r = c.r.LinearToGamma();
-                        c.g = c.g.LinearToGamma();
-                        c.b = c.b.LinearToGamma();
-                        s_Colors[i] = c;
-                    }
-
-                    workerMesh.SetColors(s_Colors);
-                    Profiler.EndSample();
+                    workerMesh.LinearToGamma();
                 }
 
                 var components = ListPool<Component>.Rent();