com.wallstop-studios.unity-helpers 2.0.0-rc81.6 → 2.0.0-rc81.9

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 (1449) 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 +49 -0
  7. package/.github/dependabot.yml +9 -9
  8. package/.github/workflows/csharpier.yml +135 -0
  9. package/.github/workflows/lint-doc-links.yml +27 -0
  10. package/.github/workflows/markdown-json.yml +41 -0
  11. package/.github/workflows/npm-publish.yml +75 -75
  12. package/.lychee.toml +26 -0
  13. package/.markdownlint.json +21 -0
  14. package/.markdownlintignore +8 -0
  15. package/.pre-commit-config.yaml +39 -22
  16. package/.prettierignore +22 -0
  17. package/.prettierrc.json +20 -0
  18. package/AGENTS.md +52 -0
  19. package/{Third Party Notices.md.meta → AGENTS.md.meta} +7 -7
  20. package/CHANGELOG.md.meta +7 -7
  21. package/DATA_STRUCTURES.md +324 -0
  22. package/DATA_STRUCTURES.md.meta +7 -0
  23. package/Docs/Images/attribute_resolution.svg +40 -0
  24. package/Docs/Images/attribute_resolution.svg.meta +7 -0
  25. package/Docs/Images/bitset.svg +47 -0
  26. package/Docs/Images/bitset.svg.meta +7 -0
  27. package/Docs/Images/concave_hull.svg +30 -0
  28. package/Docs/Images/concave_hull.svg.meta +7 -0
  29. package/Docs/Images/convex_hull.svg +29 -0
  30. package/Docs/Images/convex_hull.svg.meta +7 -0
  31. package/Docs/Images/cyclic_buffer.svg +37 -0
  32. package/Docs/Images/cyclic_buffer.svg.meta +7 -0
  33. package/Docs/Images/data_distribution_decision.svg +88 -0
  34. package/Docs/Images/data_distribution_decision.svg.meta +7 -0
  35. package/Docs/Images/deque.svg +64 -0
  36. package/Docs/Images/deque.svg.meta +7 -0
  37. package/Docs/Images/deque_queue.svg +107 -0
  38. package/Docs/Images/deque_queue.svg.meta +7 -0
  39. package/Docs/Images/disjoint_set.svg +47 -0
  40. package/Docs/Images/disjoint_set.svg.meta +7 -0
  41. package/Docs/Images/effects_pipeline.svg +59 -0
  42. package/Docs/Images/effects_pipeline.svg.meta +7 -0
  43. package/Docs/Images/geometry_edge_cases.svg +61 -0
  44. package/Docs/Images/geometry_edge_cases.svg.meta +7 -0
  45. package/Docs/Images/heap.svg +56 -0
  46. package/Docs/Images/heap.svg.meta +7 -0
  47. package/Docs/Images/kdtree_2d.svg +38 -0
  48. package/Docs/Images/kdtree_2d.svg.meta +7 -0
  49. package/Docs/Images/kdtree_3d.svg +83 -0
  50. package/Docs/Images/kdtree_3d.svg.meta +7 -0
  51. package/Docs/Images/octree_3d.svg +79 -0
  52. package/Docs/Images/octree_3d.svg.meta +7 -0
  53. package/Docs/Images/polyline_simplify.svg +18 -0
  54. package/Docs/Images/polyline_simplify.svg.meta +7 -0
  55. package/Docs/Images/quadtree_2d.svg +37 -0
  56. package/Docs/Images/quadtree_2d.svg.meta +7 -0
  57. package/Docs/Images/query_boundaries.svg +38 -0
  58. package/Docs/Images/query_boundaries.svg.meta +7 -0
  59. package/Docs/Images/random_generators.svg +105 -0
  60. package/Docs/Images/random_generators.svg.meta +7 -0
  61. package/Docs/Images/reflection_scan.svg +33 -0
  62. package/Docs/Images/reflection_scan.svg.meta +7 -0
  63. package/Docs/Images/relational_wiring.svg +75 -0
  64. package/Docs/Images/relational_wiring.svg.meta +7 -0
  65. package/Docs/Images/rtree_2d.svg +27 -0
  66. package/Docs/Images/rtree_2d.svg.meta +7 -0
  67. package/Docs/Images/rtree_3d.svg +79 -0
  68. package/Docs/Images/rtree_3d.svg.meta +7 -0
  69. package/Docs/Images/serialization_flow.svg +50 -0
  70. package/Docs/Images/serialization_flow.svg.meta +7 -0
  71. package/Docs/Images/singletons_lifecycle.svg +54 -0
  72. package/Docs/Images/singletons_lifecycle.svg.meta +7 -0
  73. package/Docs/Images/sparse_set.svg +54 -0
  74. package/Docs/Images/sparse_set.svg.meta +7 -0
  75. package/Docs/Images/trie.svg +55 -0
  76. package/Docs/Images/trie.svg.meta +7 -0
  77. package/Docs/Images.meta +8 -0
  78. package/Docs.meta +8 -0
  79. package/EDITOR_TOOLS_GUIDE.md +1976 -0
  80. package/EDITOR_TOOLS_GUIDE.md.meta +7 -0
  81. package/EFFECTS_SYSTEM.md +242 -0
  82. package/EFFECTS_SYSTEM.md.meta +7 -0
  83. package/EFFECTS_SYSTEM_TUTORIAL.md +467 -0
  84. package/EFFECTS_SYSTEM_TUTORIAL.md.meta +7 -0
  85. package/Editor/AnimationEventEditor.cs +1393 -874
  86. package/Editor/AnimationEventEditor.cs.meta +11 -11
  87. package/Editor/AssemblyInfo.cs +4 -0
  88. package/Editor/AssemblyInfo.cs.meta +3 -0
  89. package/Editor/AssetProcessors/SpriteLabelProcessor.cs +138 -111
  90. package/Editor/AssetProcessors/SpriteLabelProcessor.cs.meta +2 -2
  91. package/Editor/AssetProcessors.meta +2 -2
  92. package/Editor/Core/Helper/AnimationEventHelpers.cs +204 -0
  93. package/{Runtime/Core/DataStructure/ISpatialTree.cs.meta → Editor/Core/Helper/AnimationEventHelpers.cs.meta} +11 -11
  94. package/Editor/Core/Helper.meta +8 -0
  95. package/Editor/Core.meta +8 -0
  96. package/Editor/CustomDrawers/IntDropdownDrawer.cs +46 -46
  97. package/Editor/CustomDrawers/IntDropdownDrawer.cs.meta +2 -2
  98. package/Editor/CustomDrawers/StringInListeDrawer.cs +135 -135
  99. package/Editor/CustomDrawers/StringInListeDrawer.cs.meta +2 -2
  100. package/Editor/CustomDrawers/WShowIfPropertyDrawer.cs +105 -105
  101. package/Editor/CustomDrawers/WShowIfPropertyDrawer.cs.meta +2 -2
  102. package/Editor/CustomDrawers.meta +2 -2
  103. package/Editor/CustomEditors/MatchColliderToSpriteEditor.cs +32 -32
  104. package/Editor/CustomEditors/MatchColliderToSpriteEditor.cs.meta +2 -2
  105. package/Editor/CustomEditors/PersistentDirectoryGUI.cs +799 -799
  106. package/Editor/CustomEditors/PersistentDirectoryGUI.cs.meta +2 -2
  107. package/Editor/CustomEditors/PolygonCollider2DOptimizerEditor.cs +38 -40
  108. package/Editor/CustomEditors/PolygonCollider2DOptimizerEditor.cs.meta +2 -2
  109. package/Editor/CustomEditors/SourceFolderEntryDrawer.cs +685 -413
  110. package/Editor/CustomEditors/SourceFolderEntryDrawer.cs.meta +2 -2
  111. package/Editor/CustomEditors/TexturePlatformOverrideEntryDrawer.cs +146 -0
  112. package/{Runtime/Core/DataStructure/KDTree.cs.meta → Editor/CustomEditors/TexturePlatformOverrideEntryDrawer.cs.meta} +11 -11
  113. package/Editor/CustomEditors.meta +2 -2
  114. package/Editor/Extensions/SerializedPropertyExtensions.cs +217 -190
  115. package/Editor/Extensions/SerializedPropertyExtensions.cs.meta +2 -2
  116. package/Editor/Extensions/UnityExtensions.cs +50 -26
  117. package/Editor/Extensions/UnityExtensions.cs.meta +2 -2
  118. package/Editor/Extensions.meta +2 -2
  119. package/Editor/FitTextureSizeWindow.cs +785 -332
  120. package/Editor/FitTextureSizeWindow.cs.meta +2 -2
  121. package/Editor/Persistence/MultiFileSelectorPersistenceManager.cs +62 -0
  122. package/{Runtime/Core/DataStructure/QuadTree.cs.meta → Editor/Persistence/MultiFileSelectorPersistenceManager.cs.meta} +11 -11
  123. package/Editor/Persistence/MultiFileSelectorPersistenceWindow.cs +65 -0
  124. package/Editor/Persistence/MultiFileSelectorPersistenceWindow.cs.meta +11 -0
  125. package/Editor/Persistence.meta +8 -0
  126. package/Editor/PersistentDirectorySettings.cs +529 -248
  127. package/Editor/PersistentDirectorySettings.cs.meta +2 -2
  128. package/Editor/PrefabChecker.cs +1329 -741
  129. package/Editor/PrefabChecker.cs.meta +11 -11
  130. package/Editor/Sprites/AnimationCopier.cs +1518 -789
  131. package/Editor/Sprites/AnimationCopier.cs.meta +2 -2
  132. package/Editor/Sprites/AnimationCreator.cs +1532 -881
  133. package/Editor/Sprites/AnimationCreator.cs.meta +11 -11
  134. package/Editor/Sprites/AnimationViewerWindow.cs +1634 -1522
  135. package/Editor/Sprites/AnimationViewerWindow.cs.meta +2 -2
  136. package/Editor/Sprites/ScriptableSpriteAtlas.cs +251 -178
  137. package/Editor/Sprites/ScriptableSpriteAtlas.cs.meta +2 -2
  138. package/Editor/Sprites/ScriptableSpriteAtlasEditor.cs +1470 -1026
  139. package/Editor/Sprites/ScriptableSpriteAtlasEditor.cs.meta +2 -2
  140. package/Editor/Sprites/SpriteCropper.cs +1013 -523
  141. package/Editor/Sprites/SpriteCropper.cs.meta +2 -2
  142. package/Editor/Sprites/SpritePivotAdjustor.cs +605 -265
  143. package/Editor/Sprites/SpritePivotAdjustor.cs.meta +2 -2
  144. package/Editor/Sprites/SpriteSettingsApplier.cs +942 -918
  145. package/Editor/Sprites/SpriteSettingsApplier.cs.meta +2 -2
  146. package/Editor/Sprites/SpriteSettingsApplierAPI.cs +441 -0
  147. package/Editor/Sprites/SpriteSettingsApplierAPI.cs.meta +11 -0
  148. package/Editor/Sprites/SpriteSettingsProfileCollection.cs +12 -0
  149. package/Editor/Sprites/SpriteSettingsProfileCollection.cs.meta +11 -0
  150. package/Editor/Sprites/SpriteSheetAnimationCreator.cs +1586 -1537
  151. package/Editor/Sprites/SpriteSheetAnimationCreator.cs.meta +2 -2
  152. package/Editor/Sprites/TexturePlatformNameHelper.cs +78 -0
  153. package/Editor/Sprites/TexturePlatformNameHelper.cs.meta +11 -0
  154. package/Editor/Sprites/TextureResizerWizard.cs +434 -175
  155. package/Editor/Sprites/TextureResizerWizard.cs.meta +2 -2
  156. package/Editor/Sprites/TextureSettingsApplierAPI.cs +359 -0
  157. package/Editor/Sprites/TextureSettingsApplierAPI.cs.meta +11 -0
  158. package/Editor/Sprites/TextureSettingsApplierWindow.cs +605 -0
  159. package/Editor/Sprites/TextureSettingsApplierWindow.cs.meta +11 -0
  160. package/Editor/Sprites.meta +2 -2
  161. package/Editor/Styles/AnimationViewer.uss +115 -115
  162. package/Editor/Styles/AnimationViewer.uss.meta +2 -2
  163. package/Editor/Styles/AnimationViewer.uxml +56 -56
  164. package/Editor/Styles/AnimationViewer.uxml.meta +2 -2
  165. package/Editor/Styles/SpriteSheetAnimationCreator.uss +10 -0
  166. package/Editor/Styles/SpriteSheetAnimationCreator.uss.meta +11 -0
  167. package/Editor/Styles.meta +2 -2
  168. package/Editor/Tags/AttributeMetadataCacheEditor.cs +46 -0
  169. package/Editor/Tags/AttributeMetadataCacheEditor.cs.meta +11 -0
  170. package/Editor/Tags/AttributeMetadataCacheGenerator.cs +258 -0
  171. package/Editor/Tags/AttributeMetadataCacheGenerator.cs.meta +11 -0
  172. package/Editor/Tags.meta +8 -0
  173. package/Editor/Tools/ImageBlurTool.cs +451 -409
  174. package/Editor/Tools/ImageBlurTool.cs.meta +2 -2
  175. package/Editor/Tools.meta +2 -2
  176. package/Editor/Utils/DxReadOnlyPropertyDrawer.cs +26 -26
  177. package/Editor/Utils/DxReadOnlyPropertyDrawer.cs.meta +11 -11
  178. package/Editor/Utils/EditorUi.cs +228 -0
  179. package/Editor/Utils/EditorUi.cs.meta +11 -0
  180. package/Editor/Utils/EditorUtilities.cs +22 -22
  181. package/Editor/Utils/EditorUtilities.cs.meta +11 -11
  182. package/Editor/Utils/ScriptableObjectSingletonCreator.cs +633 -52
  183. package/Editor/Utils/ScriptableObjectSingletonCreator.cs.meta +2 -2
  184. package/Editor/Utils.meta +8 -8
  185. package/Editor/Visuals/EnhancedImageEditor.cs +160 -160
  186. package/Editor/Visuals/EnhancedImageEditor.cs.meta +11 -11
  187. package/Editor/Visuals.meta +2 -2
  188. package/Editor/WallstopStudios.UnityHelpers.Editor.asmdef +14 -18
  189. package/Editor/WallstopStudios.UnityHelpers.Editor.asmdef.meta +7 -7
  190. package/Editor.meta +8 -8
  191. package/GETTING_STARTED.md +425 -0
  192. package/GETTING_STARTED.md.meta +7 -0
  193. package/GLOSSARY.md +313 -0
  194. package/GLOSSARY.md.meta +7 -0
  195. package/HULLS.md +45 -0
  196. package/HULLS.md.meta +7 -0
  197. package/INDEX.md +429 -0
  198. package/INDEX.md.meta +7 -0
  199. package/LICENSE +21 -21
  200. package/LICENSE.md +7 -7
  201. package/LICENSE.md.meta +7 -7
  202. package/LICENSE.meta +7 -7
  203. package/MATH_AND_EXTENSIONS.md +316 -0
  204. package/MATH_AND_EXTENSIONS.md.meta +7 -0
  205. package/RANDOM_PERFORMANCE.md +140 -0
  206. package/RANDOM_PERFORMANCE.md.meta +7 -0
  207. package/README.md +3195 -188
  208. package/README.md.meta +7 -7
  209. package/REFLECTION_HELPERS.md +272 -0
  210. package/REFLECTION_HELPERS.md.meta +7 -0
  211. package/RELATIONAL_COMPONENTS.md +543 -0
  212. package/RELATIONAL_COMPONENTS.md.meta +7 -0
  213. package/Runtime/AssemblyInfo.cs +7 -0
  214. package/Runtime/AssemblyInfo.cs.meta +11 -0
  215. package/Runtime/Binaries/Microsoft.Bcl.AsyncInterfaces.dll +0 -0
  216. package/Runtime/Binaries/Microsoft.Bcl.AsyncInterfaces.dll.meta +33 -33
  217. package/Runtime/Binaries/Microsoft.Bcl.AsyncInterfaces.xml +499 -278
  218. package/Runtime/Binaries/Microsoft.Bcl.AsyncInterfaces.xml.meta +7 -7
  219. package/Runtime/Binaries/System.IO.Pipelines.dll +0 -0
  220. package/Runtime/Binaries/System.IO.Pipelines.dll.meta +33 -0
  221. package/Runtime/Binaries/System.IO.Pipelines.xml +702 -0
  222. package/Runtime/Binaries/System.IO.Pipelines.xml.meta +7 -0
  223. package/Runtime/Binaries/System.Text.Encodings.Web.dll +0 -0
  224. package/Runtime/Binaries/System.Text.Encodings.Web.dll.meta +33 -33
  225. package/Runtime/Binaries/System.Text.Encodings.Web.xml +1084 -1079
  226. package/Runtime/Binaries/System.Text.Encodings.Web.xml.meta +7 -7
  227. package/Runtime/Binaries/System.Text.Json.dll +0 -0
  228. package/Runtime/Binaries/System.Text.Json.dll.meta +33 -33
  229. package/Runtime/Binaries/System.Text.Json.xml +10217 -8116
  230. package/Runtime/Binaries/System.Text.Json.xml.meta +7 -7
  231. package/Runtime/Binaries.meta +8 -8
  232. package/Runtime/Core/Attributes/AnimationEventAttribute.cs +10 -138
  233. package/Runtime/Core/Attributes/AnimationEventAttribute.cs.meta +11 -11
  234. package/Runtime/Core/Attributes/BaseRelationalComponentAttribute.cs +841 -0
  235. package/Runtime/Core/Attributes/BaseRelationalComponentAttribute.cs.meta +11 -0
  236. package/Runtime/Core/Attributes/ChildComponentAttribute.cs +284 -226
  237. package/Runtime/Core/Attributes/ChildComponentAttribute.cs.meta +11 -11
  238. package/Runtime/Core/Attributes/DxReadOnlyAttribute.cs +6 -6
  239. package/Runtime/Core/Attributes/DxReadOnlyAttribute.cs.meta +11 -11
  240. package/Runtime/Core/Attributes/EnumDisplayNameAttribute.cs +15 -15
  241. package/Runtime/Core/Attributes/EnumDisplayNameAttribute.cs.meta +2 -2
  242. package/Runtime/Core/Attributes/IRelationalComponentAssigner.cs +36 -0
  243. package/Runtime/Core/Attributes/IRelationalComponentAssigner.cs.meta +11 -0
  244. package/Runtime/Core/Attributes/IntDropdownAttribute.cs +14 -14
  245. package/Runtime/Core/Attributes/IntDropdownAttribute.cs.meta +2 -2
  246. package/Runtime/Core/Attributes/KSerializableAttribute.cs +19 -19
  247. package/Runtime/Core/Attributes/KSerializableAttribute.cs.meta +11 -11
  248. package/Runtime/Core/Attributes/NotNullAttribute.cs +32 -32
  249. package/Runtime/Core/Attributes/NotNullAttribute.cs.meta +11 -11
  250. package/Runtime/Core/Attributes/ParentComponentAttribute.cs +376 -0
  251. package/Runtime/Core/Attributes/{ParentComponent.cs.meta → ParentComponentAttribute.cs.meta} +11 -11
  252. package/Runtime/Core/Attributes/RelationalComponentAssigner.cs +107 -0
  253. package/Runtime/Core/Attributes/RelationalComponentAssigner.cs.meta +11 -0
  254. package/Runtime/Core/Attributes/RelationalComponentExtensions.cs +61 -14
  255. package/Runtime/Core/Attributes/RelationalComponentExtensions.cs.meta +11 -11
  256. package/Runtime/Core/Attributes/RelationalComponentInitializer.cs +331 -0
  257. package/Runtime/Core/Attributes/RelationalComponentInitializer.cs.meta +11 -0
  258. package/Runtime/Core/Attributes/ScriptableSingletonPathAttribute.cs +15 -15
  259. package/Runtime/Core/Attributes/ScriptableSingletonPathAttribute.cs.meta +2 -2
  260. package/Runtime/Core/Attributes/SiblingComponentAttribute.cs +264 -137
  261. package/Runtime/Core/Attributes/SiblingComponentAttribute.cs.meta +11 -11
  262. package/Runtime/Core/Attributes/ValidateAssignmentAttribute.cs +115 -106
  263. package/Runtime/Core/Attributes/ValidateAssignmentAttribute.cs.meta +11 -11
  264. package/Runtime/Core/Attributes/ValueHelpers.cs +10 -0
  265. package/Runtime/Core/Attributes/ValueHelpers.cs.meta +3 -0
  266. package/Runtime/Core/Attributes/WShowIfAttribute.cs +24 -24
  267. package/Runtime/Core/Attributes/WShowIfAttribute.cs.meta +2 -2
  268. package/Runtime/Core/Attributes.meta +8 -8
  269. package/Runtime/Core/DataStructure/Adapters/FastVector2Int.cs +192 -92
  270. package/Runtime/Core/DataStructure/Adapters/FastVector2Int.cs.meta +11 -11
  271. package/Runtime/Core/DataStructure/Adapters/FastVector3Int.cs +268 -185
  272. package/Runtime/Core/DataStructure/Adapters/FastVector3Int.cs.meta +11 -11
  273. package/Runtime/Core/DataStructure/Adapters/KGuid.cs +360 -305
  274. package/Runtime/Core/DataStructure/Adapters/KGuid.cs.meta +11 -11
  275. package/Runtime/Core/DataStructure/Adapters/KVector2.cs +146 -80
  276. package/Runtime/Core/DataStructure/Adapters/KVector2.cs.meta +11 -11
  277. package/Runtime/Core/DataStructure/Adapters.meta +8 -8
  278. package/Runtime/Core/DataStructure/BitSet.cs +626 -0
  279. package/Runtime/Core/DataStructure/BitSet.cs.meta +11 -0
  280. package/Runtime/Core/DataStructure/BoundingBox3D.cs +405 -0
  281. package/Runtime/Core/DataStructure/BoundingBox3D.cs.meta +11 -0
  282. package/Runtime/Core/DataStructure/Circle.cs +203 -50
  283. package/Runtime/Core/DataStructure/Circle.cs.meta +11 -11
  284. package/Runtime/Core/DataStructure/CyclicBuffer.cs +489 -266
  285. package/Runtime/Core/DataStructure/CyclicBuffer.cs.meta +11 -11
  286. package/Runtime/Core/DataStructure/Deque.cs +561 -0
  287. package/Runtime/Core/DataStructure/Deque.cs.meta +11 -0
  288. package/Runtime/Core/DataStructure/DisjointSet.cs +483 -0
  289. package/Runtime/Core/DataStructure/DisjointSet.cs.meta +11 -0
  290. package/Runtime/Core/DataStructure/Heap.cs +514 -0
  291. package/Runtime/Core/DataStructure/Heap.cs.meta +11 -0
  292. package/Runtime/Core/DataStructure/{ISpatialTree.cs → ISpatialTree2D.cs} +25 -21
  293. package/Runtime/Core/DataStructure/ISpatialTree2D.cs.meta +11 -0
  294. package/Runtime/Core/DataStructure/ISpatialTree3D.cs +33 -0
  295. package/Runtime/Core/DataStructure/ISpatialTree3D.cs.meta +11 -0
  296. package/Runtime/Core/DataStructure/ImmutableBitSet.cs +398 -0
  297. package/Runtime/Core/DataStructure/ImmutableBitSet.cs.meta +3 -0
  298. package/Runtime/Core/DataStructure/KDTree2D.cs +852 -0
  299. package/Runtime/Core/DataStructure/KDTree2D.cs.meta +11 -0
  300. package/Runtime/Core/DataStructure/KDTree3D.cs +911 -0
  301. package/Runtime/Core/DataStructure/KDTree3D.cs.meta +11 -0
  302. package/Runtime/Core/DataStructure/OctTree3D.cs +983 -0
  303. package/Runtime/Core/DataStructure/OctTree3D.cs.meta +11 -0
  304. package/Runtime/Core/DataStructure/PriorityQueue.cs +194 -0
  305. package/Runtime/Core/DataStructure/PriorityQueue.cs.meta +11 -0
  306. package/Runtime/Core/DataStructure/QuadTree2D.cs +722 -0
  307. package/Runtime/Core/DataStructure/QuadTree2D.cs.meta +11 -0
  308. package/Runtime/Core/DataStructure/RTree2D.cs +704 -0
  309. package/Runtime/Core/DataStructure/{RTree.cs.meta → RTree2D.cs.meta} +11 -11
  310. package/Runtime/Core/DataStructure/RTree3D.cs +775 -0
  311. package/Runtime/Core/DataStructure/RTree3D.cs.meta +11 -0
  312. package/Runtime/Core/DataStructure/SparseSet.cs +597 -0
  313. package/Runtime/Core/DataStructure/SparseSet.cs.meta +11 -0
  314. package/Runtime/Core/DataStructure/SpatialHash2D.cs +312 -0
  315. package/Runtime/Core/DataStructure/SpatialHash2D.cs.meta +3 -0
  316. package/Runtime/Core/DataStructure/SpatialHash3D.cs +341 -0
  317. package/Runtime/Core/DataStructure/SpatialHash3D.cs.meta +11 -0
  318. package/Runtime/Core/DataStructure/Sphere.cs +264 -0
  319. package/Runtime/Core/DataStructure/Sphere.cs.meta +11 -0
  320. package/Runtime/Core/DataStructure/StringWrapper.cs +115 -91
  321. package/Runtime/Core/DataStructure/StringWrapper.cs.meta +11 -11
  322. package/Runtime/Core/DataStructure/TimedCache.cs +88 -66
  323. package/Runtime/Core/DataStructure/TimedCache.cs.meta +11 -11
  324. package/Runtime/Core/DataStructure/Trie.cs +660 -359
  325. package/Runtime/Core/DataStructure/Trie.cs.meta +2 -2
  326. package/Runtime/Core/DataStructure.meta +8 -8
  327. package/Runtime/Core/Extension/AnimatorExtensions.cs +40 -25
  328. package/Runtime/Core/Extension/AnimatorExtensions.cs.meta +11 -11
  329. package/Runtime/Core/Extension/AsyncOperationExtensions.cs +404 -110
  330. package/Runtime/Core/Extension/AsyncOperationExtensions.cs.meta +2 -2
  331. package/Runtime/Core/Extension/CircleExtensions.cs +125 -25
  332. package/Runtime/Core/Extension/CircleExtensions.cs.meta +11 -11
  333. package/Runtime/Core/Extension/ColorExtensions.cs +983 -644
  334. package/Runtime/Core/Extension/ColorExtensions.cs.meta +11 -11
  335. package/Runtime/Core/Extension/DictionaryExtensions.cs +606 -299
  336. package/Runtime/Core/Extension/DictionaryExtensions.cs.meta +11 -11
  337. package/Runtime/Core/Extension/DirectionExtensions.cs +377 -213
  338. package/Runtime/Core/Extension/DirectionExtensions.cs.meta +11 -11
  339. package/Runtime/Core/Extension/EnumExtensions.cs +535 -137
  340. package/Runtime/Core/Extension/EnumExtensions.cs.meta +2 -2
  341. package/Runtime/Core/Extension/IEnumerableExtensions.cs +341 -124
  342. package/Runtime/Core/Extension/IEnumerableExtensions.cs.meta +11 -11
  343. package/Runtime/Core/Extension/IListExtensions.cs +767 -248
  344. package/Runtime/Core/Extension/IListExtensions.cs.meta +11 -11
  345. package/Runtime/Core/Extension/IReadonlyListExtensions.cs +687 -37
  346. package/Runtime/Core/Extension/IReadonlyListExtensions.cs.meta +2 -2
  347. package/Runtime/Core/Extension/ProtoEqualityExtensions.cs +292 -0
  348. package/Runtime/Core/Extension/ProtoEqualityExtensions.cs.meta +3 -0
  349. package/Runtime/Core/Extension/RandomExtensions.cs +938 -109
  350. package/Runtime/Core/Extension/RandomExtensions.cs.meta +11 -11
  351. package/Runtime/Core/Extension/StringExtensions.cs +1635 -239
  352. package/Runtime/Core/Extension/StringExtensions.cs.meta +11 -11
  353. package/Runtime/Core/Extension/UnityExtensions.cs +4555 -1689
  354. package/Runtime/Core/Extension/UnityExtensions.cs.meta +11 -11
  355. package/Runtime/Core/Extension/WallstopStudiosLogger.cs +271 -245
  356. package/Runtime/Core/Extension/WallstopStudiosLogger.cs.meta +11 -11
  357. package/Runtime/Core/Extension.meta +8 -8
  358. package/Runtime/Core/Helper/ArrayConverter.cs +73 -39
  359. package/Runtime/Core/Helper/ArrayConverter.cs.meta +2 -2
  360. package/Runtime/Core/Helper/AssignUtilities.cs +33 -14
  361. package/Runtime/Core/Helper/AssignUtilities.cs.meta +11 -11
  362. package/Runtime/Core/Helper/DirectoryHelper.cs +210 -196
  363. package/Runtime/Core/Helper/DirectoryHelper.cs.meta +2 -2
  364. package/Runtime/Core/Helper/Enumerables.cs +51 -17
  365. package/Runtime/Core/Helper/Enumerables.cs.meta +11 -11
  366. package/Runtime/Core/Helper/FileHelper.cs +97 -77
  367. package/Runtime/Core/Helper/FileHelper.cs.meta +2 -2
  368. package/Runtime/Core/Helper/FormattingHelpers.cs +49 -38
  369. package/Runtime/Core/Helper/FormattingHelpers.cs.meta +2 -2
  370. package/Runtime/Core/Helper/FuncBasedComparer.cs +29 -0
  371. package/Runtime/Core/Helper/FuncBasedComparer.cs.meta +3 -0
  372. package/Runtime/Core/Helper/Geometry.cs +65 -43
  373. package/Runtime/Core/Helper/Geometry.cs.meta +11 -11
  374. package/Runtime/Core/Helper/Helpers.cs +1271 -831
  375. package/Runtime/Core/Helper/Helpers.cs.meta +11 -11
  376. package/Runtime/Core/Helper/IterationHelpers.cs +83 -32
  377. package/Runtime/Core/Helper/IterationHelpers.cs.meta +11 -11
  378. package/Runtime/Core/Helper/LifetimeHelpers.cs +20 -13
  379. package/Runtime/Core/Helper/LifetimeHelpers.cs.meta +11 -11
  380. package/Runtime/Core/Helper/LineHelper.cs +259 -194
  381. package/Runtime/Core/Helper/LineHelper.cs.meta +2 -2
  382. package/Runtime/Core/Helper/Logging/UnityLogTagFormatter.cs +549 -539
  383. package/Runtime/Core/Helper/Logging/UnityLogTagFormatter.cs.meta +2 -2
  384. package/Runtime/Core/Helper/Logging.meta +2 -2
  385. package/Runtime/Core/Helper/Objects.cs +477 -769
  386. package/Runtime/Core/Helper/Objects.cs.meta +11 -11
  387. package/Runtime/Core/Helper/Partials/LogHelpers.cs +13 -13
  388. package/Runtime/Core/Helper/Partials/LogHelpers.cs.meta +2 -2
  389. package/Runtime/Core/Helper/Partials/MathHelpers.cs +45 -30
  390. package/Runtime/Core/Helper/Partials/MathHelpers.cs.meta +2 -2
  391. package/Runtime/Core/Helper/Partials/ObjectHelpers.cs +506 -400
  392. package/Runtime/Core/Helper/Partials/ObjectHelpers.cs.meta +2 -2
  393. package/Runtime/Core/Helper/Partials/TransformHelpers.cs +393 -377
  394. package/Runtime/Core/Helper/Partials/TransformHelpers.cs.meta +2 -2
  395. package/Runtime/Core/Helper/Partials.meta +2 -2
  396. package/Runtime/Core/Helper/PathHelper.cs +42 -15
  397. package/Runtime/Core/Helper/PathHelper.cs.meta +2 -2
  398. package/Runtime/Core/Helper/ReflectionHelpers.cs +5287 -1963
  399. package/Runtime/Core/Helper/ReflectionHelpers.cs.meta +2 -2
  400. package/Runtime/Core/Helper/ReverseComparer.cs +33 -0
  401. package/Runtime/Core/Helper/ReverseComparer.cs.meta +3 -0
  402. package/Runtime/Core/Helper/SceneHelper.cs +251 -224
  403. package/Runtime/Core/Helper/SceneHelper.cs.meta +2 -2
  404. package/Runtime/Core/Helper/SpriteHelpers.cs +50 -41
  405. package/Runtime/Core/Helper/SpriteHelpers.cs.meta +11 -11
  406. package/Runtime/Core/Helper/StringInList.cs +61 -35
  407. package/Runtime/Core/Helper/StringInList.cs.meta +11 -11
  408. package/Runtime/Core/Helper/TestAssemblyHelper.cs +134 -0
  409. package/Runtime/Core/Helper/TestAssemblyHelper.cs.meta +11 -0
  410. package/Runtime/Core/Helper/UnityMainThreadDispatcher.cs +100 -82
  411. package/Runtime/Core/Helper/UnityMainThreadDispatcher.cs.meta +2 -2
  412. package/Runtime/Core/Helper/WallMath.cs +672 -166
  413. package/Runtime/Core/Helper/WallMath.cs.meta +11 -11
  414. package/Runtime/Core/Helper.meta +8 -8
  415. package/Runtime/Core/Math/Line2D.cs +263 -0
  416. package/Runtime/Core/Math/Line2D.cs.meta +11 -0
  417. package/Runtime/Core/Math/Line3D.cs +452 -0
  418. package/Runtime/Core/Math/Line3D.cs.meta +11 -0
  419. package/Runtime/Core/Math/Parabola.cs +241 -47
  420. package/Runtime/Core/Math/Parabola.cs.meta +11 -11
  421. package/Runtime/Core/Math/PointPolygonCheck.cs +175 -36
  422. package/Runtime/Core/Math/PointPolygonCheck.cs.meta +11 -11
  423. package/Runtime/Core/Math/Range.cs +157 -92
  424. package/Runtime/Core/Math/Range.cs.meta +11 -11
  425. package/Runtime/Core/Math.meta +8 -8
  426. package/Runtime/Core/Model/Direction.cs +25 -43
  427. package/Runtime/Core/Model/Direction.cs.meta +11 -11
  428. package/Runtime/Core/Model.meta +8 -8
  429. package/Runtime/Core/OneOf/FastOneOf.cs +252 -152
  430. package/Runtime/Core/OneOf/FastOneOf.cs.meta +11 -11
  431. package/Runtime/Core/OneOf/FastOneOf2.cs +198 -0
  432. package/Runtime/Core/OneOf/FastOneOf2.cs.meta +11 -0
  433. package/Runtime/Core/OneOf/FastOneOf4.cs +324 -0
  434. package/Runtime/Core/OneOf/FastOneOf4.cs.meta +11 -0
  435. package/Runtime/Core/OneOf/None.cs +30 -4
  436. package/Runtime/Core/OneOf/None.cs.meta +11 -11
  437. package/Runtime/Core/OneOf.meta +8 -8
  438. package/Runtime/Core/Random/AbstractRandom.cs +1318 -655
  439. package/Runtime/Core/Random/AbstractRandom.cs.meta +11 -11
  440. package/Runtime/Core/Random/DotNetRandom.cs +118 -54
  441. package/Runtime/Core/Random/DotNetRandom.cs.meta +2 -2
  442. package/Runtime/Core/Random/IRandom.cs +203 -161
  443. package/Runtime/Core/Random/IRandom.cs.meta +11 -11
  444. package/Runtime/Core/Random/IllusionFlow.cs +171 -107
  445. package/Runtime/Core/Random/IllusionFlow.cs.meta +2 -2
  446. package/Runtime/Core/Random/LinearCongruentialGenerator.cs +90 -49
  447. package/Runtime/Core/Random/LinearCongruentialGenerator.cs.meta +2 -2
  448. package/Runtime/Core/Random/NativePcgRandom.cs +139 -97
  449. package/Runtime/Core/Random/NativePcgRandom.cs.meta +11 -11
  450. package/Runtime/Core/Random/PRNG.cs +21 -7
  451. package/Runtime/Core/Random/PRNG.cs.meta +2 -2
  452. package/Runtime/Core/Random/PcgRandom.cs +243 -149
  453. package/Runtime/Core/Random/PcgRandom.cs.meta +11 -11
  454. package/Runtime/Core/Random/PerlinNoise.cs +369 -369
  455. package/Runtime/Core/Random/PerlinNoise.cs.meta +2 -2
  456. package/Runtime/Core/Random/RandomComparer.cs +34 -0
  457. package/Runtime/Core/Random/RandomComparer.cs.meta +3 -0
  458. package/Runtime/Core/Random/RandomState.cs +206 -131
  459. package/Runtime/Core/Random/RandomState.cs.meta +11 -11
  460. package/Runtime/Core/Random/RandomUtilities.cs +55 -26
  461. package/Runtime/Core/Random/RandomUtilities.cs.meta +11 -11
  462. package/Runtime/Core/Random/RomuDuo.cs +171 -116
  463. package/Runtime/Core/Random/RomuDuo.cs.meta +2 -2
  464. package/Runtime/Core/Random/SplitMix64.cs +134 -94
  465. package/Runtime/Core/Random/SplitMix64.cs.meta +2 -2
  466. package/Runtime/Core/Random/SquirrelRandom.cs +127 -84
  467. package/Runtime/Core/Random/SquirrelRandom.cs.meta +11 -11
  468. package/Runtime/Core/Random/SystemRandom.cs +203 -162
  469. package/Runtime/Core/Random/SystemRandom.cs.meta +11 -11
  470. package/Runtime/Core/Random/ThreadLocalRandom.cs +25 -12
  471. package/Runtime/Core/Random/ThreadLocalRandom.cs.meta +11 -11
  472. package/Runtime/Core/Random/UnityRandom.cs +109 -57
  473. package/Runtime/Core/Random/UnityRandom.cs.meta +11 -11
  474. package/Runtime/Core/Random/WyRandom.cs +158 -121
  475. package/Runtime/Core/Random/WyRandom.cs.meta +2 -2
  476. package/Runtime/Core/Random/XorShiftRandom.cs +106 -52
  477. package/Runtime/Core/Random/XorShiftRandom.cs.meta +11 -11
  478. package/Runtime/Core/Random/XoroShiroRandom.cs +184 -119
  479. package/Runtime/Core/Random/XoroShiroRandom.cs.meta +2 -2
  480. package/Runtime/Core/Random.meta +8 -8
  481. package/Runtime/Core/Serialization/JsonConverters/AnimationCurveConverter.cs +248 -0
  482. package/Runtime/Core/Serialization/JsonConverters/AnimationCurveConverter.cs.meta +11 -0
  483. package/Runtime/Core/Serialization/JsonConverters/BitSetConverter.cs +119 -0
  484. package/Runtime/Core/Serialization/JsonConverters/BitSetConverter.cs.meta +11 -0
  485. package/Runtime/Core/Serialization/JsonConverters/BoundingSphereConverter.cs +74 -0
  486. package/Runtime/Core/Serialization/JsonConverters/BoundingSphereConverter.cs.meta +11 -0
  487. package/Runtime/Core/Serialization/JsonConverters/BoundsConverter.cs +132 -0
  488. package/Runtime/Core/Serialization/JsonConverters/BoundsConverter.cs.meta +11 -0
  489. package/Runtime/Core/Serialization/JsonConverters/BoundsIntConverter.cs +135 -0
  490. package/Runtime/Core/Serialization/JsonConverters/BoundsIntConverter.cs.meta +11 -0
  491. package/Runtime/Core/Serialization/JsonConverters/Color32Converter.cs +98 -0
  492. package/Runtime/Core/Serialization/JsonConverters/Color32Converter.cs.meta +11 -0
  493. package/Runtime/Core/Serialization/JsonConverters/ColorBlockConverter.cs +123 -0
  494. package/Runtime/Core/Serialization/JsonConverters/ColorBlockConverter.cs.meta +11 -0
  495. package/Runtime/Core/Serialization/JsonConverters/ColorConverter.cs +88 -88
  496. package/Runtime/Core/Serialization/JsonConverters/ColorConverter.cs.meta +2 -2
  497. package/Runtime/Core/Serialization/JsonConverters/CyclicBufferConverterFactory.cs +112 -0
  498. package/Runtime/Core/Serialization/JsonConverters/CyclicBufferConverterFactory.cs.meta +11 -0
  499. package/Runtime/Core/Serialization/JsonConverters/DequeConverterFactory.cs +62 -0
  500. package/Runtime/Core/Serialization/JsonConverters/DequeConverterFactory.cs.meta +11 -0
  501. package/Runtime/Core/Serialization/JsonConverters/FastVector2IntConverter.cs +72 -0
  502. package/Runtime/Core/Serialization/JsonConverters/FastVector2IntConverter.cs.meta +11 -0
  503. package/Runtime/Core/Serialization/JsonConverters/FastVector3IntConverter.cs +80 -0
  504. package/Runtime/Core/Serialization/JsonConverters/FastVector3IntConverter.cs.meta +11 -0
  505. package/Runtime/Core/Serialization/JsonConverters/GameObjectConverter.cs +36 -36
  506. package/Runtime/Core/Serialization/JsonConverters/GameObjectConverter.cs.meta +2 -2
  507. package/Runtime/Core/Serialization/JsonConverters/GradientConverter.cs +245 -0
  508. package/Runtime/Core/Serialization/JsonConverters/GradientConverter.cs.meta +11 -0
  509. package/Runtime/Core/Serialization/JsonConverters/Hash128Converter.cs +92 -0
  510. package/Runtime/Core/Serialization/JsonConverters/Hash128Converter.cs.meta +11 -0
  511. package/Runtime/Core/Serialization/JsonConverters/ImmutableBitSetConverter.cs +119 -0
  512. package/Runtime/Core/Serialization/JsonConverters/ImmutableBitSetConverter.cs.meta +11 -0
  513. package/Runtime/Core/Serialization/JsonConverters/KVector2Converter.cs +72 -0
  514. package/Runtime/Core/Serialization/JsonConverters/KVector2Converter.cs.meta +11 -0
  515. package/Runtime/Core/Serialization/JsonConverters/LayerMaskConverter.cs +95 -0
  516. package/Runtime/Core/Serialization/JsonConverters/LayerMaskConverter.cs.meta +11 -0
  517. package/Runtime/Core/Serialization/JsonConverters/Matrix4x4Converter.cs +237 -218
  518. package/Runtime/Core/Serialization/JsonConverters/Matrix4x4Converter.cs.meta +2 -2
  519. package/Runtime/Core/Serialization/JsonConverters/MinMaxCurveConverter.cs +142 -0
  520. package/Runtime/Core/Serialization/JsonConverters/MinMaxCurveConverter.cs.meta +11 -0
  521. package/Runtime/Core/Serialization/JsonConverters/MinMaxGradientConverter.cs +135 -0
  522. package/Runtime/Core/Serialization/JsonConverters/MinMaxGradientConverter.cs.meta +11 -0
  523. package/Runtime/Core/Serialization/JsonConverters/PlaneConverter.cs +79 -0
  524. package/Runtime/Core/Serialization/JsonConverters/PlaneConverter.cs.meta +11 -0
  525. package/Runtime/Core/Serialization/JsonConverters/PoseConverter.cs +76 -0
  526. package/Runtime/Core/Serialization/JsonConverters/PoseConverter.cs.meta +11 -0
  527. package/Runtime/Core/Serialization/JsonConverters/QuaternionConverter.cs +88 -0
  528. package/Runtime/Core/Serialization/JsonConverters/QuaternionConverter.cs.meta +11 -0
  529. package/Runtime/Core/Serialization/JsonConverters/RangeConverterFactory.cs +106 -0
  530. package/Runtime/Core/Serialization/JsonConverters/RangeConverterFactory.cs.meta +11 -0
  531. package/Runtime/Core/Serialization/JsonConverters/RangeIntConverter.cs +71 -0
  532. package/Runtime/Core/Serialization/JsonConverters/RangeIntConverter.cs.meta +11 -0
  533. package/Runtime/Core/Serialization/JsonConverters/Ray2DConverter.cs +80 -0
  534. package/Runtime/Core/Serialization/JsonConverters/Ray2DConverter.cs.meta +11 -0
  535. package/Runtime/Core/Serialization/JsonConverters/RayConverter.cs +76 -0
  536. package/Runtime/Core/Serialization/JsonConverters/RayConverter.cs.meta +11 -0
  537. package/Runtime/Core/Serialization/JsonConverters/RaycastHitConverter.cs +115 -0
  538. package/Runtime/Core/Serialization/JsonConverters/RaycastHitConverter.cs.meta +11 -0
  539. package/Runtime/Core/Serialization/JsonConverters/RectConverter.cs +84 -0
  540. package/Runtime/Core/Serialization/JsonConverters/RectConverter.cs.meta +11 -0
  541. package/Runtime/Core/Serialization/JsonConverters/RectIntConverter.cs +88 -0
  542. package/Runtime/Core/Serialization/JsonConverters/RectIntConverter.cs.meta +11 -0
  543. package/Runtime/Core/Serialization/JsonConverters/RectOffsetConverter.cs +87 -0
  544. package/Runtime/Core/Serialization/JsonConverters/RectOffsetConverter.cs.meta +11 -0
  545. package/Runtime/Core/Serialization/JsonConverters/RenderTextureDescriptorConverter.cs +264 -0
  546. package/Runtime/Core/Serialization/JsonConverters/RenderTextureDescriptorConverter.cs.meta +11 -0
  547. package/Runtime/Core/Serialization/JsonConverters/ResolutionConverter.cs +158 -0
  548. package/Runtime/Core/Serialization/JsonConverters/ResolutionConverter.cs.meta +11 -0
  549. package/Runtime/Core/Serialization/JsonConverters/SceneConverter.cs +103 -0
  550. package/Runtime/Core/Serialization/JsonConverters/SceneConverter.cs.meta +11 -0
  551. package/Runtime/Core/Serialization/JsonConverters/SphericalHarmonicsL2Converter.cs +121 -0
  552. package/Runtime/Core/Serialization/JsonConverters/SphericalHarmonicsL2Converter.cs.meta +11 -0
  553. package/Runtime/Core/Serialization/JsonConverters/TouchConverter.cs +54 -0
  554. package/Runtime/Core/Serialization/JsonConverters/TouchConverter.cs.meta +11 -0
  555. package/Runtime/Core/Serialization/JsonConverters/TypeConverter.cs +30 -28
  556. package/Runtime/Core/Serialization/JsonConverters/TypeConverter.cs.meta +2 -2
  557. package/Runtime/Core/Serialization/JsonConverters/Vector2Converter.cs +72 -74
  558. package/Runtime/Core/Serialization/JsonConverters/Vector2Converter.cs.meta +11 -11
  559. package/Runtime/Core/Serialization/JsonConverters/Vector2IntConverter.cs +72 -0
  560. package/Runtime/Core/Serialization/JsonConverters/Vector2IntConverter.cs.meta +11 -0
  561. package/Runtime/Core/Serialization/JsonConverters/Vector3Converter.cs +80 -81
  562. package/Runtime/Core/Serialization/JsonConverters/Vector3Converter.cs.meta +11 -11
  563. package/Runtime/Core/Serialization/JsonConverters/Vector3IntConverter.cs +80 -0
  564. package/Runtime/Core/Serialization/JsonConverters/Vector3IntConverter.cs.meta +11 -0
  565. package/Runtime/Core/Serialization/JsonConverters/Vector4Converter.cs +88 -88
  566. package/Runtime/Core/Serialization/JsonConverters/Vector4Converter.cs.meta +2 -2
  567. package/Runtime/Core/Serialization/JsonConverters.meta +8 -8
  568. package/Runtime/Core/Serialization/ProtobufUnitySurrogates.cs +383 -0
  569. package/Runtime/Core/Serialization/ProtobufUnitySurrogates.cs.meta +11 -0
  570. package/Runtime/Core/Serialization/Serializer.cs +2020 -195
  571. package/Runtime/Core/Serialization/Serializer.cs.meta +11 -11
  572. package/Runtime/Core/Serialization.meta +8 -8
  573. package/Runtime/Core/Threading/SingleThreadedThreadPool.cs +228 -228
  574. package/Runtime/Core/Threading/SingleThreadedThreadPool.cs.meta +11 -11
  575. package/Runtime/Core/Threading.meta +8 -8
  576. package/Runtime/Core.meta +8 -8
  577. package/Runtime/Integrations/VContainer/ObjectResolverRelationalExtensions.cs +185 -0
  578. package/Runtime/Integrations/VContainer/ObjectResolverRelationalExtensions.cs.meta +11 -0
  579. package/Runtime/Integrations/VContainer/RelationalComponentEntryPoint.cs +109 -0
  580. package/Runtime/Integrations/VContainer/RelationalComponentEntryPoint.cs.meta +11 -0
  581. package/Runtime/Integrations/VContainer/RelationalComponentsBuilderExtensions.cs +78 -0
  582. package/Runtime/Integrations/VContainer/RelationalComponentsBuilderExtensions.cs.meta +11 -0
  583. package/Runtime/Integrations/VContainer/RelationalSceneAssignmentOptions.cs +83 -0
  584. package/Runtime/Integrations/VContainer/RelationalSceneAssignmentOptions.cs.meta +11 -0
  585. package/Runtime/Integrations/VContainer/WallstopStudios.UnityHelpers.Integration.VContainer.asmdef +30 -0
  586. package/Runtime/Integrations/VContainer/WallstopStudios.UnityHelpers.Integration.VContainer.asmdef.meta +7 -0
  587. package/Runtime/Integrations/VContainer.meta +8 -0
  588. package/Runtime/Integrations/Zenject/DiContainerRelationalExtensions.cs +180 -0
  589. package/Runtime/Integrations/Zenject/DiContainerRelationalExtensions.cs.meta +11 -0
  590. package/Runtime/Integrations/Zenject/RelationalComponentSceneInitializer.cs +105 -0
  591. package/Runtime/Integrations/Zenject/RelationalComponentSceneInitializer.cs.meta +11 -0
  592. package/Runtime/Integrations/Zenject/RelationalComponentsInstaller.cs +72 -0
  593. package/Runtime/Integrations/Zenject/RelationalComponentsInstaller.cs.meta +11 -0
  594. package/Runtime/Integrations/Zenject/RelationalSceneAssignmentOptions.cs +87 -0
  595. package/Runtime/Integrations/Zenject/RelationalSceneAssignmentOptions.cs.meta +11 -0
  596. package/Runtime/Integrations/Zenject/WallstopStudios.UnityHelpers.Integration.Zenject.asmdef +30 -0
  597. package/Runtime/Integrations/Zenject/WallstopStudios.UnityHelpers.Integration.Zenject.asmdef.meta +7 -0
  598. package/Runtime/Integrations/Zenject.meta +8 -0
  599. package/Runtime/Integrations.meta +8 -0
  600. package/Runtime/Protobuf-Net/System.Collections.Immutable.dll.meta +33 -33
  601. package/Runtime/Protobuf-Net/System.Runtime.CompilerServices.Unsafe.dll.meta +33 -33
  602. package/Runtime/Protobuf-Net/protobuf-net.Core.dll.meta +33 -33
  603. package/Runtime/Protobuf-Net/protobuf-net.dll.meta +33 -33
  604. package/Runtime/Protobuf-Net.meta +8 -8
  605. package/Runtime/Tags/AlwaysIncludeInAttributeMetadataCacheAttribute.cs +11 -0
  606. package/Runtime/Tags/AlwaysIncludeInAttributeMetadataCacheAttribute.cs.meta +11 -0
  607. package/Runtime/Tags/Attribute.cs +399 -205
  608. package/Runtime/Tags/Attribute.cs.meta +2 -2
  609. package/Runtime/Tags/AttributeEffect.cs +372 -281
  610. package/Runtime/Tags/AttributeEffect.cs.meta +2 -2
  611. package/Runtime/Tags/AttributeMetadataCache.cs +503 -0
  612. package/Runtime/Tags/AttributeMetadataCache.cs.meta +11 -0
  613. package/Runtime/Tags/AttributeMetadataFilters.cs +108 -0
  614. package/Runtime/Tags/AttributeMetadataFilters.cs.meta +11 -0
  615. package/Runtime/Tags/AttributeModification.cs +132 -48
  616. package/Runtime/Tags/AttributeModification.cs.meta +2 -2
  617. package/Runtime/Tags/AttributeUtilities.cs +376 -209
  618. package/Runtime/Tags/AttributeUtilities.cs.meta +2 -2
  619. package/Runtime/Tags/AttributesComponent.cs +237 -163
  620. package/Runtime/Tags/AttributesComponent.cs.meta +2 -2
  621. package/Runtime/Tags/CollisionSenses.cs +117 -91
  622. package/Runtime/Tags/CollisionSenses.cs.meta +2 -2
  623. package/Runtime/Tags/CosmeticEffectComponent.cs +112 -50
  624. package/Runtime/Tags/CosmeticEffectComponent.cs.meta +2 -2
  625. package/Runtime/Tags/CosmeticEffectData.cs +109 -63
  626. package/Runtime/Tags/CosmeticEffectData.cs.meta +2 -2
  627. package/Runtime/Tags/EffectHandle.cs +150 -65
  628. package/Runtime/Tags/EffectHandle.cs.meta +2 -2
  629. package/Runtime/Tags/EffectHandler.cs +470 -393
  630. package/Runtime/Tags/EffectHandler.cs.meta +2 -2
  631. package/Runtime/Tags/ModificationAction.cs +60 -9
  632. package/Runtime/Tags/ModificationAction.cs.meta +2 -2
  633. package/Runtime/Tags/ModifierDurationType.cs +71 -13
  634. package/Runtime/Tags/ModifierDurationType.cs.meta +2 -2
  635. package/Runtime/Tags/TagHandler.cs +373 -158
  636. package/Runtime/Tags/TagHandler.cs.meta +2 -2
  637. package/Runtime/Tags.meta +2 -2
  638. package/Runtime/Utils/AnimationEventEqualityComparer.cs +198 -161
  639. package/Runtime/Utils/AnimationEventEqualityComparer.cs.meta +11 -11
  640. package/Runtime/Utils/AnimatorEnumStateMachine.cs +110 -88
  641. package/Runtime/Utils/AnimatorEnumStateMachine.cs.meta +11 -11
  642. package/Runtime/Utils/Ascii85.cs +132 -115
  643. package/Runtime/Utils/Ascii85.cs.meta +2 -2
  644. package/Runtime/Utils/Buffers.cs +1151 -550
  645. package/Runtime/Utils/Buffers.cs.meta +11 -11
  646. package/Runtime/Utils/CenterPointOffset.cs +35 -30
  647. package/Runtime/Utils/CenterPointOffset.cs.meta +2 -2
  648. package/Runtime/Utils/ChildSpawner.cs +250 -157
  649. package/Runtime/Utils/ChildSpawner.cs.meta +2 -2
  650. package/Runtime/Utils/CircleLineRenderer.cs +142 -142
  651. package/Runtime/Utils/CircleLineRenderer.cs.meta +11 -11
  652. package/Runtime/Utils/CollisionProxy.cs +48 -48
  653. package/Runtime/Utils/CollisionProxy.cs.meta +2 -2
  654. package/Runtime/Utils/CoroutineHandler.cs +4 -4
  655. package/Runtime/Utils/CoroutineHandler.cs.meta +2 -2
  656. package/Runtime/Utils/DeferredDisposalResult.cs +20 -23
  657. package/Runtime/Utils/DeferredDisposalResult.cs.meta +2 -2
  658. package/Runtime/Utils/LZMA.cs +276 -53
  659. package/Runtime/Utils/LZMA.cs.meta +2 -2
  660. package/Runtime/Utils/MatchColliderToSprite.cs +104 -104
  661. package/Runtime/Utils/MatchColliderToSprite.cs.meta +2 -2
  662. package/Runtime/Utils/MatchTransform.cs +99 -82
  663. package/Runtime/Utils/MatchTransform.cs.meta +2 -2
  664. package/Runtime/Utils/Oscillator.cs +27 -27
  665. package/Runtime/Utils/Oscillator.cs.meta +11 -11
  666. package/Runtime/Utils/PolygonCollider2DOptimizer.cs +104 -83
  667. package/Runtime/Utils/PolygonCollider2DOptimizer.cs.meta +2 -2
  668. package/Runtime/Utils/RuntimeSingleton.cs +139 -88
  669. package/Runtime/Utils/RuntimeSingleton.cs.meta +11 -11
  670. package/Runtime/Utils/ScriptableObjectSingleton.cs +226 -85
  671. package/Runtime/Utils/ScriptableObjectSingleton.cs.meta +2 -2
  672. package/Runtime/Utils/SerializedStringComparer.cs +107 -107
  673. package/Runtime/Utils/SerializedStringComparer.cs.meta +2 -2
  674. package/Runtime/Utils/SetTextureImportData.cs +69 -69
  675. package/Runtime/Utils/SetTextureImportData.cs.meta +11 -11
  676. package/Runtime/Utils/SevenZip/Common/CRC.cs +70 -70
  677. package/Runtime/Utils/SevenZip/Common/CRC.cs.meta +11 -11
  678. package/Runtime/Utils/SevenZip/Common/InBuffer.cs +84 -84
  679. package/Runtime/Utils/SevenZip/Common/InBuffer.cs.meta +11 -11
  680. package/Runtime/Utils/SevenZip/Common/OutBuffer.cs +70 -70
  681. package/Runtime/Utils/SevenZip/Common/OutBuffer.cs.meta +11 -11
  682. package/Runtime/Utils/SevenZip/Common.meta +2 -2
  683. package/Runtime/Utils/SevenZip/Compress/LZ/IMatchFinder.cs +28 -28
  684. package/Runtime/Utils/SevenZip/Compress/LZ/IMatchFinder.cs.meta +11 -11
  685. package/Runtime/Utils/SevenZip/Compress/LZ/LzBinTree.cs +454 -454
  686. package/Runtime/Utils/SevenZip/Compress/LZ/LzBinTree.cs.meta +11 -11
  687. package/Runtime/Utils/SevenZip/Compress/LZ/LzInWindow.cs +179 -179
  688. package/Runtime/Utils/SevenZip/Compress/LZ/LzInWindow.cs.meta +11 -11
  689. package/Runtime/Utils/SevenZip/Compress/LZ/LzOutWindow.cs +137 -137
  690. package/Runtime/Utils/SevenZip/Compress/LZ/LzOutWindow.cs.meta +11 -11
  691. package/Runtime/Utils/SevenZip/Compress/LZ.meta +8 -8
  692. package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaBase.cs +110 -110
  693. package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaBase.cs.meta +11 -11
  694. package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaDecoder.cs +525 -527
  695. package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaDecoder.cs.meta +11 -11
  696. package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaEncoder.cs +1891 -1904
  697. package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaEncoder.cs.meta +11 -11
  698. package/Runtime/Utils/SevenZip/Compress/LZMA.meta +8 -8
  699. package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoder.cs +242 -242
  700. package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoder.cs.meta +11 -11
  701. package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoderBit.cs +146 -149
  702. package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoderBit.cs.meta +11 -11
  703. package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoderBitTree.cs +177 -177
  704. package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoderBitTree.cs.meta +11 -11
  705. package/Runtime/Utils/SevenZip/Compress/RangeCoder.meta +8 -8
  706. package/Runtime/Utils/SevenZip/Compress.meta +8 -8
  707. package/Runtime/Utils/SevenZip/ICoder.cs +177 -177
  708. package/Runtime/Utils/SevenZip/ICoder.cs.meta +11 -11
  709. package/Runtime/Utils/SevenZip.meta +2 -2
  710. package/Runtime/Utils/SpriteRendererMetadata.cs +346 -370
  711. package/Runtime/Utils/SpriteRendererMetadata.cs.meta +2 -2
  712. package/Runtime/Utils/SpriteRendererSyncer.cs +100 -100
  713. package/Runtime/Utils/SpriteRendererSyncer.cs.meta +2 -2
  714. package/Runtime/Utils/StartTracker.cs +15 -15
  715. package/Runtime/Utils/StartTracker.cs.meta +2 -2
  716. package/Runtime/Utils/TextureScale.cs +356 -179
  717. package/Runtime/Utils/TextureScale.cs.meta +2 -2
  718. package/Runtime/Utils/TypeNameSorter.cs +17 -17
  719. package/Runtime/Utils/TypeNameSorter.cs.meta +2 -2
  720. package/Runtime/Utils/UnityObjectNameComparer.cs +89 -89
  721. package/Runtime/Utils/UnityObjectNameComparer.cs.meta +2 -2
  722. package/Runtime/Utils.meta +8 -8
  723. package/Runtime/Visuals/AnimatedSpriteLayer.cs +217 -130
  724. package/Runtime/Visuals/AnimatedSpriteLayer.cs.meta +2 -2
  725. package/Runtime/Visuals/UGUI/EnhancedImage.cs +218 -85
  726. package/Runtime/Visuals/UGUI/EnhancedImage.cs.meta +2 -2
  727. package/Runtime/Visuals/UGUI.meta +2 -2
  728. package/Runtime/Visuals/UIToolkit/LayeredImage.cs +781 -484
  729. package/Runtime/Visuals/UIToolkit/LayeredImage.cs.meta +2 -2
  730. package/Runtime/Visuals/UIToolkit/MultiFileSelectorElement.cs +945 -322
  731. package/Runtime/Visuals/UIToolkit/MultiFileSelectorElement.cs.meta +2 -2
  732. package/Runtime/Visuals/UIToolkit.meta +2 -2
  733. package/Runtime/Visuals.meta +2 -2
  734. package/Runtime/WallstopStudios.UnityHelpers.asmdef +22 -14
  735. package/Runtime/WallstopStudios.UnityHelpers.asmdef.meta +7 -7
  736. package/Runtime.meta +8 -8
  737. package/SERIALIZATION.md +648 -0
  738. package/SERIALIZATION.md.meta +7 -0
  739. package/SINGLETONS.md +427 -0
  740. package/SINGLETONS.md.meta +7 -0
  741. package/SPATIAL_TREES_2D_GUIDE.md +261 -0
  742. package/SPATIAL_TREES_2D_GUIDE.md.meta +7 -0
  743. package/SPATIAL_TREES_3D_GUIDE.md +214 -0
  744. package/SPATIAL_TREES_3D_GUIDE.md.meta +7 -0
  745. package/SPATIAL_TREE_2D_PERFORMANCE.md +238 -0
  746. package/SPATIAL_TREE_2D_PERFORMANCE.md.meta +7 -0
  747. package/SPATIAL_TREE_3D_PERFORMANCE.md +240 -0
  748. package/SPATIAL_TREE_3D_PERFORMANCE.md.meta +7 -0
  749. package/SPATIAL_TREE_SEMANTICS.md +106 -0
  750. package/SPATIAL_TREE_SEMANTICS.md.meta +7 -0
  751. package/Samples~/DI - VContainer/Prefabs/RelationalConsumer.prefab +77 -0
  752. package/Samples~/DI - VContainer/Prefabs/RelationalConsumer.prefab.meta +8 -0
  753. package/Samples~/DI - VContainer/Prefabs/Spawner.prefab +47 -0
  754. package/Samples~/DI - VContainer/Prefabs/Spawner.prefab.meta +8 -0
  755. package/Samples~/DI - VContainer/Prefabs.meta +9 -0
  756. package/Samples~/DI - VContainer/README.md +334 -0
  757. package/Samples~/DI - VContainer/README.md.meta +8 -0
  758. package/Samples~/DI - VContainer/Scenes/VContainer_Sample.unity +120 -0
  759. package/Samples~/DI - VContainer/Scenes/VContainer_Sample.unity.meta +8 -0
  760. package/Samples~/DI - VContainer/Scenes.meta +9 -0
  761. package/Samples~/DI - VContainer/Scripts/GameLifetimeScope.cs +24 -0
  762. package/Samples~/DI - VContainer/Scripts/GameLifetimeScope.cs.meta +12 -0
  763. package/Samples~/DI - VContainer/Scripts/RelationalConsumer.cs +21 -0
  764. package/Samples~/DI - VContainer/Scripts/RelationalConsumer.cs.meta +12 -0
  765. package/Samples~/DI - VContainer/Scripts/Samples.UnityHelpers.DI.VContainer.asmdef +37 -0
  766. package/Samples~/DI - VContainer/Scripts/Samples.UnityHelpers.DI.VContainer.asmdef.meta +8 -0
  767. package/Samples~/DI - VContainer/Scripts/Spawner.cs +21 -0
  768. package/Samples~/DI - VContainer/Scripts/Spawner.cs.meta +12 -0
  769. package/Samples~/DI - VContainer/Scripts.meta +9 -0
  770. package/Samples~/DI - VContainer.meta +9 -0
  771. package/Samples~/DI - Zenject/Prefabs/RelationalConsumer.prefab +77 -0
  772. package/Samples~/DI - Zenject/Prefabs/RelationalConsumer.prefab.meta +8 -0
  773. package/Samples~/DI - Zenject/Prefabs/SpawnerZenject.prefab +47 -0
  774. package/Samples~/DI - Zenject/Prefabs/SpawnerZenject.prefab.meta +8 -0
  775. package/Samples~/DI - Zenject/Prefabs.meta +9 -0
  776. package/Samples~/DI - Zenject/README.md +389 -0
  777. package/Samples~/DI - Zenject/README.md.meta +7 -0
  778. package/Samples~/DI - Zenject/Scenes/Zenject_Sample.unity +164 -0
  779. package/Samples~/DI - Zenject/Scenes/Zenject_Sample.unity.meta +8 -0
  780. package/Samples~/DI - Zenject/Scenes.meta +9 -0
  781. package/Samples~/DI - Zenject/Scripts/RelationalConsumer.cs +19 -0
  782. package/Samples~/DI - Zenject/Scripts/RelationalConsumer.cs.meta +12 -0
  783. package/Samples~/DI - Zenject/Scripts/Samples.UnityHelpers.DI.Zenject.asmdef +36 -0
  784. package/Samples~/DI - Zenject/Scripts/Samples.UnityHelpers.DI.Zenject.asmdef.meta +8 -0
  785. package/Samples~/DI - Zenject/Scripts/SceneContextPlaceholder.cs +47 -0
  786. package/Samples~/DI - Zenject/Scripts/SceneContextPlaceholder.cs.meta +12 -0
  787. package/Samples~/DI - Zenject/Scripts/SpawnerZenject.cs +20 -0
  788. package/Samples~/DI - Zenject/Scripts/SpawnerZenject.cs.meta +12 -0
  789. package/Samples~/DI - Zenject/Scripts.meta +9 -0
  790. package/Samples~/DI - Zenject.meta +9 -0
  791. package/Samples~/Random - PRNG/README.md +12 -0
  792. package/Samples~/Random - PRNG/README.md.meta +8 -0
  793. package/Samples~/Random - PRNG/Scripts/RandomPrngDemo.cs +28 -0
  794. package/Samples~/Random - PRNG/Scripts/RandomPrngDemo.cs.meta +12 -0
  795. package/Samples~/Random - PRNG/Scripts/Samples.UnityHelpers.Random.Prng.asmdef +17 -0
  796. package/Samples~/Random - PRNG/Scripts/Samples.UnityHelpers.Random.Prng.asmdef.meta +8 -0
  797. package/Samples~/Random - PRNG/Scripts.meta +9 -0
  798. package/Samples~/Random - PRNG.meta +9 -0
  799. package/Samples~/Relational Components - Basic/README.md +19 -0
  800. package/Samples~/Relational Components - Basic/README.md.meta +8 -0
  801. package/Samples~/Relational Components - Basic/Scripts/RelationalBasicConsumer.cs +37 -0
  802. package/Samples~/Relational Components - Basic/Scripts/RelationalBasicConsumer.cs.meta +12 -0
  803. package/Samples~/Relational Components - Basic/Scripts/Samples.UnityHelpers.Relational.Basic.asmdef +17 -0
  804. package/Samples~/Relational Components - Basic/Scripts/Samples.UnityHelpers.Relational.Basic.asmdef.meta +8 -0
  805. package/Samples~/Relational Components - Basic/Scripts.meta +9 -0
  806. package/Samples~/Relational Components - Basic.meta +9 -0
  807. package/Samples~/Serialization - JSON/README.md +13 -0
  808. package/Samples~/Serialization - JSON/README.md.meta +8 -0
  809. package/Samples~/Serialization - JSON/Scripts/JsonSerializationDemo.cs +50 -0
  810. package/Samples~/Serialization - JSON/Scripts/JsonSerializationDemo.cs.meta +12 -0
  811. package/Samples~/Serialization - JSON/Scripts/Samples.UnityHelpers.Serialization.Json.asmdef +17 -0
  812. package/Samples~/Serialization - JSON/Scripts/Samples.UnityHelpers.Serialization.Json.asmdef.meta +8 -0
  813. package/Samples~/Serialization - JSON/Scripts.meta +9 -0
  814. package/Samples~/Serialization - JSON.meta +9 -0
  815. package/Samples~/Spatial Structures - 2D and 3D/README.md +13 -0
  816. package/Samples~/Spatial Structures - 2D and 3D/README.md.meta +8 -0
  817. package/Samples~/Spatial Structures - 2D and 3D/Scripts/Samples.UnityHelpers.SpatialStructures.asmdef +17 -0
  818. package/Samples~/Spatial Structures - 2D and 3D/Scripts/Samples.UnityHelpers.SpatialStructures.asmdef.meta +8 -0
  819. package/Samples~/Spatial Structures - 2D and 3D/Scripts/SpatialStructuresDemo.cs +62 -0
  820. package/Samples~/Spatial Structures - 2D and 3D/Scripts/SpatialStructuresDemo.cs.meta +12 -0
  821. package/Samples~/Spatial Structures - 2D and 3D/Scripts.meta +9 -0
  822. package/Samples~/Spatial Structures - 2D and 3D.meta +9 -0
  823. package/Samples~/UGUI - EnhancedImage/README.md +12 -0
  824. package/Samples~/UGUI - EnhancedImage/README.md.meta +8 -0
  825. package/Samples~/UGUI - EnhancedImage/Scripts/EnhancedImageDemo.cs +36 -0
  826. package/Samples~/UGUI - EnhancedImage/Scripts/EnhancedImageDemo.cs.meta +12 -0
  827. package/Samples~/UGUI - EnhancedImage/Scripts/Samples.UnityHelpers.UGUI.EnhancedImage.asmdef +17 -0
  828. package/Samples~/UGUI - EnhancedImage/Scripts/Samples.UnityHelpers.UGUI.EnhancedImage.asmdef.meta +8 -0
  829. package/Samples~/UGUI - EnhancedImage/Scripts.meta +9 -0
  830. package/Samples~/UGUI - EnhancedImage.meta +9 -0
  831. package/Samples~/UI Toolkit - MultiFile Selector (Editor)/README.md +12 -0
  832. package/Samples~/UI Toolkit - MultiFile Selector (Editor)/README.md.meta +8 -0
  833. package/Samples~/UI Toolkit - MultiFile Selector (Editor)/Scripts/Editor/MultiFileSelectorSampleWindow.cs +45 -0
  834. package/Samples~/UI Toolkit - MultiFile Selector (Editor)/Scripts/Editor/MultiFileSelectorSampleWindow.cs.meta +12 -0
  835. package/Samples~/UI Toolkit - MultiFile Selector (Editor)/Scripts/Editor/Samples.UnityHelpers.UIToolkit.Editor.asmdef +19 -0
  836. package/Samples~/UI Toolkit - MultiFile Selector (Editor)/Scripts/Editor/Samples.UnityHelpers.UIToolkit.Editor.asmdef.meta +8 -0
  837. package/Samples~/UI Toolkit - MultiFile Selector (Editor)/Scripts/Editor.meta +9 -0
  838. package/Samples~/UI Toolkit - MultiFile Selector (Editor)/Scripts.meta +9 -0
  839. package/Samples~/UI Toolkit - MultiFile Selector (Editor).meta +9 -0
  840. package/Shaders/Materials/BackgroundMask-Material.mat +59 -59
  841. package/Shaders/Materials/BackgroundMask-Material.mat.meta +8 -8
  842. package/Shaders/Materials.meta +8 -8
  843. package/Shaders/ShaderGraph/BackgroundMask.shadergraph +1653 -1653
  844. package/Shaders/ShaderGraph/BackgroundMask.shadergraph.meta +10 -10
  845. package/Shaders/ShaderGraph/DebugDisplayValue.shadersubgraph +835 -835
  846. package/Shaders/ShaderGraph/DebugDisplayValue.shadersubgraph.meta +10 -10
  847. package/Shaders/ShaderGraph.meta +8 -8
  848. package/Shaders/Support/EnhancedImageSupport.shader +64 -0
  849. package/Shaders/Support/EnhancedImageSupport.shader.meta +9 -0
  850. package/Shaders/Support.meta +8 -0
  851. package/Shaders.meta +8 -8
  852. package/Styles/Elements/Progress/ArcedProgressBar.cs +345 -345
  853. package/Styles/Elements/Progress/ArcedProgressBar.cs.meta +2 -2
  854. package/Styles/Elements/Progress/CircularProgressBar.cs +307 -307
  855. package/Styles/Elements/Progress/CircularProgressBar.cs.meta +2 -2
  856. package/Styles/Elements/Progress/GlitchProgressBar.cs +416 -416
  857. package/Styles/Elements/Progress/GlitchProgressBar.cs.meta +2 -2
  858. package/Styles/Elements/Progress/LiquidProgressBar.cs +632 -632
  859. package/Styles/Elements/Progress/LiquidProgressBar.cs.meta +2 -2
  860. package/Styles/Elements/Progress/MarchingAntsProgressBar.cs +722 -722
  861. package/Styles/Elements/Progress/MarchingAntsProgressBar.cs.meta +2 -2
  862. package/Styles/Elements/Progress/RegularProgressBar.cs +405 -405
  863. package/Styles/Elements/Progress/RegularProgressBar.cs.meta +2 -2
  864. package/Styles/Elements/Progress/WigglyProgressBar.cs +837 -837
  865. package/Styles/Elements/Progress/WigglyProgressBar.cs.meta +2 -2
  866. package/Styles/Elements/Progress.meta +2 -2
  867. package/Styles/Elements.meta +2 -2
  868. package/Styles/USS/ArcedProgressBar.uss +18 -18
  869. package/Styles/USS/ArcedProgressBar.uss.meta +2 -2
  870. package/Styles/USS/CirclularProgressBar.uss +17 -17
  871. package/Styles/USS/CirclularProgressBar.uss.meta +2 -2
  872. package/Styles/USS/RegularProgressBar.uss +32 -32
  873. package/Styles/USS/RegularProgressBar.uss.meta +2 -2
  874. package/Styles/USS/WigglyProgressBar.uss +16 -16
  875. package/Styles/USS/WigglyProgressBar.uss.meta +2 -2
  876. package/Styles/USS.meta +2 -2
  877. package/Styles/WallstopStudios.UnityHelpers.Styles.asmdef +14 -17
  878. package/Styles/WallstopStudios.UnityHelpers.Styles.asmdef.meta +7 -7
  879. package/Styles.meta +2 -2
  880. package/THIRD_PARTY_NOTICES.md +74 -0
  881. package/THIRD_PARTY_NOTICES.md.meta +7 -0
  882. package/Tests/Editor/Attributes/AnimationEventHelpersTests.cs +155 -0
  883. package/Tests/Editor/Attributes/AnimationEventHelpersTests.cs.meta +11 -0
  884. package/Tests/Editor/Attributes.meta +8 -0
  885. package/Tests/Editor/Core/Attributes/RelationalComponentAssignerTests.cs +118 -0
  886. package/Tests/Editor/Core/Attributes/RelationalComponentAssignerTests.cs.meta +11 -0
  887. package/Tests/Editor/Core/Attributes.meta +8 -0
  888. package/Tests/Editor/Core.meta +8 -0
  889. package/Tests/Editor/Extensions/SerializedPropertyExtensionsTests.cs +194 -0
  890. package/Tests/Editor/Extensions/SerializedPropertyExtensionsTests.cs.meta +3 -0
  891. package/Tests/Editor/Extensions.meta +3 -0
  892. package/Tests/Editor/Helper/DummyScriptableObject.cs +6 -0
  893. package/Tests/Editor/Helper/DummyScriptableObject.cs.meta +3 -0
  894. package/Tests/Editor/Helper/HelpersTests.cs +101 -0
  895. package/Tests/Editor/Helper/HelpersTests.cs.meta +3 -0
  896. package/Tests/Editor/Helper/ObjectHelpersEditorTests.cs +63 -0
  897. package/Tests/Editor/Helper/ObjectHelpersEditorTests.cs.meta +11 -0
  898. package/Tests/Editor/Helper/PromptScope.cs +28 -0
  899. package/Tests/Editor/Helper/PromptScope.cs.meta +11 -0
  900. package/Tests/Editor/Helper/ReflectionHelpersEditorTests.cs +105 -0
  901. package/Tests/Editor/Helper/ReflectionHelpersEditorTests.cs.meta +11 -0
  902. package/Tests/Editor/Helper/SpriteHelpersTests.cs +334 -0
  903. package/Tests/Editor/Helper/SpriteHelpersTests.cs.meta +3 -0
  904. package/Tests/Editor/Helper/SpriteSettingsApplierAdditionalTests.cs +183 -0
  905. package/Tests/Editor/Helper/SpriteSettingsApplierAdditionalTests.cs.meta +11 -0
  906. package/Tests/Editor/Helper/SpriteSettingsApplierTests.cs +161 -0
  907. package/Tests/Editor/Helper/SpriteSettingsApplierTests.cs.meta +11 -0
  908. package/Tests/Editor/Helper.meta +3 -0
  909. package/Tests/Editor/Integrations/VContainer/VContainerIntegrationCompilationTests.cs +40 -0
  910. package/Tests/Editor/Integrations/VContainer/VContainerIntegrationCompilationTests.cs.meta +11 -0
  911. package/Tests/Editor/Integrations/VContainer/VContainerRelationalEntryPointTests.cs +77 -0
  912. package/Tests/Editor/Integrations/VContainer/VContainerRelationalEntryPointTests.cs.meta +11 -0
  913. package/Tests/Editor/Integrations/VContainer/WallstopStudios.UnityHelpers.Tests.Editor.VContainer.asmdef +36 -0
  914. package/Tests/Editor/Integrations/VContainer/WallstopStudios.UnityHelpers.Tests.Editor.VContainer.asmdef.meta +7 -0
  915. package/Tests/Editor/Integrations/VContainer.meta +8 -0
  916. package/Tests/Editor/Integrations/Zenject/WallstopStudios.UnityHelpers.Tests.Editor.Zenject.asmdef +36 -0
  917. package/Tests/Editor/Integrations/Zenject/WallstopStudios.UnityHelpers.Tests.Editor.Zenject.asmdef.meta +7 -0
  918. package/Tests/Editor/Integrations/Zenject/ZenjectIntegrationCompilationTests.cs +40 -0
  919. package/Tests/Editor/Integrations/Zenject/ZenjectIntegrationCompilationTests.cs.meta +11 -0
  920. package/Tests/Editor/Integrations/Zenject/ZenjectRelationalInitializerTests.cs +76 -0
  921. package/Tests/Editor/Integrations/Zenject/ZenjectRelationalInitializerTests.cs.meta +11 -0
  922. package/Tests/Editor/Integrations/Zenject.meta +8 -0
  923. package/Tests/Editor/Integrations.meta +8 -0
  924. package/Tests/Editor/MultiFileSelectorElementTests.cs +265 -0
  925. package/Tests/Editor/MultiFileSelectorElementTests.cs.meta +11 -0
  926. package/Tests/Editor/MultiFileSelectorPersistenceManagerTests.cs +100 -0
  927. package/Tests/Editor/MultiFileSelectorPersistenceManagerTests.cs.meta +11 -0
  928. package/Tests/Editor/Sprites/AnimationCopierWindowTests.cs +199 -0
  929. package/Tests/Editor/Sprites/AnimationCopierWindowTests.cs.meta +11 -0
  930. package/Tests/Editor/Sprites/ScriptableSpriteAtlasEditorTests.cs +108 -0
  931. package/Tests/Editor/Sprites/ScriptableSpriteAtlasEditorTests.cs.meta +11 -0
  932. package/Tests/Editor/Sprites/SpriteCropperAdditionalTests.cs +323 -0
  933. package/Tests/Editor/Sprites/SpriteCropperAdditionalTests.cs.meta +11 -0
  934. package/Tests/Editor/Sprites/SpriteCropperTests.cs +162 -0
  935. package/Tests/Editor/Sprites/SpriteCropperTests.cs.meta +11 -0
  936. package/Tests/Editor/Sprites/SpritePivotAdjusterAdditionalTests.cs +227 -0
  937. package/Tests/Editor/Sprites/SpritePivotAdjusterAdditionalTests.cs.meta +11 -0
  938. package/Tests/Editor/Sprites/SpritePivotAdjusterTests.cs +113 -0
  939. package/Tests/Editor/Sprites/SpritePivotAdjusterTests.cs.meta +11 -0
  940. package/Tests/Editor/Sprites/TexturePlatformNameHelperTests.cs +28 -0
  941. package/Tests/Editor/Sprites/TexturePlatformNameHelperTests.cs.meta +11 -0
  942. package/Tests/Editor/Sprites/TextureResizerWizardTests.cs +248 -0
  943. package/Tests/Editor/Sprites/TextureResizerWizardTests.cs.meta +11 -0
  944. package/Tests/Editor/Sprites/TextureSettingsApplierAPITests.cs +180 -0
  945. package/Tests/Editor/Sprites/TextureSettingsApplierAPITests.cs.meta +11 -0
  946. package/Tests/Editor/Sprites/TextureSettingsApplierWizardAdditionalTests.cs +295 -0
  947. package/Tests/Editor/Sprites/TextureSettingsApplierWizardAdditionalTests.cs.meta +11 -0
  948. package/Tests/Editor/Sprites/TextureSettingsApplierWizardTests.cs +134 -0
  949. package/Tests/Editor/Sprites/TextureSettingsApplierWizardTests.cs.meta +11 -0
  950. package/Tests/Editor/Sprites.meta +8 -0
  951. package/Tests/Editor/TestComponents/PrewarmTesterComponent.cs +10 -0
  952. package/Tests/Editor/TestComponents/PrewarmTesterComponent.cs.meta +11 -0
  953. package/Tests/Editor/TestComponents.meta +8 -0
  954. package/Tests/Editor/Tools/ImageBlurToolTests.cs +135 -0
  955. package/Tests/Editor/Tools/ImageBlurToolTests.cs.meta +11 -0
  956. package/Tests/Editor/Tools.meta +8 -0
  957. package/Tests/Editor/Utils/CommonTestBase.cs +208 -0
  958. package/Tests/Editor/Utils/CommonTestBase.cs.meta +11 -0
  959. package/Tests/Editor/Utils/ScriptableObjectSingletonCreatorEditorTests.cs +306 -0
  960. package/Tests/Editor/Utils/ScriptableObjectSingletonCreatorEditorTests.cs.meta +9 -0
  961. package/Tests/Editor/Utils/ScriptableObjectSingletonCreatorTests.cs +183 -0
  962. package/Tests/Editor/Utils/ScriptableObjectSingletonCreatorTests.cs.meta +11 -0
  963. package/Tests/Editor/Utils/ScriptableObjectSingletonTests.cs +466 -0
  964. package/Tests/Editor/Utils/ScriptableObjectSingletonTests.cs.meta +11 -0
  965. package/Tests/Editor/Utils.meta +3 -0
  966. package/Tests/Editor/WallstopStudios.UnityHelpers.Tests.Editor.asmdef +19 -0
  967. package/Tests/Editor/WallstopStudios.UnityHelpers.Tests.Editor.asmdef.meta +7 -0
  968. package/Tests/Editor/Windows/FitTextureSizeWindowTests.cs +781 -0
  969. package/Tests/Editor/Windows/FitTextureSizeWindowTests.cs.meta +11 -0
  970. package/Tests/Editor/Windows/PrefabCheckerFolderAdditionTests.cs +96 -0
  971. package/Tests/Editor/Windows/PrefabCheckerFolderAdditionTests.cs.meta +11 -0
  972. package/Tests/Editor/Windows/PrefabCheckerTests.cs +81 -0
  973. package/Tests/Editor/Windows/PrefabCheckerTests.cs.meta +11 -0
  974. package/Tests/Editor/Windows.meta +8 -0
  975. package/Tests/Editor.meta +8 -0
  976. package/Tests/Runtime/AssemblyInfo.cs +4 -0
  977. package/Tests/Runtime/AssemblyInfo.cs.meta +3 -0
  978. package/Tests/Runtime/Attributes/ChildComponentTests.cs +766 -81
  979. package/Tests/Runtime/Attributes/ChildComponentTests.cs.meta +2 -2
  980. package/Tests/Runtime/Attributes/Components/ExpectChildSpriteRenderers.cs +28 -28
  981. package/Tests/Runtime/Attributes/Components/ExpectChildSpriteRenderers.cs.meta +2 -2
  982. package/Tests/Runtime/Attributes/Components/ExpectParentSpriteRenderers.cs +28 -28
  983. package/Tests/Runtime/Attributes/Components/ExpectParentSpriteRenderers.cs.meta +2 -2
  984. package/Tests/Runtime/{Components → Attributes/Components}/RelationalComponentTesterComplex.cs +34 -34
  985. package/Tests/Runtime/{Components → Attributes/Components}/RelationalComponentTesterComplex.cs.meta +2 -2
  986. package/Tests/Runtime/Attributes/Components/RelationalComponentsTesterSimple.cs +37 -0
  987. package/Tests/Runtime/{Components → Attributes/Components}/RelationalComponentsTesterSimple.cs.meta +2 -2
  988. package/Tests/Runtime/Attributes/Components.meta +2 -2
  989. package/Tests/Runtime/Attributes/MiscRuntimeAttributeTests.cs +75 -0
  990. package/Tests/Runtime/Attributes/MiscRuntimeAttributeTests.cs.meta +11 -0
  991. package/Tests/Runtime/Attributes/NotNullAttributeTests.cs +26 -0
  992. package/Tests/Runtime/Attributes/NotNullAttributeTests.cs.meta +3 -0
  993. package/Tests/Runtime/Attributes/ParentComponentTests.cs +565 -68
  994. package/Tests/Runtime/Attributes/ParentComponentTests.cs.meta +2 -2
  995. package/Tests/Runtime/Attributes/RelationalComponentAdvancedTests.cs +614 -0
  996. package/Tests/Runtime/Attributes/RelationalComponentAdvancedTests.cs.meta +11 -0
  997. package/Tests/Runtime/Attributes/RelationalComponentBackwardCompatibilityTests.cs +478 -0
  998. package/Tests/Runtime/Attributes/RelationalComponentBackwardCompatibilityTests.cs.meta +11 -0
  999. package/Tests/Runtime/Attributes/RelationalComponentExtensionsTests.cs +56 -0
  1000. package/Tests/Runtime/Attributes/RelationalComponentExtensionsTests.cs.meta +11 -0
  1001. package/Tests/Runtime/Attributes/RelationalComponentHashSetTests.cs +226 -0
  1002. package/Tests/Runtime/Attributes/RelationalComponentHashSetTests.cs.meta +11 -0
  1003. package/Tests/Runtime/Attributes/RelationalComponentInitializerTests.cs +109 -0
  1004. package/Tests/Runtime/Attributes/RelationalComponentInitializerTests.cs.meta +11 -0
  1005. package/Tests/Runtime/Attributes/RelationalComponentTagAndNameFilterEdgeTests.cs +234 -0
  1006. package/Tests/Runtime/Attributes/RelationalComponentTagAndNameFilterEdgeTests.cs.meta +11 -0
  1007. package/Tests/Runtime/Attributes/SiblingComponentTests.cs +721 -0
  1008. package/Tests/Runtime/Attributes/SiblingComponentTests.cs.meta +11 -0
  1009. package/Tests/Runtime/Attributes/ValidateAssignmentAttributeTests.cs +96 -0
  1010. package/Tests/Runtime/Attributes/ValidateAssignmentAttributeTests.cs.meta +11 -0
  1011. package/Tests/Runtime/Attributes.meta +2 -2
  1012. package/Tests/Runtime/Core/Random/RandomComparerTests.cs +166 -0
  1013. package/Tests/Runtime/Core/Random/RandomComparerTests.cs.meta +11 -0
  1014. package/Tests/Runtime/Core/Random.meta +8 -0
  1015. package/Tests/Runtime/Core/Threading/SingleThreadedThreadPoolTests.cs +56 -56
  1016. package/Tests/Runtime/Core/Threading/SingleThreadedThreadPoolTests.cs.meta +2 -2
  1017. package/Tests/Runtime/Core/Threading.meta +2 -2
  1018. package/Tests/Runtime/Core.meta +2 -2
  1019. package/Tests/Runtime/DataStructures/BalancedKDTree2DTests.cs +562 -0
  1020. package/Tests/Runtime/DataStructures/{BalancedKDTreeTests.cs.meta → BalancedKDTree2DTests.cs.meta} +11 -11
  1021. package/Tests/Runtime/DataStructures/BalancedKDTree3DTests.cs +10 -0
  1022. package/Tests/Runtime/DataStructures/BalancedKDTree3DTests.cs.meta +11 -0
  1023. package/Tests/Runtime/DataStructures/BitSetTests.cs +1400 -0
  1024. package/Tests/Runtime/DataStructures/BitSetTests.cs.meta +3 -0
  1025. package/Tests/Runtime/DataStructures/BoundingBox3DTests.cs +1215 -0
  1026. package/Tests/Runtime/DataStructures/BoundingBox3DTests.cs.meta +11 -0
  1027. package/Tests/Runtime/DataStructures/CircleTests.cs +965 -0
  1028. package/Tests/Runtime/DataStructures/CircleTests.cs.meta +11 -0
  1029. package/Tests/Runtime/DataStructures/CyclicBufferTests.cs +2083 -324
  1030. package/Tests/Runtime/DataStructures/CyclicBufferTests.cs.meta +2 -2
  1031. package/Tests/Runtime/DataStructures/DequeTests.cs +790 -0
  1032. package/Tests/Runtime/DataStructures/DequeTests.cs.meta +3 -0
  1033. package/Tests/Runtime/DataStructures/DisjointSetTests.cs +1114 -0
  1034. package/Tests/Runtime/DataStructures/DisjointSetTests.cs.meta +3 -0
  1035. package/Tests/Runtime/DataStructures/FastOneOfTests.cs +966 -0
  1036. package/Tests/Runtime/DataStructures/FastOneOfTests.cs.meta +11 -0
  1037. package/Tests/Runtime/DataStructures/FastVector2IntTests.cs +286 -0
  1038. package/Tests/Runtime/DataStructures/FastVector2IntTests.cs.meta +11 -0
  1039. package/Tests/Runtime/DataStructures/FastVector3IntTests.cs +414 -0
  1040. package/Tests/Runtime/DataStructures/FastVector3IntTests.cs.meta +11 -0
  1041. package/Tests/Runtime/DataStructures/HeapTests.cs +1953 -0
  1042. package/Tests/Runtime/DataStructures/HeapTests.cs.meta +11 -0
  1043. package/Tests/Runtime/DataStructures/ImmutableBitSetTests.cs +833 -0
  1044. package/Tests/Runtime/DataStructures/ImmutableBitSetTests.cs.meta +3 -0
  1045. package/Tests/Runtime/DataStructures/KDTree3DTestsBase.cs +297 -0
  1046. package/Tests/Runtime/DataStructures/KDTree3DTestsBase.cs.meta +11 -0
  1047. package/Tests/Runtime/DataStructures/OctTree3DTests.cs +351 -0
  1048. package/Tests/Runtime/DataStructures/OctTree3DTests.cs.meta +11 -0
  1049. package/Tests/Runtime/DataStructures/PriorityQueueTests.cs +71 -0
  1050. package/Tests/Runtime/DataStructures/PriorityQueueTests.cs.meta +3 -0
  1051. package/Tests/Runtime/DataStructures/ProtobufSerializationTests.cs +475 -0
  1052. package/Tests/Runtime/DataStructures/ProtobufSerializationTests.cs.meta +11 -0
  1053. package/Tests/Runtime/DataStructures/QuadTree2DTests.cs +660 -0
  1054. package/Tests/Runtime/DataStructures/QuadTree2DTests.cs.meta +11 -0
  1055. package/Tests/Runtime/DataStructures/RTree2DTests.cs +823 -0
  1056. package/Tests/Runtime/DataStructures/RTree2DTests.cs.meta +3 -0
  1057. package/Tests/Runtime/DataStructures/RTree3DTests.cs +270 -0
  1058. package/Tests/Runtime/DataStructures/RTree3DTests.cs.meta +11 -0
  1059. package/Tests/Runtime/DataStructures/SparseSetTests.cs +1146 -0
  1060. package/Tests/Runtime/DataStructures/SparseSetTests.cs.meta +3 -0
  1061. package/Tests/Runtime/DataStructures/SpatialHashTests.cs +992 -0
  1062. package/Tests/Runtime/DataStructures/SpatialHashTests.cs.meta +11 -0
  1063. package/Tests/Runtime/DataStructures/SpatialTree2DBoundsConsistencyTests.cs +351 -0
  1064. package/Tests/Runtime/DataStructures/SpatialTree2DBoundsConsistencyTests.cs.meta +11 -0
  1065. package/Tests/Runtime/DataStructures/SpatialTree2DBoundsEdgeTests.cs +127 -0
  1066. package/Tests/Runtime/DataStructures/SpatialTree2DBoundsEdgeTests.cs.meta +11 -0
  1067. package/Tests/Runtime/DataStructures/SpatialTree2DBoundsFuzzTests.cs +218 -0
  1068. package/Tests/Runtime/DataStructures/SpatialTree2DBoundsFuzzTests.cs.meta +11 -0
  1069. package/Tests/Runtime/DataStructures/SpatialTree2DTests.cs +396 -0
  1070. package/Tests/Runtime/DataStructures/SpatialTree2DTests.cs.meta +11 -0
  1071. package/Tests/Runtime/DataStructures/SpatialTree3DBoundsConsistencyTests.cs +281 -0
  1072. package/Tests/Runtime/DataStructures/SpatialTree3DBoundsConsistencyTests.cs.meta +11 -0
  1073. package/Tests/Runtime/DataStructures/SpatialTree3DBoundsEdgeTests.cs +127 -0
  1074. package/Tests/Runtime/DataStructures/SpatialTree3DBoundsEdgeTests.cs.meta +11 -0
  1075. package/Tests/Runtime/DataStructures/SpatialTree3DBoundsFuzzTests.cs +170 -0
  1076. package/Tests/Runtime/DataStructures/SpatialTree3DBoundsFuzzTests.cs.meta +11 -0
  1077. package/Tests/Runtime/DataStructures/SpatialTree3DTests.cs +474 -0
  1078. package/Tests/Runtime/DataStructures/SpatialTree3DTests.cs.meta +11 -0
  1079. package/Tests/Runtime/DataStructures/SphereTests.cs +806 -0
  1080. package/Tests/Runtime/DataStructures/SphereTests.cs.meta +3 -0
  1081. package/Tests/Runtime/DataStructures/StringWrapperTests.cs +333 -0
  1082. package/Tests/Runtime/DataStructures/StringWrapperTests.cs.meta +11 -0
  1083. package/Tests/Runtime/DataStructures/TimedCacheTests.cs +669 -0
  1084. package/Tests/Runtime/DataStructures/TimedCacheTests.cs.meta +11 -0
  1085. package/Tests/Runtime/DataStructures/TrieTests.cs +3385 -0
  1086. package/Tests/Runtime/DataStructures/TrieTests.cs.meta +11 -0
  1087. package/Tests/Runtime/DataStructures/UnbalancedKDTree2DTests.cs +565 -0
  1088. package/Tests/Runtime/DataStructures/{UnbalancedKDTreeTests.cs.meta → UnbalancedKDTree2DTests.cs.meta} +11 -11
  1089. package/Tests/Runtime/DataStructures/UnbalancedKDTree3DTests.cs +10 -0
  1090. package/Tests/Runtime/DataStructures/UnbalancedKDTree3DTests.cs.meta +11 -0
  1091. package/Tests/Runtime/DataStructures.meta +8 -8
  1092. package/Tests/Runtime/Extensions/AnimatorExtensionsTests.cs +28 -0
  1093. package/Tests/Runtime/Extensions/AnimatorExtensionsTests.cs.meta +11 -0
  1094. package/Tests/Runtime/Extensions/AsyncOperationExtensionsTests.cs +667 -0
  1095. package/Tests/Runtime/Extensions/AsyncOperationExtensionsTests.cs.meta +11 -0
  1096. package/Tests/Runtime/Extensions/CircleExtensionsTests.cs +230 -0
  1097. package/Tests/Runtime/Extensions/CircleExtensionsTests.cs.meta +11 -0
  1098. package/Tests/Runtime/Extensions/ColorExtensionsTests.cs +55 -0
  1099. package/Tests/Runtime/Extensions/ColorExtensionsTests.cs.meta +11 -0
  1100. package/Tests/Runtime/Extensions/DictionaryExtensionTests.cs +724 -438
  1101. package/Tests/Runtime/Extensions/DictionaryExtensionTests.cs.meta +2 -2
  1102. package/Tests/Runtime/Extensions/DirectionExtensionsComprehensiveTests.cs +403 -0
  1103. package/Tests/Runtime/Extensions/DirectionExtensionsComprehensiveTests.cs.meta +11 -0
  1104. package/Tests/Runtime/Extensions/DirectionExtensionsTests.cs +69 -0
  1105. package/Tests/Runtime/Extensions/DirectionExtensionsTests.cs.meta +11 -0
  1106. package/Tests/Runtime/Extensions/EnumExtensionTests.cs +809 -153
  1107. package/Tests/Runtime/Extensions/EnumExtensionTests.cs.meta +2 -2
  1108. package/Tests/Runtime/Extensions/IEnumerableExtensionsTests.cs +191 -0
  1109. package/Tests/Runtime/Extensions/IEnumerableExtensionsTests.cs.meta +11 -0
  1110. package/Tests/Runtime/Extensions/IListExtensionTests.cs +955 -169
  1111. package/Tests/Runtime/Extensions/IListExtensionTests.cs.meta +2 -2
  1112. package/Tests/Runtime/Extensions/IReadonlyListExtensionTests.cs +266 -58
  1113. package/Tests/Runtime/Extensions/IReadonlyListExtensionTests.cs.meta +2 -2
  1114. package/Tests/Runtime/Extensions/LoggingExtensionTests.cs +721 -718
  1115. package/Tests/Runtime/Extensions/LoggingExtensionTests.cs.meta +2 -2
  1116. package/Tests/Runtime/Extensions/ProtoEqualityExtensionsTests.cs +565 -0
  1117. package/Tests/Runtime/Extensions/ProtoEqualityExtensionsTests.cs.meta +3 -0
  1118. package/Tests/Runtime/Extensions/ProtoEqualityPolymorphismTests.cs +100 -0
  1119. package/Tests/Runtime/Extensions/ProtoEqualityPolymorphismTests.cs.meta +11 -0
  1120. package/Tests/Runtime/Extensions/RandomExtensionTests.cs +719 -27
  1121. package/Tests/Runtime/Extensions/RandomExtensionTests.cs.meta +2 -2
  1122. package/Tests/Runtime/Extensions/StringExtensionTests.cs +2592 -31
  1123. package/Tests/Runtime/Extensions/StringExtensionTests.cs.meta +2 -2
  1124. package/Tests/Runtime/Extensions/UnityExtensionsBasicTests.cs +166 -0
  1125. package/Tests/Runtime/Extensions/UnityExtensionsBasicTests.cs.meta +11 -0
  1126. package/Tests/Runtime/Extensions/UnityExtensionsComprehensiveTests.cs +1446 -0
  1127. package/Tests/Runtime/Extensions/UnityExtensionsComprehensiveTests.cs.meta +11 -0
  1128. package/Tests/Runtime/Extensions/UnityExtensionsMathTests.cs +1779 -0
  1129. package/Tests/Runtime/Extensions/UnityExtensionsMathTests.cs.meta +11 -0
  1130. package/Tests/Runtime/Extensions/UnityExtensionsVector2HullTests.cs +292 -0
  1131. package/Tests/Runtime/Extensions/UnityExtensionsVector2HullTests.cs.meta +11 -0
  1132. package/Tests/Runtime/Extensions/UnityLogTagFormatterEdgeTests.cs +260 -0
  1133. package/Tests/Runtime/Extensions/UnityLogTagFormatterEdgeTests.cs.meta +11 -0
  1134. package/Tests/Runtime/Extensions.meta +2 -2
  1135. package/Tests/Runtime/Helper/ArrayConverterTests.cs +19 -19
  1136. package/Tests/Runtime/Helper/ArrayConverterTests.cs.meta +2 -2
  1137. package/Tests/Runtime/Helper/AssignUtilitiesTests.cs +38 -0
  1138. package/Tests/Runtime/Helper/AssignUtilitiesTests.cs.meta +11 -0
  1139. package/Tests/Runtime/Helper/DirectoryHelperTests.cs +347 -0
  1140. package/Tests/Runtime/Helper/DirectoryHelperTests.cs.meta +11 -0
  1141. package/Tests/Runtime/Helper/EnumerablesTests.cs +45 -0
  1142. package/Tests/Runtime/Helper/EnumerablesTests.cs.meta +11 -0
  1143. package/Tests/Runtime/Helper/FileHelperTests.cs +481 -0
  1144. package/Tests/Runtime/Helper/FileHelperTests.cs.meta +11 -0
  1145. package/Tests/Runtime/Helper/FormattingHelpersTests.cs +353 -0
  1146. package/Tests/Runtime/Helper/FormattingHelpersTests.cs.meta +11 -0
  1147. package/Tests/Runtime/Helper/FuncBasedComparerTests.cs +27 -0
  1148. package/Tests/Runtime/Helper/FuncBasedComparerTests.cs.meta +11 -0
  1149. package/Tests/Runtime/Helper/GeometryTests.cs +517 -0
  1150. package/Tests/Runtime/Helper/GeometryTests.cs.meta +3 -0
  1151. package/Tests/Runtime/Helper/HelpersTests.cs +749 -0
  1152. package/Tests/Runtime/Helper/HelpersTests.cs.meta +11 -0
  1153. package/Tests/Runtime/Helper/IterationHelpersTests.cs +173 -0
  1154. package/Tests/Runtime/Helper/IterationHelpersTests.cs.meta +11 -0
  1155. package/Tests/Runtime/Helper/LineHelperTests.cs +662 -0
  1156. package/Tests/Runtime/Helper/LineHelperTests.cs.meta +11 -0
  1157. package/Tests/Runtime/Helper/ObjectHelperTests.cs +444 -432
  1158. package/Tests/Runtime/Helper/ObjectHelperTests.cs.meta +2 -2
  1159. package/Tests/Runtime/Helper/ObjectsTests.cs +363 -0
  1160. package/Tests/Runtime/Helper/ObjectsTests.cs.meta +3 -0
  1161. package/Tests/Runtime/Helper/PathHelperTests.cs +183 -0
  1162. package/Tests/Runtime/Helper/PathHelperTests.cs.meta +11 -0
  1163. package/Tests/Runtime/Helper/ReflectionHelperTests.cs +2199 -1493
  1164. package/Tests/Runtime/Helper/ReflectionHelperTests.cs.meta +2 -2
  1165. package/Tests/Runtime/Helper/ReflectionHelpersMemberLookupTests.cs +192 -0
  1166. package/Tests/Runtime/Helper/ReflectionHelpersMemberLookupTests.cs.meta +11 -0
  1167. package/Tests/Runtime/Helper/ReflectionHelpersTypeScanningTests.cs +58 -0
  1168. package/Tests/Runtime/Helper/ReflectionHelpersTypeScanningTests.cs.meta +11 -0
  1169. package/Tests/Runtime/Helper/SceneHelperTests.cs +77 -94
  1170. package/Tests/Runtime/Helper/SceneHelperTests.cs.meta +2 -2
  1171. package/Tests/Runtime/Helper/UnityMainThreadDispatcherTests.cs +45 -0
  1172. package/Tests/Runtime/Helper/UnityMainThreadDispatcherTests.cs.meta +11 -0
  1173. package/Tests/Runtime/Helper/WallMathTests.cs +1884 -233
  1174. package/Tests/Runtime/Helper/WallMathTests.cs.meta +2 -2
  1175. package/Tests/Runtime/Helper.meta +2 -2
  1176. package/Tests/Runtime/Integrations/VContainer/RelationalComponentsVContainerTests.cs +560 -0
  1177. package/Tests/Runtime/Integrations/VContainer/RelationalComponentsVContainerTests.cs.meta +11 -0
  1178. package/Tests/Runtime/Integrations/VContainer/WallstopStudios.UnityHelpers.Tests.Runtime.VContainer.asmdef +38 -0
  1179. package/Tests/Runtime/Integrations/VContainer/WallstopStudios.UnityHelpers.Tests.Runtime.VContainer.asmdef.meta +7 -0
  1180. package/Tests/Runtime/Integrations/VContainer.meta +8 -0
  1181. package/Tests/Runtime/Integrations/Zenject/RelationalComponentsZenjectTests.cs +591 -0
  1182. package/Tests/Runtime/Integrations/Zenject/RelationalComponentsZenjectTests.cs.meta +11 -0
  1183. package/Tests/Runtime/Integrations/Zenject/WallstopStudios.UnityHelpers.Tests.Runtime.Zenject.asmdef +38 -0
  1184. package/Tests/Runtime/Integrations/Zenject/WallstopStudios.UnityHelpers.Tests.Runtime.Zenject.asmdef.meta +7 -0
  1185. package/Tests/Runtime/Integrations/Zenject.meta +8 -0
  1186. package/Tests/Runtime/Integrations.meta +8 -0
  1187. package/Tests/Runtime/Math/Line2DTests.cs +594 -0
  1188. package/Tests/Runtime/Math/Line2DTests.cs.meta +11 -0
  1189. package/Tests/Runtime/Math/Line3DTests.cs +655 -0
  1190. package/Tests/Runtime/Math/Line3DTests.cs.meta +11 -0
  1191. package/Tests/Runtime/Math/LineTests.cs +480 -0
  1192. package/Tests/Runtime/Math/LineTests.cs.meta +11 -0
  1193. package/Tests/Runtime/Math/ParabolaTests.cs +477 -0
  1194. package/Tests/Runtime/Math/ParabolaTests.cs.meta +11 -0
  1195. package/Tests/Runtime/Math/PointPolygonCheckTests.cs +939 -0
  1196. package/Tests/Runtime/Math/PointPolygonCheckTests.cs.meta +11 -0
  1197. package/Tests/Runtime/Math/RangeTests.cs +197 -0
  1198. package/Tests/Runtime/Math/RangeTests.cs.meta +11 -0
  1199. package/Tests/Runtime/Math.meta +8 -0
  1200. package/Tests/Runtime/Performance/BenchmarkReadmeUpdater.cs +81 -0
  1201. package/Tests/Runtime/Performance/BenchmarkReadmeUpdater.cs.meta +11 -0
  1202. package/Tests/Runtime/Performance/JsonSerializationPerformanceTests.cs +421 -0
  1203. package/Tests/Runtime/Performance/JsonSerializationPerformanceTests.cs.meta +3 -0
  1204. package/Tests/Runtime/Performance/ListExtensionPerformanceTests.cs +76 -76
  1205. package/Tests/Runtime/Performance/ListExtensionPerformanceTests.cs.meta +2 -2
  1206. package/Tests/Runtime/Performance/ProtoEqualsPerformanceTests.cs +161 -0
  1207. package/Tests/Runtime/Performance/ProtoEqualsPerformanceTests.cs.meta +11 -0
  1208. package/Tests/Runtime/Performance/ProtoSerializationPerformanceTests.cs +207 -0
  1209. package/Tests/Runtime/Performance/ProtoSerializationPerformanceTests.cs.meta +3 -0
  1210. package/Tests/Runtime/Performance/RandomPerformanceTests.cs +195 -181
  1211. package/Tests/Runtime/Performance/RandomPerformanceTests.cs.meta +11 -11
  1212. package/Tests/Runtime/Performance/RelationComponentPerformanceTests.cs +60 -61
  1213. package/Tests/Runtime/Performance/RelationComponentPerformanceTests.cs.meta +2 -2
  1214. package/Tests/Runtime/Performance/SpatialTree2DPerformanceTests.cs +692 -0
  1215. package/Tests/Runtime/Performance/SpatialTree2DPerformanceTests.cs.meta +11 -0
  1216. package/Tests/Runtime/Performance/SpatialTree3DPerformanceTests.cs +650 -0
  1217. package/Tests/Runtime/Performance/SpatialTree3DPerformanceTests.cs.meta +11 -0
  1218. package/Tests/Runtime/Performance.meta +8 -8
  1219. package/Tests/Runtime/Random/DotNetRandomTests.cs +9 -9
  1220. package/Tests/Runtime/Random/DotNetRandomTests.cs.meta +2 -2
  1221. package/Tests/Runtime/Random/IllusionFlowTests.cs +12 -12
  1222. package/Tests/Runtime/Random/IllusionFlowTests.cs.meta +2 -2
  1223. package/Tests/Runtime/Random/LinearCongruentialGeneratorTests.cs +12 -12
  1224. package/Tests/Runtime/Random/LinearCongruentialGeneratorTests.cs.meta +2 -2
  1225. package/Tests/Runtime/Random/PcgRandomTests.cs +9 -9
  1226. package/Tests/Runtime/Random/PcgRandomTests.cs.meta +11 -11
  1227. package/Tests/Runtime/Random/RandomProtoSerializationTests.cs +494 -0
  1228. package/Tests/Runtime/Random/RandomProtoSerializationTests.cs.meta +3 -0
  1229. package/Tests/Runtime/Random/RandomStateSerializationTests.cs +304 -0
  1230. package/Tests/Runtime/Random/RandomStateSerializationTests.cs.meta +4 -0
  1231. package/Tests/Runtime/Random/RandomTestBase.cs +836 -787
  1232. package/Tests/Runtime/Random/RandomTestBase.cs.meta +11 -11
  1233. package/Tests/Runtime/Random/RomuDuoRandomTests.cs +9 -9
  1234. package/Tests/Runtime/Random/RomuDuoRandomTests.cs.meta +2 -2
  1235. package/Tests/Runtime/Random/SplitMix64RandomTests.cs +9 -9
  1236. package/Tests/Runtime/Random/SplitMix64RandomTests.cs.meta +2 -2
  1237. package/Tests/Runtime/Random/SquirrelRandomTests.cs +14 -14
  1238. package/Tests/Runtime/Random/SquirrelRandomTests.cs.meta +11 -11
  1239. package/Tests/Runtime/Random/SystemRandomTests.cs +10 -10
  1240. package/Tests/Runtime/Random/SystemRandomTests.cs.meta +11 -11
  1241. package/Tests/Runtime/Random/UnityRandomTests.cs +9 -9
  1242. package/Tests/Runtime/Random/UnityRandomTests.cs.meta +11 -11
  1243. package/Tests/Runtime/Random/WyRandomTests.cs +9 -9
  1244. package/Tests/Runtime/Random/WyRandomTests.cs.meta +2 -2
  1245. package/Tests/Runtime/Random/XorShiftRandomTests.cs +9 -9
  1246. package/Tests/Runtime/Random/XorShiftRandomTests.cs.meta +11 -11
  1247. package/Tests/Runtime/Random/XoroShiroRandomTests.cs +9 -9
  1248. package/Tests/Runtime/Random/XoroShiroRandomTests.cs.meta +2 -2
  1249. package/Tests/Runtime/Random.meta +8 -8
  1250. package/Tests/Runtime/RuntimeTestTimeouts.cs +3 -0
  1251. package/Tests/Runtime/RuntimeTestTimeouts.cs.meta +11 -0
  1252. package/Tests/Runtime/Scenes/Test1.unity +723 -723
  1253. package/Tests/Runtime/Scenes/Test1.unity.meta +7 -7
  1254. package/Tests/Runtime/Scenes/Test2.unity +723 -723
  1255. package/Tests/Runtime/Scenes/Test2.unity.meta +7 -7
  1256. package/Tests/Runtime/Scenes.meta +2 -2
  1257. package/Tests/Runtime/Serialization/AdaptersJsonTests.cs +67 -0
  1258. package/Tests/Runtime/Serialization/AdaptersJsonTests.cs.meta +11 -0
  1259. package/Tests/Runtime/Serialization/BitSetJsonTests.cs +50 -0
  1260. package/Tests/Runtime/Serialization/BitSetJsonTests.cs.meta +11 -0
  1261. package/Tests/Runtime/Serialization/CyclicBufferJsonTests.cs +67 -0
  1262. package/Tests/Runtime/Serialization/CyclicBufferJsonTests.cs.meta +11 -0
  1263. package/Tests/Runtime/Serialization/DequeJsonTests.cs +70 -0
  1264. package/Tests/Runtime/Serialization/DequeJsonTests.cs.meta +11 -0
  1265. package/Tests/Runtime/Serialization/ImmutableBitSetJsonTests.cs +25 -0
  1266. package/Tests/Runtime/Serialization/ImmutableBitSetJsonTests.cs.meta +11 -0
  1267. package/Tests/Runtime/Serialization/JsonConverterTests.cs +1157 -0
  1268. package/Tests/Runtime/Serialization/JsonConverterTests.cs.meta +11 -0
  1269. package/Tests/Runtime/Serialization/JsonRoundtripComprehensiveTests.cs +239 -0
  1270. package/Tests/Runtime/Serialization/JsonRoundtripComprehensiveTests.cs.meta +11 -0
  1271. package/Tests/Runtime/Serialization/JsonSerializationCorrectnessTests.cs +458 -0
  1272. package/Tests/Runtime/Serialization/JsonSerializationCorrectnessTests.cs.meta +3 -0
  1273. package/Tests/Runtime/Serialization/JsonSerializationTest.cs +156 -156
  1274. package/Tests/Runtime/Serialization/JsonSerializationTest.cs.meta +2 -2
  1275. package/Tests/Runtime/Serialization/MathJsonTests.cs +79 -0
  1276. package/Tests/Runtime/Serialization/MathJsonTests.cs.meta +11 -0
  1277. package/Tests/Runtime/Serialization/ProtoInterfaceResolutionEdgeTests.cs +76 -0
  1278. package/Tests/Runtime/Serialization/ProtoInterfaceResolutionEdgeTests.cs.meta +11 -0
  1279. package/Tests/Runtime/Serialization/ProtoRootRegistrationTests.cs +80 -0
  1280. package/Tests/Runtime/Serialization/ProtoRootRegistrationTests.cs.meta +11 -0
  1281. package/Tests/Runtime/Serialization/ProtoRoundtripComprehensiveTests.cs +257 -0
  1282. package/Tests/Runtime/Serialization/ProtoRoundtripComprehensiveTests.cs.meta +11 -0
  1283. package/Tests/Runtime/Serialization/ProtoSerializationCorrectnessTests.cs +471 -0
  1284. package/Tests/Runtime/Serialization/ProtoSerializationCorrectnessTests.cs.meta +3 -0
  1285. package/Tests/Runtime/Serialization/ProtoSerializationTests.cs +169 -0
  1286. package/Tests/Runtime/Serialization/ProtoSerializationTests.cs.meta +11 -0
  1287. package/Tests/Runtime/Serialization/ProtoSerializeBehaviorTests.cs +62 -0
  1288. package/Tests/Runtime/Serialization/ProtoSerializeBehaviorTests.cs.meta +11 -0
  1289. package/Tests/Runtime/Serialization/SerializerAdditionalTests.cs +895 -0
  1290. package/Tests/Runtime/Serialization/SerializerAdditionalTests.cs.meta +3 -0
  1291. package/Tests/Runtime/Serialization/TypeConverterTests.cs +34 -0
  1292. package/Tests/Runtime/Serialization/TypeConverterTests.cs.meta +11 -0
  1293. package/Tests/Runtime/Serialization.meta +2 -2
  1294. package/Tests/Runtime/Tags/AttributeComponentTests.cs +174 -0
  1295. package/Tests/Runtime/Tags/AttributeComponentTests.cs.meta +3 -0
  1296. package/Tests/Runtime/Tags/AttributeDataTests.cs +312 -0
  1297. package/Tests/Runtime/Tags/AttributeDataTests.cs.meta +11 -0
  1298. package/Tests/Runtime/Tags/AttributeUtilitiesTests.cs +405 -0
  1299. package/Tests/Runtime/Tags/AttributeUtilitiesTests.cs.meta +3 -0
  1300. package/Tests/Runtime/Tags/CosmeticAndCollisionTests.cs +147 -0
  1301. package/Tests/Runtime/Tags/CosmeticAndCollisionTests.cs.meta +11 -0
  1302. package/Tests/Runtime/Tags/CosmeticEffectDataTests.cs +60 -0
  1303. package/Tests/Runtime/Tags/CosmeticEffectDataTests.cs.meta +3 -0
  1304. package/Tests/Runtime/Tags/EffectHandleTests.cs +61 -0
  1305. package/Tests/Runtime/Tags/EffectHandleTests.cs.meta +3 -0
  1306. package/Tests/Runtime/Tags/EffectHandlerTests.cs +270 -0
  1307. package/Tests/Runtime/Tags/EffectHandlerTests.cs.meta +3 -0
  1308. package/Tests/Runtime/Tags/Helpers/RecordingCosmeticComponent.cs +39 -0
  1309. package/Tests/Runtime/Tags/Helpers/RecordingCosmeticComponent.cs.meta +3 -0
  1310. package/Tests/Runtime/Tags/Helpers/TagTestBase.cs +49 -0
  1311. package/Tests/Runtime/Tags/Helpers/TagTestBase.cs.meta +3 -0
  1312. package/Tests/Runtime/Tags/Helpers/TestAttributesComponent.cs +28 -0
  1313. package/Tests/Runtime/Tags/Helpers/TestAttributesComponent.cs.meta +3 -0
  1314. package/Tests/Runtime/Tags/Helpers.meta +3 -0
  1315. package/Tests/Runtime/Tags/TagHandlerTests.cs +108 -0
  1316. package/Tests/Runtime/Tags/TagHandlerTests.cs.meta +3 -0
  1317. package/Tests/Runtime/Tags.meta +8 -0
  1318. package/Tests/Runtime/TestUtils/CommonTestBase.cs +213 -0
  1319. package/Tests/Runtime/TestUtils/CommonTestBase.cs.meta +11 -0
  1320. package/Tests/Runtime/TestUtils/GCAssert.cs +55 -0
  1321. package/Tests/Runtime/TestUtils/GCAssert.cs.meta +11 -0
  1322. package/Tests/Runtime/TestUtils/SpatialAssert.cs +33 -0
  1323. package/Tests/Runtime/TestUtils/SpatialAssert.cs.meta +11 -0
  1324. package/Tests/Runtime/TestUtils/SpatialDiagnostics.cs +195 -0
  1325. package/Tests/Runtime/TestUtils/SpatialDiagnostics.cs.meta +11 -0
  1326. package/Tests/Runtime/TestUtils.meta +8 -0
  1327. package/Tests/Runtime/Utils/AnimationEventEqualityComparerTests.cs +144 -0
  1328. package/Tests/Runtime/Utils/AnimationEventEqualityComparerTests.cs.meta +11 -0
  1329. package/Tests/Runtime/Utils/Ascii85Tests.cs +56 -0
  1330. package/Tests/Runtime/Utils/Ascii85Tests.cs.meta +11 -0
  1331. package/Tests/Runtime/Utils/BuffersTests.cs +1148 -741
  1332. package/Tests/Runtime/Utils/BuffersTests.cs.meta +2 -2
  1333. package/Tests/Runtime/Utils/BuffersWaitInstructionTests.cs +31 -0
  1334. package/Tests/Runtime/Utils/BuffersWaitInstructionTests.cs.meta +11 -0
  1335. package/Tests/Runtime/Utils/CenterPointOffsetTests.cs +67 -0
  1336. package/Tests/Runtime/Utils/CenterPointOffsetTests.cs.meta +11 -0
  1337. package/Tests/Runtime/Utils/ChildSpawnerTests.cs +490 -0
  1338. package/Tests/Runtime/Utils/ChildSpawnerTests.cs.meta +11 -0
  1339. package/Tests/Runtime/Utils/CircleLineRendererTests.cs +80 -0
  1340. package/Tests/Runtime/Utils/CircleLineRendererTests.cs.meta +11 -0
  1341. package/Tests/Runtime/Utils/CollisionProxyTests.cs +442 -0
  1342. package/Tests/Runtime/Utils/CollisionProxyTests.cs.meta +11 -0
  1343. package/Tests/Runtime/Utils/CoroutineHandlerTests.cs +353 -0
  1344. package/Tests/Runtime/Utils/CoroutineHandlerTests.cs.meta +11 -0
  1345. package/Tests/Runtime/Utils/DeferredDisposalResultTests.cs +44 -0
  1346. package/Tests/Runtime/Utils/DeferredDisposalResultTests.cs.meta +11 -0
  1347. package/Tests/Runtime/Utils/LZMAComprehensiveTests.cs +249 -0
  1348. package/Tests/Runtime/Utils/LZMAComprehensiveTests.cs.meta +11 -0
  1349. package/Tests/Runtime/Utils/LZMATests.cs +31 -0
  1350. package/Tests/Runtime/Utils/LZMATests.cs.meta +11 -0
  1351. package/Tests/Runtime/Utils/MatchColliderToSpriteAdditionalTests.cs +86 -0
  1352. package/Tests/Runtime/Utils/MatchColliderToSpriteAdditionalTests.cs.meta +11 -0
  1353. package/Tests/Runtime/Utils/MatchColliderToSpriteTests.cs +503 -0
  1354. package/Tests/Runtime/Utils/MatchColliderToSpriteTests.cs.meta +11 -0
  1355. package/Tests/Runtime/Utils/MatchTransformEdgeTests.cs +34 -0
  1356. package/Tests/Runtime/Utils/MatchTransformEdgeTests.cs.meta +11 -0
  1357. package/Tests/Runtime/Utils/MatchTransformTests.cs +495 -0
  1358. package/Tests/Runtime/Utils/MatchTransformTests.cs.meta +11 -0
  1359. package/Tests/Runtime/Utils/OscillatorTests.cs +540 -0
  1360. package/Tests/Runtime/Utils/OscillatorTests.cs.meta +11 -0
  1361. package/Tests/Runtime/Utils/PolygonCollider2DOptimizerTests.cs +52 -0
  1362. package/Tests/Runtime/Utils/PolygonCollider2DOptimizerTests.cs.meta +11 -0
  1363. package/Tests/Runtime/Utils/RuntimeSingletonTests.cs +766 -0
  1364. package/Tests/Runtime/Utils/RuntimeSingletonTests.cs.meta +11 -0
  1365. package/Tests/Runtime/Utils/SerializedStringComparerEdgeTests.cs +47 -0
  1366. package/Tests/Runtime/Utils/SerializedStringComparerEdgeTests.cs.meta +11 -0
  1367. package/Tests/Runtime/Utils/SerializedStringComparerTests.cs +361 -0
  1368. package/Tests/Runtime/Utils/SerializedStringComparerTests.cs.meta +11 -0
  1369. package/Tests/Runtime/Utils/SpriteRendererMetadataTests.cs +383 -398
  1370. package/Tests/Runtime/Utils/SpriteRendererMetadataTests.cs.meta +2 -2
  1371. package/Tests/Runtime/Utils/SpriteRendererSyncTests.cs +134 -0
  1372. package/Tests/Runtime/Utils/SpriteRendererSyncTests.cs.meta +11 -0
  1373. package/Tests/Runtime/Utils/StartTrackerTests.cs +24 -0
  1374. package/Tests/Runtime/Utils/StartTrackerTests.cs.meta +11 -0
  1375. package/Tests/Runtime/Utils/TextureScaleEdgeTests.cs +114 -0
  1376. package/Tests/Runtime/Utils/TextureScaleEdgeTests.cs.meta +11 -0
  1377. package/Tests/Runtime/Utils/TextureScaleTests.cs +298 -0
  1378. package/Tests/Runtime/Utils/TextureScaleTests.cs.meta +3 -0
  1379. package/Tests/Runtime/Utils/TypeNameSorterAdditionalTests.cs +36 -0
  1380. package/Tests/Runtime/Utils/TypeNameSorterAdditionalTests.cs.meta +11 -0
  1381. package/Tests/Runtime/Utils/TypeNameSorterTests.cs +34 -0
  1382. package/Tests/Runtime/Utils/TypeNameSorterTests.cs.meta +11 -0
  1383. package/Tests/Runtime/Utils/UnityObjectNameComparerEdgeTests.cs +63 -0
  1384. package/Tests/Runtime/Utils/UnityObjectNameComparerEdgeTests.cs.meta +11 -0
  1385. package/Tests/Runtime/Utils/UnityObjectNameComparerTests.cs +59 -0
  1386. package/Tests/Runtime/Utils/UnityObjectNameComparerTests.cs.meta +11 -0
  1387. package/Tests/Runtime/Utils.meta +2 -2
  1388. package/Tests/Runtime/Visuals/AnimatedSpriteLayerTests.cs +266 -0
  1389. package/Tests/Runtime/Visuals/AnimatedSpriteLayerTests.cs.meta +11 -0
  1390. package/Tests/Runtime/Visuals/EnhancedImageTests.cs +184 -0
  1391. package/Tests/Runtime/Visuals/EnhancedImageTests.cs.meta +11 -0
  1392. package/Tests/Runtime/Visuals/LayeredImageTests.cs +422 -0
  1393. package/Tests/Runtime/Visuals/LayeredImageTests.cs.meta +11 -0
  1394. package/Tests/Runtime/Visuals/VisualsTestHelpers.cs +132 -0
  1395. package/Tests/Runtime/Visuals/VisualsTestHelpers.cs.meta +11 -0
  1396. package/Tests/Runtime/Visuals.meta +3 -0
  1397. package/Tests/Runtime/WallstopStudios.UnityHelpers.Tests.Runtime.asmdef +24 -23
  1398. package/Tests/Runtime/WallstopStudios.UnityHelpers.Tests.Runtime.asmdef.meta +7 -7
  1399. package/Tests/Runtime.meta +8 -8
  1400. package/Tests.meta +8 -8
  1401. package/URP/VolumeProfiles/Post Processing Bloom Profile(URP).asset +63 -63
  1402. package/URP/VolumeProfiles/Post Processing Bloom Profile(URP).asset.meta +8 -8
  1403. package/URP/VolumeProfiles.meta +8 -8
  1404. package/URP.meta +8 -8
  1405. package/node_modules.meta +8 -0
  1406. package/package.json +95 -38
  1407. package/package.json.meta +7 -7
  1408. package/scripts/check-eol.ps1 +52 -0
  1409. package/scripts/check-eol.ps1.meta +7 -0
  1410. package/scripts/clean-nul.ps1 +29 -0
  1411. package/scripts/clean-nul.ps1.meta +7 -0
  1412. package/scripts/lint-doc-links.ps1 +80 -0
  1413. package/scripts/lint-doc-links.ps1.meta +7 -0
  1414. package/scripts/normalize-eol.ps1 +71 -0
  1415. package/scripts/normalize-eol.ps1.meta +7 -0
  1416. package/scripts.meta +8 -0
  1417. package/Editor/Sprites/ProjectAnimationSettings.cs +0 -50
  1418. package/Editor/Sprites/ProjectAnimationSettings.cs.meta +0 -3
  1419. package/Editor/Sprites/TextureSettingsApplier.cs +0 -178
  1420. package/Editor/Sprites/TextureSettingsApplier.cs.meta +0 -3
  1421. package/Runtime/Core/Attributes/ParentComponent.cs +0 -189
  1422. package/Runtime/Core/DataStructure/KDTree.cs +0 -434
  1423. package/Runtime/Core/DataStructure/QuadTree.cs +0 -431
  1424. package/Runtime/Core/DataStructure/RTree.cs +0 -356
  1425. package/Runtime/Core/Extension/HashSetExtensions.cs +0 -12
  1426. package/Runtime/Core/Extension/HashSetExtensions.cs.meta +0 -11
  1427. package/Runtime/Core/Math/Line.cs +0 -55
  1428. package/Runtime/Core/Math/Line.cs.meta +0 -11
  1429. package/Runtime/Core/Math/XXHash.cs +0 -310
  1430. package/Runtime/Core/Math/XXHash.cs.meta +0 -11
  1431. package/Tests/Runtime/Components/RelationalComponentsTesterSimple.cs +0 -40
  1432. package/Tests/Runtime/Components.meta +0 -3
  1433. package/Tests/Runtime/DataStructures/BalancedKDTreeTests.cs +0 -14
  1434. package/Tests/Runtime/DataStructures/QuadTreeTests.cs +0 -14
  1435. package/Tests/Runtime/DataStructures/QuadTreeTests.cs.meta +0 -11
  1436. package/Tests/Runtime/DataStructures/SpatialTreeTests.cs +0 -130
  1437. package/Tests/Runtime/DataStructures/SpatialTreeTests.cs.meta +0 -11
  1438. package/Tests/Runtime/DataStructures/UnbalancedKDTreeTests.cs +0 -14
  1439. package/Tests/Runtime/Helper/FormattingHelperTests.cs +0 -129
  1440. package/Tests/Runtime/Helper/FormattingHelperTests.cs.meta +0 -3
  1441. package/Tests/Runtime/Performance/KDTreePerformanceTests.cs +0 -14
  1442. package/Tests/Runtime/Performance/KDTreePerformanceTests.cs.meta +0 -11
  1443. package/Tests/Runtime/Performance/QuadTreePerformanceTests.cs +0 -14
  1444. package/Tests/Runtime/Performance/QuadTreePerformanceTests.cs.meta +0 -11
  1445. package/Tests/Runtime/Performance/SpatialTreePerformanceTest.cs +0 -158
  1446. package/Tests/Runtime/Performance/SpatialTreePerformanceTest.cs.meta +0 -11
  1447. package/Tests/Runtime/Performance/UnbalancedKDTreeTests.cs +0 -14
  1448. package/Tests/Runtime/Performance/UnbalancedKDTreeTests.cs.meta +0 -11
  1449. 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
+ }