com.wallstop-studios.unity-helpers 2.0.0-rc81.7 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1500) hide show
  1. package/.config/dotnet-tools.json +10 -10
  2. package/.csharpierignore +1 -0
  3. package/.csharpierrc.json +3 -0
  4. package/.editorconfig +184 -184
  5. package/.gitattributes +87 -63
  6. package/.githooks/pre-commit +75 -0
  7. package/.githooks/pre-push +50 -0
  8. package/.github/dependabot.yml +32 -10
  9. package/.github/scripts/check-markdown-links.ps1 +77 -0
  10. package/.github/scripts/check_markdown_links.py +89 -0
  11. package/.github/scripts/check_markdown_url_encoding.py +74 -0
  12. package/.github/scripts/validate_markdown_links.py +194 -0
  13. package/.github/workflows/csharpier-autofix.yml +152 -0
  14. package/.github/workflows/format-on-demand.yml +305 -0
  15. package/.github/workflows/lint-doc-links.yml +30 -0
  16. package/.github/workflows/markdown-json.yml +45 -0
  17. package/.github/workflows/npm-publish.yml +75 -75
  18. package/.github/workflows/prettier-autofix.yml +195 -0
  19. package/.github/workflows/update-dotnet-tools.yml +80 -0
  20. package/.github/workflows/yaml-format-lint.yml +41 -0
  21. package/.lychee.toml +26 -0
  22. package/.markdownlint.json +21 -0
  23. package/.markdownlint.jsonc +21 -0
  24. package/.markdownlintignore +8 -0
  25. package/.pre-commit-config.yaml +47 -22
  26. package/.prettierignore +22 -0
  27. package/.prettierrc.json +20 -0
  28. package/.yamllint.yaml +31 -0
  29. package/AGENTS.md +56 -0
  30. package/{Third Party Notices.md.meta → AGENTS.md.meta} +7 -7
  31. package/CHANGELOG.md +11 -0
  32. package/CHANGELOG.md.meta +7 -7
  33. package/CONTRIBUTING.md +49 -0
  34. package/CONTRIBUTING.md.meta +7 -0
  35. package/DATA_STRUCTURES.md +324 -0
  36. package/DATA_STRUCTURES.md.meta +7 -0
  37. package/Docs/Images/attribute_resolution.svg +40 -0
  38. package/Docs/Images/attribute_resolution.svg.meta +7 -0
  39. package/Docs/Images/bitset.svg +47 -0
  40. package/Docs/Images/bitset.svg.meta +7 -0
  41. package/Docs/Images/concave_hull.svg +30 -0
  42. package/Docs/Images/concave_hull.svg.meta +7 -0
  43. package/Docs/Images/convex_hull.svg +29 -0
  44. package/Docs/Images/convex_hull.svg.meta +7 -0
  45. package/Docs/Images/cyclic_buffer.svg +37 -0
  46. package/Docs/Images/cyclic_buffer.svg.meta +7 -0
  47. package/Docs/Images/data_distribution_decision.svg +88 -0
  48. package/Docs/Images/data_distribution_decision.svg.meta +7 -0
  49. package/Docs/Images/deque.svg +64 -0
  50. package/Docs/Images/deque.svg.meta +7 -0
  51. package/Docs/Images/deque_queue.svg +107 -0
  52. package/Docs/Images/deque_queue.svg.meta +7 -0
  53. package/Docs/Images/disjoint_set.svg +47 -0
  54. package/Docs/Images/disjoint_set.svg.meta +7 -0
  55. package/Docs/Images/effects_pipeline.svg +59 -0
  56. package/Docs/Images/effects_pipeline.svg.meta +7 -0
  57. package/Docs/Images/geometry_edge_cases.svg +61 -0
  58. package/Docs/Images/geometry_edge_cases.svg.meta +7 -0
  59. package/Docs/Images/heap.svg +56 -0
  60. package/Docs/Images/heap.svg.meta +7 -0
  61. package/Docs/Images/kdtree_2d.svg +38 -0
  62. package/Docs/Images/kdtree_2d.svg.meta +7 -0
  63. package/Docs/Images/kdtree_3d.svg +83 -0
  64. package/Docs/Images/kdtree_3d.svg.meta +7 -0
  65. package/Docs/Images/octree_3d.svg +79 -0
  66. package/Docs/Images/octree_3d.svg.meta +7 -0
  67. package/Docs/Images/polyline_simplify.svg +18 -0
  68. package/Docs/Images/polyline_simplify.svg.meta +7 -0
  69. package/Docs/Images/quadtree_2d.svg +37 -0
  70. package/Docs/Images/quadtree_2d.svg.meta +7 -0
  71. package/Docs/Images/query_boundaries.svg +38 -0
  72. package/Docs/Images/query_boundaries.svg.meta +7 -0
  73. package/Docs/Images/random_generators.svg +105 -0
  74. package/Docs/Images/random_generators.svg.meta +7 -0
  75. package/Docs/Images/reflection_scan.svg +33 -0
  76. package/Docs/Images/reflection_scan.svg.meta +7 -0
  77. package/Docs/Images/relational_wiring.svg +75 -0
  78. package/Docs/Images/relational_wiring.svg.meta +7 -0
  79. package/Docs/Images/rtree_2d.svg +27 -0
  80. package/Docs/Images/rtree_2d.svg.meta +7 -0
  81. package/Docs/Images/rtree_3d.svg +79 -0
  82. package/Docs/Images/rtree_3d.svg.meta +7 -0
  83. package/Docs/Images/serialization_flow.svg +50 -0
  84. package/Docs/Images/serialization_flow.svg.meta +7 -0
  85. package/Docs/Images/singletons_lifecycle.svg +54 -0
  86. package/Docs/Images/singletons_lifecycle.svg.meta +7 -0
  87. package/Docs/Images/sparse_set.svg +54 -0
  88. package/Docs/Images/sparse_set.svg.meta +7 -0
  89. package/Docs/Images/trie.svg +55 -0
  90. package/Docs/Images/trie.svg.meta +7 -0
  91. package/Docs/Images.meta +8 -0
  92. package/Docs.meta +8 -0
  93. package/EDITOR_TOOLS_GUIDE.md +1980 -0
  94. package/EDITOR_TOOLS_GUIDE.md.meta +7 -0
  95. package/EFFECTS_SYSTEM.md +242 -0
  96. package/EFFECTS_SYSTEM.md.meta +7 -0
  97. package/EFFECTS_SYSTEM_TUTORIAL.md +467 -0
  98. package/EFFECTS_SYSTEM_TUTORIAL.md.meta +7 -0
  99. package/Editor/AnimationEventEditor.cs +1570 -874
  100. package/Editor/AnimationEventEditor.cs.meta +11 -11
  101. package/Editor/AssemblyInfo.cs +4 -0
  102. package/Editor/AssemblyInfo.cs.meta +3 -0
  103. package/Editor/AssetProcessors/SpriteLabelProcessor.cs +138 -111
  104. package/Editor/AssetProcessors/SpriteLabelProcessor.cs.meta +2 -2
  105. package/Editor/AssetProcessors.meta +2 -2
  106. package/Editor/Core/Helper/AnimationEventHelpers.cs +230 -0
  107. package/{Runtime/Core/DataStructure/ISpatialTree.cs.meta → Editor/Core/Helper/AnimationEventHelpers.cs.meta} +11 -11
  108. package/Editor/Core/Helper.meta +8 -0
  109. package/Editor/Core.meta +8 -0
  110. package/Editor/CustomDrawers/IntDropdownDrawer.cs +46 -46
  111. package/Editor/CustomDrawers/IntDropdownDrawer.cs.meta +2 -2
  112. package/Editor/CustomDrawers/StringInListeDrawer.cs +135 -135
  113. package/Editor/CustomDrawers/StringInListeDrawer.cs.meta +2 -2
  114. package/Editor/CustomDrawers/WShowIfPropertyDrawer.cs +105 -105
  115. package/Editor/CustomDrawers/WShowIfPropertyDrawer.cs.meta +2 -2
  116. package/Editor/CustomDrawers.meta +2 -2
  117. package/Editor/CustomEditors/MatchColliderToSpriteEditor.cs +32 -32
  118. package/Editor/CustomEditors/MatchColliderToSpriteEditor.cs.meta +2 -2
  119. package/Editor/CustomEditors/PersistentDirectoryGUI.cs +808 -799
  120. package/Editor/CustomEditors/PersistentDirectoryGUI.cs.meta +2 -2
  121. package/Editor/CustomEditors/PolygonCollider2DOptimizerEditor.cs +38 -40
  122. package/Editor/CustomEditors/PolygonCollider2DOptimizerEditor.cs.meta +2 -2
  123. package/Editor/CustomEditors/SourceFolderEntryDrawer.cs +685 -413
  124. package/Editor/CustomEditors/SourceFolderEntryDrawer.cs.meta +2 -2
  125. package/Editor/CustomEditors/TexturePlatformOverrideEntryDrawer.cs +155 -0
  126. package/{Runtime/Core/DataStructure/KDTree.cs.meta → Editor/CustomEditors/TexturePlatformOverrideEntryDrawer.cs.meta} +11 -11
  127. package/Editor/CustomEditors.meta +2 -2
  128. package/Editor/Extensions/SerializedPropertyExtensions.cs +217 -190
  129. package/Editor/Extensions/SerializedPropertyExtensions.cs.meta +2 -2
  130. package/Editor/Extensions/UnityExtensions.cs +50 -26
  131. package/Editor/Extensions/UnityExtensions.cs.meta +2 -2
  132. package/Editor/Extensions.meta +2 -2
  133. package/Editor/FitTextureSizeWindow.cs +809 -332
  134. package/Editor/FitTextureSizeWindow.cs.meta +2 -2
  135. package/Editor/Persistence/MultiFileSelectorPersistenceManager.cs +62 -0
  136. package/{Runtime/Core/DataStructure/QuadTree.cs.meta → Editor/Persistence/MultiFileSelectorPersistenceManager.cs.meta} +11 -11
  137. package/Editor/Persistence/MultiFileSelectorPersistenceWindow.cs +65 -0
  138. package/Editor/Persistence/MultiFileSelectorPersistenceWindow.cs.meta +11 -0
  139. package/Editor/Persistence.meta +8 -0
  140. package/Editor/PersistentDirectorySettings.cs +581 -248
  141. package/Editor/PersistentDirectorySettings.cs.meta +2 -2
  142. package/Editor/PrefabChecker.cs +1396 -741
  143. package/Editor/PrefabChecker.cs.meta +11 -11
  144. package/Editor/Sprites/AnimationCopier.cs +1594 -789
  145. package/Editor/Sprites/AnimationCopier.cs.meta +2 -2
  146. package/Editor/Sprites/AnimationCreator.cs +1573 -881
  147. package/Editor/Sprites/AnimationCreator.cs.meta +11 -11
  148. package/Editor/Sprites/AnimationViewerWindow.cs +1670 -1522
  149. package/Editor/Sprites/AnimationViewerWindow.cs.meta +2 -2
  150. package/Editor/Sprites/ScriptableSpriteAtlas.cs +251 -178
  151. package/Editor/Sprites/ScriptableSpriteAtlas.cs.meta +2 -2
  152. package/Editor/Sprites/ScriptableSpriteAtlasEditor.cs +1470 -1026
  153. package/Editor/Sprites/ScriptableSpriteAtlasEditor.cs.meta +2 -2
  154. package/Editor/Sprites/SpriteCropper.cs +1013 -523
  155. package/Editor/Sprites/SpriteCropper.cs.meta +2 -2
  156. package/Editor/Sprites/SpritePivotAdjustor.cs +605 -265
  157. package/Editor/Sprites/SpritePivotAdjustor.cs.meta +2 -2
  158. package/Editor/Sprites/SpriteSettingsApplier.cs +942 -918
  159. package/Editor/Sprites/SpriteSettingsApplier.cs.meta +2 -2
  160. package/Editor/Sprites/SpriteSettingsApplierAPI.cs +441 -0
  161. package/Editor/Sprites/SpriteSettingsApplierAPI.cs.meta +11 -0
  162. package/Editor/Sprites/SpriteSettingsProfileCollection.cs +12 -0
  163. package/Editor/Sprites/SpriteSettingsProfileCollection.cs.meta +11 -0
  164. package/Editor/Sprites/SpriteSheetAnimationCreator.cs +1586 -1537
  165. package/Editor/Sprites/SpriteSheetAnimationCreator.cs.meta +2 -2
  166. package/Editor/Sprites/TexturePlatformNameHelper.cs +89 -0
  167. package/Editor/Sprites/TexturePlatformNameHelper.cs.meta +11 -0
  168. package/Editor/Sprites/TextureResizerWizard.cs +456 -175
  169. package/Editor/Sprites/TextureResizerWizard.cs.meta +2 -2
  170. package/Editor/Sprites/TextureSettingsApplierAPI.cs +359 -0
  171. package/Editor/Sprites/TextureSettingsApplierAPI.cs.meta +11 -0
  172. package/Editor/Sprites/TextureSettingsApplierWindow.cs +668 -0
  173. package/Editor/Sprites/TextureSettingsApplierWindow.cs.meta +11 -0
  174. package/Editor/Sprites.meta +2 -2
  175. package/Editor/Styles/AnimationViewer.uss +115 -115
  176. package/Editor/Styles/AnimationViewer.uss.meta +2 -2
  177. package/Editor/Styles/AnimationViewer.uxml +56 -56
  178. package/Editor/Styles/AnimationViewer.uxml.meta +2 -2
  179. package/Editor/Styles/SpriteSheetAnimationCreator.uss +10 -0
  180. package/Editor/Styles/SpriteSheetAnimationCreator.uss.meta +11 -0
  181. package/Editor/Styles.meta +2 -2
  182. package/Editor/Tags/AttributeMetadataCacheEditor.cs +46 -0
  183. package/Editor/Tags/AttributeMetadataCacheEditor.cs.meta +11 -0
  184. package/Editor/Tags/AttributeMetadataCacheGenerator.cs +258 -0
  185. package/Editor/Tags/AttributeMetadataCacheGenerator.cs.meta +11 -0
  186. package/Editor/Tags.meta +8 -0
  187. package/Editor/Tools/ImageBlurTool.cs +522 -409
  188. package/Editor/Tools/ImageBlurTool.cs.meta +2 -2
  189. package/Editor/Tools.meta +2 -2
  190. package/Editor/Utils/DxReadOnlyPropertyDrawer.cs +26 -26
  191. package/Editor/Utils/DxReadOnlyPropertyDrawer.cs.meta +11 -11
  192. package/Editor/Utils/EditorUi.cs +228 -0
  193. package/Editor/Utils/EditorUi.cs.meta +11 -0
  194. package/Editor/Utils/EditorUtilities.cs +22 -22
  195. package/Editor/Utils/EditorUtilities.cs.meta +11 -11
  196. package/Editor/Utils/ScriptableObjectSingletonCreator.cs +633 -52
  197. package/Editor/Utils/ScriptableObjectSingletonCreator.cs.meta +2 -2
  198. package/Editor/Utils.meta +8 -8
  199. package/Editor/Visuals/EnhancedImageEditor.cs +160 -160
  200. package/Editor/Visuals/EnhancedImageEditor.cs.meta +11 -11
  201. package/Editor/Visuals.meta +2 -2
  202. package/Editor/WallstopStudios.UnityHelpers.Editor.asmdef +14 -18
  203. package/Editor/WallstopStudios.UnityHelpers.Editor.asmdef.meta +7 -7
  204. package/Editor.meta +8 -8
  205. package/GETTING_STARTED.md +409 -0
  206. package/GETTING_STARTED.md.meta +7 -0
  207. package/GLOSSARY.md +313 -0
  208. package/GLOSSARY.md.meta +7 -0
  209. package/HULLS.md +45 -0
  210. package/HULLS.md.meta +7 -0
  211. package/INDEX.md +429 -0
  212. package/INDEX.md.meta +7 -0
  213. package/LICENSE +21 -21
  214. package/LICENSE.md +7 -7
  215. package/LICENSE.md.meta +7 -7
  216. package/LICENSE.meta +7 -7
  217. package/MATH_AND_EXTENSIONS.md +316 -0
  218. package/MATH_AND_EXTENSIONS.md.meta +7 -0
  219. package/RANDOM_PERFORMANCE.md +140 -0
  220. package/RANDOM_PERFORMANCE.md.meta +7 -0
  221. package/README.md +1183 -188
  222. package/README.md.meta +7 -7
  223. package/REFLECTION_HELPERS.md +272 -0
  224. package/REFLECTION_HELPERS.md.meta +7 -0
  225. package/RELATIONAL_COMPONENTS.md +552 -0
  226. package/RELATIONAL_COMPONENTS.md.meta +7 -0
  227. package/Runtime/AssemblyInfo.cs +9 -0
  228. package/Runtime/AssemblyInfo.cs.meta +11 -0
  229. package/Runtime/Binaries/Microsoft.Bcl.AsyncInterfaces.dll +0 -0
  230. package/Runtime/Binaries/Microsoft.Bcl.AsyncInterfaces.dll.meta +33 -33
  231. package/Runtime/Binaries/Microsoft.Bcl.AsyncInterfaces.xml +499 -278
  232. package/Runtime/Binaries/Microsoft.Bcl.AsyncInterfaces.xml.meta +7 -7
  233. package/Runtime/Binaries/System.IO.Pipelines.dll +0 -0
  234. package/Runtime/Binaries/System.IO.Pipelines.dll.meta +33 -0
  235. package/Runtime/Binaries/System.IO.Pipelines.xml +702 -0
  236. package/Runtime/Binaries/System.IO.Pipelines.xml.meta +7 -0
  237. package/Runtime/Binaries/System.Text.Encodings.Web.dll +0 -0
  238. package/Runtime/Binaries/System.Text.Encodings.Web.dll.meta +33 -33
  239. package/Runtime/Binaries/System.Text.Encodings.Web.xml +1084 -1079
  240. package/Runtime/Binaries/System.Text.Encodings.Web.xml.meta +7 -7
  241. package/Runtime/Binaries/System.Text.Json.dll +0 -0
  242. package/Runtime/Binaries/System.Text.Json.dll.meta +33 -33
  243. package/Runtime/Binaries/System.Text.Json.xml +10217 -8116
  244. package/Runtime/Binaries/System.Text.Json.xml.meta +7 -7
  245. package/Runtime/Binaries.meta +8 -8
  246. package/Runtime/Core/Attributes/AnimationEventAttribute.cs +10 -138
  247. package/Runtime/Core/Attributes/AnimationEventAttribute.cs.meta +11 -11
  248. package/Runtime/Core/Attributes/BaseRelationalComponentAttribute.cs +841 -0
  249. package/Runtime/Core/Attributes/BaseRelationalComponentAttribute.cs.meta +11 -0
  250. package/Runtime/Core/Attributes/ChildComponentAttribute.cs +284 -226
  251. package/Runtime/Core/Attributes/ChildComponentAttribute.cs.meta +11 -11
  252. package/Runtime/Core/Attributes/DxReadOnlyAttribute.cs +6 -6
  253. package/Runtime/Core/Attributes/DxReadOnlyAttribute.cs.meta +11 -11
  254. package/Runtime/Core/Attributes/EnumDisplayNameAttribute.cs +15 -15
  255. package/Runtime/Core/Attributes/EnumDisplayNameAttribute.cs.meta +2 -2
  256. package/Runtime/Core/Attributes/IRelationalComponentAssigner.cs +36 -0
  257. package/Runtime/Core/Attributes/IRelationalComponentAssigner.cs.meta +11 -0
  258. package/Runtime/Core/Attributes/IntDropdownAttribute.cs +14 -14
  259. package/Runtime/Core/Attributes/IntDropdownAttribute.cs.meta +2 -2
  260. package/Runtime/Core/Attributes/KSerializableAttribute.cs +19 -19
  261. package/Runtime/Core/Attributes/KSerializableAttribute.cs.meta +11 -11
  262. package/Runtime/Core/Attributes/NotNullAttribute.cs +30 -32
  263. package/Runtime/Core/Attributes/NotNullAttribute.cs.meta +11 -11
  264. package/Runtime/Core/Attributes/ParentComponentAttribute.cs +376 -0
  265. package/Runtime/Core/Attributes/{ParentComponent.cs.meta → ParentComponentAttribute.cs.meta} +11 -11
  266. package/Runtime/Core/Attributes/RelationalComponentAssigner.cs +152 -0
  267. package/Runtime/Core/Attributes/RelationalComponentAssigner.cs.meta +11 -0
  268. package/Runtime/Core/Attributes/RelationalComponentExtensions.cs +61 -14
  269. package/Runtime/Core/Attributes/RelationalComponentExtensions.cs.meta +11 -11
  270. package/Runtime/Core/Attributes/RelationalComponentInitializer.cs +331 -0
  271. package/Runtime/Core/Attributes/RelationalComponentInitializer.cs.meta +11 -0
  272. package/Runtime/Core/Attributes/ScriptableSingletonPathAttribute.cs +15 -15
  273. package/Runtime/Core/Attributes/ScriptableSingletonPathAttribute.cs.meta +2 -2
  274. package/Runtime/Core/Attributes/SiblingComponentAttribute.cs +264 -137
  275. package/Runtime/Core/Attributes/SiblingComponentAttribute.cs.meta +11 -11
  276. package/Runtime/Core/Attributes/ValidateAssignmentAttribute.cs +115 -106
  277. package/Runtime/Core/Attributes/ValidateAssignmentAttribute.cs.meta +11 -11
  278. package/Runtime/Core/Attributes/ValueHelpers.cs +10 -0
  279. package/Runtime/Core/Attributes/ValueHelpers.cs.meta +3 -0
  280. package/Runtime/Core/Attributes/WShowIfAttribute.cs +24 -24
  281. package/Runtime/Core/Attributes/WShowIfAttribute.cs.meta +2 -2
  282. package/Runtime/Core/Attributes.meta +8 -8
  283. package/Runtime/Core/DataStructure/Adapters/FastVector2Int.cs +192 -92
  284. package/Runtime/Core/DataStructure/Adapters/FastVector2Int.cs.meta +11 -11
  285. package/Runtime/Core/DataStructure/Adapters/FastVector3Int.cs +268 -185
  286. package/Runtime/Core/DataStructure/Adapters/FastVector3Int.cs.meta +11 -11
  287. package/Runtime/Core/DataStructure/Adapters/KGuid.cs +360 -305
  288. package/Runtime/Core/DataStructure/Adapters/KGuid.cs.meta +11 -11
  289. package/Runtime/Core/DataStructure/Adapters/KVector2.cs +146 -80
  290. package/Runtime/Core/DataStructure/Adapters/KVector2.cs.meta +11 -11
  291. package/Runtime/Core/DataStructure/Adapters.meta +8 -8
  292. package/Runtime/Core/DataStructure/BitSet.cs +626 -0
  293. package/Runtime/Core/DataStructure/BitSet.cs.meta +11 -0
  294. package/Runtime/Core/DataStructure/BoundingBox3D.cs +405 -0
  295. package/Runtime/Core/DataStructure/BoundingBox3D.cs.meta +11 -0
  296. package/Runtime/Core/DataStructure/Circle.cs +203 -50
  297. package/Runtime/Core/DataStructure/Circle.cs.meta +11 -11
  298. package/Runtime/Core/DataStructure/CyclicBuffer.cs +488 -266
  299. package/Runtime/Core/DataStructure/CyclicBuffer.cs.meta +11 -11
  300. package/Runtime/Core/DataStructure/Deque.cs +561 -0
  301. package/Runtime/Core/DataStructure/Deque.cs.meta +11 -0
  302. package/Runtime/Core/DataStructure/DisjointSet.cs +483 -0
  303. package/Runtime/Core/DataStructure/DisjointSet.cs.meta +11 -0
  304. package/Runtime/Core/DataStructure/Heap.cs +514 -0
  305. package/Runtime/Core/DataStructure/Heap.cs.meta +11 -0
  306. package/Runtime/Core/DataStructure/{ISpatialTree.cs → ISpatialTree2D.cs} +25 -21
  307. package/Runtime/Core/DataStructure/ISpatialTree2D.cs.meta +11 -0
  308. package/Runtime/Core/DataStructure/ISpatialTree3D.cs +33 -0
  309. package/Runtime/Core/DataStructure/ISpatialTree3D.cs.meta +11 -0
  310. package/Runtime/Core/DataStructure/ImmutableBitSet.cs +398 -0
  311. package/Runtime/Core/DataStructure/ImmutableBitSet.cs.meta +3 -0
  312. package/Runtime/Core/DataStructure/KDTree2D.cs +852 -0
  313. package/Runtime/Core/DataStructure/KDTree2D.cs.meta +11 -0
  314. package/Runtime/Core/DataStructure/KDTree3D.cs +911 -0
  315. package/Runtime/Core/DataStructure/KDTree3D.cs.meta +11 -0
  316. package/Runtime/Core/DataStructure/OctTree3D.cs +983 -0
  317. package/Runtime/Core/DataStructure/OctTree3D.cs.meta +11 -0
  318. package/Runtime/Core/DataStructure/PriorityQueue.cs +194 -0
  319. package/Runtime/Core/DataStructure/PriorityQueue.cs.meta +11 -0
  320. package/Runtime/Core/DataStructure/QuadTree2D.cs +722 -0
  321. package/Runtime/Core/DataStructure/QuadTree2D.cs.meta +11 -0
  322. package/Runtime/Core/DataStructure/RTree2D.cs +704 -0
  323. package/Runtime/Core/DataStructure/{RTree.cs.meta → RTree2D.cs.meta} +11 -11
  324. package/Runtime/Core/DataStructure/RTree3D.cs +775 -0
  325. package/Runtime/Core/DataStructure/RTree3D.cs.meta +11 -0
  326. package/Runtime/Core/DataStructure/SparseSet.cs +597 -0
  327. package/Runtime/Core/DataStructure/SparseSet.cs.meta +11 -0
  328. package/Runtime/Core/DataStructure/SpatialHash2D.cs +312 -0
  329. package/Runtime/Core/DataStructure/SpatialHash2D.cs.meta +3 -0
  330. package/Runtime/Core/DataStructure/SpatialHash3D.cs +341 -0
  331. package/Runtime/Core/DataStructure/SpatialHash3D.cs.meta +11 -0
  332. package/Runtime/Core/DataStructure/Sphere.cs +264 -0
  333. package/Runtime/Core/DataStructure/Sphere.cs.meta +11 -0
  334. package/Runtime/Core/DataStructure/StringWrapper.cs +115 -91
  335. package/Runtime/Core/DataStructure/StringWrapper.cs.meta +11 -11
  336. package/Runtime/Core/DataStructure/TimedCache.cs +88 -66
  337. package/Runtime/Core/DataStructure/TimedCache.cs.meta +11 -11
  338. package/Runtime/Core/DataStructure/Trie.cs +660 -359
  339. package/Runtime/Core/DataStructure/Trie.cs.meta +2 -2
  340. package/Runtime/Core/DataStructure.meta +8 -8
  341. package/Runtime/Core/Extension/AnimatorExtensions.cs +40 -25
  342. package/Runtime/Core/Extension/AnimatorExtensions.cs.meta +11 -11
  343. package/Runtime/Core/Extension/AsyncOperationExtensions.cs +404 -110
  344. package/Runtime/Core/Extension/AsyncOperationExtensions.cs.meta +2 -2
  345. package/Runtime/Core/Extension/CircleExtensions.cs +125 -25
  346. package/Runtime/Core/Extension/CircleExtensions.cs.meta +11 -11
  347. package/Runtime/Core/Extension/ColorExtensions.cs +983 -644
  348. package/Runtime/Core/Extension/ColorExtensions.cs.meta +11 -11
  349. package/Runtime/Core/Extension/DictionaryExtensions.cs +606 -299
  350. package/Runtime/Core/Extension/DictionaryExtensions.cs.meta +11 -11
  351. package/Runtime/Core/Extension/DirectionExtensions.cs +377 -213
  352. package/Runtime/Core/Extension/DirectionExtensions.cs.meta +11 -11
  353. package/Runtime/Core/Extension/EnumExtensions.cs +535 -137
  354. package/Runtime/Core/Extension/EnumExtensions.cs.meta +2 -2
  355. package/Runtime/Core/Extension/IEnumerableExtensions.cs +341 -124
  356. package/Runtime/Core/Extension/IEnumerableExtensions.cs.meta +11 -11
  357. package/Runtime/Core/Extension/IListExtensions.cs +767 -248
  358. package/Runtime/Core/Extension/IListExtensions.cs.meta +11 -11
  359. package/Runtime/Core/Extension/IReadonlyListExtensions.cs +687 -37
  360. package/Runtime/Core/Extension/IReadonlyListExtensions.cs.meta +2 -2
  361. package/Runtime/Core/Extension/ProtoEqualityExtensions.cs +292 -0
  362. package/Runtime/Core/Extension/ProtoEqualityExtensions.cs.meta +3 -0
  363. package/Runtime/Core/Extension/RandomExtensions.cs +1006 -109
  364. package/Runtime/Core/Extension/RandomExtensions.cs.meta +11 -11
  365. package/Runtime/Core/Extension/StringExtensions.cs +1635 -239
  366. package/Runtime/Core/Extension/StringExtensions.cs.meta +11 -11
  367. package/Runtime/Core/Extension/UnityExtensions.cs +4555 -1689
  368. package/Runtime/Core/Extension/UnityExtensions.cs.meta +11 -11
  369. package/Runtime/Core/Extension/WallstopStudiosLogger.cs +287 -245
  370. package/Runtime/Core/Extension/WallstopStudiosLogger.cs.meta +11 -11
  371. package/Runtime/Core/Extension.meta +8 -8
  372. package/Runtime/Core/Helper/ArrayConverter.cs +73 -39
  373. package/Runtime/Core/Helper/ArrayConverter.cs.meta +2 -2
  374. package/Runtime/Core/Helper/AssignUtilities.cs +33 -14
  375. package/Runtime/Core/Helper/AssignUtilities.cs.meta +11 -11
  376. package/Runtime/Core/Helper/DirectoryHelper.cs +210 -196
  377. package/Runtime/Core/Helper/DirectoryHelper.cs.meta +2 -2
  378. package/Runtime/Core/Helper/Enumerables.cs +51 -17
  379. package/Runtime/Core/Helper/Enumerables.cs.meta +11 -11
  380. package/Runtime/Core/Helper/FileHelper.cs +97 -77
  381. package/Runtime/Core/Helper/FileHelper.cs.meta +2 -2
  382. package/Runtime/Core/Helper/FormattingHelpers.cs +49 -38
  383. package/Runtime/Core/Helper/FormattingHelpers.cs.meta +2 -2
  384. package/Runtime/Core/Helper/FuncBasedComparer.cs +29 -0
  385. package/Runtime/Core/Helper/FuncBasedComparer.cs.meta +3 -0
  386. package/Runtime/Core/Helper/Geometry.cs +65 -43
  387. package/Runtime/Core/Helper/Geometry.cs.meta +11 -11
  388. package/Runtime/Core/Helper/Helpers.cs +1271 -831
  389. package/Runtime/Core/Helper/Helpers.cs.meta +11 -11
  390. package/Runtime/Core/Helper/IterationHelpers.cs +83 -32
  391. package/Runtime/Core/Helper/IterationHelpers.cs.meta +11 -11
  392. package/Runtime/Core/Helper/LifetimeHelpers.cs +20 -13
  393. package/Runtime/Core/Helper/LifetimeHelpers.cs.meta +11 -11
  394. package/Runtime/Core/Helper/LineHelper.cs +259 -194
  395. package/Runtime/Core/Helper/LineHelper.cs.meta +2 -2
  396. package/Runtime/Core/Helper/Logging/UnityLogTagFormatter.cs +549 -539
  397. package/Runtime/Core/Helper/Logging/UnityLogTagFormatter.cs.meta +2 -2
  398. package/Runtime/Core/Helper/Logging.meta +2 -2
  399. package/Runtime/Core/Helper/Objects.cs +477 -769
  400. package/Runtime/Core/Helper/Objects.cs.meta +11 -11
  401. package/Runtime/Core/Helper/Partials/LogHelpers.cs +13 -13
  402. package/Runtime/Core/Helper/Partials/LogHelpers.cs.meta +2 -2
  403. package/Runtime/Core/Helper/Partials/MathHelpers.cs +45 -30
  404. package/Runtime/Core/Helper/Partials/MathHelpers.cs.meta +2 -2
  405. package/Runtime/Core/Helper/Partials/ObjectHelpers.cs +509 -400
  406. package/Runtime/Core/Helper/Partials/ObjectHelpers.cs.meta +2 -2
  407. package/Runtime/Core/Helper/Partials/TransformHelpers.cs +393 -377
  408. package/Runtime/Core/Helper/Partials/TransformHelpers.cs.meta +2 -2
  409. package/Runtime/Core/Helper/Partials.meta +2 -2
  410. package/Runtime/Core/Helper/PathHelper.cs +42 -15
  411. package/Runtime/Core/Helper/PathHelper.cs.meta +2 -2
  412. package/Runtime/Core/Helper/ReflectionHelpers.cs +5298 -1963
  413. package/Runtime/Core/Helper/ReflectionHelpers.cs.meta +2 -2
  414. package/Runtime/Core/Helper/ReverseComparer.cs +33 -0
  415. package/Runtime/Core/Helper/ReverseComparer.cs.meta +3 -0
  416. package/Runtime/Core/Helper/SceneHelper.cs +251 -224
  417. package/Runtime/Core/Helper/SceneHelper.cs.meta +2 -2
  418. package/Runtime/Core/Helper/SpriteHelpers.cs +52 -41
  419. package/Runtime/Core/Helper/SpriteHelpers.cs.meta +11 -11
  420. package/Runtime/Core/Helper/StringInList.cs +61 -35
  421. package/Runtime/Core/Helper/StringInList.cs.meta +11 -11
  422. package/Runtime/Core/Helper/TestAssemblyHelper.cs +134 -0
  423. package/Runtime/Core/Helper/TestAssemblyHelper.cs.meta +11 -0
  424. package/Runtime/Core/Helper/UnityMainThreadDispatcher.cs +144 -82
  425. package/Runtime/Core/Helper/UnityMainThreadDispatcher.cs.meta +2 -2
  426. package/Runtime/Core/Helper/WallMath.cs +672 -166
  427. package/Runtime/Core/Helper/WallMath.cs.meta +11 -11
  428. package/Runtime/Core/Helper.meta +8 -8
  429. package/Runtime/Core/Math/Line2D.cs +263 -0
  430. package/Runtime/Core/Math/Line2D.cs.meta +11 -0
  431. package/Runtime/Core/Math/Line3D.cs +452 -0
  432. package/Runtime/Core/Math/Line3D.cs.meta +11 -0
  433. package/Runtime/Core/Math/Parabola.cs +241 -47
  434. package/Runtime/Core/Math/Parabola.cs.meta +11 -11
  435. package/Runtime/Core/Math/PointPolygonCheck.cs +175 -36
  436. package/Runtime/Core/Math/PointPolygonCheck.cs.meta +11 -11
  437. package/Runtime/Core/Math/Range.cs +157 -92
  438. package/Runtime/Core/Math/Range.cs.meta +11 -11
  439. package/Runtime/Core/Math.meta +8 -8
  440. package/Runtime/Core/Model/Direction.cs +25 -43
  441. package/Runtime/Core/Model/Direction.cs.meta +11 -11
  442. package/Runtime/Core/Model.meta +8 -8
  443. package/Runtime/Core/OneOf/FastOneOf.cs +252 -152
  444. package/Runtime/Core/OneOf/FastOneOf.cs.meta +11 -11
  445. package/Runtime/Core/OneOf/FastOneOf2.cs +198 -0
  446. package/Runtime/Core/OneOf/FastOneOf2.cs.meta +11 -0
  447. package/Runtime/Core/OneOf/FastOneOf4.cs +324 -0
  448. package/Runtime/Core/OneOf/FastOneOf4.cs.meta +11 -0
  449. package/Runtime/Core/OneOf/None.cs +30 -4
  450. package/Runtime/Core/OneOf/None.cs.meta +11 -11
  451. package/Runtime/Core/OneOf.meta +8 -8
  452. package/Runtime/Core/Random/AbstractRandom.cs +1318 -655
  453. package/Runtime/Core/Random/AbstractRandom.cs.meta +11 -11
  454. package/Runtime/Core/Random/DotNetRandom.cs +118 -54
  455. package/Runtime/Core/Random/DotNetRandom.cs.meta +2 -2
  456. package/Runtime/Core/Random/IRandom.cs +203 -161
  457. package/Runtime/Core/Random/IRandom.cs.meta +11 -11
  458. package/Runtime/Core/Random/IllusionFlow.cs +171 -107
  459. package/Runtime/Core/Random/IllusionFlow.cs.meta +2 -2
  460. package/Runtime/Core/Random/LinearCongruentialGenerator.cs +90 -49
  461. package/Runtime/Core/Random/LinearCongruentialGenerator.cs.meta +2 -2
  462. package/Runtime/Core/Random/NativePcgRandom.cs +139 -97
  463. package/Runtime/Core/Random/NativePcgRandom.cs.meta +11 -11
  464. package/Runtime/Core/Random/PRNG.cs +21 -7
  465. package/Runtime/Core/Random/PRNG.cs.meta +2 -2
  466. package/Runtime/Core/Random/PcgRandom.cs +243 -149
  467. package/Runtime/Core/Random/PcgRandom.cs.meta +11 -11
  468. package/Runtime/Core/Random/PerlinNoise.cs +369 -369
  469. package/Runtime/Core/Random/PerlinNoise.cs.meta +2 -2
  470. package/Runtime/Core/Random/RandomComparer.cs +34 -0
  471. package/Runtime/Core/Random/RandomComparer.cs.meta +3 -0
  472. package/Runtime/Core/Random/RandomState.cs +206 -131
  473. package/Runtime/Core/Random/RandomState.cs.meta +11 -11
  474. package/Runtime/Core/Random/RandomUtilities.cs +55 -26
  475. package/Runtime/Core/Random/RandomUtilities.cs.meta +11 -11
  476. package/Runtime/Core/Random/RomuDuo.cs +171 -116
  477. package/Runtime/Core/Random/RomuDuo.cs.meta +2 -2
  478. package/Runtime/Core/Random/SplitMix64.cs +134 -94
  479. package/Runtime/Core/Random/SplitMix64.cs.meta +2 -2
  480. package/Runtime/Core/Random/SquirrelRandom.cs +127 -84
  481. package/Runtime/Core/Random/SquirrelRandom.cs.meta +11 -11
  482. package/Runtime/Core/Random/SystemRandom.cs +203 -162
  483. package/Runtime/Core/Random/SystemRandom.cs.meta +11 -11
  484. package/Runtime/Core/Random/ThreadLocalRandom.cs +25 -12
  485. package/Runtime/Core/Random/ThreadLocalRandom.cs.meta +11 -11
  486. package/Runtime/Core/Random/UnityRandom.cs +109 -57
  487. package/Runtime/Core/Random/UnityRandom.cs.meta +11 -11
  488. package/Runtime/Core/Random/WyRandom.cs +158 -121
  489. package/Runtime/Core/Random/WyRandom.cs.meta +2 -2
  490. package/Runtime/Core/Random/XorShiftRandom.cs +106 -52
  491. package/Runtime/Core/Random/XorShiftRandom.cs.meta +11 -11
  492. package/Runtime/Core/Random/XoroShiroRandom.cs +184 -119
  493. package/Runtime/Core/Random/XoroShiroRandom.cs.meta +2 -2
  494. package/Runtime/Core/Random.meta +8 -8
  495. package/Runtime/Core/Serialization/JsonConverters/AnimationCurveConverter.cs +248 -0
  496. package/Runtime/Core/Serialization/JsonConverters/AnimationCurveConverter.cs.meta +11 -0
  497. package/Runtime/Core/Serialization/JsonConverters/BitSetConverter.cs +119 -0
  498. package/Runtime/Core/Serialization/JsonConverters/BitSetConverter.cs.meta +11 -0
  499. package/Runtime/Core/Serialization/JsonConverters/BoundingSphereConverter.cs +74 -0
  500. package/Runtime/Core/Serialization/JsonConverters/BoundingSphereConverter.cs.meta +11 -0
  501. package/Runtime/Core/Serialization/JsonConverters/BoundsConverter.cs +132 -0
  502. package/Runtime/Core/Serialization/JsonConverters/BoundsConverter.cs.meta +11 -0
  503. package/Runtime/Core/Serialization/JsonConverters/BoundsIntConverter.cs +135 -0
  504. package/Runtime/Core/Serialization/JsonConverters/BoundsIntConverter.cs.meta +11 -0
  505. package/Runtime/Core/Serialization/JsonConverters/Color32Converter.cs +98 -0
  506. package/Runtime/Core/Serialization/JsonConverters/Color32Converter.cs.meta +11 -0
  507. package/Runtime/Core/Serialization/JsonConverters/ColorBlockConverter.cs +123 -0
  508. package/Runtime/Core/Serialization/JsonConverters/ColorBlockConverter.cs.meta +11 -0
  509. package/Runtime/Core/Serialization/JsonConverters/ColorConverter.cs +88 -88
  510. package/Runtime/Core/Serialization/JsonConverters/ColorConverter.cs.meta +2 -2
  511. package/Runtime/Core/Serialization/JsonConverters/CyclicBufferConverterFactory.cs +112 -0
  512. package/Runtime/Core/Serialization/JsonConverters/CyclicBufferConverterFactory.cs.meta +11 -0
  513. package/Runtime/Core/Serialization/JsonConverters/DequeConverterFactory.cs +62 -0
  514. package/Runtime/Core/Serialization/JsonConverters/DequeConverterFactory.cs.meta +11 -0
  515. package/Runtime/Core/Serialization/JsonConverters/FastVector2IntConverter.cs +72 -0
  516. package/Runtime/Core/Serialization/JsonConverters/FastVector2IntConverter.cs.meta +11 -0
  517. package/Runtime/Core/Serialization/JsonConverters/FastVector3IntConverter.cs +80 -0
  518. package/Runtime/Core/Serialization/JsonConverters/FastVector3IntConverter.cs.meta +11 -0
  519. package/Runtime/Core/Serialization/JsonConverters/GameObjectConverter.cs +44 -36
  520. package/Runtime/Core/Serialization/JsonConverters/GameObjectConverter.cs.meta +2 -2
  521. package/Runtime/Core/Serialization/JsonConverters/GradientConverter.cs +245 -0
  522. package/Runtime/Core/Serialization/JsonConverters/GradientConverter.cs.meta +11 -0
  523. package/Runtime/Core/Serialization/JsonConverters/Hash128Converter.cs +92 -0
  524. package/Runtime/Core/Serialization/JsonConverters/Hash128Converter.cs.meta +11 -0
  525. package/Runtime/Core/Serialization/JsonConverters/ImmutableBitSetConverter.cs +119 -0
  526. package/Runtime/Core/Serialization/JsonConverters/ImmutableBitSetConverter.cs.meta +11 -0
  527. package/Runtime/Core/Serialization/JsonConverters/KVector2Converter.cs +72 -0
  528. package/Runtime/Core/Serialization/JsonConverters/KVector2Converter.cs.meta +11 -0
  529. package/Runtime/Core/Serialization/JsonConverters/LayerMaskConverter.cs +95 -0
  530. package/Runtime/Core/Serialization/JsonConverters/LayerMaskConverter.cs.meta +11 -0
  531. package/Runtime/Core/Serialization/JsonConverters/Matrix4x4Converter.cs +237 -218
  532. package/Runtime/Core/Serialization/JsonConverters/Matrix4x4Converter.cs.meta +2 -2
  533. package/Runtime/Core/Serialization/JsonConverters/MinMaxCurveConverter.cs +142 -0
  534. package/Runtime/Core/Serialization/JsonConverters/MinMaxCurveConverter.cs.meta +11 -0
  535. package/Runtime/Core/Serialization/JsonConverters/MinMaxGradientConverter.cs +135 -0
  536. package/Runtime/Core/Serialization/JsonConverters/MinMaxGradientConverter.cs.meta +11 -0
  537. package/Runtime/Core/Serialization/JsonConverters/PlaneConverter.cs +79 -0
  538. package/Runtime/Core/Serialization/JsonConverters/PlaneConverter.cs.meta +11 -0
  539. package/Runtime/Core/Serialization/JsonConverters/PoseConverter.cs +76 -0
  540. package/Runtime/Core/Serialization/JsonConverters/PoseConverter.cs.meta +11 -0
  541. package/Runtime/Core/Serialization/JsonConverters/QuaternionConverter.cs +88 -0
  542. package/Runtime/Core/Serialization/JsonConverters/QuaternionConverter.cs.meta +11 -0
  543. package/Runtime/Core/Serialization/JsonConverters/RangeConverterFactory.cs +106 -0
  544. package/Runtime/Core/Serialization/JsonConverters/RangeConverterFactory.cs.meta +11 -0
  545. package/Runtime/Core/Serialization/JsonConverters/RangeIntConverter.cs +71 -0
  546. package/Runtime/Core/Serialization/JsonConverters/RangeIntConverter.cs.meta +11 -0
  547. package/Runtime/Core/Serialization/JsonConverters/Ray2DConverter.cs +80 -0
  548. package/Runtime/Core/Serialization/JsonConverters/Ray2DConverter.cs.meta +11 -0
  549. package/Runtime/Core/Serialization/JsonConverters/RayConverter.cs +76 -0
  550. package/Runtime/Core/Serialization/JsonConverters/RayConverter.cs.meta +11 -0
  551. package/Runtime/Core/Serialization/JsonConverters/RaycastHitConverter.cs +115 -0
  552. package/Runtime/Core/Serialization/JsonConverters/RaycastHitConverter.cs.meta +11 -0
  553. package/Runtime/Core/Serialization/JsonConverters/RectConverter.cs +84 -0
  554. package/Runtime/Core/Serialization/JsonConverters/RectConverter.cs.meta +11 -0
  555. package/Runtime/Core/Serialization/JsonConverters/RectIntConverter.cs +88 -0
  556. package/Runtime/Core/Serialization/JsonConverters/RectIntConverter.cs.meta +11 -0
  557. package/Runtime/Core/Serialization/JsonConverters/RectOffsetConverter.cs +87 -0
  558. package/Runtime/Core/Serialization/JsonConverters/RectOffsetConverter.cs.meta +11 -0
  559. package/Runtime/Core/Serialization/JsonConverters/RenderTextureDescriptorConverter.cs +264 -0
  560. package/Runtime/Core/Serialization/JsonConverters/RenderTextureDescriptorConverter.cs.meta +11 -0
  561. package/Runtime/Core/Serialization/JsonConverters/ResolutionConverter.cs +158 -0
  562. package/Runtime/Core/Serialization/JsonConverters/ResolutionConverter.cs.meta +11 -0
  563. package/Runtime/Core/Serialization/JsonConverters/SceneConverter.cs +103 -0
  564. package/Runtime/Core/Serialization/JsonConverters/SceneConverter.cs.meta +11 -0
  565. package/Runtime/Core/Serialization/JsonConverters/SphericalHarmonicsL2Converter.cs +121 -0
  566. package/Runtime/Core/Serialization/JsonConverters/SphericalHarmonicsL2Converter.cs.meta +11 -0
  567. package/Runtime/Core/Serialization/JsonConverters/TouchConverter.cs +54 -0
  568. package/Runtime/Core/Serialization/JsonConverters/TouchConverter.cs.meta +11 -0
  569. package/Runtime/Core/Serialization/JsonConverters/TypeConverter.cs +30 -28
  570. package/Runtime/Core/Serialization/JsonConverters/TypeConverter.cs.meta +2 -2
  571. package/Runtime/Core/Serialization/JsonConverters/Vector2Converter.cs +72 -74
  572. package/Runtime/Core/Serialization/JsonConverters/Vector2Converter.cs.meta +11 -11
  573. package/Runtime/Core/Serialization/JsonConverters/Vector2IntConverter.cs +72 -0
  574. package/Runtime/Core/Serialization/JsonConverters/Vector2IntConverter.cs.meta +11 -0
  575. package/Runtime/Core/Serialization/JsonConverters/Vector3Converter.cs +80 -81
  576. package/Runtime/Core/Serialization/JsonConverters/Vector3Converter.cs.meta +11 -11
  577. package/Runtime/Core/Serialization/JsonConverters/Vector3IntConverter.cs +80 -0
  578. package/Runtime/Core/Serialization/JsonConverters/Vector3IntConverter.cs.meta +11 -0
  579. package/Runtime/Core/Serialization/JsonConverters/Vector4Converter.cs +88 -88
  580. package/Runtime/Core/Serialization/JsonConverters/Vector4Converter.cs.meta +2 -2
  581. package/Runtime/Core/Serialization/JsonConverters.meta +8 -8
  582. package/Runtime/Core/Serialization/ProtobufUnitySurrogates.cs +383 -0
  583. package/Runtime/Core/Serialization/ProtobufUnitySurrogates.cs.meta +11 -0
  584. package/Runtime/Core/Serialization/Serializer.cs +2121 -195
  585. package/Runtime/Core/Serialization/Serializer.cs.meta +11 -11
  586. package/Runtime/Core/Serialization.meta +8 -8
  587. package/Runtime/Core/Threading/SingleThreadedThreadPool.cs +228 -228
  588. package/Runtime/Core/Threading/SingleThreadedThreadPool.cs.meta +11 -11
  589. package/Runtime/Core/Threading.meta +8 -8
  590. package/Runtime/Core.meta +8 -8
  591. package/Runtime/Integrations/VContainer/AssemblyInfo.cs +9 -0
  592. package/Runtime/Integrations/VContainer/AssemblyInfo.cs.meta +3 -0
  593. package/Runtime/Integrations/VContainer/ObjectResolverRelationalExtensions.cs +281 -0
  594. package/Runtime/Integrations/VContainer/ObjectResolverRelationalExtensions.cs.meta +11 -0
  595. package/Runtime/Integrations/VContainer/RelationalComponentEntryPoint.cs +189 -0
  596. package/Runtime/Integrations/VContainer/RelationalComponentEntryPoint.cs.meta +11 -0
  597. package/Runtime/Integrations/VContainer/RelationalComponentsBuilderExtensions.cs +90 -0
  598. package/Runtime/Integrations/VContainer/RelationalComponentsBuilderExtensions.cs.meta +11 -0
  599. package/Runtime/Integrations/VContainer/RelationalObjectPools.cs +114 -0
  600. package/Runtime/Integrations/VContainer/RelationalObjectPools.cs.meta +11 -0
  601. package/Runtime/Integrations/VContainer/RelationalSceneAssignmentOptions.cs +95 -0
  602. package/Runtime/Integrations/VContainer/RelationalSceneAssignmentOptions.cs.meta +11 -0
  603. package/Runtime/Integrations/VContainer/RelationalSceneLoadListener.cs +241 -0
  604. package/Runtime/Integrations/VContainer/RelationalSceneLoadListener.cs.meta +11 -0
  605. package/Runtime/Integrations/VContainer/WallstopStudios.UnityHelpers.Integration.VContainer.asmdef +30 -0
  606. package/Runtime/Integrations/VContainer/WallstopStudios.UnityHelpers.Integration.VContainer.asmdef.meta +7 -0
  607. package/Runtime/Integrations/VContainer.meta +8 -0
  608. package/Runtime/Integrations/Zenject/AssemblyInfo.cs +9 -0
  609. package/Runtime/Integrations/Zenject/AssemblyInfo.cs.meta +3 -0
  610. package/Runtime/Integrations/Zenject/DiContainerRelationalExtensions.cs +247 -0
  611. package/Runtime/Integrations/Zenject/DiContainerRelationalExtensions.cs.meta +11 -0
  612. package/Runtime/Integrations/Zenject/RelationalComponentSceneInitializer.cs +182 -0
  613. package/Runtime/Integrations/Zenject/RelationalComponentSceneInitializer.cs.meta +11 -0
  614. package/Runtime/Integrations/Zenject/RelationalComponentsInstaller.cs +94 -0
  615. package/Runtime/Integrations/Zenject/RelationalComponentsInstaller.cs.meta +11 -0
  616. package/Runtime/Integrations/Zenject/RelationalMemoryPools.cs +44 -0
  617. package/Runtime/Integrations/Zenject/RelationalMemoryPools.cs.meta +11 -0
  618. package/Runtime/Integrations/Zenject/RelationalSceneAssignmentOptions.cs +93 -0
  619. package/Runtime/Integrations/Zenject/RelationalSceneAssignmentOptions.cs.meta +11 -0
  620. package/Runtime/Integrations/Zenject/RelationalSceneLoadListener.cs +243 -0
  621. package/Runtime/Integrations/Zenject/RelationalSceneLoadListener.cs.meta +11 -0
  622. package/Runtime/Integrations/Zenject/WallstopStudios.UnityHelpers.Integration.Zenject.asmdef +30 -0
  623. package/Runtime/Integrations/Zenject/WallstopStudios.UnityHelpers.Integration.Zenject.asmdef.meta +7 -0
  624. package/Runtime/Integrations/Zenject.meta +8 -0
  625. package/Runtime/Integrations.meta +8 -0
  626. package/Runtime/Protobuf-Net/System.Collections.Immutable.dll.meta +33 -33
  627. package/Runtime/Protobuf-Net/System.Runtime.CompilerServices.Unsafe.dll.meta +33 -33
  628. package/Runtime/Protobuf-Net/protobuf-net.Core.dll.meta +33 -33
  629. package/Runtime/Protobuf-Net/protobuf-net.dll.meta +33 -33
  630. package/Runtime/Protobuf-Net.meta +8 -8
  631. package/Runtime/Tags/AlwaysIncludeInAttributeMetadataCacheAttribute.cs +11 -0
  632. package/Runtime/Tags/AlwaysIncludeInAttributeMetadataCacheAttribute.cs.meta +11 -0
  633. package/Runtime/Tags/Attribute.cs +399 -205
  634. package/Runtime/Tags/Attribute.cs.meta +2 -2
  635. package/Runtime/Tags/AttributeEffect.cs +372 -281
  636. package/Runtime/Tags/AttributeEffect.cs.meta +2 -2
  637. package/Runtime/Tags/AttributeMetadataCache.cs +500 -0
  638. package/Runtime/Tags/AttributeMetadataCache.cs.meta +11 -0
  639. package/Runtime/Tags/AttributeMetadataFilters.cs +108 -0
  640. package/Runtime/Tags/AttributeMetadataFilters.cs.meta +11 -0
  641. package/Runtime/Tags/AttributeModification.cs +132 -48
  642. package/Runtime/Tags/AttributeModification.cs.meta +2 -2
  643. package/Runtime/Tags/AttributeUtilities.cs +376 -209
  644. package/Runtime/Tags/AttributeUtilities.cs.meta +2 -2
  645. package/Runtime/Tags/AttributesComponent.cs +237 -163
  646. package/Runtime/Tags/AttributesComponent.cs.meta +2 -2
  647. package/Runtime/Tags/CollisionSenses.cs +117 -91
  648. package/Runtime/Tags/CollisionSenses.cs.meta +2 -2
  649. package/Runtime/Tags/CosmeticEffectComponent.cs +112 -50
  650. package/Runtime/Tags/CosmeticEffectComponent.cs.meta +2 -2
  651. package/Runtime/Tags/CosmeticEffectData.cs +109 -63
  652. package/Runtime/Tags/CosmeticEffectData.cs.meta +2 -2
  653. package/Runtime/Tags/EffectHandle.cs +150 -65
  654. package/Runtime/Tags/EffectHandle.cs.meta +2 -2
  655. package/Runtime/Tags/EffectHandler.cs +470 -393
  656. package/Runtime/Tags/EffectHandler.cs.meta +2 -2
  657. package/Runtime/Tags/ModificationAction.cs +60 -9
  658. package/Runtime/Tags/ModificationAction.cs.meta +2 -2
  659. package/Runtime/Tags/ModifierDurationType.cs +71 -13
  660. package/Runtime/Tags/ModifierDurationType.cs.meta +2 -2
  661. package/Runtime/Tags/TagHandler.cs +373 -158
  662. package/Runtime/Tags/TagHandler.cs.meta +2 -2
  663. package/Runtime/Tags.meta +2 -2
  664. package/Runtime/Utils/AnimationEventEqualityComparer.cs +198 -161
  665. package/Runtime/Utils/AnimationEventEqualityComparer.cs.meta +11 -11
  666. package/Runtime/Utils/AnimatorEnumStateMachine.cs +110 -88
  667. package/Runtime/Utils/AnimatorEnumStateMachine.cs.meta +11 -11
  668. package/Runtime/Utils/Ascii85.cs +132 -115
  669. package/Runtime/Utils/Ascii85.cs.meta +2 -2
  670. package/Runtime/Utils/Buffers.cs +1151 -550
  671. package/Runtime/Utils/Buffers.cs.meta +11 -11
  672. package/Runtime/Utils/CenterPointOffset.cs +35 -30
  673. package/Runtime/Utils/CenterPointOffset.cs.meta +2 -2
  674. package/Runtime/Utils/ChildSpawner.cs +250 -157
  675. package/Runtime/Utils/ChildSpawner.cs.meta +2 -2
  676. package/Runtime/Utils/CircleLineRenderer.cs +142 -142
  677. package/Runtime/Utils/CircleLineRenderer.cs.meta +11 -11
  678. package/Runtime/Utils/CollisionProxy.cs +48 -48
  679. package/Runtime/Utils/CollisionProxy.cs.meta +2 -2
  680. package/Runtime/Utils/CoroutineHandler.cs +4 -4
  681. package/Runtime/Utils/CoroutineHandler.cs.meta +2 -2
  682. package/Runtime/Utils/DeferredDisposalResult.cs +20 -23
  683. package/Runtime/Utils/DeferredDisposalResult.cs.meta +2 -2
  684. package/Runtime/Utils/LZMA.cs +276 -53
  685. package/Runtime/Utils/LZMA.cs.meta +2 -2
  686. package/Runtime/Utils/MatchColliderToSprite.cs +104 -104
  687. package/Runtime/Utils/MatchColliderToSprite.cs.meta +2 -2
  688. package/Runtime/Utils/MatchTransform.cs +99 -82
  689. package/Runtime/Utils/MatchTransform.cs.meta +2 -2
  690. package/Runtime/Utils/Oscillator.cs +27 -27
  691. package/Runtime/Utils/Oscillator.cs.meta +11 -11
  692. package/Runtime/Utils/PolygonCollider2DOptimizer.cs +104 -83
  693. package/Runtime/Utils/PolygonCollider2DOptimizer.cs.meta +2 -2
  694. package/Runtime/Utils/RuntimeSingleton.cs +139 -89
  695. package/Runtime/Utils/RuntimeSingleton.cs.meta +11 -11
  696. package/Runtime/Utils/ScriptableObjectSingleton.cs +225 -85
  697. package/Runtime/Utils/ScriptableObjectSingleton.cs.meta +2 -2
  698. package/Runtime/Utils/SerializedStringComparer.cs +107 -107
  699. package/Runtime/Utils/SerializedStringComparer.cs.meta +2 -2
  700. package/Runtime/Utils/SetTextureImportData.cs +71 -69
  701. package/Runtime/Utils/SetTextureImportData.cs.meta +11 -11
  702. package/Runtime/Utils/SevenZip/Common/CRC.cs +70 -70
  703. package/Runtime/Utils/SevenZip/Common/CRC.cs.meta +11 -11
  704. package/Runtime/Utils/SevenZip/Common/InBuffer.cs +84 -84
  705. package/Runtime/Utils/SevenZip/Common/InBuffer.cs.meta +11 -11
  706. package/Runtime/Utils/SevenZip/Common/OutBuffer.cs +70 -70
  707. package/Runtime/Utils/SevenZip/Common/OutBuffer.cs.meta +11 -11
  708. package/Runtime/Utils/SevenZip/Common.meta +2 -2
  709. package/Runtime/Utils/SevenZip/Compress/LZ/IMatchFinder.cs +28 -28
  710. package/Runtime/Utils/SevenZip/Compress/LZ/IMatchFinder.cs.meta +11 -11
  711. package/Runtime/Utils/SevenZip/Compress/LZ/LzBinTree.cs +454 -454
  712. package/Runtime/Utils/SevenZip/Compress/LZ/LzBinTree.cs.meta +11 -11
  713. package/Runtime/Utils/SevenZip/Compress/LZ/LzInWindow.cs +179 -179
  714. package/Runtime/Utils/SevenZip/Compress/LZ/LzInWindow.cs.meta +11 -11
  715. package/Runtime/Utils/SevenZip/Compress/LZ/LzOutWindow.cs +137 -137
  716. package/Runtime/Utils/SevenZip/Compress/LZ/LzOutWindow.cs.meta +11 -11
  717. package/Runtime/Utils/SevenZip/Compress/LZ.meta +8 -8
  718. package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaBase.cs +110 -110
  719. package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaBase.cs.meta +11 -11
  720. package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaDecoder.cs +525 -527
  721. package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaDecoder.cs.meta +11 -11
  722. package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaEncoder.cs +1891 -1904
  723. package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaEncoder.cs.meta +11 -11
  724. package/Runtime/Utils/SevenZip/Compress/LZMA.meta +8 -8
  725. package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoder.cs +242 -242
  726. package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoder.cs.meta +11 -11
  727. package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoderBit.cs +146 -149
  728. package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoderBit.cs.meta +11 -11
  729. package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoderBitTree.cs +177 -177
  730. package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoderBitTree.cs.meta +11 -11
  731. package/Runtime/Utils/SevenZip/Compress/RangeCoder.meta +8 -8
  732. package/Runtime/Utils/SevenZip/Compress.meta +8 -8
  733. package/Runtime/Utils/SevenZip/ICoder.cs +177 -177
  734. package/Runtime/Utils/SevenZip/ICoder.cs.meta +11 -11
  735. package/Runtime/Utils/SevenZip.meta +2 -2
  736. package/Runtime/Utils/SpriteRendererMetadata.cs +346 -370
  737. package/Runtime/Utils/SpriteRendererMetadata.cs.meta +2 -2
  738. package/Runtime/Utils/SpriteRendererSyncer.cs +100 -100
  739. package/Runtime/Utils/SpriteRendererSyncer.cs.meta +2 -2
  740. package/Runtime/Utils/StartTracker.cs +15 -15
  741. package/Runtime/Utils/StartTracker.cs.meta +2 -2
  742. package/Runtime/Utils/TextureScale.cs +364 -179
  743. package/Runtime/Utils/TextureScale.cs.meta +2 -2
  744. package/Runtime/Utils/TypeNameSorter.cs +17 -17
  745. package/Runtime/Utils/TypeNameSorter.cs.meta +2 -2
  746. package/Runtime/Utils/UnityObjectNameComparer.cs +89 -89
  747. package/Runtime/Utils/UnityObjectNameComparer.cs.meta +2 -2
  748. package/Runtime/Utils.meta +8 -8
  749. package/Runtime/Visuals/AnimatedSpriteLayer.cs +217 -130
  750. package/Runtime/Visuals/AnimatedSpriteLayer.cs.meta +2 -2
  751. package/Runtime/Visuals/UGUI/EnhancedImage.cs +224 -85
  752. package/Runtime/Visuals/UGUI/EnhancedImage.cs.meta +2 -2
  753. package/Runtime/Visuals/UGUI.meta +2 -2
  754. package/Runtime/Visuals/UIToolkit/LayeredImage.cs +784 -484
  755. package/Runtime/Visuals/UIToolkit/LayeredImage.cs.meta +2 -2
  756. package/Runtime/Visuals/UIToolkit/MultiFileSelectorElement.cs +945 -322
  757. package/Runtime/Visuals/UIToolkit/MultiFileSelectorElement.cs.meta +2 -2
  758. package/Runtime/Visuals/UIToolkit.meta +2 -2
  759. package/Runtime/Visuals.meta +2 -2
  760. package/Runtime/WallstopStudios.UnityHelpers.asmdef +22 -14
  761. package/Runtime/WallstopStudios.UnityHelpers.asmdef.meta +7 -7
  762. package/Runtime.meta +8 -8
  763. package/SERIALIZATION.md +663 -0
  764. package/SERIALIZATION.md.meta +7 -0
  765. package/SINGLETONS.md +427 -0
  766. package/SINGLETONS.md.meta +7 -0
  767. package/SPATIAL_TREES_2D_GUIDE.md +261 -0
  768. package/SPATIAL_TREES_2D_GUIDE.md.meta +7 -0
  769. package/SPATIAL_TREES_3D_GUIDE.md +214 -0
  770. package/SPATIAL_TREES_3D_GUIDE.md.meta +7 -0
  771. package/SPATIAL_TREE_2D_PERFORMANCE.md +241 -0
  772. package/SPATIAL_TREE_2D_PERFORMANCE.md.meta +7 -0
  773. package/SPATIAL_TREE_3D_PERFORMANCE.md +243 -0
  774. package/SPATIAL_TREE_3D_PERFORMANCE.md.meta +7 -0
  775. package/SPATIAL_TREE_SEMANTICS.md +106 -0
  776. package/SPATIAL_TREE_SEMANTICS.md.meta +7 -0
  777. package/Samples~/DI - VContainer/Prefabs/RelationalConsumer.prefab +77 -0
  778. package/Samples~/DI - VContainer/Prefabs/RelationalConsumer.prefab.meta +8 -0
  779. package/Samples~/DI - VContainer/Prefabs/Spawner.prefab +47 -0
  780. package/Samples~/DI - VContainer/Prefabs/Spawner.prefab.meta +8 -0
  781. package/Samples~/DI - VContainer/Prefabs.meta +9 -0
  782. package/Samples~/DI - VContainer/README.md +515 -0
  783. package/Samples~/DI - VContainer/README.md.meta +8 -0
  784. package/Samples~/DI - VContainer/Scenes/VContainer_Sample.unity +120 -0
  785. package/Samples~/DI - VContainer/Scenes/VContainer_Sample.unity.meta +8 -0
  786. package/Samples~/DI - VContainer/Scenes.meta +9 -0
  787. package/Samples~/DI - VContainer/Scripts/GameLifetimeScope.cs +42 -0
  788. package/Samples~/DI - VContainer/Scripts/GameLifetimeScope.cs.meta +12 -0
  789. package/Samples~/DI - VContainer/Scripts/RelationalConsumer.cs +24 -0
  790. package/Samples~/DI - VContainer/Scripts/RelationalConsumer.cs.meta +12 -0
  791. package/Samples~/DI - VContainer/Scripts/Samples.UnityHelpers.DI.VContainer.asmdef +37 -0
  792. package/Samples~/DI - VContainer/Scripts/Samples.UnityHelpers.DI.VContainer.asmdef.meta +8 -0
  793. package/Samples~/DI - VContainer/Scripts/Spawner.cs +130 -0
  794. package/Samples~/DI - VContainer/Scripts/Spawner.cs.meta +12 -0
  795. package/Samples~/DI - VContainer/Scripts.meta +9 -0
  796. package/Samples~/DI - VContainer.meta +9 -0
  797. package/Samples~/DI - Zenject/Prefabs/RelationalConsumer.prefab +77 -0
  798. package/Samples~/DI - Zenject/Prefabs/RelationalConsumer.prefab.meta +8 -0
  799. package/Samples~/DI - Zenject/Prefabs/SpawnerZenject.prefab +47 -0
  800. package/Samples~/DI - Zenject/Prefabs/SpawnerZenject.prefab.meta +8 -0
  801. package/Samples~/DI - Zenject/Prefabs.meta +9 -0
  802. package/Samples~/DI - Zenject/README.md +553 -0
  803. package/Samples~/DI - Zenject/README.md.meta +7 -0
  804. package/Samples~/DI - Zenject/Scenes/Zenject_Sample.unity +164 -0
  805. package/Samples~/DI - Zenject/Scenes/Zenject_Sample.unity.meta +8 -0
  806. package/Samples~/DI - Zenject/Scenes.meta +9 -0
  807. package/Samples~/DI - Zenject/Scripts/RelationalConsumer.cs +22 -0
  808. package/Samples~/DI - Zenject/Scripts/RelationalConsumer.cs.meta +12 -0
  809. package/Samples~/DI - Zenject/Scripts/RelationalConsumerPool.cs +37 -0
  810. package/Samples~/DI - Zenject/Scripts/RelationalConsumerPool.cs.meta +12 -0
  811. package/Samples~/DI - Zenject/Scripts/Samples.UnityHelpers.DI.Zenject.asmdef +36 -0
  812. package/Samples~/DI - Zenject/Scripts/Samples.UnityHelpers.DI.Zenject.asmdef.meta +8 -0
  813. package/Samples~/DI - Zenject/Scripts/SceneContextPlaceholder.cs +47 -0
  814. package/Samples~/DI - Zenject/Scripts/SceneContextPlaceholder.cs.meta +12 -0
  815. package/Samples~/DI - Zenject/Scripts/SpawnerZenject.cs +91 -0
  816. package/Samples~/DI - Zenject/Scripts/SpawnerZenject.cs.meta +12 -0
  817. package/Samples~/DI - Zenject/Scripts.meta +9 -0
  818. package/Samples~/DI - Zenject.meta +9 -0
  819. package/Samples~/Random - PRNG/README.md +13 -0
  820. package/Samples~/Random - PRNG/README.md.meta +8 -0
  821. package/Samples~/Random - PRNG/Scripts/RandomPrngDemo.cs +28 -0
  822. package/Samples~/Random - PRNG/Scripts/RandomPrngDemo.cs.meta +12 -0
  823. package/Samples~/Random - PRNG/Scripts/Samples.UnityHelpers.Random.Prng.asmdef +17 -0
  824. package/Samples~/Random - PRNG/Scripts/Samples.UnityHelpers.Random.Prng.asmdef.meta +8 -0
  825. package/Samples~/Random - PRNG/Scripts.meta +9 -0
  826. package/Samples~/Random - PRNG.meta +9 -0
  827. package/Samples~/Relational Components - Basic/README.md +21 -0
  828. package/Samples~/Relational Components - Basic/README.md.meta +8 -0
  829. package/Samples~/Relational Components - Basic/Scripts/RelationalBasicConsumer.cs +37 -0
  830. package/Samples~/Relational Components - Basic/Scripts/RelationalBasicConsumer.cs.meta +12 -0
  831. package/Samples~/Relational Components - Basic/Scripts/Samples.UnityHelpers.Relational.Basic.asmdef +17 -0
  832. package/Samples~/Relational Components - Basic/Scripts/Samples.UnityHelpers.Relational.Basic.asmdef.meta +8 -0
  833. package/Samples~/Relational Components - Basic/Scripts.meta +9 -0
  834. package/Samples~/Relational Components - Basic.meta +9 -0
  835. package/Samples~/Serialization - JSON/README.md +14 -0
  836. package/Samples~/Serialization - JSON/README.md.meta +8 -0
  837. package/Samples~/Serialization - JSON/Scripts/JsonSerializationDemo.cs +50 -0
  838. package/Samples~/Serialization - JSON/Scripts/JsonSerializationDemo.cs.meta +12 -0
  839. package/Samples~/Serialization - JSON/Scripts/Samples.UnityHelpers.Serialization.Json.asmdef +17 -0
  840. package/Samples~/Serialization - JSON/Scripts/Samples.UnityHelpers.Serialization.Json.asmdef.meta +8 -0
  841. package/Samples~/Serialization - JSON/Scripts.meta +9 -0
  842. package/Samples~/Serialization - JSON.meta +9 -0
  843. package/Samples~/Spatial Structures - 2D and 3D/README.md +14 -0
  844. package/Samples~/Spatial Structures - 2D and 3D/README.md.meta +8 -0
  845. package/Samples~/Spatial Structures - 2D and 3D/Scripts/Samples.UnityHelpers.SpatialStructures.asmdef +17 -0
  846. package/Samples~/Spatial Structures - 2D and 3D/Scripts/Samples.UnityHelpers.SpatialStructures.asmdef.meta +8 -0
  847. package/Samples~/Spatial Structures - 2D and 3D/Scripts/SpatialStructuresDemo.cs +62 -0
  848. package/Samples~/Spatial Structures - 2D and 3D/Scripts/SpatialStructuresDemo.cs.meta +12 -0
  849. package/Samples~/Spatial Structures - 2D and 3D/Scripts.meta +9 -0
  850. package/Samples~/Spatial Structures - 2D and 3D.meta +9 -0
  851. package/Samples~/UGUI - EnhancedImage/README.md +13 -0
  852. package/Samples~/UGUI - EnhancedImage/README.md.meta +8 -0
  853. package/Samples~/UGUI - EnhancedImage/Scripts/EnhancedImageDemo.cs +36 -0
  854. package/Samples~/UGUI - EnhancedImage/Scripts/EnhancedImageDemo.cs.meta +12 -0
  855. package/Samples~/UGUI - EnhancedImage/Scripts/Samples.UnityHelpers.UGUI.EnhancedImage.asmdef +17 -0
  856. package/Samples~/UGUI - EnhancedImage/Scripts/Samples.UnityHelpers.UGUI.EnhancedImage.asmdef.meta +8 -0
  857. package/Samples~/UGUI - EnhancedImage/Scripts.meta +9 -0
  858. package/Samples~/UGUI - EnhancedImage.meta +9 -0
  859. package/Samples~/UI Toolkit - MultiFile Selector (Editor)/README.md +13 -0
  860. package/Samples~/UI Toolkit - MultiFile Selector (Editor)/README.md.meta +8 -0
  861. package/Samples~/UI Toolkit - MultiFile Selector (Editor)/Scripts/Editor/MultiFileSelectorSampleWindow.cs +45 -0
  862. package/Samples~/UI Toolkit - MultiFile Selector (Editor)/Scripts/Editor/MultiFileSelectorSampleWindow.cs.meta +12 -0
  863. package/Samples~/UI Toolkit - MultiFile Selector (Editor)/Scripts/Editor/Samples.UnityHelpers.UIToolkit.Editor.asmdef +19 -0
  864. package/Samples~/UI Toolkit - MultiFile Selector (Editor)/Scripts/Editor/Samples.UnityHelpers.UIToolkit.Editor.asmdef.meta +8 -0
  865. package/Samples~/UI Toolkit - MultiFile Selector (Editor)/Scripts/Editor.meta +9 -0
  866. package/Samples~/UI Toolkit - MultiFile Selector (Editor)/Scripts.meta +9 -0
  867. package/Samples~/UI Toolkit - MultiFile Selector (Editor).meta +9 -0
  868. package/Shaders/Materials/BackgroundMask-Material.mat +59 -59
  869. package/Shaders/Materials/BackgroundMask-Material.mat.meta +8 -8
  870. package/Shaders/Materials.meta +8 -8
  871. package/Shaders/ShaderGraph/BackgroundMask.shadergraph +1653 -1653
  872. package/Shaders/ShaderGraph/BackgroundMask.shadergraph.meta +10 -10
  873. package/Shaders/ShaderGraph/DebugDisplayValue.shadersubgraph +835 -835
  874. package/Shaders/ShaderGraph/DebugDisplayValue.shadersubgraph.meta +10 -10
  875. package/Shaders/ShaderGraph.meta +8 -8
  876. package/Shaders/Support/EnhancedImageSupport.shader +64 -0
  877. package/Shaders/Support/EnhancedImageSupport.shader.meta +9 -0
  878. package/Shaders/Support.meta +8 -0
  879. package/Shaders.meta +8 -8
  880. package/Styles/Elements/Progress/ArcedProgressBar.cs +345 -345
  881. package/Styles/Elements/Progress/ArcedProgressBar.cs.meta +2 -2
  882. package/Styles/Elements/Progress/CircularProgressBar.cs +307 -307
  883. package/Styles/Elements/Progress/CircularProgressBar.cs.meta +2 -2
  884. package/Styles/Elements/Progress/GlitchProgressBar.cs +416 -416
  885. package/Styles/Elements/Progress/GlitchProgressBar.cs.meta +2 -2
  886. package/Styles/Elements/Progress/LiquidProgressBar.cs +632 -632
  887. package/Styles/Elements/Progress/LiquidProgressBar.cs.meta +2 -2
  888. package/Styles/Elements/Progress/MarchingAntsProgressBar.cs +722 -722
  889. package/Styles/Elements/Progress/MarchingAntsProgressBar.cs.meta +2 -2
  890. package/Styles/Elements/Progress/RegularProgressBar.cs +405 -405
  891. package/Styles/Elements/Progress/RegularProgressBar.cs.meta +2 -2
  892. package/Styles/Elements/Progress/WigglyProgressBar.cs +837 -837
  893. package/Styles/Elements/Progress/WigglyProgressBar.cs.meta +2 -2
  894. package/Styles/Elements/Progress.meta +2 -2
  895. package/Styles/Elements.meta +2 -2
  896. package/Styles/USS/ArcedProgressBar.uss +18 -18
  897. package/Styles/USS/ArcedProgressBar.uss.meta +2 -2
  898. package/Styles/USS/CirclularProgressBar.uss +17 -17
  899. package/Styles/USS/CirclularProgressBar.uss.meta +2 -2
  900. package/Styles/USS/RegularProgressBar.uss +32 -32
  901. package/Styles/USS/RegularProgressBar.uss.meta +2 -2
  902. package/Styles/USS/WigglyProgressBar.uss +16 -16
  903. package/Styles/USS/WigglyProgressBar.uss.meta +2 -2
  904. package/Styles/USS.meta +2 -2
  905. package/Styles/WallstopStudios.UnityHelpers.Styles.asmdef +14 -17
  906. package/Styles/WallstopStudios.UnityHelpers.Styles.asmdef.meta +7 -7
  907. package/Styles.meta +2 -2
  908. package/THIRD_PARTY_NOTICES.md +74 -0
  909. package/THIRD_PARTY_NOTICES.md.meta +7 -0
  910. package/Tests/Editor/Attributes/AnimationEventHelpersTests.cs +171 -0
  911. package/Tests/Editor/Attributes/AnimationEventHelpersTests.cs.meta +11 -0
  912. package/Tests/Editor/Attributes.meta +8 -0
  913. package/Tests/Editor/Core/Attributes/RelationalComponentAssignerTests.cs +118 -0
  914. package/Tests/Editor/Core/Attributes/RelationalComponentAssignerTests.cs.meta +11 -0
  915. package/Tests/Editor/Core/Attributes.meta +8 -0
  916. package/Tests/Editor/Core.meta +8 -0
  917. package/Tests/Editor/Extensions/SerializedPropertyExtensionsTests.cs +194 -0
  918. package/Tests/Editor/Extensions/SerializedPropertyExtensionsTests.cs.meta +3 -0
  919. package/Tests/Editor/Extensions.meta +3 -0
  920. package/Tests/Editor/Helper/DummyScriptableObject.cs +6 -0
  921. package/Tests/Editor/Helper/DummyScriptableObject.cs.meta +3 -0
  922. package/Tests/Editor/Helper/HelpersTests.cs +101 -0
  923. package/Tests/Editor/Helper/HelpersTests.cs.meta +3 -0
  924. package/Tests/Editor/Helper/ObjectHelpersEditorTests.cs +63 -0
  925. package/Tests/Editor/Helper/ObjectHelpersEditorTests.cs.meta +11 -0
  926. package/Tests/Editor/Helper/PromptScope.cs +28 -0
  927. package/Tests/Editor/Helper/PromptScope.cs.meta +11 -0
  928. package/Tests/Editor/Helper/ReflectionHelpersEditorTests.cs +105 -0
  929. package/Tests/Editor/Helper/ReflectionHelpersEditorTests.cs.meta +11 -0
  930. package/Tests/Editor/Helper/SpriteHelpersTests.cs +334 -0
  931. package/Tests/Editor/Helper/SpriteHelpersTests.cs.meta +3 -0
  932. package/Tests/Editor/Helper/SpriteSettingsApplierAdditionalTests.cs +183 -0
  933. package/Tests/Editor/Helper/SpriteSettingsApplierAdditionalTests.cs.meta +11 -0
  934. package/Tests/Editor/Helper/SpriteSettingsApplierTests.cs +161 -0
  935. package/Tests/Editor/Helper/SpriteSettingsApplierTests.cs.meta +11 -0
  936. package/Tests/Editor/Helper.meta +3 -0
  937. package/Tests/Editor/Integrations/VContainer/VContainerIntegrationCompilationTests.cs +40 -0
  938. package/Tests/Editor/Integrations/VContainer/VContainerIntegrationCompilationTests.cs.meta +11 -0
  939. package/Tests/Editor/Integrations/VContainer/VContainerRelationalEntryPointTests.cs +81 -0
  940. package/Tests/Editor/Integrations/VContainer/VContainerRelationalEntryPointTests.cs.meta +11 -0
  941. package/Tests/Editor/Integrations/VContainer/VContainerRelationalHelpersTests.cs +170 -0
  942. package/Tests/Editor/Integrations/VContainer/VContainerRelationalHelpersTests.cs.meta +11 -0
  943. package/Tests/Editor/Integrations/VContainer/WallstopStudios.UnityHelpers.Tests.Editor.VContainer.asmdef +37 -0
  944. package/Tests/Editor/Integrations/VContainer/WallstopStudios.UnityHelpers.Tests.Editor.VContainer.asmdef.meta +7 -0
  945. package/Tests/Editor/Integrations/VContainer.meta +8 -0
  946. package/Tests/Editor/Integrations/Zenject/WallstopStudios.UnityHelpers.Tests.Editor.Zenject.asmdef +37 -0
  947. package/Tests/Editor/Integrations/Zenject/WallstopStudios.UnityHelpers.Tests.Editor.Zenject.asmdef.meta +7 -0
  948. package/Tests/Editor/Integrations/Zenject/ZenjectIntegrationCompilationTests.cs +40 -0
  949. package/Tests/Editor/Integrations/Zenject/ZenjectIntegrationCompilationTests.cs.meta +11 -0
  950. package/Tests/Editor/Integrations/Zenject/ZenjectRelationalHelpersTests.cs +131 -0
  951. package/Tests/Editor/Integrations/Zenject/ZenjectRelationalHelpersTests.cs.meta +11 -0
  952. package/Tests/Editor/Integrations/Zenject/ZenjectRelationalInitializerTests.cs +80 -0
  953. package/Tests/Editor/Integrations/Zenject/ZenjectRelationalInitializerTests.cs.meta +11 -0
  954. package/Tests/Editor/Integrations/Zenject.meta +8 -0
  955. package/Tests/Editor/Integrations.meta +8 -0
  956. package/Tests/Editor/MultiFileSelectorElementTests.cs +265 -0
  957. package/Tests/Editor/MultiFileSelectorElementTests.cs.meta +11 -0
  958. package/Tests/Editor/MultiFileSelectorPersistenceManagerTests.cs +100 -0
  959. package/Tests/Editor/MultiFileSelectorPersistenceManagerTests.cs.meta +11 -0
  960. package/Tests/Editor/PersistentDirectorySettingsTests.cs +59 -0
  961. package/Tests/Editor/PersistentDirectorySettingsTests.cs.meta +11 -0
  962. package/Tests/Editor/PrefabCheckerReportTests.cs +32 -0
  963. package/Tests/Editor/PrefabCheckerReportTests.cs.meta +11 -0
  964. package/Tests/Editor/Sprites/AnimationCopierFilterTests.cs +64 -0
  965. package/Tests/Editor/Sprites/AnimationCopierFilterTests.cs.meta +11 -0
  966. package/Tests/Editor/Sprites/AnimationCopierWindowTests.cs +199 -0
  967. package/Tests/Editor/Sprites/AnimationCopierWindowTests.cs.meta +11 -0
  968. package/Tests/Editor/Sprites/AnimationViewerWindowTests.cs +38 -0
  969. package/Tests/Editor/Sprites/AnimationViewerWindowTests.cs.meta +11 -0
  970. package/Tests/Editor/Sprites/ScriptableSpriteAtlasEditorTests.cs +108 -0
  971. package/Tests/Editor/Sprites/ScriptableSpriteAtlasEditorTests.cs.meta +11 -0
  972. package/Tests/Editor/Sprites/SpriteCropperAdditionalTests.cs +323 -0
  973. package/Tests/Editor/Sprites/SpriteCropperAdditionalTests.cs.meta +11 -0
  974. package/Tests/Editor/Sprites/SpriteCropperTests.cs +162 -0
  975. package/Tests/Editor/Sprites/SpriteCropperTests.cs.meta +11 -0
  976. package/Tests/Editor/Sprites/SpritePivotAdjusterAdditionalTests.cs +227 -0
  977. package/Tests/Editor/Sprites/SpritePivotAdjusterAdditionalTests.cs.meta +11 -0
  978. package/Tests/Editor/Sprites/SpritePivotAdjusterTests.cs +113 -0
  979. package/Tests/Editor/Sprites/SpritePivotAdjusterTests.cs.meta +11 -0
  980. package/Tests/Editor/Sprites/TexturePlatformNameHelperTests.cs +46 -0
  981. package/Tests/Editor/Sprites/TexturePlatformNameHelperTests.cs.meta +11 -0
  982. package/Tests/Editor/Sprites/TextureResizerWizardTests.cs +248 -0
  983. package/Tests/Editor/Sprites/TextureResizerWizardTests.cs.meta +11 -0
  984. package/Tests/Editor/Sprites/TextureSettingsApplierAPITests.cs +180 -0
  985. package/Tests/Editor/Sprites/TextureSettingsApplierAPITests.cs.meta +11 -0
  986. package/Tests/Editor/Sprites/TextureSettingsApplierWizardAdditionalTests.cs +295 -0
  987. package/Tests/Editor/Sprites/TextureSettingsApplierWizardAdditionalTests.cs.meta +11 -0
  988. package/Tests/Editor/Sprites/TextureSettingsApplierWizardTests.cs +134 -0
  989. package/Tests/Editor/Sprites/TextureSettingsApplierWizardTests.cs.meta +11 -0
  990. package/Tests/Editor/Sprites.meta +8 -0
  991. package/Tests/Editor/TestComponents/PrewarmTesterComponent.cs +10 -0
  992. package/Tests/Editor/TestComponents/PrewarmTesterComponent.cs.meta +11 -0
  993. package/Tests/Editor/TestComponents.meta +8 -0
  994. package/Tests/Editor/Tools/ImageBlurToolTests.cs +47 -0
  995. package/Tests/Editor/Tools/ImageBlurToolTests.cs.meta +11 -0
  996. package/Tests/Editor/Tools.meta +8 -0
  997. package/Tests/Editor/Utils/CommonTestBase.cs +250 -0
  998. package/Tests/Editor/Utils/CommonTestBase.cs.meta +11 -0
  999. package/Tests/Editor/Utils/ScriptableObjectSingletonCreatorEditorTests.cs +306 -0
  1000. package/Tests/Editor/Utils/ScriptableObjectSingletonCreatorEditorTests.cs.meta +9 -0
  1001. package/Tests/Editor/Utils/ScriptableObjectSingletonCreatorTests.cs +183 -0
  1002. package/Tests/Editor/Utils/ScriptableObjectSingletonCreatorTests.cs.meta +11 -0
  1003. package/Tests/Editor/Utils/ScriptableObjectSingletonTests.cs +466 -0
  1004. package/Tests/Editor/Utils/ScriptableObjectSingletonTests.cs.meta +11 -0
  1005. package/Tests/Editor/Utils.meta +3 -0
  1006. package/Tests/Editor/WallstopStudios.UnityHelpers.Tests.Editor.asmdef +19 -0
  1007. package/Tests/Editor/WallstopStudios.UnityHelpers.Tests.Editor.asmdef.meta +7 -0
  1008. package/Tests/Editor/Windows/FitTextureSizeWindowTests.cs +773 -0
  1009. package/Tests/Editor/Windows/FitTextureSizeWindowTests.cs.meta +11 -0
  1010. package/Tests/Editor/Windows/PrefabCheckerFolderAdditionTests.cs +96 -0
  1011. package/Tests/Editor/Windows/PrefabCheckerFolderAdditionTests.cs.meta +11 -0
  1012. package/Tests/Editor/Windows/PrefabCheckerTests.cs +81 -0
  1013. package/Tests/Editor/Windows/PrefabCheckerTests.cs.meta +11 -0
  1014. package/Tests/Editor/Windows.meta +8 -0
  1015. package/Tests/Editor.meta +8 -0
  1016. package/Tests/Runtime/AssemblyInfo.cs +4 -0
  1017. package/Tests/Runtime/AssemblyInfo.cs.meta +3 -0
  1018. package/Tests/Runtime/Attributes/ChildComponentTests.cs +766 -81
  1019. package/Tests/Runtime/Attributes/ChildComponentTests.cs.meta +2 -2
  1020. package/Tests/Runtime/Attributes/Components/ExpectChildSpriteRenderers.cs +28 -28
  1021. package/Tests/Runtime/Attributes/Components/ExpectChildSpriteRenderers.cs.meta +2 -2
  1022. package/Tests/Runtime/Attributes/Components/ExpectParentSpriteRenderers.cs +28 -28
  1023. package/Tests/Runtime/Attributes/Components/ExpectParentSpriteRenderers.cs.meta +2 -2
  1024. package/Tests/Runtime/{Components → Attributes/Components}/RelationalComponentTesterComplex.cs +34 -34
  1025. package/Tests/Runtime/{Components → Attributes/Components}/RelationalComponentTesterComplex.cs.meta +2 -2
  1026. package/Tests/Runtime/Attributes/Components/RelationalComponentsTesterSimple.cs +37 -0
  1027. package/Tests/Runtime/{Components → Attributes/Components}/RelationalComponentsTesterSimple.cs.meta +2 -2
  1028. package/Tests/Runtime/Attributes/Components.meta +2 -2
  1029. package/Tests/Runtime/Attributes/MiscRuntimeAttributeTests.cs +75 -0
  1030. package/Tests/Runtime/Attributes/MiscRuntimeAttributeTests.cs.meta +11 -0
  1031. package/Tests/Runtime/Attributes/NotNullAttributeTests.cs +26 -0
  1032. package/Tests/Runtime/Attributes/NotNullAttributeTests.cs.meta +3 -0
  1033. package/Tests/Runtime/Attributes/ParentComponentTests.cs +565 -68
  1034. package/Tests/Runtime/Attributes/ParentComponentTests.cs.meta +2 -2
  1035. package/Tests/Runtime/Attributes/RelationalComponentAdvancedTests.cs +614 -0
  1036. package/Tests/Runtime/Attributes/RelationalComponentAdvancedTests.cs.meta +11 -0
  1037. package/Tests/Runtime/Attributes/RelationalComponentBackwardCompatibilityTests.cs +478 -0
  1038. package/Tests/Runtime/Attributes/RelationalComponentBackwardCompatibilityTests.cs.meta +11 -0
  1039. package/Tests/Runtime/Attributes/RelationalComponentExtensionsTests.cs +56 -0
  1040. package/Tests/Runtime/Attributes/RelationalComponentExtensionsTests.cs.meta +11 -0
  1041. package/Tests/Runtime/Attributes/RelationalComponentHashSetTests.cs +226 -0
  1042. package/Tests/Runtime/Attributes/RelationalComponentHashSetTests.cs.meta +11 -0
  1043. package/Tests/Runtime/Attributes/RelationalComponentInitializerTests.cs +98 -0
  1044. package/Tests/Runtime/Attributes/RelationalComponentInitializerTests.cs.meta +11 -0
  1045. package/Tests/Runtime/Attributes/RelationalComponentTagAndNameFilterEdgeTests.cs +234 -0
  1046. package/Tests/Runtime/Attributes/RelationalComponentTagAndNameFilterEdgeTests.cs.meta +11 -0
  1047. package/Tests/Runtime/Attributes/SiblingComponentTests.cs +721 -0
  1048. package/Tests/Runtime/Attributes/SiblingComponentTests.cs.meta +11 -0
  1049. package/Tests/Runtime/Attributes/ValidateAssignmentAttributeTests.cs +96 -0
  1050. package/Tests/Runtime/Attributes/ValidateAssignmentAttributeTests.cs.meta +11 -0
  1051. package/Tests/Runtime/Attributes.meta +2 -2
  1052. package/Tests/Runtime/Core/Random/RandomComparerTests.cs +166 -0
  1053. package/Tests/Runtime/Core/Random/RandomComparerTests.cs.meta +11 -0
  1054. package/Tests/Runtime/Core/Random.meta +8 -0
  1055. package/Tests/Runtime/Core/Threading/SingleThreadedThreadPoolTests.cs +56 -56
  1056. package/Tests/Runtime/Core/Threading/SingleThreadedThreadPoolTests.cs.meta +2 -2
  1057. package/Tests/Runtime/Core/Threading.meta +2 -2
  1058. package/Tests/Runtime/Core.meta +2 -2
  1059. package/Tests/Runtime/DataStructures/BalancedKDTree2DTests.cs +562 -0
  1060. package/Tests/Runtime/DataStructures/{BalancedKDTreeTests.cs.meta → BalancedKDTree2DTests.cs.meta} +11 -11
  1061. package/Tests/Runtime/DataStructures/BalancedKDTree3DTests.cs +10 -0
  1062. package/Tests/Runtime/DataStructures/BalancedKDTree3DTests.cs.meta +11 -0
  1063. package/Tests/Runtime/DataStructures/BitSetTests.cs +1400 -0
  1064. package/Tests/Runtime/DataStructures/BitSetTests.cs.meta +3 -0
  1065. package/Tests/Runtime/DataStructures/BoundingBox3DTests.cs +1215 -0
  1066. package/Tests/Runtime/DataStructures/BoundingBox3DTests.cs.meta +11 -0
  1067. package/Tests/Runtime/DataStructures/CircleTests.cs +965 -0
  1068. package/Tests/Runtime/DataStructures/CircleTests.cs.meta +11 -0
  1069. package/Tests/Runtime/DataStructures/CyclicBufferTests.cs +2083 -324
  1070. package/Tests/Runtime/DataStructures/CyclicBufferTests.cs.meta +2 -2
  1071. package/Tests/Runtime/DataStructures/DequeTests.cs +790 -0
  1072. package/Tests/Runtime/DataStructures/DequeTests.cs.meta +3 -0
  1073. package/Tests/Runtime/DataStructures/DisjointSetTests.cs +1114 -0
  1074. package/Tests/Runtime/DataStructures/DisjointSetTests.cs.meta +3 -0
  1075. package/Tests/Runtime/DataStructures/FastOneOfTests.cs +966 -0
  1076. package/Tests/Runtime/DataStructures/FastOneOfTests.cs.meta +11 -0
  1077. package/Tests/Runtime/DataStructures/FastVector2IntTests.cs +286 -0
  1078. package/Tests/Runtime/DataStructures/FastVector2IntTests.cs.meta +11 -0
  1079. package/Tests/Runtime/DataStructures/FastVector3IntTests.cs +414 -0
  1080. package/Tests/Runtime/DataStructures/FastVector3IntTests.cs.meta +11 -0
  1081. package/Tests/Runtime/DataStructures/HeapTests.cs +1953 -0
  1082. package/Tests/Runtime/DataStructures/HeapTests.cs.meta +11 -0
  1083. package/Tests/Runtime/DataStructures/ImmutableBitSetTests.cs +833 -0
  1084. package/Tests/Runtime/DataStructures/ImmutableBitSetTests.cs.meta +3 -0
  1085. package/Tests/Runtime/DataStructures/KDTree3DTestsBase.cs +297 -0
  1086. package/Tests/Runtime/DataStructures/KDTree3DTestsBase.cs.meta +11 -0
  1087. package/Tests/Runtime/DataStructures/OctTree3DTests.cs +351 -0
  1088. package/Tests/Runtime/DataStructures/OctTree3DTests.cs.meta +11 -0
  1089. package/Tests/Runtime/DataStructures/PriorityQueueTests.cs +71 -0
  1090. package/Tests/Runtime/DataStructures/PriorityQueueTests.cs.meta +3 -0
  1091. package/Tests/Runtime/DataStructures/ProtobufSerializationTests.cs +475 -0
  1092. package/Tests/Runtime/DataStructures/ProtobufSerializationTests.cs.meta +11 -0
  1093. package/Tests/Runtime/DataStructures/QuadTree2DTests.cs +660 -0
  1094. package/Tests/Runtime/DataStructures/QuadTree2DTests.cs.meta +11 -0
  1095. package/Tests/Runtime/DataStructures/RTree2DTests.cs +823 -0
  1096. package/Tests/Runtime/DataStructures/RTree2DTests.cs.meta +3 -0
  1097. package/Tests/Runtime/DataStructures/RTree3DTests.cs +270 -0
  1098. package/Tests/Runtime/DataStructures/RTree3DTests.cs.meta +11 -0
  1099. package/Tests/Runtime/DataStructures/SparseSetTests.cs +1146 -0
  1100. package/Tests/Runtime/DataStructures/SparseSetTests.cs.meta +3 -0
  1101. package/Tests/Runtime/DataStructures/SpatialHashTests.cs +992 -0
  1102. package/Tests/Runtime/DataStructures/SpatialHashTests.cs.meta +11 -0
  1103. package/Tests/Runtime/DataStructures/SpatialTree2DBoundsConsistencyTests.cs +351 -0
  1104. package/Tests/Runtime/DataStructures/SpatialTree2DBoundsConsistencyTests.cs.meta +11 -0
  1105. package/Tests/Runtime/DataStructures/SpatialTree2DBoundsEdgeTests.cs +127 -0
  1106. package/Tests/Runtime/DataStructures/SpatialTree2DBoundsEdgeTests.cs.meta +11 -0
  1107. package/Tests/Runtime/DataStructures/SpatialTree2DBoundsFuzzTests.cs +218 -0
  1108. package/Tests/Runtime/DataStructures/SpatialTree2DBoundsFuzzTests.cs.meta +11 -0
  1109. package/Tests/Runtime/DataStructures/SpatialTree2DTests.cs +396 -0
  1110. package/Tests/Runtime/DataStructures/SpatialTree2DTests.cs.meta +11 -0
  1111. package/Tests/Runtime/DataStructures/SpatialTree3DBoundsConsistencyTests.cs +281 -0
  1112. package/Tests/Runtime/DataStructures/SpatialTree3DBoundsConsistencyTests.cs.meta +11 -0
  1113. package/Tests/Runtime/DataStructures/SpatialTree3DBoundsEdgeTests.cs +127 -0
  1114. package/Tests/Runtime/DataStructures/SpatialTree3DBoundsEdgeTests.cs.meta +11 -0
  1115. package/Tests/Runtime/DataStructures/SpatialTree3DBoundsFuzzTests.cs +170 -0
  1116. package/Tests/Runtime/DataStructures/SpatialTree3DBoundsFuzzTests.cs.meta +11 -0
  1117. package/Tests/Runtime/DataStructures/SpatialTree3DTests.cs +474 -0
  1118. package/Tests/Runtime/DataStructures/SpatialTree3DTests.cs.meta +11 -0
  1119. package/Tests/Runtime/DataStructures/SphereTests.cs +806 -0
  1120. package/Tests/Runtime/DataStructures/SphereTests.cs.meta +3 -0
  1121. package/Tests/Runtime/DataStructures/StringWrapperTests.cs +333 -0
  1122. package/Tests/Runtime/DataStructures/StringWrapperTests.cs.meta +11 -0
  1123. package/Tests/Runtime/DataStructures/TimedCacheTests.cs +669 -0
  1124. package/Tests/Runtime/DataStructures/TimedCacheTests.cs.meta +11 -0
  1125. package/Tests/Runtime/DataStructures/TrieTests.cs +3385 -0
  1126. package/Tests/Runtime/DataStructures/TrieTests.cs.meta +11 -0
  1127. package/Tests/Runtime/DataStructures/UnbalancedKDTree2DTests.cs +565 -0
  1128. package/Tests/Runtime/DataStructures/{UnbalancedKDTreeTests.cs.meta → UnbalancedKDTree2DTests.cs.meta} +11 -11
  1129. package/Tests/Runtime/DataStructures/UnbalancedKDTree3DTests.cs +10 -0
  1130. package/Tests/Runtime/DataStructures/UnbalancedKDTree3DTests.cs.meta +11 -0
  1131. package/Tests/Runtime/DataStructures.meta +8 -8
  1132. package/Tests/Runtime/Extensions/AnimatorExtensionsTests.cs +28 -0
  1133. package/Tests/Runtime/Extensions/AnimatorExtensionsTests.cs.meta +11 -0
  1134. package/Tests/Runtime/Extensions/AsyncOperationExtensionsTests.cs +667 -0
  1135. package/Tests/Runtime/Extensions/AsyncOperationExtensionsTests.cs.meta +11 -0
  1136. package/Tests/Runtime/Extensions/CircleExtensionsTests.cs +230 -0
  1137. package/Tests/Runtime/Extensions/CircleExtensionsTests.cs.meta +11 -0
  1138. package/Tests/Runtime/Extensions/ColorExtensionsTests.cs +55 -0
  1139. package/Tests/Runtime/Extensions/ColorExtensionsTests.cs.meta +11 -0
  1140. package/Tests/Runtime/Extensions/DictionaryExtensionTests.cs +724 -438
  1141. package/Tests/Runtime/Extensions/DictionaryExtensionTests.cs.meta +2 -2
  1142. package/Tests/Runtime/Extensions/DirectionExtensionsComprehensiveTests.cs +403 -0
  1143. package/Tests/Runtime/Extensions/DirectionExtensionsComprehensiveTests.cs.meta +11 -0
  1144. package/Tests/Runtime/Extensions/DirectionExtensionsTests.cs +69 -0
  1145. package/Tests/Runtime/Extensions/DirectionExtensionsTests.cs.meta +11 -0
  1146. package/Tests/Runtime/Extensions/EnumExtensionTests.cs +809 -153
  1147. package/Tests/Runtime/Extensions/EnumExtensionTests.cs.meta +2 -2
  1148. package/Tests/Runtime/Extensions/IEnumerableExtensionsTests.cs +191 -0
  1149. package/Tests/Runtime/Extensions/IEnumerableExtensionsTests.cs.meta +11 -0
  1150. package/Tests/Runtime/Extensions/IListExtensionTests.cs +955 -169
  1151. package/Tests/Runtime/Extensions/IListExtensionTests.cs.meta +2 -2
  1152. package/Tests/Runtime/Extensions/IReadonlyListExtensionTests.cs +266 -58
  1153. package/Tests/Runtime/Extensions/IReadonlyListExtensionTests.cs.meta +2 -2
  1154. package/Tests/Runtime/Extensions/LoggingExtensionTests.cs +721 -718
  1155. package/Tests/Runtime/Extensions/LoggingExtensionTests.cs.meta +2 -2
  1156. package/Tests/Runtime/Extensions/ProtoEqualityExtensionsTests.cs +565 -0
  1157. package/Tests/Runtime/Extensions/ProtoEqualityExtensionsTests.cs.meta +3 -0
  1158. package/Tests/Runtime/Extensions/ProtoEqualityPolymorphismTests.cs +100 -0
  1159. package/Tests/Runtime/Extensions/ProtoEqualityPolymorphismTests.cs.meta +11 -0
  1160. package/Tests/Runtime/Extensions/RandomExtensionTests.cs +719 -27
  1161. package/Tests/Runtime/Extensions/RandomExtensionTests.cs.meta +2 -2
  1162. package/Tests/Runtime/Extensions/StringExtensionTests.cs +2592 -31
  1163. package/Tests/Runtime/Extensions/StringExtensionTests.cs.meta +2 -2
  1164. package/Tests/Runtime/Extensions/UnityExtensionsBasicTests.cs +166 -0
  1165. package/Tests/Runtime/Extensions/UnityExtensionsBasicTests.cs.meta +11 -0
  1166. package/Tests/Runtime/Extensions/UnityExtensionsComprehensiveTests.cs +1446 -0
  1167. package/Tests/Runtime/Extensions/UnityExtensionsComprehensiveTests.cs.meta +11 -0
  1168. package/Tests/Runtime/Extensions/UnityExtensionsMathTests.cs +1779 -0
  1169. package/Tests/Runtime/Extensions/UnityExtensionsMathTests.cs.meta +11 -0
  1170. package/Tests/Runtime/Extensions/UnityExtensionsVector2HullTests.cs +292 -0
  1171. package/Tests/Runtime/Extensions/UnityExtensionsVector2HullTests.cs.meta +11 -0
  1172. package/Tests/Runtime/Extensions/UnityLogTagFormatterEdgeTests.cs +260 -0
  1173. package/Tests/Runtime/Extensions/UnityLogTagFormatterEdgeTests.cs.meta +11 -0
  1174. package/Tests/Runtime/Extensions.meta +2 -2
  1175. package/Tests/Runtime/Helper/ArrayConverterTests.cs +19 -19
  1176. package/Tests/Runtime/Helper/ArrayConverterTests.cs.meta +2 -2
  1177. package/Tests/Runtime/Helper/AssignUtilitiesTests.cs +38 -0
  1178. package/Tests/Runtime/Helper/AssignUtilitiesTests.cs.meta +11 -0
  1179. package/Tests/Runtime/Helper/DirectoryHelperTests.cs +347 -0
  1180. package/Tests/Runtime/Helper/DirectoryHelperTests.cs.meta +11 -0
  1181. package/Tests/Runtime/Helper/EnumerablesTests.cs +45 -0
  1182. package/Tests/Runtime/Helper/EnumerablesTests.cs.meta +11 -0
  1183. package/Tests/Runtime/Helper/FileHelperTests.cs +481 -0
  1184. package/Tests/Runtime/Helper/FileHelperTests.cs.meta +11 -0
  1185. package/Tests/Runtime/Helper/FormattingHelpersTests.cs +353 -0
  1186. package/Tests/Runtime/Helper/FormattingHelpersTests.cs.meta +11 -0
  1187. package/Tests/Runtime/Helper/FuncBasedComparerTests.cs +27 -0
  1188. package/Tests/Runtime/Helper/FuncBasedComparerTests.cs.meta +11 -0
  1189. package/Tests/Runtime/Helper/GeometryTests.cs +517 -0
  1190. package/Tests/Runtime/Helper/GeometryTests.cs.meta +3 -0
  1191. package/Tests/Runtime/Helper/HelpersTests.cs +749 -0
  1192. package/Tests/Runtime/Helper/HelpersTests.cs.meta +11 -0
  1193. package/Tests/Runtime/Helper/IterationHelpersTests.cs +173 -0
  1194. package/Tests/Runtime/Helper/IterationHelpersTests.cs.meta +11 -0
  1195. package/Tests/Runtime/Helper/LineHelperTests.cs +662 -0
  1196. package/Tests/Runtime/Helper/LineHelperTests.cs.meta +11 -0
  1197. package/Tests/Runtime/Helper/ObjectHelperTests.cs +444 -432
  1198. package/Tests/Runtime/Helper/ObjectHelperTests.cs.meta +2 -2
  1199. package/Tests/Runtime/Helper/ObjectsTests.cs +363 -0
  1200. package/Tests/Runtime/Helper/ObjectsTests.cs.meta +3 -0
  1201. package/Tests/Runtime/Helper/PathHelperTests.cs +183 -0
  1202. package/Tests/Runtime/Helper/PathHelperTests.cs.meta +11 -0
  1203. package/Tests/Runtime/Helper/ReflectionHelperTests.cs +2199 -1493
  1204. package/Tests/Runtime/Helper/ReflectionHelperTests.cs.meta +2 -2
  1205. package/Tests/Runtime/Helper/ReflectionHelpersMemberLookupTests.cs +192 -0
  1206. package/Tests/Runtime/Helper/ReflectionHelpersMemberLookupTests.cs.meta +11 -0
  1207. package/Tests/Runtime/Helper/ReflectionHelpersTypeScanningTests.cs +58 -0
  1208. package/Tests/Runtime/Helper/ReflectionHelpersTypeScanningTests.cs.meta +11 -0
  1209. package/Tests/Runtime/Helper/SceneHelperTests.cs +77 -94
  1210. package/Tests/Runtime/Helper/SceneHelperTests.cs.meta +2 -2
  1211. package/Tests/Runtime/Helper/UnityMainThreadDispatcherTests.cs +45 -0
  1212. package/Tests/Runtime/Helper/UnityMainThreadDispatcherTests.cs.meta +11 -0
  1213. package/Tests/Runtime/Helper/WallMathTests.cs +1884 -233
  1214. package/Tests/Runtime/Helper/WallMathTests.cs.meta +2 -2
  1215. package/Tests/Runtime/Helper.meta +2 -2
  1216. package/Tests/Runtime/Integrations/VContainer/RelationalComponentsVContainerTests.cs +601 -0
  1217. package/Tests/Runtime/Integrations/VContainer/RelationalComponentsVContainerTests.cs.meta +11 -0
  1218. package/Tests/Runtime/Integrations/VContainer/RelationalObjectPoolsVContainerTests.cs +86 -0
  1219. package/Tests/Runtime/Integrations/VContainer/RelationalObjectPoolsVContainerTests.cs.meta +11 -0
  1220. package/Tests/Runtime/Integrations/VContainer/WallstopStudios.UnityHelpers.Tests.Runtime.VContainer.asmdef +38 -0
  1221. package/Tests/Runtime/Integrations/VContainer/WallstopStudios.UnityHelpers.Tests.Runtime.VContainer.asmdef.meta +7 -0
  1222. package/Tests/Runtime/Integrations/VContainer.meta +8 -0
  1223. package/Tests/Runtime/Integrations/Zenject/RelationalComponentsZenjectTests.cs +619 -0
  1224. package/Tests/Runtime/Integrations/Zenject/RelationalComponentsZenjectTests.cs.meta +11 -0
  1225. package/Tests/Runtime/Integrations/Zenject/WallstopStudios.UnityHelpers.Tests.Runtime.Zenject.asmdef +38 -0
  1226. package/Tests/Runtime/Integrations/Zenject/WallstopStudios.UnityHelpers.Tests.Runtime.Zenject.asmdef.meta +7 -0
  1227. package/Tests/Runtime/Integrations/Zenject.meta +8 -0
  1228. package/Tests/Runtime/Integrations.meta +8 -0
  1229. package/Tests/Runtime/Math/Line2DTests.cs +594 -0
  1230. package/Tests/Runtime/Math/Line2DTests.cs.meta +11 -0
  1231. package/Tests/Runtime/Math/Line3DTests.cs +655 -0
  1232. package/Tests/Runtime/Math/Line3DTests.cs.meta +11 -0
  1233. package/Tests/Runtime/Math/LineTests.cs +480 -0
  1234. package/Tests/Runtime/Math/LineTests.cs.meta +11 -0
  1235. package/Tests/Runtime/Math/ParabolaTests.cs +477 -0
  1236. package/Tests/Runtime/Math/ParabolaTests.cs.meta +11 -0
  1237. package/Tests/Runtime/Math/PointPolygonCheckTests.cs +939 -0
  1238. package/Tests/Runtime/Math/PointPolygonCheckTests.cs.meta +11 -0
  1239. package/Tests/Runtime/Math/RangeTests.cs +197 -0
  1240. package/Tests/Runtime/Math/RangeTests.cs.meta +11 -0
  1241. package/Tests/Runtime/Math.meta +8 -0
  1242. package/Tests/Runtime/Performance/BenchmarkReadmeUpdater.cs +81 -0
  1243. package/Tests/Runtime/Performance/BenchmarkReadmeUpdater.cs.meta +11 -0
  1244. package/Tests/Runtime/Performance/JsonSerializationPerformanceTests.cs +421 -0
  1245. package/Tests/Runtime/Performance/JsonSerializationPerformanceTests.cs.meta +3 -0
  1246. package/Tests/Runtime/Performance/ListExtensionPerformanceTests.cs +76 -76
  1247. package/Tests/Runtime/Performance/ListExtensionPerformanceTests.cs.meta +2 -2
  1248. package/Tests/Runtime/Performance/ProtoEqualsPerformanceTests.cs +161 -0
  1249. package/Tests/Runtime/Performance/ProtoEqualsPerformanceTests.cs.meta +11 -0
  1250. package/Tests/Runtime/Performance/ProtoSerializationPerformanceTests.cs +207 -0
  1251. package/Tests/Runtime/Performance/ProtoSerializationPerformanceTests.cs.meta +3 -0
  1252. package/Tests/Runtime/Performance/RandomPerformanceTests.cs +195 -181
  1253. package/Tests/Runtime/Performance/RandomPerformanceTests.cs.meta +11 -11
  1254. package/Tests/Runtime/Performance/RelationComponentPerformanceTests.cs +60 -61
  1255. package/Tests/Runtime/Performance/RelationComponentPerformanceTests.cs.meta +2 -2
  1256. package/Tests/Runtime/Performance/SpatialTree2DPerformanceTests.cs +697 -0
  1257. package/Tests/Runtime/Performance/SpatialTree2DPerformanceTests.cs.meta +11 -0
  1258. package/Tests/Runtime/Performance/SpatialTree3DPerformanceTests.cs +653 -0
  1259. package/Tests/Runtime/Performance/SpatialTree3DPerformanceTests.cs.meta +11 -0
  1260. package/Tests/Runtime/Performance.meta +8 -8
  1261. package/Tests/Runtime/Random/DotNetRandomTests.cs +9 -9
  1262. package/Tests/Runtime/Random/DotNetRandomTests.cs.meta +2 -2
  1263. package/Tests/Runtime/Random/IllusionFlowTests.cs +12 -12
  1264. package/Tests/Runtime/Random/IllusionFlowTests.cs.meta +2 -2
  1265. package/Tests/Runtime/Random/LinearCongruentialGeneratorTests.cs +12 -12
  1266. package/Tests/Runtime/Random/LinearCongruentialGeneratorTests.cs.meta +2 -2
  1267. package/Tests/Runtime/Random/PcgRandomTests.cs +9 -9
  1268. package/Tests/Runtime/Random/PcgRandomTests.cs.meta +11 -11
  1269. package/Tests/Runtime/Random/RandomProtoSerializationTests.cs +494 -0
  1270. package/Tests/Runtime/Random/RandomProtoSerializationTests.cs.meta +3 -0
  1271. package/Tests/Runtime/Random/RandomStateSerializationTests.cs +304 -0
  1272. package/Tests/Runtime/Random/RandomStateSerializationTests.cs.meta +4 -0
  1273. package/Tests/Runtime/Random/RandomTestBase.cs +836 -787
  1274. package/Tests/Runtime/Random/RandomTestBase.cs.meta +11 -11
  1275. package/Tests/Runtime/Random/RomuDuoRandomTests.cs +9 -9
  1276. package/Tests/Runtime/Random/RomuDuoRandomTests.cs.meta +2 -2
  1277. package/Tests/Runtime/Random/SplitMix64RandomTests.cs +9 -9
  1278. package/Tests/Runtime/Random/SplitMix64RandomTests.cs.meta +2 -2
  1279. package/Tests/Runtime/Random/SquirrelRandomTests.cs +14 -14
  1280. package/Tests/Runtime/Random/SquirrelRandomTests.cs.meta +11 -11
  1281. package/Tests/Runtime/Random/SystemRandomTests.cs +10 -10
  1282. package/Tests/Runtime/Random/SystemRandomTests.cs.meta +11 -11
  1283. package/Tests/Runtime/Random/UnityRandomTests.cs +9 -9
  1284. package/Tests/Runtime/Random/UnityRandomTests.cs.meta +11 -11
  1285. package/Tests/Runtime/Random/WyRandomTests.cs +9 -9
  1286. package/Tests/Runtime/Random/WyRandomTests.cs.meta +2 -2
  1287. package/Tests/Runtime/Random/XorShiftRandomTests.cs +9 -9
  1288. package/Tests/Runtime/Random/XorShiftRandomTests.cs.meta +11 -11
  1289. package/Tests/Runtime/Random/XoroShiroRandomTests.cs +9 -9
  1290. package/Tests/Runtime/Random/XoroShiroRandomTests.cs.meta +2 -2
  1291. package/Tests/Runtime/Random.meta +8 -8
  1292. package/Tests/Runtime/RuntimeTestTimeouts.cs +3 -0
  1293. package/Tests/Runtime/RuntimeTestTimeouts.cs.meta +11 -0
  1294. package/Tests/Runtime/Scenes/Test1.unity +723 -723
  1295. package/Tests/Runtime/Scenes/Test1.unity.meta +7 -7
  1296. package/Tests/Runtime/Scenes/Test2.unity +723 -723
  1297. package/Tests/Runtime/Scenes/Test2.unity.meta +7 -7
  1298. package/Tests/Runtime/Scenes.meta +2 -2
  1299. package/Tests/Runtime/Serialization/AdaptersJsonTests.cs +67 -0
  1300. package/Tests/Runtime/Serialization/AdaptersJsonTests.cs.meta +11 -0
  1301. package/Tests/Runtime/Serialization/BitSetJsonTests.cs +50 -0
  1302. package/Tests/Runtime/Serialization/BitSetJsonTests.cs.meta +11 -0
  1303. package/Tests/Runtime/Serialization/CyclicBufferJsonTests.cs +67 -0
  1304. package/Tests/Runtime/Serialization/CyclicBufferJsonTests.cs.meta +11 -0
  1305. package/Tests/Runtime/Serialization/DequeJsonTests.cs +70 -0
  1306. package/Tests/Runtime/Serialization/DequeJsonTests.cs.meta +11 -0
  1307. package/Tests/Runtime/Serialization/ImmutableBitSetJsonTests.cs +25 -0
  1308. package/Tests/Runtime/Serialization/ImmutableBitSetJsonTests.cs.meta +11 -0
  1309. package/Tests/Runtime/Serialization/JsonConverterAdditionalTests.cs +30 -0
  1310. package/Tests/Runtime/Serialization/JsonConverterAdditionalTests.cs.meta +11 -0
  1311. package/Tests/Runtime/Serialization/JsonConverterTests.cs +1153 -0
  1312. package/Tests/Runtime/Serialization/JsonConverterTests.cs.meta +11 -0
  1313. package/Tests/Runtime/Serialization/JsonRoundtripComprehensiveTests.cs +239 -0
  1314. package/Tests/Runtime/Serialization/JsonRoundtripComprehensiveTests.cs.meta +11 -0
  1315. package/Tests/Runtime/Serialization/JsonSerializationCorrectnessTests.cs +458 -0
  1316. package/Tests/Runtime/Serialization/JsonSerializationCorrectnessTests.cs.meta +3 -0
  1317. package/Tests/Runtime/Serialization/JsonSerializationTest.cs +167 -156
  1318. package/Tests/Runtime/Serialization/JsonSerializationTest.cs.meta +2 -2
  1319. package/Tests/Runtime/Serialization/MathJsonTests.cs +79 -0
  1320. package/Tests/Runtime/Serialization/MathJsonTests.cs.meta +11 -0
  1321. package/Tests/Runtime/Serialization/ProtoInterfaceResolutionEdgeTests.cs +76 -0
  1322. package/Tests/Runtime/Serialization/ProtoInterfaceResolutionEdgeTests.cs.meta +11 -0
  1323. package/Tests/Runtime/Serialization/ProtoRootRegistrationTests.cs +80 -0
  1324. package/Tests/Runtime/Serialization/ProtoRootRegistrationTests.cs.meta +11 -0
  1325. package/Tests/Runtime/Serialization/ProtoRoundtripComprehensiveTests.cs +257 -0
  1326. package/Tests/Runtime/Serialization/ProtoRoundtripComprehensiveTests.cs.meta +11 -0
  1327. package/Tests/Runtime/Serialization/ProtoSerializationCorrectnessTests.cs +471 -0
  1328. package/Tests/Runtime/Serialization/ProtoSerializationCorrectnessTests.cs.meta +3 -0
  1329. package/Tests/Runtime/Serialization/ProtoSerializationTests.cs +169 -0
  1330. package/Tests/Runtime/Serialization/ProtoSerializationTests.cs.meta +11 -0
  1331. package/Tests/Runtime/Serialization/ProtoSerializeBehaviorTests.cs +62 -0
  1332. package/Tests/Runtime/Serialization/ProtoSerializeBehaviorTests.cs.meta +11 -0
  1333. package/Tests/Runtime/Serialization/SerializerAdditionalTests.cs +907 -0
  1334. package/Tests/Runtime/Serialization/SerializerAdditionalTests.cs.meta +3 -0
  1335. package/Tests/Runtime/Serialization/SerializerFileIoTests.cs +105 -0
  1336. package/Tests/Runtime/Serialization/SerializerFileIoTests.cs.meta +11 -0
  1337. package/Tests/Runtime/Serialization/TypeConverterTests.cs +34 -0
  1338. package/Tests/Runtime/Serialization/TypeConverterTests.cs.meta +11 -0
  1339. package/Tests/Runtime/Serialization/UnityEngineObjectJsonTests.cs +247 -0
  1340. package/Tests/Runtime/Serialization/UnityEngineObjectJsonTests.cs.meta +11 -0
  1341. package/Tests/Runtime/Serialization.meta +2 -2
  1342. package/Tests/Runtime/Tags/AttributeComponentTests.cs +174 -0
  1343. package/Tests/Runtime/Tags/AttributeComponentTests.cs.meta +3 -0
  1344. package/Tests/Runtime/Tags/AttributeDataTests.cs +312 -0
  1345. package/Tests/Runtime/Tags/AttributeDataTests.cs.meta +11 -0
  1346. package/Tests/Runtime/Tags/AttributeUtilitiesTests.cs +405 -0
  1347. package/Tests/Runtime/Tags/AttributeUtilitiesTests.cs.meta +3 -0
  1348. package/Tests/Runtime/Tags/CosmeticAndCollisionTests.cs +147 -0
  1349. package/Tests/Runtime/Tags/CosmeticAndCollisionTests.cs.meta +11 -0
  1350. package/Tests/Runtime/Tags/CosmeticEffectDataTests.cs +60 -0
  1351. package/Tests/Runtime/Tags/CosmeticEffectDataTests.cs.meta +3 -0
  1352. package/Tests/Runtime/Tags/EffectHandleTests.cs +61 -0
  1353. package/Tests/Runtime/Tags/EffectHandleTests.cs.meta +3 -0
  1354. package/Tests/Runtime/Tags/EffectHandlerTests.cs +270 -0
  1355. package/Tests/Runtime/Tags/EffectHandlerTests.cs.meta +3 -0
  1356. package/Tests/Runtime/Tags/Helpers/RecordingCosmeticComponent.cs +39 -0
  1357. package/Tests/Runtime/Tags/Helpers/RecordingCosmeticComponent.cs.meta +3 -0
  1358. package/Tests/Runtime/Tags/Helpers/TagTestBase.cs +49 -0
  1359. package/Tests/Runtime/Tags/Helpers/TagTestBase.cs.meta +3 -0
  1360. package/Tests/Runtime/Tags/Helpers/TestAttributesComponent.cs +28 -0
  1361. package/Tests/Runtime/Tags/Helpers/TestAttributesComponent.cs.meta +3 -0
  1362. package/Tests/Runtime/Tags/Helpers.meta +3 -0
  1363. package/Tests/Runtime/Tags/TagHandlerTests.cs +108 -0
  1364. package/Tests/Runtime/Tags/TagHandlerTests.cs.meta +3 -0
  1365. package/Tests/Runtime/Tags.meta +8 -0
  1366. package/Tests/Runtime/TestUtils/CommonTestBase.cs +301 -0
  1367. package/Tests/Runtime/TestUtils/CommonTestBase.cs.meta +11 -0
  1368. package/Tests/Runtime/TestUtils/GCAssert.cs +55 -0
  1369. package/Tests/Runtime/TestUtils/GCAssert.cs.meta +11 -0
  1370. package/Tests/Runtime/TestUtils/SpatialAssert.cs +33 -0
  1371. package/Tests/Runtime/TestUtils/SpatialAssert.cs.meta +11 -0
  1372. package/Tests/Runtime/TestUtils/SpatialDiagnostics.cs +195 -0
  1373. package/Tests/Runtime/TestUtils/SpatialDiagnostics.cs.meta +11 -0
  1374. package/Tests/Runtime/TestUtils.meta +8 -0
  1375. package/Tests/Runtime/Utils/AnimationEventEqualityComparerTests.cs +144 -0
  1376. package/Tests/Runtime/Utils/AnimationEventEqualityComparerTests.cs.meta +11 -0
  1377. package/Tests/Runtime/Utils/Ascii85Tests.cs +56 -0
  1378. package/Tests/Runtime/Utils/Ascii85Tests.cs.meta +11 -0
  1379. package/Tests/Runtime/Utils/BuffersTests.cs +1148 -741
  1380. package/Tests/Runtime/Utils/BuffersTests.cs.meta +2 -2
  1381. package/Tests/Runtime/Utils/BuffersWaitInstructionTests.cs +31 -0
  1382. package/Tests/Runtime/Utils/BuffersWaitInstructionTests.cs.meta +11 -0
  1383. package/Tests/Runtime/Utils/CenterPointOffsetTests.cs +67 -0
  1384. package/Tests/Runtime/Utils/CenterPointOffsetTests.cs.meta +11 -0
  1385. package/Tests/Runtime/Utils/ChildSpawnerTests.cs +490 -0
  1386. package/Tests/Runtime/Utils/ChildSpawnerTests.cs.meta +11 -0
  1387. package/Tests/Runtime/Utils/CircleLineRendererTests.cs +80 -0
  1388. package/Tests/Runtime/Utils/CircleLineRendererTests.cs.meta +11 -0
  1389. package/Tests/Runtime/Utils/CollisionProxyTests.cs +442 -0
  1390. package/Tests/Runtime/Utils/CollisionProxyTests.cs.meta +11 -0
  1391. package/Tests/Runtime/Utils/CoroutineHandlerTests.cs +353 -0
  1392. package/Tests/Runtime/Utils/CoroutineHandlerTests.cs.meta +11 -0
  1393. package/Tests/Runtime/Utils/DeferredDisposalResultTests.cs +44 -0
  1394. package/Tests/Runtime/Utils/DeferredDisposalResultTests.cs.meta +11 -0
  1395. package/Tests/Runtime/Utils/LZMAComprehensiveTests.cs +249 -0
  1396. package/Tests/Runtime/Utils/LZMAComprehensiveTests.cs.meta +11 -0
  1397. package/Tests/Runtime/Utils/LZMATests.cs +31 -0
  1398. package/Tests/Runtime/Utils/LZMATests.cs.meta +11 -0
  1399. package/Tests/Runtime/Utils/MatchColliderToSpriteAdditionalTests.cs +86 -0
  1400. package/Tests/Runtime/Utils/MatchColliderToSpriteAdditionalTests.cs.meta +11 -0
  1401. package/Tests/Runtime/Utils/MatchColliderToSpriteTests.cs +503 -0
  1402. package/Tests/Runtime/Utils/MatchColliderToSpriteTests.cs.meta +11 -0
  1403. package/Tests/Runtime/Utils/MatchTransformEdgeTests.cs +34 -0
  1404. package/Tests/Runtime/Utils/MatchTransformEdgeTests.cs.meta +11 -0
  1405. package/Tests/Runtime/Utils/MatchTransformTests.cs +495 -0
  1406. package/Tests/Runtime/Utils/MatchTransformTests.cs.meta +11 -0
  1407. package/Tests/Runtime/Utils/OscillatorTests.cs +540 -0
  1408. package/Tests/Runtime/Utils/OscillatorTests.cs.meta +11 -0
  1409. package/Tests/Runtime/Utils/PolygonCollider2DOptimizerTests.cs +52 -0
  1410. package/Tests/Runtime/Utils/PolygonCollider2DOptimizerTests.cs.meta +11 -0
  1411. package/Tests/Runtime/Utils/RuntimeSingletonTests.cs +766 -0
  1412. package/Tests/Runtime/Utils/RuntimeSingletonTests.cs.meta +11 -0
  1413. package/Tests/Runtime/Utils/SerializedStringComparerEdgeTests.cs +47 -0
  1414. package/Tests/Runtime/Utils/SerializedStringComparerEdgeTests.cs.meta +11 -0
  1415. package/Tests/Runtime/Utils/SerializedStringComparerTests.cs +361 -0
  1416. package/Tests/Runtime/Utils/SerializedStringComparerTests.cs.meta +11 -0
  1417. package/Tests/Runtime/Utils/SpriteRendererMetadataTests.cs +383 -398
  1418. package/Tests/Runtime/Utils/SpriteRendererMetadataTests.cs.meta +2 -2
  1419. package/Tests/Runtime/Utils/SpriteRendererSyncTests.cs +134 -0
  1420. package/Tests/Runtime/Utils/SpriteRendererSyncTests.cs.meta +11 -0
  1421. package/Tests/Runtime/Utils/StartTrackerTests.cs +24 -0
  1422. package/Tests/Runtime/Utils/StartTrackerTests.cs.meta +11 -0
  1423. package/Tests/Runtime/Utils/TextureScaleEdgeTests.cs +114 -0
  1424. package/Tests/Runtime/Utils/TextureScaleEdgeTests.cs.meta +11 -0
  1425. package/Tests/Runtime/Utils/TextureScaleTests.cs +298 -0
  1426. package/Tests/Runtime/Utils/TextureScaleTests.cs.meta +3 -0
  1427. package/Tests/Runtime/Utils/TypeNameSorterAdditionalTests.cs +36 -0
  1428. package/Tests/Runtime/Utils/TypeNameSorterAdditionalTests.cs.meta +11 -0
  1429. package/Tests/Runtime/Utils/TypeNameSorterTests.cs +34 -0
  1430. package/Tests/Runtime/Utils/TypeNameSorterTests.cs.meta +11 -0
  1431. package/Tests/Runtime/Utils/UnityObjectNameComparerEdgeTests.cs +63 -0
  1432. package/Tests/Runtime/Utils/UnityObjectNameComparerEdgeTests.cs.meta +11 -0
  1433. package/Tests/Runtime/Utils/UnityObjectNameComparerTests.cs +59 -0
  1434. package/Tests/Runtime/Utils/UnityObjectNameComparerTests.cs.meta +11 -0
  1435. package/Tests/Runtime/Utils.meta +2 -2
  1436. package/Tests/Runtime/Visuals/AnimatedSpriteLayerTests.cs +266 -0
  1437. package/Tests/Runtime/Visuals/AnimatedSpriteLayerTests.cs.meta +11 -0
  1438. package/Tests/Runtime/Visuals/EnhancedImageTests.cs +153 -0
  1439. package/Tests/Runtime/Visuals/EnhancedImageTests.cs.meta +11 -0
  1440. package/Tests/Runtime/Visuals/LayeredImageTests.cs +422 -0
  1441. package/Tests/Runtime/Visuals/LayeredImageTests.cs.meta +11 -0
  1442. package/Tests/Runtime/Visuals/VisualsTestHelpers.cs +125 -0
  1443. package/Tests/Runtime/Visuals/VisualsTestHelpers.cs.meta +11 -0
  1444. package/Tests/Runtime/Visuals.meta +3 -0
  1445. package/Tests/Runtime/WallstopStudios.UnityHelpers.Tests.Runtime.asmdef +24 -23
  1446. package/Tests/Runtime/WallstopStudios.UnityHelpers.Tests.Runtime.asmdef.meta +7 -7
  1447. package/Tests/Runtime.meta +8 -8
  1448. package/Tests.meta +8 -8
  1449. package/URP/VolumeProfiles/Post Processing Bloom Profile(URP).asset +63 -63
  1450. package/URP/VolumeProfiles/Post Processing Bloom Profile(URP).asset.meta +8 -8
  1451. package/URP/VolumeProfiles.meta +8 -8
  1452. package/URP.meta +8 -8
  1453. package/node_modules.meta +8 -0
  1454. package/package-lock.json.meta +7 -0
  1455. package/package.json +99 -38
  1456. package/package.json.meta +7 -7
  1457. package/scripts/check-eol.ps1 +51 -0
  1458. package/scripts/check-eol.ps1.meta +7 -0
  1459. package/scripts/clean-nul.ps1 +29 -0
  1460. package/scripts/clean-nul.ps1.meta +7 -0
  1461. package/scripts/lint-doc-links.ps1 +80 -0
  1462. package/scripts/lint-doc-links.ps1.meta +7 -0
  1463. package/scripts/lint-tests.ps1 +156 -0
  1464. package/scripts/lint-tests.ps1.meta +7 -0
  1465. package/scripts/normalize-eol.ps1 +68 -0
  1466. package/scripts/normalize-eol.ps1.meta +7 -0
  1467. package/scripts.meta +8 -0
  1468. package/Editor/Sprites/ProjectAnimationSettings.cs +0 -50
  1469. package/Editor/Sprites/ProjectAnimationSettings.cs.meta +0 -3
  1470. package/Editor/Sprites/TextureSettingsApplier.cs +0 -178
  1471. package/Editor/Sprites/TextureSettingsApplier.cs.meta +0 -3
  1472. package/Runtime/Core/Attributes/ParentComponent.cs +0 -189
  1473. package/Runtime/Core/DataStructure/KDTree.cs +0 -434
  1474. package/Runtime/Core/DataStructure/QuadTree.cs +0 -431
  1475. package/Runtime/Core/DataStructure/RTree.cs +0 -356
  1476. package/Runtime/Core/Extension/HashSetExtensions.cs +0 -12
  1477. package/Runtime/Core/Extension/HashSetExtensions.cs.meta +0 -11
  1478. package/Runtime/Core/Math/Line.cs +0 -55
  1479. package/Runtime/Core/Math/Line.cs.meta +0 -11
  1480. package/Runtime/Core/Math/XXHash.cs +0 -310
  1481. package/Runtime/Core/Math/XXHash.cs.meta +0 -11
  1482. package/Tests/Runtime/Components/RelationalComponentsTesterSimple.cs +0 -40
  1483. package/Tests/Runtime/Components.meta +0 -3
  1484. package/Tests/Runtime/DataStructures/BalancedKDTreeTests.cs +0 -14
  1485. package/Tests/Runtime/DataStructures/QuadTreeTests.cs +0 -14
  1486. package/Tests/Runtime/DataStructures/QuadTreeTests.cs.meta +0 -11
  1487. package/Tests/Runtime/DataStructures/SpatialTreeTests.cs +0 -130
  1488. package/Tests/Runtime/DataStructures/SpatialTreeTests.cs.meta +0 -11
  1489. package/Tests/Runtime/DataStructures/UnbalancedKDTreeTests.cs +0 -14
  1490. package/Tests/Runtime/Helper/FormattingHelperTests.cs +0 -129
  1491. package/Tests/Runtime/Helper/FormattingHelperTests.cs.meta +0 -3
  1492. package/Tests/Runtime/Performance/KDTreePerformanceTests.cs +0 -14
  1493. package/Tests/Runtime/Performance/KDTreePerformanceTests.cs.meta +0 -11
  1494. package/Tests/Runtime/Performance/QuadTreePerformanceTests.cs +0 -14
  1495. package/Tests/Runtime/Performance/QuadTreePerformanceTests.cs.meta +0 -11
  1496. package/Tests/Runtime/Performance/SpatialTreePerformanceTest.cs +0 -158
  1497. package/Tests/Runtime/Performance/SpatialTreePerformanceTest.cs.meta +0 -11
  1498. package/Tests/Runtime/Performance/UnbalancedKDTreeTests.cs +0 -14
  1499. package/Tests/Runtime/Performance/UnbalancedKDTreeTests.cs.meta +0 -11
  1500. package/Third Party Notices.md +0 -1
@@ -1,1026 +1,1470 @@
1
- namespace WallstopStudios.UnityHelpers.Editor.Sprites
2
- {
3
- #if UNITY_EDITOR
4
- using System;
5
- using System.Collections.Generic;
6
- using System.ComponentModel;
7
- using System.IO;
8
- using System.Linq;
9
- using System.Text.RegularExpressions;
10
- using Core.Extension;
11
- using Core.Helper;
12
- using UnityEditor;
13
- using UnityEditor.U2D;
14
- using UnityEngine;
15
- using UnityEngine.U2D;
16
- using WallstopStudios.UnityHelpers.Utils;
17
- using Object = UnityEngine.Object;
18
-
19
- public sealed class ScriptableSpriteAtlasEditor : EditorWindow
20
- {
21
- private readonly Dictionary<ScriptableSpriteAtlas, SerializedObject> _serializedConfigs =
22
- new();
23
- private List<ScriptableSpriteAtlas> _atlasConfigs = new();
24
- private Vector2 _scrollPosition;
25
-
26
- private sealed class ScanResult
27
- {
28
- public List<Sprite> spritesToAdd = new();
29
- public List<Sprite> spritesToRemove = new();
30
- public bool hasScanned;
31
- }
32
-
33
- private readonly Dictionary<ScriptableSpriteAtlas, ScanResult> _scanResultsCache = new();
34
- private readonly Dictionary<ScriptableSpriteAtlas, bool> _foldoutStates = new();
35
-
36
- private const string NewAtlasConfigDirectory = "Assets/Data";
37
-
38
- [MenuItem("Tools/Wallstop Studios/Unity Helpers/Sprite Atlas Generator")]
39
- public static void ShowWindow()
40
- {
41
- GetWindow<ScriptableSpriteAtlasEditor>("Sprite Atlas Generator");
42
- }
43
-
44
- private void OnEnable()
45
- {
46
- LoadAtlasConfigs();
47
- }
48
-
49
- private void OnProjectChange()
50
- {
51
- LoadAtlasConfigs();
52
- }
53
-
54
- private void LoadAtlasConfigs()
55
- {
56
- _atlasConfigs.Clear();
57
- Dictionary<ScriptableSpriteAtlas, ScanResult> existingScanCache = new(
58
- _scanResultsCache
59
- );
60
- _serializedConfigs.Clear();
61
- _scanResultsCache.Clear();
62
-
63
- string[] guids = AssetDatabase.FindAssets("t:ScriptableSpriteAtlas");
64
- foreach (string guid in guids)
65
- {
66
- string path = AssetDatabase.GUIDToAssetPath(guid);
67
- if (string.IsNullOrWhiteSpace(path))
68
- {
69
- continue;
70
- }
71
- ScriptableSpriteAtlas config = AssetDatabase.LoadAssetAtPath<ScriptableSpriteAtlas>(
72
- path
73
- );
74
- if (config != null)
75
- {
76
- _atlasConfigs.Add(config);
77
- if (existingScanCache.TryGetValue(config, out ScanResult cachedResult))
78
- {
79
- _scanResultsCache[config] = cachedResult;
80
- }
81
- else
82
- {
83
- _scanResultsCache.TryAdd(config, _ => new ScanResult());
84
- }
85
- _serializedConfigs.TryAdd(config, newConfig => new SerializedObject(newConfig));
86
- _foldoutStates.TryAdd(config, true);
87
- }
88
- }
89
- _atlasConfigs = _atlasConfigs.OrderBy(c => c.name).ToList();
90
- }
91
-
92
- private void OnGUI()
93
- {
94
- EditorGUILayout.LabelField("Sprite Atlas Generation Tool", EditorStyles.boldLabel);
95
- EditorGUILayout.Space();
96
-
97
- using (new EditorGUILayout.HorizontalScope())
98
- {
99
- if (GUILayout.Button("Refresh Config List", GUILayout.Height(30)))
100
- {
101
- LoadAtlasConfigs();
102
- }
103
-
104
- if (
105
- GUILayout.Button(
106
- $"Create New Config in '{NewAtlasConfigDirectory}'",
107
- GUILayout.Height(30)
108
- )
109
- )
110
- {
111
- CreateNewScriptableSpriteAtlas();
112
- }
113
- }
114
-
115
- EditorGUILayout.Space();
116
-
117
- if (GUILayout.Button("Generate/Update All .spriteatlas Assets", GUILayout.Height(40)))
118
- {
119
- GenerateAllAtlases();
120
- }
121
-
122
- if (GUILayout.Button("Pack All Generated Sprite Atlases", GUILayout.Height(40)))
123
- {
124
- PackAllProjectAtlases();
125
- }
126
- EditorGUILayout.Space(20);
127
- _scrollPosition = EditorGUILayout.BeginScrollView(_scrollPosition);
128
- if (_atlasConfigs.Count == 0)
129
- {
130
- EditorGUILayout.HelpBox(
131
- "No ScriptableSpriteAtlas configurations found. Use the 'Create New Config' button above or create one via Assets > Create > Wallstop Studios > Unity Helpers > Scriptable Sprite Atlas Config.",
132
- MessageType.Info
133
- );
134
- }
135
-
136
- foreach (ScriptableSpriteAtlas config in _atlasConfigs)
137
- {
138
- if (config == null)
139
- {
140
- LoadAtlasConfigs();
141
- Repaint();
142
- return;
143
- }
144
-
145
- EditorGUILayout.BeginVertical(EditorStyles.helpBox);
146
- string foldoutLabel =
147
- $"{config.name} (Output: {config.FullOutputPath ?? "Path Not Set"})";
148
- if (AssetDatabase.Contains(config))
149
- {
150
- foldoutLabel += $" - Path: {AssetDatabase.GetAssetPath(config)}";
151
- }
152
-
153
- _foldoutStates[config] = EditorGUILayout.Foldout(
154
- _foldoutStates[config],
155
- foldoutLabel,
156
- true,
157
- EditorStyles.foldoutHeader
158
- );
159
-
160
- if (_foldoutStates[config])
161
- {
162
- using EditorGUI.IndentLevelScope indentScope = new();
163
- SerializedObject serializedConfig = _serializedConfigs.GetOrAdd(
164
- config,
165
- newConfig => new SerializedObject(newConfig)
166
- );
167
- serializedConfig.Update();
168
- EditorGUI.BeginChangeCheck();
169
-
170
- string currentAssetName = config.name;
171
- Rect nameRect = EditorGUILayout.GetControlRect();
172
- EditorGUI.BeginChangeCheck();
173
- string newAssetName = EditorGUI.TextField(
174
- new Rect(nameRect.x, nameRect.y, nameRect.width - 60, nameRect.height),
175
- "Asset Name",
176
- currentAssetName
177
- );
178
- if (EditorGUI.EndChangeCheck())
179
- {
180
- serializedConfig.ApplyModifiedProperties();
181
- if (
182
- !string.IsNullOrWhiteSpace(newAssetName)
183
- && newAssetName != currentAssetName
184
- && AssetDatabase.Contains(config)
185
- )
186
- {
187
- string assetPath = AssetDatabase.GetAssetPath(config);
188
- string error = AssetDatabase.RenameAsset(assetPath, newAssetName);
189
- if (string.IsNullOrWhiteSpace(error))
190
- {
191
- LoadAtlasConfigs();
192
- GUIUtility.ExitGUI();
193
- }
194
- else
195
- {
196
- this.LogError($"Failed to rename asset: {error}");
197
- }
198
- }
199
- }
200
-
201
- SerializedProperty scriptProperty = serializedConfig.FindProperty("m_Script");
202
- if (scriptProperty != null)
203
- {
204
- GUI.enabled = false;
205
- EditorGUILayout.PropertyField(scriptProperty);
206
- GUI.enabled = true;
207
- }
208
-
209
- SerializedProperty property = serializedConfig.GetIterator();
210
- bool enterChildren = true;
211
- while (property.NextVisible(enterChildren))
212
- {
213
- enterChildren = false;
214
- if (string.Equals(property.name, "m_Script", StringComparison.Ordinal))
215
- {
216
- continue;
217
- }
218
-
219
- EditorGUILayout.PropertyField(property, true);
220
- }
221
-
222
- if (EditorGUI.EndChangeCheck())
223
- {
224
- serializedConfig.ApplyModifiedProperties();
225
- }
226
-
227
- EditorGUILayout.Space();
228
- if (GUILayout.Button("Add New Source Folder Entry"))
229
- {
230
- string folderPath = EditorUtility.OpenFolderPanel(
231
- "Select Source Folder",
232
- Application.dataPath,
233
- ""
234
- );
235
- if (!string.IsNullOrWhiteSpace(folderPath))
236
- {
237
- if (folderPath.StartsWith(Application.dataPath))
238
- {
239
- string relativePath =
240
- "Assets" + folderPath.Substring(Application.dataPath.Length);
241
- relativePath = relativePath.SanitizePath();
242
- SerializedProperty sourceFolderEntriesProp =
243
- serializedConfig.FindProperty(
244
- nameof(ScriptableSpriteAtlas.sourceFolderEntries)
245
- );
246
-
247
- bool pathExists = false;
248
- for (int j = 0; j < sourceFolderEntriesProp.arraySize; j++)
249
- {
250
- SerializedProperty entryProp =
251
- sourceFolderEntriesProp.GetArrayElementAtIndex(j);
252
- SerializedProperty pathProp = entryProp.FindPropertyRelative(
253
- "folderPath"
254
- );
255
- if (
256
- string.Equals(
257
- pathProp.stringValue,
258
- relativePath,
259
- StringComparison.Ordinal
260
- )
261
- )
262
- {
263
- pathExists = true;
264
- this.LogWarn(
265
- $"Folder path '{relativePath}' already exists in an entry for '{config.name}'."
266
- );
267
- break;
268
- }
269
- }
270
-
271
- if (!pathExists)
272
- {
273
- sourceFolderEntriesProp.InsertArrayElementAtIndex(
274
- sourceFolderEntriesProp.arraySize
275
- );
276
- SerializedProperty newEntryProp =
277
- sourceFolderEntriesProp.GetArrayElementAtIndex(
278
- sourceFolderEntriesProp.arraySize - 1
279
- );
280
- newEntryProp.FindPropertyRelative("folderPath").stringValue =
281
- relativePath;
282
-
283
- serializedConfig.ApplyModifiedProperties();
284
- this.Log(
285
- $"Added new source folder entry for '{relativePath}' to '{config.name}'. You can add regexes to it below."
286
- );
287
- }
288
- }
289
- else
290
- {
291
- EditorUtility.DisplayDialog(
292
- "Invalid Folder",
293
- "The selected folder must be within the project's 'Assets' directory.",
294
- "OK"
295
- );
296
- }
297
- }
298
- }
299
-
300
- EditorGUILayout.Space();
301
- EditorGUILayout.LabelField("Analysis & Actions", EditorStyles.boldLabel);
302
-
303
- if (GUILayout.Button($"Scan Folders for '{config.name}'"))
304
- {
305
- ScanFoldersForConfig(config);
306
- }
307
-
308
- ScanResult result = _scanResultsCache[config];
309
- if (result.hasScanned)
310
- {
311
- EditorGUILayout.LabelField(
312
- $"Current manually added sprites: {config.spritesToPack.Count(s => s != null)}"
313
- );
314
- EditorGUILayout.LabelField(
315
- "Sprites found by scan (not yet added/removed):"
316
- );
317
- using EditorGUI.IndentLevelScope nextIndentScope = new();
318
-
319
- if (result.spritesToAdd.Count > 0)
320
- {
321
- EditorGUILayout.LabelField(
322
- $"To Add: {result.spritesToAdd.Count} sprites."
323
- );
324
- if (
325
- GUILayout.Button(
326
- $"Add {result.spritesToAdd.Count} Sprites to '{config.name}' List"
327
- )
328
- )
329
- {
330
- AddScannedSprites(config, result);
331
- }
332
- }
333
- else
334
- {
335
- EditorGUILayout.LabelField(
336
- "To Add: 0 sprites.",
337
- EditorStyles.miniLabel
338
- );
339
- }
340
-
341
- if (result.spritesToRemove.Count > 0)
342
- {
343
- EditorGUILayout.LabelField(
344
- $"To Remove: {result.spritesToRemove.Count} sprites (currently in list but not found by scan)."
345
- );
346
- if (
347
- GUILayout.Button(
348
- $"Remove {result.spritesToRemove.Count} Sprites from '{config.name}' List"
349
- )
350
- )
351
- {
352
- RemoveUnfoundSprites(config, result);
353
- }
354
- }
355
- else
356
- {
357
- EditorGUILayout.LabelField(
358
- "To Remove: 0 sprites.",
359
- EditorStyles.miniLabel
360
- );
361
- }
362
- }
363
- else
364
- {
365
- EditorGUILayout.HelpBox(
366
- "Scan to see potential changes from folder sources.",
367
- MessageType.None
368
- );
369
- }
370
-
371
- EditorGUILayout.Space();
372
- EditorGUILayout.LabelField("Source Sprite Utilities", EditorStyles.boldLabel);
373
-
374
- int validSpriteCount = config.spritesToPack.Count(s => s != null);
375
- EditorGUI.BeginDisabledGroup(validSpriteCount == 0);
376
- if (
377
- GUILayout.Button(
378
- $"Force Uncompressed for {validSpriteCount} Source Sprites in '{config.name}'"
379
- )
380
- && EditorUtility.DisplayDialog(
381
- "Force Uncompressed Source Sprites",
382
- $"This will modify the import settings of {validSpriteCount} source sprites currently in the '{config.name}' list.\n\n"
383
- + "- Crunch compression will be disabled.\n"
384
- + "- Texture format for the 'Default' platform will be set to uncompressed (RGBA32 or RGB24).\n\n"
385
- + "This action modifies source asset import settings and may require re-packing atlases. Are you sure?",
386
- "Yes, Modify Source Sprites",
387
- "Cancel"
388
- )
389
- )
390
- {
391
- ForceUncompressedSourceSprites(config);
392
- }
393
- EditorGUI.EndDisabledGroup();
394
-
395
- EditorGUILayout.Space();
396
- if (
397
- GUILayout.Button(
398
- $"Generate/Update '{config.outputSpriteAtlasName}.spriteatlas' ONLY"
399
- )
400
- && EditorUtility.DisplayDialog(
401
- $"Generate Atlas: {config.name}",
402
- $"This will create or update '{config.outputSpriteAtlasName}.spriteatlas'. Continue?",
403
- "Yes",
404
- "No"
405
- )
406
- )
407
- {
408
- GenerateSingleAtlas(config);
409
- }
410
- }
411
- EditorGUILayout.EndVertical();
412
- EditorGUILayout.Space();
413
- }
414
- EditorGUILayout.EndScrollView();
415
- }
416
-
417
- private void CreateNewScriptableSpriteAtlas()
418
- {
419
- DirectoryHelper.EnsureDirectoryExists(NewAtlasConfigDirectory);
420
- ScriptableSpriteAtlas newAtlasConfig = CreateInstance<ScriptableSpriteAtlas>();
421
- string path = AssetDatabase.GenerateUniqueAssetPath(
422
- Path.Combine(NewAtlasConfigDirectory, "NewScriptableSpriteAtlas.asset")
423
- );
424
-
425
- AssetDatabase.CreateAsset(newAtlasConfig, path);
426
- AssetDatabase.SaveAssets();
427
- AssetDatabase.Refresh();
428
-
429
- EditorUtility.FocusProjectWindow();
430
- Selection.activeObject = newAtlasConfig;
431
-
432
- this.Log($"Created new ScriptableSpriteAtlas at: {path}");
433
- LoadAtlasConfigs();
434
- Repaint();
435
- }
436
-
437
- private void ScanFoldersForConfig(ScriptableSpriteAtlas config)
438
- {
439
- if (config.sourceFolderEntries == null || config.sourceFolderEntries.Count == 0)
440
- {
441
- this.LogWarn(
442
- $"'{config.name}': No source folder entries defined. Scan will find nothing from folders."
443
- );
444
- _scanResultsCache[config] = new ScanResult { hasScanned = true };
445
- Repaint();
446
- return;
447
- }
448
-
449
- ScanResult currentScan = new();
450
- HashSet<Sprite> foundSpritesInFolders = new();
451
-
452
- foreach (SourceFolderEntry entry in config.sourceFolderEntries)
453
- {
454
- if (
455
- string.IsNullOrWhiteSpace(entry.folderPath)
456
- || !AssetDatabase.IsValidFolder(entry.folderPath)
457
- )
458
- {
459
- this.LogWarn(
460
- $"'{config.name}': Invalid or empty folder path '{entry.folderPath}' in an entry. Skipping this entry."
461
- );
462
- continue;
463
- }
464
-
465
- string[] textureGuids = AssetDatabase.FindAssets(
466
- "t:Texture2D",
467
- new[] { entry.folderPath }
468
- );
469
- foreach (string guid in textureGuids)
470
- {
471
- string assetPath = AssetDatabase.GUIDToAssetPath(guid);
472
- string fileName = Path.GetFileName(assetPath);
473
-
474
- bool matchesAllRegexesInEntry = true;
475
- List<string> activeRegexPatterns = entry
476
- .regexes.Where(r => !string.IsNullOrWhiteSpace(r))
477
- .ToList();
478
-
479
- if (
480
- entry.selectionMode.HasFlagNoAlloc(SpriteSelectionMode.Regex)
481
- && activeRegexPatterns is { Count: > 0 }
482
- )
483
- {
484
- foreach (string regexPattern in activeRegexPatterns)
485
- {
486
- try
487
- {
488
- if (!Regex.IsMatch(fileName, regexPattern, RegexOptions.IgnoreCase))
489
- {
490
- matchesAllRegexesInEntry = false;
491
- break;
492
- }
493
- }
494
- catch (ArgumentException ex)
495
- {
496
- this.LogError(
497
- $"'{config.name}', Folder '{entry.folderPath}': Invalid Regex pattern '{regexPattern}': {ex.Message}. File '{fileName}' will not be matched by this entry due to this error."
498
- );
499
- matchesAllRegexesInEntry = false;
500
- break;
501
- }
502
- }
503
- }
504
-
505
- bool allMatch = matchesAllRegexesInEntry;
506
- bool matchesAllTagsInEntry = true;
507
- if (
508
- entry.selectionMode.HasFlagNoAlloc(SpriteSelectionMode.Labels)
509
- && entry.labels is { Count: > 0 }
510
- )
511
- {
512
- Object mainAsset = AssetDatabase.LoadMainAssetAtPath(assetPath);
513
- if (mainAsset != null)
514
- {
515
- string[] labels = AssetDatabase.GetLabels(mainAsset);
516
- switch (entry.labelSelectionMode)
517
- {
518
- case LabelSelectionMode.All:
519
- {
520
- matchesAllTagsInEntry = labels.All(label =>
521
- entry.labels.Contains(label)
522
- );
523
- break;
524
- }
525
- case LabelSelectionMode.AnyOf:
526
- {
527
- matchesAllTagsInEntry = labels.Any(label =>
528
- entry.labels.Contains(label)
529
- );
530
- break;
531
- }
532
- default:
533
- {
534
- throw new InvalidEnumArgumentException(
535
- nameof(entry.labelSelectionMode),
536
- (int)entry.labelSelectionMode,
537
- typeof(LabelSelectionMode)
538
- );
539
- }
540
- }
541
- }
542
-
543
- switch (entry.regexAndTagLogic)
544
- {
545
- case SpriteSelectionBooleanLogic.And:
546
- {
547
- allMatch = matchesAllRegexesInEntry && matchesAllTagsInEntry;
548
- break;
549
- }
550
- case SpriteSelectionBooleanLogic.Or:
551
- {
552
- allMatch = matchesAllRegexesInEntry || matchesAllTagsInEntry;
553
- break;
554
- }
555
- default:
556
- {
557
- throw new InvalidEnumArgumentException(
558
- nameof(entry.regexAndTagLogic),
559
- (int)entry.regexAndTagLogic,
560
- typeof(SpriteSelectionBooleanLogic)
561
- );
562
- }
563
- }
564
- }
565
-
566
- if (allMatch)
567
- {
568
- foreach (
569
- Object asset in AssetDatabase
570
- .LoadAllAssetsAtPath(assetPath)
571
- .Concat(AssetDatabase.LoadAllAssetRepresentationsAtPath(assetPath))
572
- )
573
- {
574
- if (asset is Sprite spriteAsset && spriteAsset != null)
575
- {
576
- foundSpritesInFolders.Add(spriteAsset);
577
- }
578
- }
579
- }
580
- }
581
- }
582
-
583
- List<Sprite> validSpritesInConfigList = config
584
- .spritesToPack.Where(s => s != null)
585
- .ToList();
586
-
587
- currentScan.spritesToAdd = foundSpritesInFolders
588
- .Except(validSpritesInConfigList)
589
- .ToList();
590
-
591
- currentScan.spritesToRemove = validSpritesInConfigList
592
- .Except(foundSpritesInFolders)
593
- .ToList();
594
-
595
- currentScan.hasScanned = true;
596
- _scanResultsCache[config] = currentScan;
597
- this.Log(
598
- $"'{config.name}': Scan complete. Total unique sprites found across all folder entries: {foundSpritesInFolders.Count}. Potential to add: {currentScan.spritesToAdd.Count}, Potential to remove: {currentScan.spritesToRemove.Count}."
599
- );
600
- Repaint();
601
- }
602
-
603
- private void AddScannedSprites(ScriptableSpriteAtlas config, ScanResult result)
604
- {
605
- if (result.spritesToAdd.Count <= 0)
606
- {
607
- return;
608
- }
609
-
610
- SerializedObject so = new(config);
611
- SerializedProperty spritesListProp = so.FindProperty(
612
- nameof(ScriptableSpriteAtlas.spritesToPack)
613
- );
614
-
615
- Undo.RecordObject(config, "Add Scanned Sprites to Atlas Config");
616
-
617
- int addedCount = 0;
618
- foreach (Sprite sprite in result.spritesToAdd)
619
- {
620
- bool alreadyExists = false;
621
- for (int i = 0; i < spritesListProp.arraySize; ++i)
622
- {
623
- if (spritesListProp.GetArrayElementAtIndex(i).objectReferenceValue == sprite)
624
- {
625
- alreadyExists = true;
626
- break;
627
- }
628
- }
629
- if (!alreadyExists)
630
- {
631
- spritesListProp.InsertArrayElementAtIndex(spritesListProp.arraySize);
632
- spritesListProp
633
- .GetArrayElementAtIndex(spritesListProp.arraySize - 1)
634
- .objectReferenceValue = sprite;
635
- addedCount++;
636
- }
637
- }
638
-
639
- if (addedCount > 0)
640
- {
641
- so.ApplyModifiedProperties();
642
- config.spritesToPack.SortByName();
643
- EditorUtility.SetDirty(config);
644
- this.Log($"'{config.name}': Added {addedCount} sprites.");
645
- }
646
- else
647
- {
648
- this.Log(
649
- $"'{config.name}': No new sprites to add (all found sprites might already be in the list)."
650
- );
651
- }
652
-
653
- result.spritesToAdd.Clear();
654
- ScanFoldersForConfig(config);
655
- Repaint();
656
- }
657
-
658
- private void RemoveUnfoundSprites(ScriptableSpriteAtlas config, ScanResult result)
659
- {
660
- if (result.spritesToRemove.Count <= 0)
661
- {
662
- return;
663
- }
664
-
665
- SerializedObject so = new(config);
666
- SerializedProperty spritesListProp = so.FindProperty("spritesToPack");
667
-
668
- Undo.RecordObject(config, "Remove Unfound Sprites from Atlas Config");
669
-
670
- int countRemoved = 0;
671
- List<Sprite> spritesActuallyToRemove = new(result.spritesToRemove);
672
-
673
- for (int i = spritesListProp.arraySize - 1; 0 <= i; --i)
674
- {
675
- SerializedProperty element = spritesListProp.GetArrayElementAtIndex(i);
676
- if (
677
- element.objectReferenceValue != null
678
- && spritesActuallyToRemove.Contains(element.objectReferenceValue as Sprite)
679
- )
680
- {
681
- element.objectReferenceValue = null;
682
- spritesListProp.DeleteArrayElementAtIndex(i);
683
- countRemoved++;
684
- }
685
- }
686
-
687
- if (countRemoved > 0)
688
- {
689
- so.ApplyModifiedProperties();
690
- this.Log(
691
- $"'{config.name}': Removed {countRemoved} sprites that were no longer found by scan."
692
- );
693
- }
694
- result.spritesToRemove.Clear();
695
- ScanFoldersForConfig(config);
696
- Repaint();
697
- }
698
-
699
- private void GenerateAllAtlases()
700
- {
701
- if (_atlasConfigs.Count == 0)
702
- {
703
- EditorUtility.DisplayDialog(
704
- "No Configurations",
705
- "No ScriptableSpriteAtlas configurations found to generate.",
706
- "OK"
707
- );
708
- return;
709
- }
710
-
711
- int totalConfigs = _atlasConfigs.Count;
712
- int currentConfig = 0;
713
-
714
- AssetDatabase.StartAssetEditing();
715
- try
716
- {
717
- foreach (ScriptableSpriteAtlas config in _atlasConfigs)
718
- {
719
- if (config == null)
720
- {
721
- continue;
722
- }
723
-
724
- currentConfig++;
725
- float progress = (float)currentConfig / totalConfigs;
726
- EditorUtility.DisplayProgressBar(
727
- "Generating Sprite Atlases",
728
- $"Processing: {config.name}",
729
- progress
730
- );
731
- GenerateSingleAtlas(config, false);
732
- }
733
- }
734
- finally
735
- {
736
- AssetDatabase.StopAssetEditing();
737
- EditorUtility.ClearProgressBar();
738
- AssetDatabase.SaveAssets();
739
- AssetDatabase.Refresh();
740
- }
741
- }
742
-
743
- private void GenerateSingleAtlas(
744
- ScriptableSpriteAtlas config,
745
- bool refreshAssetsImmediately = true
746
- )
747
- {
748
- if (config == null)
749
- {
750
- this.LogError($"Attempted to generate atlas from a null config.");
751
- return;
752
- }
753
- string outputPath = config.FullOutputPath;
754
- if (string.IsNullOrWhiteSpace(outputPath))
755
- {
756
- this.LogError(
757
- $"'{config.name}': Output path or name is not set. Cannot generate atlas."
758
- );
759
- return;
760
- }
761
-
762
- string directory = Path.GetDirectoryName(outputPath);
763
- if (!string.IsNullOrWhiteSpace(directory) && !Directory.Exists(directory))
764
- {
765
- Directory.CreateDirectory(directory);
766
- AssetDatabase.Refresh();
767
- }
768
-
769
- SpriteAtlas atlas = AssetDatabase.LoadAssetAtPath<SpriteAtlas>(outputPath);
770
- bool newAtlas = false;
771
- if (atlas == null)
772
- {
773
- atlas = new SpriteAtlas();
774
- newAtlas = true;
775
- this.Log($"'{config.name}': Creating new SpriteAtlas at {outputPath}");
776
- }
777
- else
778
- {
779
- this.Log($"'{config.name}': Updating existing SpriteAtlas at {outputPath}");
780
- atlas.Remove(atlas.GetPackables());
781
- }
782
-
783
- SpriteAtlasPackingSettings packingSettings = atlas.GetPackingSettings();
784
- packingSettings.enableRotation = config.enableRotation;
785
- packingSettings.padding = config.padding;
786
- packingSettings.enableTightPacking = config.enableTightPacking;
787
- packingSettings.enableAlphaDilation = config.enableAlphaDilation;
788
- atlas.SetPackingSettings(packingSettings);
789
-
790
- SpriteAtlasTextureSettings textureSettings = atlas.GetTextureSettings();
791
- textureSettings.readable = config.readWriteEnabled;
792
- atlas.SetTextureSettings(textureSettings);
793
-
794
- TextureImporterPlatformSettings platformSettings = atlas.GetPlatformSettings(
795
- "DefaultTexturePlatform"
796
- );
797
- if (string.IsNullOrWhiteSpace(platformSettings.name))
798
- {
799
- platformSettings.name = "DefaultTexturePlatform";
800
- }
801
-
802
- platformSettings.overridden = true;
803
- platformSettings.maxTextureSize = config.maxTextureSize;
804
- platformSettings.crunchedCompression = config.useCrunchCompression;
805
- platformSettings.compressionQuality = config.crunchCompressionLevel;
806
- platformSettings.format = TextureImporterFormat.Automatic;
807
- platformSettings.textureCompression = config.compression;
808
- atlas.SetPlatformSettings(platformSettings);
809
-
810
- int spriteCount = atlas.spriteCount;
811
- using PooledResource<Sprite[]> spriteResource = WallstopArrayPool<Sprite>.Get(
812
- spriteCount
813
- );
814
- Sprite[] sprites = spriteResource.resource;
815
- int loaded = atlas.GetSprites(sprites);
816
- using PooledResource<List<Sprite>> removeResource = Buffers<Sprite>.List.Get();
817
- List<Sprite> toRemove = removeResource.resource;
818
-
819
- for (int i = 0; i < loaded; ++i)
820
- {
821
- Sprite sprite = sprites[i];
822
- if (sprite == null)
823
- {
824
- toRemove.Add(sprite);
825
- }
826
- }
827
-
828
- if (toRemove.Count > 0)
829
- {
830
- atlas.Remove(toRemove.ToArray<Object>());
831
- }
832
-
833
- int removed = config.spritesToPack.RemoveAll(sprite => sprite == null);
834
- if (removed > 0)
835
- {
836
- EditorUtility.SetDirty(config);
837
- }
838
-
839
- if (config.spritesToPack.Count > 0)
840
- {
841
- Object[] spritesToAdd = config.spritesToPack.ToArray<Object>();
842
- atlas.Add(spritesToAdd);
843
- }
844
- else
845
- {
846
- this.LogWarn(
847
- $"'{config.name}': No sprites in the 'spritesToPack' list. Atlas will be empty."
848
- );
849
- }
850
-
851
- if (newAtlas)
852
- {
853
- AssetDatabase.CreateAsset(atlas, outputPath);
854
- }
855
- else
856
- {
857
- EditorUtility.SetDirty(atlas);
858
- }
859
-
860
- if (refreshAssetsImmediately)
861
- {
862
- AssetDatabase.SaveAssets();
863
- AssetDatabase.Refresh();
864
- }
865
- this.Log(
866
- $"'{config.name}': Successfully generated/updated at {outputPath}. Sprites included: {config.spritesToPack.Count}."
867
- );
868
- }
869
-
870
- private void PackAllProjectAtlases()
871
- {
872
- this.Log(
873
- $"Starting to pack all Sprite Atlases in the project for target: {EditorUserBuildSettings.activeBuildTarget}"
874
- );
875
- SpriteAtlasUtility.PackAllAtlases(EditorUserBuildSettings.activeBuildTarget);
876
- this.Log($"Finished packing all Sprite Atlases.");
877
- AssetDatabase.Refresh();
878
- }
879
-
880
- private void ForceUncompressedSourceSprites(ScriptableSpriteAtlas config)
881
- {
882
- if (config == null)
883
- {
884
- return;
885
- }
886
-
887
- List<Sprite> spritesToProcess = config
888
- .spritesToPack.Where(s => s != null && s.texture != null)
889
- .ToList();
890
- if (spritesToProcess.Count == 0)
891
- {
892
- this.LogWarn(
893
- $"'{config.name}': No valid sprites with textures in the list to modify."
894
- );
895
- EditorUtility.DisplayDialog(
896
- "No Sprites",
897
- "No valid sprites found in the configuration's list to process.",
898
- "OK"
899
- );
900
- return;
901
- }
902
-
903
- int modifiedCount = 0;
904
- int errorCount = 0;
905
- HashSet<string> processedAssetPaths = new();
906
-
907
- List<TextureImporter> importers = new();
908
- AssetDatabase.StartAssetEditing();
909
- try
910
- {
911
- for (int i = 0; i < spritesToProcess.Count; ++i)
912
- {
913
- Sprite sprite = spritesToProcess[i];
914
- EditorUtility.DisplayProgressBar(
915
- "Modifying Source Sprite Import Settings",
916
- $"Processing: {sprite.name} ({i + 1}/{spritesToProcess.Count})",
917
- (float)(i + 1) / spritesToProcess.Count
918
- );
919
-
920
- string assetPath = AssetDatabase.GetAssetPath(sprite.texture);
921
- if (string.IsNullOrWhiteSpace(assetPath))
922
- {
923
- this.LogWarn(
924
- $"Could not find asset path for sprite's texture: {sprite.name}. Skipping."
925
- );
926
- errorCount++;
927
- continue;
928
- }
929
-
930
- if (!processedAssetPaths.Add(assetPath))
931
- {
932
- continue;
933
- }
934
-
935
- TextureImporter importer =
936
- AssetImporter.GetAtPath(assetPath) as TextureImporter;
937
- if (importer == null)
938
- {
939
- this.LogWarn(
940
- $"Could not get TextureImporter for asset: {assetPath} (from sprite: {sprite.name}). Skipping."
941
- );
942
- errorCount++;
943
- continue;
944
- }
945
-
946
- bool settingsActuallyModified = false;
947
-
948
- if (importer.crunchedCompression)
949
- {
950
- importer.crunchedCompression = false;
951
- settingsActuallyModified = true;
952
- }
953
-
954
- if (importer.textureCompression != TextureImporterCompression.Uncompressed)
955
- {
956
- importer.textureCompression = TextureImporterCompression.Uncompressed;
957
- settingsActuallyModified = true;
958
- }
959
-
960
- TextureImporterPlatformSettings platformSettings =
961
- importer.GetDefaultPlatformTextureSettings();
962
- bool platformSettingsChangedThisTime = false;
963
- TextureImporterFormat targetFormat = importer.DoesSourceTextureHaveAlpha()
964
- ? TextureImporterFormat.RGBA32
965
- : TextureImporterFormat.RGB24;
966
-
967
- if (platformSettings.format != targetFormat)
968
- {
969
- platformSettings.format = targetFormat;
970
- platformSettingsChangedThisTime = true;
971
- }
972
- if (platformSettings.crunchedCompression)
973
- {
974
- platformSettings.crunchedCompression = false;
975
- platformSettingsChangedThisTime = true;
976
- }
977
- if (platformSettings.compressionQuality != 100)
978
- {
979
- platformSettings.compressionQuality = 100;
980
- platformSettingsChangedThisTime = true;
981
- }
982
-
983
- if (platformSettingsChangedThisTime || !platformSettings.overridden)
984
- {
985
- platformSettings.overridden = true;
986
- importer.SetPlatformTextureSettings(platformSettings);
987
- settingsActuallyModified = true;
988
- }
989
-
990
- if (settingsActuallyModified)
991
- {
992
- importer.SaveAndReimport();
993
- importers.Add(importer);
994
- modifiedCount++;
995
- this.Log(
996
- $"Set import settings for texture: {assetPath} (from sprite: {sprite.name}) to uncompressed ({targetFormat})."
997
- );
998
- }
999
- }
1000
- }
1001
- finally
1002
- {
1003
- AssetDatabase.StopAssetEditing();
1004
- EditorUtility.ClearProgressBar();
1005
- }
1006
-
1007
- foreach (TextureImporter importer in importers)
1008
- {
1009
- importer.SaveAndReimport();
1010
- }
1011
-
1012
- if (modifiedCount > 0 || errorCount > 0)
1013
- {
1014
- AssetDatabase.SaveAssets();
1015
- AssetDatabase.Refresh();
1016
- }
1017
-
1018
- string summaryMessage =
1019
- $"Finished processing source sprite textures for '{config.name}'.\n"
1020
- + $"Successfully modified importers for: {modifiedCount} textures.\n"
1021
- + $"Errors/Skipped duplicates: {errorCount + (spritesToProcess.Count - processedAssetPaths.Count)}.";
1022
- this.Log($"{summaryMessage}");
1023
- }
1024
- }
1025
- #endif
1026
- }
1
+ namespace WallstopStudios.UnityHelpers.Editor.Sprites
2
+ {
3
+ #if UNITY_EDITOR
4
+ using System;
5
+ using System.Collections.Generic;
6
+ using System.IO;
7
+ using System.Linq;
8
+ using System.Text.RegularExpressions;
9
+ using UnityEditor;
10
+ using UnityEditor.U2D;
11
+ using UnityEngine;
12
+ using UnityEngine.U2D;
13
+ using WallstopStudios.UnityHelpers.Core.Extension;
14
+ using WallstopStudios.UnityHelpers.Core.Helper;
15
+ using WallstopStudios.UnityHelpers.Utils;
16
+ using Object = UnityEngine.Object;
17
+
18
+ /// <summary>
19
+ /// Editor window for managing <c>ScriptableSpriteAtlas</c> configuration assets and generating
20
+ /// corresponding <c>.spriteatlas</c> assets. Supports scanning for adds/removals, bulk generate,
21
+ /// and optional packing after generation.
22
+ /// </summary>
23
+ /// <remarks>
24
+ /// <para>
25
+ /// Problems this solves: keeping <c>SpriteAtlas</c> assets in sync with curated rules and sets
26
+ /// of sprites, with visibility into pending additions/removals before writing.
27
+ /// </para>
28
+ /// <para>
29
+ /// How it works: loads all <c>ScriptableSpriteAtlas</c> assets in the project, caches scan
30
+ /// results (to add/remove), and drives generation of the <c>.spriteatlas</c> assets. Optionally
31
+ /// invokes <see cref="SpriteAtlasUtility.PackAllAtlases"/> to repack.
32
+ /// </para>
33
+ /// <para>
34
+ /// Usage: open via menu, refresh config list, create new configs in a target folder, then
35
+ /// Generate/Pack as needed.
36
+ /// </para>
37
+ /// <para>
38
+ /// Caveats: generation modifies/creates assets; ensure correct output paths and VCS.
39
+ /// </para>
40
+ /// </remarks>
41
+ public sealed class ScriptableSpriteAtlasEditor : EditorWindow
42
+ {
43
+ private static bool SuppressUserPrompts { get; set; }
44
+
45
+ static ScriptableSpriteAtlasEditor()
46
+ {
47
+ try
48
+ {
49
+ if (Application.isBatchMode || IsInvokedByTestRunner())
50
+ {
51
+ SuppressUserPrompts = true;
52
+ }
53
+ }
54
+ catch { }
55
+ }
56
+
57
+ private static bool IsInvokedByTestRunner()
58
+ {
59
+ string[] args = Environment.GetCommandLineArgs();
60
+ for (int i = 0; i < args.Length; ++i)
61
+ {
62
+ string a = args[i];
63
+ if (
64
+ a.IndexOf("runTests", StringComparison.OrdinalIgnoreCase) >= 0
65
+ || a.IndexOf("testResults", StringComparison.OrdinalIgnoreCase) >= 0
66
+ || a.IndexOf("testPlatform", StringComparison.OrdinalIgnoreCase) >= 0
67
+ )
68
+ {
69
+ return true;
70
+ }
71
+ }
72
+ return false;
73
+ }
74
+
75
+ private readonly Dictionary<ScriptableSpriteAtlas, SerializedObject> _serializedConfigs =
76
+ new();
77
+ private List<ScriptableSpriteAtlas> _atlasConfigs = new();
78
+ private Vector2 _scrollPosition;
79
+ private bool _packAfterGenerate;
80
+
81
+ private sealed class ScanResult
82
+ {
83
+ public List<Sprite> spritesToAdd = new();
84
+ public List<Sprite> spritesToRemove = new();
85
+ public bool hasScanned;
86
+ }
87
+
88
+ private readonly Dictionary<ScriptableSpriteAtlas, ScanResult> _scanResultsCache = new();
89
+ private readonly Dictionary<ScriptableSpriteAtlas, bool> _foldoutStates = new();
90
+
91
+ private const string NewAtlasConfigDirectory = "Assets/Data";
92
+
93
+ [MenuItem("Tools/Wallstop Studios/Unity Helpers/Sprite Atlas Generator")]
94
+ public static void ShowWindow()
95
+ {
96
+ GetWindow<ScriptableSpriteAtlasEditor>("Sprite Atlas Generator");
97
+ }
98
+
99
+ private void OnEnable()
100
+ {
101
+ LoadAtlasConfigs();
102
+ }
103
+
104
+ private void OnProjectChange()
105
+ {
106
+ LoadAtlasConfigs();
107
+ }
108
+
109
+ internal void LoadAtlasConfigs()
110
+ {
111
+ _atlasConfigs.Clear();
112
+ Dictionary<ScriptableSpriteAtlas, ScanResult> existingScanCache = new(
113
+ _scanResultsCache
114
+ );
115
+ _serializedConfigs.Clear();
116
+ _scanResultsCache.Clear();
117
+
118
+ string[] guids = AssetDatabase.FindAssets("t:ScriptableSpriteAtlas");
119
+ foreach (string guid in guids)
120
+ {
121
+ string path = AssetDatabase.GUIDToAssetPath(guid);
122
+ if (string.IsNullOrWhiteSpace(path))
123
+ {
124
+ continue;
125
+ }
126
+ ScriptableSpriteAtlas config = AssetDatabase.LoadAssetAtPath<ScriptableSpriteAtlas>(
127
+ path
128
+ );
129
+ if (config != null)
130
+ {
131
+ _atlasConfigs.Add(config);
132
+ if (existingScanCache.TryGetValue(config, out ScanResult cachedResult))
133
+ {
134
+ _scanResultsCache[config] = cachedResult;
135
+ }
136
+ else
137
+ {
138
+ _scanResultsCache.TryAdd(config, _ => new ScanResult());
139
+ }
140
+ _serializedConfigs.TryAdd(config, newConfig => new SerializedObject(newConfig));
141
+ _foldoutStates.TryAdd(config, true);
142
+ }
143
+ }
144
+ _atlasConfigs = _atlasConfigs.OrderBy(c => c.name).ToList();
145
+ }
146
+
147
+ private void OnGUI()
148
+ {
149
+ EditorGUILayout.LabelField("Sprite Atlas Generation Tool", EditorStyles.boldLabel);
150
+ EditorGUILayout.Space();
151
+
152
+ using (new EditorGUILayout.HorizontalScope())
153
+ {
154
+ if (GUILayout.Button("Refresh Config List", GUILayout.Height(30)))
155
+ {
156
+ LoadAtlasConfigs();
157
+ }
158
+
159
+ if (
160
+ GUILayout.Button(
161
+ $"Create New Config in '{NewAtlasConfigDirectory}'",
162
+ GUILayout.Height(30)
163
+ )
164
+ )
165
+ {
166
+ CreateNewScriptableSpriteAtlas();
167
+ }
168
+ }
169
+
170
+ EditorGUILayout.Space();
171
+
172
+ using (new EditorGUILayout.HorizontalScope())
173
+ {
174
+ _packAfterGenerate = EditorGUILayout.ToggleLeft(
175
+ new GUIContent(
176
+ "Pack after generate",
177
+ "If enabled, atlases will be packed immediately after generation."
178
+ ),
179
+ _packAfterGenerate,
180
+ GUILayout.Width(180)
181
+ );
182
+
183
+ if (
184
+ GUILayout.Button(
185
+ "Generate/Update All .spriteatlas Assets",
186
+ GUILayout.Height(30)
187
+ )
188
+ )
189
+ {
190
+ GenerateAllAtlases();
191
+ if (_packAfterGenerate)
192
+ {
193
+ PackAllProjectAtlases();
194
+ }
195
+ }
196
+
197
+ if (GUILayout.Button("Generate + Pack All", GUILayout.Height(30)))
198
+ {
199
+ GenerateAllAtlases();
200
+ PackAllProjectAtlases();
201
+ }
202
+ }
203
+
204
+ if (GUILayout.Button("Pack All Generated Sprite Atlases", GUILayout.Height(40)))
205
+ {
206
+ PackAllProjectAtlases();
207
+ }
208
+ EditorGUILayout.Space(20);
209
+ _scrollPosition = EditorGUILayout.BeginScrollView(_scrollPosition);
210
+ if (_atlasConfigs.Count == 0)
211
+ {
212
+ EditorGUILayout.HelpBox(
213
+ "No ScriptableSpriteAtlas configurations found. Use the 'Create New Config' button above or create one via Assets > Create > Wallstop Studios > Unity Helpers > Scriptable Sprite Atlas Config.",
214
+ MessageType.Info
215
+ );
216
+ }
217
+
218
+ foreach (ScriptableSpriteAtlas config in _atlasConfigs)
219
+ {
220
+ if (config == null)
221
+ {
222
+ LoadAtlasConfigs();
223
+ Repaint();
224
+ return;
225
+ }
226
+
227
+ EditorGUILayout.BeginVertical(EditorStyles.helpBox);
228
+ string foldoutLabel =
229
+ $"{config.name} (Output: {config.FullOutputPath ?? "Path Not Set"})";
230
+ if (AssetDatabase.Contains(config))
231
+ {
232
+ foldoutLabel += $" - Path: {AssetDatabase.GetAssetPath(config)}";
233
+ }
234
+
235
+ _foldoutStates[config] = EditorGUILayout.Foldout(
236
+ _foldoutStates[config],
237
+ foldoutLabel,
238
+ true,
239
+ EditorStyles.foldoutHeader
240
+ );
241
+
242
+ if (_foldoutStates[config])
243
+ {
244
+ using EditorGUI.IndentLevelScope indentScope = new();
245
+ SerializedObject serializedConfig = _serializedConfigs.GetOrAdd(
246
+ config,
247
+ newConfig => new SerializedObject(newConfig)
248
+ );
249
+ serializedConfig.Update();
250
+ EditorGUI.BeginChangeCheck();
251
+
252
+ string currentAssetName = config.name;
253
+ Rect nameRect = EditorGUILayout.GetControlRect();
254
+ EditorGUI.BeginChangeCheck();
255
+ string newAssetName = EditorGUI.TextField(
256
+ new Rect(nameRect.x, nameRect.y, nameRect.width - 60, nameRect.height),
257
+ "Asset Name",
258
+ currentAssetName
259
+ );
260
+ if (EditorGUI.EndChangeCheck())
261
+ {
262
+ serializedConfig.ApplyModifiedProperties();
263
+ if (
264
+ !string.IsNullOrWhiteSpace(newAssetName)
265
+ && newAssetName != currentAssetName
266
+ && AssetDatabase.Contains(config)
267
+ )
268
+ {
269
+ string assetPath = AssetDatabase.GetAssetPath(config);
270
+ string error = AssetDatabase.RenameAsset(assetPath, newAssetName);
271
+ if (string.IsNullOrWhiteSpace(error))
272
+ {
273
+ LoadAtlasConfigs();
274
+ GUIUtility.ExitGUI();
275
+ }
276
+ else
277
+ {
278
+ this.LogError($"Failed to rename asset: {error}");
279
+ }
280
+ }
281
+ }
282
+
283
+ SerializedProperty scriptProperty = serializedConfig.FindProperty("m_Script");
284
+ if (scriptProperty != null)
285
+ {
286
+ GUI.enabled = false;
287
+ EditorGUILayout.PropertyField(scriptProperty);
288
+ GUI.enabled = true;
289
+ }
290
+
291
+ SerializedProperty property = serializedConfig.GetIterator();
292
+ bool enterChildren = true;
293
+ while (property.NextVisible(enterChildren))
294
+ {
295
+ enterChildren = false;
296
+ if (string.Equals(property.name, "m_Script", StringComparison.Ordinal))
297
+ {
298
+ continue;
299
+ }
300
+
301
+ EditorGUILayout.PropertyField(property, true);
302
+ }
303
+
304
+ if (EditorGUI.EndChangeCheck())
305
+ {
306
+ serializedConfig.ApplyModifiedProperties();
307
+ }
308
+
309
+ EditorGUILayout.Space();
310
+ // Output validation and quick actions
311
+ string fullOutputPath = config.FullOutputPath;
312
+ if (
313
+ string.IsNullOrWhiteSpace(config.outputSpriteAtlasDirectory)
314
+ || string.IsNullOrWhiteSpace(config.outputSpriteAtlasName)
315
+ )
316
+ {
317
+ EditorGUILayout.HelpBox(
318
+ "Output directory and file name must be set to generate the atlas.",
319
+ MessageType.Warning
320
+ );
321
+ }
322
+ else
323
+ {
324
+ using (new EditorGUILayout.HorizontalScope())
325
+ {
326
+ if (GUILayout.Button("Generate Only"))
327
+ {
328
+ GenerateSingleAtlas(config);
329
+ if (_packAfterGenerate)
330
+ {
331
+ PackAllProjectAtlases();
332
+ }
333
+ }
334
+ if (GUILayout.Button("Generate + Pack"))
335
+ {
336
+ GenerateSingleAtlas(config);
337
+ PackAllProjectAtlases();
338
+ }
339
+
340
+ if (!string.IsNullOrWhiteSpace(fullOutputPath))
341
+ {
342
+ SpriteAtlas existing = AssetDatabase.LoadAssetAtPath<SpriteAtlas>(
343
+ fullOutputPath
344
+ );
345
+ if (existing != null)
346
+ {
347
+ if (GUILayout.Button("Ping Atlas"))
348
+ {
349
+ PingAtlas(fullOutputPath);
350
+ }
351
+ if (GUILayout.Button("Reveal In Explorer"))
352
+ {
353
+ RevealInExplorer(fullOutputPath);
354
+ }
355
+ }
356
+ }
357
+ }
358
+ }
359
+ if (GUILayout.Button("Add New Source Folder Entry"))
360
+ {
361
+ string folderPath = Utils.EditorUi.OpenFolderPanel(
362
+ "Select Source Folder",
363
+ Application.dataPath,
364
+ ""
365
+ );
366
+ if (!string.IsNullOrWhiteSpace(folderPath))
367
+ {
368
+ if (folderPath.StartsWith(Application.dataPath))
369
+ {
370
+ string relativePath =
371
+ "Assets" + folderPath.Substring(Application.dataPath.Length);
372
+ relativePath = relativePath.SanitizePath();
373
+ SerializedProperty sourceFolderEntriesProp =
374
+ serializedConfig.FindProperty(
375
+ nameof(ScriptableSpriteAtlas.sourceFolderEntries)
376
+ );
377
+
378
+ bool pathExists = false;
379
+ for (int j = 0; j < sourceFolderEntriesProp.arraySize; j++)
380
+ {
381
+ SerializedProperty entryProp =
382
+ sourceFolderEntriesProp.GetArrayElementAtIndex(j);
383
+ SerializedProperty pathProp = entryProp.FindPropertyRelative(
384
+ "folderPath"
385
+ );
386
+ if (
387
+ string.Equals(
388
+ pathProp.stringValue,
389
+ relativePath,
390
+ StringComparison.Ordinal
391
+ )
392
+ )
393
+ {
394
+ pathExists = true;
395
+ this.LogWarn(
396
+ $"Folder path '{relativePath}' already exists in an entry for '{config.name}'."
397
+ );
398
+ break;
399
+ }
400
+ }
401
+
402
+ if (!pathExists)
403
+ {
404
+ sourceFolderEntriesProp.InsertArrayElementAtIndex(
405
+ sourceFolderEntriesProp.arraySize
406
+ );
407
+ SerializedProperty newEntryProp =
408
+ sourceFolderEntriesProp.GetArrayElementAtIndex(
409
+ sourceFolderEntriesProp.arraySize - 1
410
+ );
411
+ newEntryProp.FindPropertyRelative("folderPath").stringValue =
412
+ relativePath;
413
+
414
+ serializedConfig.ApplyModifiedProperties();
415
+ this.Log(
416
+ $"Added new source folder entry for '{relativePath}' to '{config.name}'. You can add regexes to it below."
417
+ );
418
+ }
419
+ }
420
+ else
421
+ {
422
+ Utils.EditorUi.Info(
423
+ "Invalid Folder",
424
+ "The selected folder must be within the project's 'Assets' directory."
425
+ );
426
+ }
427
+ }
428
+ }
429
+
430
+ EditorGUILayout.Space();
431
+ EditorGUILayout.LabelField("Analysis & Actions", EditorStyles.boldLabel);
432
+
433
+ if (GUILayout.Button($"Scan Folders for '{config.name}'"))
434
+ {
435
+ ScanFoldersForConfig(config);
436
+ }
437
+
438
+ ScanResult result = _scanResultsCache[config];
439
+ if (result.hasScanned)
440
+ {
441
+ EditorGUILayout.LabelField(
442
+ $"Current manually added sprites: {config.spritesToPack.Count(s => s != null)}"
443
+ );
444
+ EditorGUILayout.LabelField(
445
+ "Sprites found by scan (not yet added/removed):"
446
+ );
447
+ using EditorGUI.IndentLevelScope nextIndentScope = new();
448
+
449
+ if (result.spritesToAdd.Count > 0)
450
+ {
451
+ EditorGUILayout.LabelField(
452
+ $"To Add: {result.spritesToAdd.Count} sprites."
453
+ );
454
+ if (
455
+ GUILayout.Button(
456
+ $"Add {result.spritesToAdd.Count} Sprites to '{config.name}' List"
457
+ )
458
+ )
459
+ {
460
+ AddScannedSprites(config, result);
461
+ }
462
+ }
463
+ else
464
+ {
465
+ EditorGUILayout.LabelField(
466
+ "To Add: 0 sprites.",
467
+ EditorStyles.miniLabel
468
+ );
469
+ }
470
+
471
+ if (result.spritesToRemove.Count > 0)
472
+ {
473
+ EditorGUILayout.LabelField(
474
+ $"To Remove: {result.spritesToRemove.Count} sprites (currently in list but not found by scan)."
475
+ );
476
+ if (
477
+ GUILayout.Button(
478
+ $"Remove {result.spritesToRemove.Count} Sprites from '{config.name}' List"
479
+ )
480
+ )
481
+ {
482
+ RemoveUnfoundSprites(config, result);
483
+ }
484
+ if (
485
+ GUILayout.Button(
486
+ $"Sync List To Scan Result ({result.spritesToAdd.Count} add, {result.spritesToRemove.Count} remove)"
487
+ )
488
+ )
489
+ {
490
+ SyncListToScanResult(config, result);
491
+ }
492
+ }
493
+ else
494
+ {
495
+ EditorGUILayout.LabelField(
496
+ "To Remove: 0 sprites.",
497
+ EditorStyles.miniLabel
498
+ );
499
+ }
500
+ }
501
+ else
502
+ {
503
+ EditorGUILayout.HelpBox(
504
+ "Scan to see potential changes from folder sources.",
505
+ MessageType.None
506
+ );
507
+ }
508
+
509
+ EditorGUILayout.Space();
510
+ EditorGUILayout.LabelField("Source Sprite Utilities", EditorStyles.boldLabel);
511
+
512
+ int validSpriteCount = config.spritesToPack.Count(s => s != null);
513
+ EditorGUI.BeginDisabledGroup(validSpriteCount == 0);
514
+ if (
515
+ GUILayout.Button(
516
+ $"Force Uncompressed for {validSpriteCount} Source Sprites in '{config.name}'"
517
+ )
518
+ && Utils.EditorUi.Confirm(
519
+ "Force Uncompressed Source Sprites",
520
+ $"This will modify the import settings of {validSpriteCount} source sprites currently in the '{config.name}' list.\n\n"
521
+ + "- Crunch compression will be disabled.\n"
522
+ + "- Texture format for the 'Default' platform will be set to uncompressed (RGBA32 or RGB24).\n\n"
523
+ + "This action modifies source asset import settings and may require re-packing atlases. Are you sure?",
524
+ "Yes, Modify Source Sprites",
525
+ "Cancel",
526
+ defaultWhenSuppressed: true
527
+ )
528
+ )
529
+ {
530
+ ForceUncompressedSourceSprites(config);
531
+ }
532
+ EditorGUI.EndDisabledGroup();
533
+
534
+ EditorGUILayout.Space();
535
+ if (
536
+ GUILayout.Button(
537
+ $"Generate/Update '{config.outputSpriteAtlasName}.spriteatlas' ONLY"
538
+ )
539
+ && Utils.EditorUi.Confirm(
540
+ $"Generate Atlas: {config.name}",
541
+ $"This will create or update '{config.outputSpriteAtlasName}.spriteatlas'. Continue?",
542
+ "Yes",
543
+ "No",
544
+ defaultWhenSuppressed: true
545
+ )
546
+ )
547
+ {
548
+ GenerateSingleAtlas(config);
549
+ }
550
+ }
551
+ EditorGUILayout.EndVertical();
552
+ EditorGUILayout.Space();
553
+ }
554
+ EditorGUILayout.EndScrollView();
555
+ }
556
+
557
+ private void CreateNewScriptableSpriteAtlas()
558
+ {
559
+ DirectoryHelper.EnsureDirectoryExists(NewAtlasConfigDirectory);
560
+ ScriptableSpriteAtlas newAtlasConfig = CreateInstance<ScriptableSpriteAtlas>();
561
+ string path = AssetDatabase.GenerateUniqueAssetPath(
562
+ Path.Combine(NewAtlasConfigDirectory, "NewScriptableSpriteAtlas.asset")
563
+ );
564
+
565
+ AssetDatabase.CreateAsset(newAtlasConfig, path);
566
+ AssetDatabase.SaveAssets();
567
+ AssetDatabase.Refresh();
568
+
569
+ EditorUtility.FocusProjectWindow();
570
+ Selection.activeObject = newAtlasConfig;
571
+
572
+ this.Log($"Created new ScriptableSpriteAtlas at: {path}");
573
+ LoadAtlasConfigs();
574
+ Repaint();
575
+ }
576
+
577
+ private void ScanFoldersForConfig(ScriptableSpriteAtlas config)
578
+ {
579
+ if (config.sourceFolderEntries == null || config.sourceFolderEntries.Count == 0)
580
+ {
581
+ this.LogWarn(
582
+ $"'{config.name}': No source folder entries defined. Scan will find nothing from folders."
583
+ );
584
+ _scanResultsCache[config] = new ScanResult { hasScanned = true };
585
+ Repaint();
586
+ return;
587
+ }
588
+
589
+ ScanResult currentScan = new();
590
+ HashSet<Sprite> foundSpritesInFolders = new();
591
+
592
+ foreach (SourceFolderEntry entry in config.sourceFolderEntries)
593
+ {
594
+ if (
595
+ string.IsNullOrWhiteSpace(entry.folderPath)
596
+ || !AssetDatabase.IsValidFolder(entry.folderPath)
597
+ )
598
+ {
599
+ this.LogWarn(
600
+ $"'{config.name}': Invalid or empty folder path '{entry.folderPath}' in an entry. Skipping this entry."
601
+ );
602
+ continue;
603
+ }
604
+
605
+ // Build a search set optimized by labels when applicable
606
+ bool useLabels =
607
+ entry.selectionMode.HasFlagNoAlloc(SpriteSelectionMode.Labels)
608
+ && entry.labels is { Count: > 0 };
609
+ List<string> guidList = new();
610
+ if (useLabels)
611
+ {
612
+ switch (entry.labelSelectionMode)
613
+ {
614
+ case LabelSelectionMode.All:
615
+ {
616
+ string query = "t:Texture2D";
617
+ foreach (string l in entry.labels)
618
+ {
619
+ if (!string.IsNullOrWhiteSpace(l))
620
+ {
621
+ query += $" l:{l}";
622
+ }
623
+ }
624
+ guidList.AddRange(
625
+ AssetDatabase.FindAssets(query, new[] { entry.folderPath })
626
+ );
627
+ break;
628
+ }
629
+ case LabelSelectionMode.AnyOf:
630
+ {
631
+ using PooledResource<HashSet<string>> setRes =
632
+ Buffers<string>.HashSet.Get();
633
+ HashSet<string> set = setRes.resource;
634
+ foreach (string l in entry.labels)
635
+ {
636
+ if (string.IsNullOrWhiteSpace(l))
637
+ {
638
+ continue;
639
+ }
640
+ string query = $"t:Texture2D l:{l}";
641
+ foreach (
642
+ string g in AssetDatabase.FindAssets(
643
+ query,
644
+ new[] { entry.folderPath }
645
+ )
646
+ )
647
+ {
648
+ set.Add(g);
649
+ }
650
+ }
651
+ if (set.Count > 0)
652
+ {
653
+ guidList.AddRange(set);
654
+ }
655
+ break;
656
+ }
657
+ default:
658
+ {
659
+ this.LogError(
660
+ $"'{config.name}', Folder '{entry.folderPath}': Invalid LabelSelectionMode value '{entry.labelSelectionMode}'. Skipping label pre-filter."
661
+ );
662
+ break;
663
+ }
664
+ }
665
+ }
666
+ else
667
+ {
668
+ guidList.AddRange(
669
+ AssetDatabase.FindAssets("t:Texture2D", new[] { entry.folderPath })
670
+ );
671
+ }
672
+
673
+ // Prepare compiled regexes if regex selection is enabled
674
+ bool useRegex = entry.selectionMode.HasFlagNoAlloc(SpriteSelectionMode.Regex);
675
+ List<string> activeRegexPatterns = entry
676
+ .regexes.Where(r => !string.IsNullOrWhiteSpace(r))
677
+ .ToList();
678
+ List<Regex> compiledRegexes = null;
679
+ if (useRegex && activeRegexPatterns.Count > 0)
680
+ {
681
+ compiledRegexes = new List<Regex>(activeRegexPatterns.Count);
682
+ foreach (string pattern in activeRegexPatterns)
683
+ {
684
+ try
685
+ {
686
+ compiledRegexes.Add(
687
+ new Regex(
688
+ pattern,
689
+ RegexOptions.IgnoreCase
690
+ | RegexOptions.CultureInvariant
691
+ | RegexOptions.Compiled
692
+ )
693
+ );
694
+ }
695
+ catch (ArgumentException ex)
696
+ {
697
+ this.LogError(
698
+ $"'{config.name}', Folder '{entry.folderPath}': Invalid Regex pattern '{pattern}': {ex.Message}. This pattern will be ignored."
699
+ );
700
+ }
701
+ }
702
+ }
703
+
704
+ // Compile exclusion regexes if provided
705
+ List<Regex> compiledExcludeRegexes = null;
706
+ if (entry.excludeRegexes is { Count: > 0 })
707
+ {
708
+ compiledExcludeRegexes = new List<Regex>(entry.excludeRegexes.Count);
709
+ foreach (string pattern in entry.excludeRegexes)
710
+ {
711
+ if (string.IsNullOrWhiteSpace(pattern))
712
+ {
713
+ continue;
714
+ }
715
+ try
716
+ {
717
+ compiledExcludeRegexes.Add(
718
+ new Regex(
719
+ pattern,
720
+ RegexOptions.IgnoreCase
721
+ | RegexOptions.CultureInvariant
722
+ | RegexOptions.Compiled
723
+ )
724
+ );
725
+ }
726
+ catch (ArgumentException ex)
727
+ {
728
+ this.LogError(
729
+ $"'{config.name}', Folder '{entry.folderPath}': Invalid Exclude Regex pattern '{pattern}': {ex.Message}. This pattern will be ignored."
730
+ );
731
+ }
732
+ }
733
+ }
734
+
735
+ foreach (string guid in guidList)
736
+ {
737
+ string assetPath = AssetDatabase.GUIDToAssetPath(guid);
738
+ string fileName = Path.GetFileName(assetPath);
739
+
740
+ bool matchesAllRegexesInEntry = true;
741
+ if (useRegex && compiledRegexes is { Count: > 0 })
742
+ {
743
+ foreach (Regex rx in compiledRegexes)
744
+ {
745
+ if (!rx.IsMatch(fileName))
746
+ {
747
+ matchesAllRegexesInEntry = false;
748
+ break;
749
+ }
750
+ }
751
+ }
752
+
753
+ bool allMatch = matchesAllRegexesInEntry;
754
+ bool matchesAllTagsInEntry = true;
755
+ if (
756
+ entry.selectionMode.HasFlagNoAlloc(SpriteSelectionMode.Labels)
757
+ && entry.labels is { Count: > 0 }
758
+ )
759
+ {
760
+ Object mainAsset = AssetDatabase.LoadMainAssetAtPath(assetPath);
761
+ if (mainAsset != null)
762
+ {
763
+ string[] labels = AssetDatabase.GetLabels(mainAsset);
764
+ using PooledResource<HashSet<string>> entryLabelsRes =
765
+ Buffers<string>.HashSet.Get();
766
+ HashSet<string> entryLabels = entryLabelsRes.resource;
767
+ entryLabels.Clear();
768
+ entryLabels.UnionWith(entry.labels);
769
+
770
+ using PooledResource<HashSet<string>> assetLabelsRes =
771
+ Buffers<string>.HashSet.Get();
772
+ HashSet<string> assetLabels = assetLabelsRes.resource;
773
+ assetLabels.Clear();
774
+ assetLabels.UnionWith(labels);
775
+ switch (entry.labelSelectionMode)
776
+ {
777
+ case LabelSelectionMode.All:
778
+ {
779
+ // Asset must contain all required entry labels
780
+ matchesAllTagsInEntry = entryLabels.All(assetLabels.Contains);
781
+ break;
782
+ }
783
+ case LabelSelectionMode.AnyOf:
784
+ {
785
+ matchesAllTagsInEntry = assetLabels.Any(entryLabels.Contains);
786
+ break;
787
+ }
788
+ default:
789
+ {
790
+ this.LogError(
791
+ $"'{config.name}', Folder '{entry.folderPath}': Invalid LabelSelectionMode value '{entry.labelSelectionMode}'. Skipping label filtering for this entry."
792
+ );
793
+ matchesAllTagsInEntry = false;
794
+ break;
795
+ }
796
+ }
797
+ }
798
+
799
+ switch (entry.regexAndTagLogic)
800
+ {
801
+ case SpriteSelectionBooleanLogic.And:
802
+ {
803
+ allMatch = matchesAllRegexesInEntry && matchesAllTagsInEntry;
804
+ break;
805
+ }
806
+ case SpriteSelectionBooleanLogic.Or:
807
+ {
808
+ allMatch = matchesAllRegexesInEntry || matchesAllTagsInEntry;
809
+ break;
810
+ }
811
+ default:
812
+ {
813
+ this.LogError(
814
+ $"'{config.name}', Folder '{entry.folderPath}': Invalid SpriteSelectionBooleanLogic value '{entry.regexAndTagLogic}'. Defaulting to AND logic."
815
+ );
816
+ allMatch = matchesAllRegexesInEntry && matchesAllTagsInEntry;
817
+ break;
818
+ }
819
+ }
820
+ }
821
+
822
+ if (allMatch)
823
+ {
824
+ bool excluded = false;
825
+ // Exclude by path prefixes (case-insensitive starts-with)
826
+ if (!excluded && entry.excludePathPrefixes is { Count: > 0 })
827
+ {
828
+ string ap = assetPath.SanitizePath();
829
+ foreach (string prefix in entry.excludePathPrefixes)
830
+ {
831
+ if (string.IsNullOrWhiteSpace(prefix))
832
+ {
833
+ continue;
834
+ }
835
+ string p = prefix.SanitizePath();
836
+ if (ap.StartsWith(p, StringComparison.OrdinalIgnoreCase))
837
+ {
838
+ excluded = true;
839
+ break;
840
+ }
841
+ }
842
+ }
843
+ // Exclude by regex (OR semantics)
844
+ if (!excluded && compiledExcludeRegexes is { Count: > 0 })
845
+ {
846
+ foreach (Regex rx in compiledExcludeRegexes)
847
+ {
848
+ if (rx.IsMatch(fileName))
849
+ {
850
+ excluded = true;
851
+ break;
852
+ }
853
+ }
854
+ }
855
+
856
+ // Exclude by labels
857
+ if (!excluded && entry.excludeLabels is { Count: > 0 })
858
+ {
859
+ Object mainAsset2 = AssetDatabase.LoadMainAssetAtPath(assetPath);
860
+ if (mainAsset2 != null)
861
+ {
862
+ string[] labels2 = AssetDatabase.GetLabels(mainAsset2);
863
+ using PooledResource<HashSet<string>> exEntryLabelsRes =
864
+ Buffers<string>.HashSet.Get();
865
+ HashSet<string> exEntryLabels = exEntryLabelsRes.resource;
866
+ exEntryLabels.Clear();
867
+ exEntryLabels.UnionWith(entry.excludeLabels);
868
+
869
+ using PooledResource<HashSet<string>> assetLabelsRes2 =
870
+ Buffers<string>.HashSet.Get();
871
+ HashSet<string> assetLabels2 = assetLabelsRes2.resource;
872
+ assetLabels2.Clear();
873
+ assetLabels2.UnionWith(labels2);
874
+
875
+ switch (entry.excludeLabelSelectionMode)
876
+ {
877
+ case LabelSelectionMode.All:
878
+ excluded = exEntryLabels.All(assetLabels2.Contains);
879
+ break;
880
+ case LabelSelectionMode.AnyOf:
881
+ excluded = assetLabels2.Any(exEntryLabels.Contains);
882
+ break;
883
+ }
884
+ }
885
+ }
886
+
887
+ if (!excluded)
888
+ {
889
+ foreach (Object asset in AssetDatabase.LoadAllAssetsAtPath(assetPath))
890
+ {
891
+ if (asset is Sprite spriteAsset && spriteAsset != null)
892
+ {
893
+ foundSpritesInFolders.Add(spriteAsset);
894
+ }
895
+ }
896
+ }
897
+ }
898
+ }
899
+ }
900
+
901
+ List<Sprite> validSpritesInConfigList = config
902
+ .spritesToPack.Where(s => s != null)
903
+ .ToList();
904
+
905
+ currentScan.spritesToAdd = foundSpritesInFolders
906
+ .Except(validSpritesInConfigList)
907
+ .ToList();
908
+
909
+ currentScan.spritesToRemove = validSpritesInConfigList
910
+ .Except(foundSpritesInFolders)
911
+ .ToList();
912
+
913
+ currentScan.hasScanned = true;
914
+ _scanResultsCache[config] = currentScan;
915
+ this.Log(
916
+ $"'{config.name}': Scan complete. Total unique sprites found across all folder entries: {foundSpritesInFolders.Count}. Potential to add: {currentScan.spritesToAdd.Count}, Potential to remove: {currentScan.spritesToRemove.Count}."
917
+ );
918
+ Repaint();
919
+ }
920
+
921
+ private void AddScannedSprites(ScriptableSpriteAtlas config, ScanResult result)
922
+ {
923
+ if (result.spritesToAdd.Count <= 0)
924
+ {
925
+ return;
926
+ }
927
+
928
+ SerializedObject so = new(config);
929
+ SerializedProperty spritesListProp = so.FindProperty(
930
+ nameof(ScriptableSpriteAtlas.spritesToPack)
931
+ );
932
+
933
+ Undo.RecordObject(config, "Add Scanned Sprites to Atlas Config");
934
+
935
+ int addedCount = 0;
936
+ foreach (Sprite sprite in result.spritesToAdd)
937
+ {
938
+ bool alreadyExists = false;
939
+ for (int i = 0; i < spritesListProp.arraySize; ++i)
940
+ {
941
+ if (spritesListProp.GetArrayElementAtIndex(i).objectReferenceValue == sprite)
942
+ {
943
+ alreadyExists = true;
944
+ break;
945
+ }
946
+ }
947
+ if (!alreadyExists)
948
+ {
949
+ spritesListProp.InsertArrayElementAtIndex(spritesListProp.arraySize);
950
+ spritesListProp
951
+ .GetArrayElementAtIndex(spritesListProp.arraySize - 1)
952
+ .objectReferenceValue = sprite;
953
+ addedCount++;
954
+ }
955
+ }
956
+
957
+ if (addedCount > 0)
958
+ {
959
+ so.ApplyModifiedProperties();
960
+ config.spritesToPack.SortByName();
961
+ EditorUtility.SetDirty(config);
962
+ this.Log($"'{config.name}': Added {addedCount} sprites.");
963
+ }
964
+ else
965
+ {
966
+ this.Log(
967
+ $"'{config.name}': No new sprites to add (all found sprites might already be in the list)."
968
+ );
969
+ }
970
+
971
+ result.spritesToAdd.Clear();
972
+ ScanFoldersForConfig(config);
973
+ Repaint();
974
+ }
975
+
976
+ private void RemoveUnfoundSprites(ScriptableSpriteAtlas config, ScanResult result)
977
+ {
978
+ if (result.spritesToRemove.Count <= 0)
979
+ {
980
+ return;
981
+ }
982
+
983
+ SerializedObject so = new(config);
984
+ SerializedProperty spritesListProp = so.FindProperty("spritesToPack");
985
+
986
+ Undo.RecordObject(config, "Remove Unfound Sprites from Atlas Config");
987
+
988
+ int countRemoved = 0;
989
+ List<Sprite> spritesActuallyToRemove = new(result.spritesToRemove);
990
+
991
+ for (int i = spritesListProp.arraySize - 1; 0 <= i; --i)
992
+ {
993
+ SerializedProperty element = spritesListProp.GetArrayElementAtIndex(i);
994
+ if (
995
+ element.objectReferenceValue != null
996
+ && spritesActuallyToRemove.Contains(element.objectReferenceValue as Sprite)
997
+ )
998
+ {
999
+ element.objectReferenceValue = null;
1000
+ spritesListProp.DeleteArrayElementAtIndex(i);
1001
+ countRemoved++;
1002
+ }
1003
+ }
1004
+
1005
+ if (countRemoved > 0)
1006
+ {
1007
+ so.ApplyModifiedProperties();
1008
+ this.Log(
1009
+ $"'{config.name}': Removed {countRemoved} sprites that were no longer found by scan."
1010
+ );
1011
+ }
1012
+ result.spritesToRemove.Clear();
1013
+ ScanFoldersForConfig(config);
1014
+ Repaint();
1015
+ }
1016
+
1017
+ internal void GenerateAllAtlases()
1018
+ {
1019
+ if (_atlasConfigs.Count == 0)
1020
+ {
1021
+ Utils.EditorUi.Info(
1022
+ "No Configurations",
1023
+ "No ScriptableSpriteAtlas configurations found to generate."
1024
+ );
1025
+ return;
1026
+ }
1027
+
1028
+ int totalConfigs = _atlasConfigs.Count;
1029
+ int currentConfig = 0;
1030
+
1031
+ AssetDatabase.StartAssetEditing();
1032
+ try
1033
+ {
1034
+ foreach (ScriptableSpriteAtlas config in _atlasConfigs)
1035
+ {
1036
+ if (config == null)
1037
+ {
1038
+ continue;
1039
+ }
1040
+
1041
+ currentConfig++;
1042
+ float progress = (float)currentConfig / totalConfigs;
1043
+ Utils.EditorUi.ShowProgress(
1044
+ "Generating Sprite Atlases",
1045
+ $"Processing: {config.name}",
1046
+ progress
1047
+ );
1048
+ GenerateSingleAtlas(config, false);
1049
+ }
1050
+ }
1051
+ finally
1052
+ {
1053
+ AssetDatabase.StopAssetEditing();
1054
+ Utils.EditorUi.ClearProgress();
1055
+ AssetDatabase.SaveAssets();
1056
+ AssetDatabase.Refresh();
1057
+ }
1058
+ }
1059
+
1060
+ private void GenerateSingleAtlas(
1061
+ ScriptableSpriteAtlas config,
1062
+ bool refreshAssetsImmediately = true
1063
+ )
1064
+ {
1065
+ if (config == null)
1066
+ {
1067
+ this.LogError($"Attempted to generate atlas from a null config.");
1068
+ return;
1069
+ }
1070
+ string outputPath = config.FullOutputPath;
1071
+ if (string.IsNullOrWhiteSpace(outputPath))
1072
+ {
1073
+ this.LogError(
1074
+ $"'{config.name}': Output path or name is not set. Cannot generate atlas."
1075
+ );
1076
+ return;
1077
+ }
1078
+
1079
+ string directory = Path.GetDirectoryName(outputPath);
1080
+ if (!string.IsNullOrWhiteSpace(directory) && !Directory.Exists(directory))
1081
+ {
1082
+ Directory.CreateDirectory(directory);
1083
+ AssetDatabase.Refresh();
1084
+ }
1085
+
1086
+ SpriteAtlas atlas = AssetDatabase.LoadAssetAtPath<SpriteAtlas>(outputPath);
1087
+ bool newAtlas = false;
1088
+ if (atlas == null)
1089
+ {
1090
+ atlas = new SpriteAtlas();
1091
+ newAtlas = true;
1092
+ this.Log($"'{config.name}': Creating new SpriteAtlas at {outputPath}");
1093
+ }
1094
+ else
1095
+ {
1096
+ this.Log($"'{config.name}': Updating existing SpriteAtlas at {outputPath}");
1097
+ atlas.Remove(atlas.GetPackables());
1098
+ }
1099
+
1100
+ SpriteAtlasPackingSettings packingSettings = atlas.GetPackingSettings();
1101
+ packingSettings.enableRotation = config.enableRotation;
1102
+ packingSettings.padding = config.padding;
1103
+ packingSettings.enableTightPacking = config.enableTightPacking;
1104
+ packingSettings.enableAlphaDilation = config.enableAlphaDilation;
1105
+ atlas.SetPackingSettings(packingSettings);
1106
+
1107
+ SpriteAtlasTextureSettings textureSettings = atlas.GetTextureSettings();
1108
+ textureSettings.readable = config.readWriteEnabled;
1109
+ atlas.SetTextureSettings(textureSettings);
1110
+
1111
+ TextureImporterPlatformSettings platformSettings = atlas.GetPlatformSettings(
1112
+ "DefaultTexturePlatform"
1113
+ );
1114
+ if (string.IsNullOrWhiteSpace(platformSettings.name))
1115
+ {
1116
+ platformSettings.name = "DefaultTexturePlatform";
1117
+ }
1118
+
1119
+ platformSettings.overridden = true;
1120
+ platformSettings.maxTextureSize = config.maxTextureSize;
1121
+ platformSettings.crunchedCompression = config.useCrunchCompression;
1122
+ platformSettings.compressionQuality = config.crunchCompressionLevel;
1123
+ platformSettings.format = TextureImporterFormat.Automatic;
1124
+ platformSettings.textureCompression = config.compression;
1125
+ atlas.SetPlatformSettings(platformSettings);
1126
+
1127
+ // Apply per-platform overrides if configured
1128
+ if (config.overrideStandalone)
1129
+ {
1130
+ ApplyPlatformSettings(
1131
+ atlas,
1132
+ "Standalone",
1133
+ config.standaloneMaxTextureSize,
1134
+ config.standaloneCompression,
1135
+ config.standaloneUseCrunchCompression,
1136
+ config.standaloneCrunchCompressionLevel
1137
+ );
1138
+ }
1139
+ if (config.overrideIPhone)
1140
+ {
1141
+ ApplyPlatformSettings(
1142
+ atlas,
1143
+ "iPhone",
1144
+ config.iPhoneMaxTextureSize,
1145
+ config.iPhoneCompression,
1146
+ config.iPhoneUseCrunchCompression,
1147
+ config.iPhoneCrunchCompressionLevel
1148
+ );
1149
+ }
1150
+ if (config.overrideAndroid)
1151
+ {
1152
+ ApplyPlatformSettings(
1153
+ atlas,
1154
+ "Android",
1155
+ config.androidMaxTextureSize,
1156
+ config.androidCompression,
1157
+ config.androidUseCrunchCompression,
1158
+ config.androidCrunchCompressionLevel
1159
+ );
1160
+ }
1161
+
1162
+ // No need to remove null sprites from atlas contents here; we control packables below.
1163
+
1164
+ int removed = config.spritesToPack.RemoveAll(sprite => sprite == null);
1165
+ if (removed > 0)
1166
+ {
1167
+ EditorUtility.SetDirty(config);
1168
+ }
1169
+
1170
+ if (config.spritesToPack.Count > 0)
1171
+ {
1172
+ Object[] spritesToAdd = config.spritesToPack.ToArray<Object>();
1173
+ atlas.Add(spritesToAdd);
1174
+ }
1175
+ else
1176
+ {
1177
+ this.LogWarn(
1178
+ $"'{config.name}': No sprites in the 'spritesToPack' list. Atlas will be empty."
1179
+ );
1180
+ }
1181
+
1182
+ if (newAtlas)
1183
+ {
1184
+ AssetDatabase.CreateAsset(atlas, outputPath);
1185
+ }
1186
+ else
1187
+ {
1188
+ EditorUtility.SetDirty(atlas);
1189
+ }
1190
+
1191
+ if (refreshAssetsImmediately)
1192
+ {
1193
+ AssetDatabase.SaveAssets();
1194
+ AssetDatabase.Refresh();
1195
+ }
1196
+ this.Log(
1197
+ $"'{config.name}': Successfully generated/updated at {outputPath}. Sprites included: {config.spritesToPack.Count}."
1198
+ );
1199
+ }
1200
+
1201
+ private static void ApplyPlatformSettings(
1202
+ SpriteAtlas atlas,
1203
+ string platformName,
1204
+ int maxTextureSize,
1205
+ TextureImporterCompression compression,
1206
+ bool useCrunch,
1207
+ int crunchLevel
1208
+ )
1209
+ {
1210
+ TextureImporterPlatformSettings ps = atlas.GetPlatformSettings(platformName);
1211
+ if (string.IsNullOrWhiteSpace(ps.name))
1212
+ {
1213
+ ps.name = platformName;
1214
+ }
1215
+ ps.overridden = true;
1216
+ ps.maxTextureSize = maxTextureSize;
1217
+ ps.textureCompression = compression;
1218
+ ps.crunchedCompression = useCrunch;
1219
+ ps.compressionQuality = Mathf.Clamp(crunchLevel, 0, 100);
1220
+ atlas.SetPlatformSettings(ps);
1221
+ }
1222
+
1223
+ internal void PackAllProjectAtlases()
1224
+ {
1225
+ this.Log(
1226
+ $"Starting to pack all Sprite Atlases in the project for target: {EditorUserBuildSettings.activeBuildTarget}"
1227
+ );
1228
+ SpriteAtlasUtility.PackAllAtlases(EditorUserBuildSettings.activeBuildTarget);
1229
+ this.Log($"Finished packing all Sprite Atlases.");
1230
+ AssetDatabase.Refresh();
1231
+ }
1232
+
1233
+ private static void PingAtlas(string outputPath)
1234
+ {
1235
+ if (string.IsNullOrWhiteSpace(outputPath))
1236
+ {
1237
+ return;
1238
+ }
1239
+ Object obj = AssetDatabase.LoadAssetAtPath<Object>(outputPath);
1240
+ if (obj != null)
1241
+ {
1242
+ Selection.activeObject = obj;
1243
+ EditorGUIUtility.PingObject(obj);
1244
+ }
1245
+ }
1246
+
1247
+ private static void RevealInExplorer(string outputPath)
1248
+ {
1249
+ if (string.IsNullOrWhiteSpace(outputPath))
1250
+ {
1251
+ return;
1252
+ }
1253
+ EditorUtility.RevealInFinder(outputPath);
1254
+ }
1255
+
1256
+ private void ForceUncompressedSourceSprites(ScriptableSpriteAtlas config)
1257
+ {
1258
+ if (config == null)
1259
+ {
1260
+ return;
1261
+ }
1262
+
1263
+ List<Sprite> spritesToProcess = config
1264
+ .spritesToPack.Where(s => s != null && s.texture != null)
1265
+ .ToList();
1266
+ if (spritesToProcess.Count == 0)
1267
+ {
1268
+ this.LogWarn(
1269
+ $"'{config.name}': No valid sprites with textures in the list to modify."
1270
+ );
1271
+ Utils.EditorUi.Info(
1272
+ "No Sprites",
1273
+ "No valid sprites found in the configuration's list to process."
1274
+ );
1275
+ return;
1276
+ }
1277
+
1278
+ int modifiedCount = 0;
1279
+ int errorCount = 0;
1280
+ HashSet<string> processedAssetPaths = new();
1281
+
1282
+ List<TextureImporter> importers = new();
1283
+ AssetDatabase.StartAssetEditing();
1284
+ try
1285
+ {
1286
+ for (int i = 0; i < spritesToProcess.Count; ++i)
1287
+ {
1288
+ Sprite sprite = spritesToProcess[i];
1289
+ Utils.EditorUi.ShowProgress(
1290
+ "Modifying Source Sprite Import Settings",
1291
+ $"Processing: {sprite.name} ({i + 1}/{spritesToProcess.Count})",
1292
+ (float)(i + 1) / spritesToProcess.Count
1293
+ );
1294
+
1295
+ string assetPath = AssetDatabase.GetAssetPath(sprite.texture);
1296
+ if (string.IsNullOrWhiteSpace(assetPath))
1297
+ {
1298
+ this.LogWarn(
1299
+ $"Could not find asset path for sprite's texture: {sprite.name}. Skipping."
1300
+ );
1301
+ errorCount++;
1302
+ continue;
1303
+ }
1304
+
1305
+ if (!processedAssetPaths.Add(assetPath))
1306
+ {
1307
+ continue;
1308
+ }
1309
+
1310
+ TextureImporter importer =
1311
+ AssetImporter.GetAtPath(assetPath) as TextureImporter;
1312
+ if (importer == null)
1313
+ {
1314
+ this.LogWarn(
1315
+ $"Could not get TextureImporter for asset: {assetPath} (from sprite: {sprite.name}). Skipping."
1316
+ );
1317
+ errorCount++;
1318
+ continue;
1319
+ }
1320
+
1321
+ bool settingsActuallyModified = false;
1322
+
1323
+ if (importer.crunchedCompression)
1324
+ {
1325
+ importer.crunchedCompression = false;
1326
+ settingsActuallyModified = true;
1327
+ }
1328
+
1329
+ if (importer.textureCompression != TextureImporterCompression.Uncompressed)
1330
+ {
1331
+ importer.textureCompression = TextureImporterCompression.Uncompressed;
1332
+ settingsActuallyModified = true;
1333
+ }
1334
+
1335
+ TextureImporterPlatformSettings platformSettings =
1336
+ importer.GetDefaultPlatformTextureSettings();
1337
+ bool platformSettingsChangedThisTime = false;
1338
+ TextureImporterFormat targetFormat = importer.DoesSourceTextureHaveAlpha()
1339
+ ? TextureImporterFormat.RGBA32
1340
+ : TextureImporterFormat.RGB24;
1341
+
1342
+ if (platformSettings.format != targetFormat)
1343
+ {
1344
+ platformSettings.format = targetFormat;
1345
+ platformSettingsChangedThisTime = true;
1346
+ }
1347
+ if (platformSettings.crunchedCompression)
1348
+ {
1349
+ platformSettings.crunchedCompression = false;
1350
+ platformSettingsChangedThisTime = true;
1351
+ }
1352
+ if (platformSettings.compressionQuality != 100)
1353
+ {
1354
+ platformSettings.compressionQuality = 100;
1355
+ platformSettingsChangedThisTime = true;
1356
+ }
1357
+
1358
+ if (platformSettingsChangedThisTime || !platformSettings.overridden)
1359
+ {
1360
+ platformSettings.overridden = true;
1361
+ importer.SetPlatformTextureSettings(platformSettings);
1362
+ settingsActuallyModified = true;
1363
+ }
1364
+
1365
+ if (settingsActuallyModified)
1366
+ {
1367
+ importer.SaveAndReimport();
1368
+ importers.Add(importer);
1369
+ modifiedCount++;
1370
+ this.Log(
1371
+ $"Set import settings for texture: {assetPath} (from sprite: {sprite.name}) to uncompressed ({targetFormat})."
1372
+ );
1373
+ }
1374
+ }
1375
+ }
1376
+ finally
1377
+ {
1378
+ AssetDatabase.StopAssetEditing();
1379
+ Utils.EditorUi.ClearProgress();
1380
+ }
1381
+
1382
+ foreach (TextureImporter importer in importers)
1383
+ {
1384
+ importer.SaveAndReimport();
1385
+ }
1386
+
1387
+ if (modifiedCount > 0 || errorCount > 0)
1388
+ {
1389
+ AssetDatabase.SaveAssets();
1390
+ AssetDatabase.Refresh();
1391
+ }
1392
+
1393
+ string summaryMessage =
1394
+ $"Finished processing source sprite textures for '{config.name}'.\n"
1395
+ + $"Successfully modified importers for: {modifiedCount} textures.\n"
1396
+ + $"Errors/Skipped duplicates: {errorCount + (spritesToProcess.Count - processedAssetPaths.Count)}.";
1397
+ this.Log($"{summaryMessage}");
1398
+ }
1399
+
1400
+ private void SyncListToScanResult(ScriptableSpriteAtlas config, ScanResult result)
1401
+ {
1402
+ if (config == null || result == null || !result.hasScanned)
1403
+ {
1404
+ return;
1405
+ }
1406
+
1407
+ SerializedObject so = new(config);
1408
+ SerializedProperty spritesListProp = so.FindProperty(
1409
+ nameof(ScriptableSpriteAtlas.spritesToPack)
1410
+ );
1411
+
1412
+ Undo.RecordObject(config, "Sync Sprites To Scan Result");
1413
+
1414
+ // Build the target set = (current ∪ toAdd) \ toRemove
1415
+ using PooledResource<HashSet<Sprite>> targetSetRes = Buffers<Sprite>.HashSet.Get();
1416
+ HashSet<Sprite> targetSet = targetSetRes.resource;
1417
+
1418
+ for (int i = 0; i < spritesListProp.arraySize; ++i)
1419
+ {
1420
+ Object o = spritesListProp.GetArrayElementAtIndex(i).objectReferenceValue;
1421
+ if (o is Sprite s && s != null)
1422
+ {
1423
+ targetSet.Add(s);
1424
+ }
1425
+ }
1426
+
1427
+ foreach (Sprite s in result.spritesToAdd)
1428
+ {
1429
+ if (s != null)
1430
+ {
1431
+ targetSet.Add(s);
1432
+ }
1433
+ }
1434
+ foreach (Sprite s in result.spritesToRemove)
1435
+ {
1436
+ if (s != null)
1437
+ {
1438
+ targetSet.Remove(s);
1439
+ }
1440
+ }
1441
+
1442
+ // Rewrite list to match target set
1443
+ while (spritesListProp.arraySize > 0)
1444
+ {
1445
+ spritesListProp.DeleteArrayElementAtIndex(spritesListProp.arraySize - 1);
1446
+ }
1447
+ int index = 0;
1448
+ foreach (Sprite s in targetSet)
1449
+ {
1450
+ spritesListProp.InsertArrayElementAtIndex(index);
1451
+ spritesListProp.GetArrayElementAtIndex(index).objectReferenceValue = s;
1452
+ index++;
1453
+ }
1454
+
1455
+ so.ApplyModifiedProperties();
1456
+ config.spritesToPack.SortByName();
1457
+ EditorUtility.SetDirty(config);
1458
+ this.Log(
1459
+ $"'{config.name}': Synchronized sprite list to scan result. Now contains {config.spritesToPack.Count} sprites."
1460
+ );
1461
+
1462
+ // Refresh scan to reflect new state
1463
+ result.spritesToAdd.Clear();
1464
+ result.spritesToRemove.Clear();
1465
+ ScanFoldersForConfig(config);
1466
+ Repaint();
1467
+ }
1468
+ }
1469
+ #endif
1470
+ }