com.wallstop-studios.unity-helpers 2.0.0-rc81.7 → 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 -89
  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,1522 +1,1634 @@
1
- // ReSharper disable HeapView.CanAvoidClosure
2
- namespace WallstopStudios.UnityHelpers.Editor.Sprites
3
- {
4
- #if UNITY_EDITOR
5
- using System;
6
- using System.Collections.Generic;
7
- using System.IO;
8
- using System.Linq;
9
- using Core.Extension;
10
- using Core.Helper;
11
- using UnityEditor;
12
- using UnityEditor.UIElements;
13
- using UnityEngine;
14
- using UnityEngine.UIElements;
15
- using WallstopStudios.UnityHelpers.Visuals;
16
- using WallstopStudios.UnityHelpers.Visuals.UIToolkit;
17
- using Object = UnityEngine.Object;
18
-
19
- public sealed class AnimationViewerWindow : EditorWindow
20
- {
21
- private const string PackageId = "com.wallstop-studios.unity-helpers";
22
- private const float DragThresholdSqrMagnitude = 10f * 10f;
23
- private const int InvalidPointerId = -1;
24
-
25
- private sealed class EditorLayerData
26
- {
27
- public AnimationClip SourceClip { get; }
28
- public List<Sprite> Sprites { get; }
29
- public string ClipName => SourceClip != null ? SourceClip.name : "Unnamed Layer";
30
- public float OriginalClipFps { get; }
31
- public string BindingPath { get; }
32
-
33
- public EditorLayerData(AnimationClip clip)
34
- {
35
- SourceClip = clip;
36
- Sprites = clip.GetSpritesFromClip()?.ToList();
37
- OriginalClipFps =
38
- clip.frameRate > 0 ? clip.frameRate : AnimatedSpriteLayer.FrameRate;
39
-
40
- BindingPath = string.Empty;
41
- if (SourceClip != null)
42
- {
43
- foreach (
44
- EditorCurveBinding binding in AnimationUtility.GetObjectReferenceCurveBindings(
45
- SourceClip
46
- )
47
- )
48
- {
49
- if (
50
- binding.type == typeof(SpriteRenderer)
51
- && binding.propertyName == "m_Sprite"
52
- )
53
- {
54
- BindingPath = binding.path;
55
- break;
56
- }
57
- }
58
- }
59
- }
60
- }
61
-
62
- [MenuItem("Tools/Wallstop Studios/Unity Helpers/Sprite Animation Editor")]
63
- public static void ShowWindow()
64
- {
65
- AnimationViewerWindow wnd = GetWindow<AnimationViewerWindow>();
66
- wnd.titleContent = new GUIContent("2D Animation Viewer");
67
- wnd.minSize = new Vector2(750, 500);
68
- }
69
-
70
- private VisualTreeAsset _visualTree;
71
- private StyleSheet _styleSheet;
72
-
73
- private ObjectField _addAnimationClipField;
74
- private Button _browseAndAddButton;
75
- private FloatField _fpsField;
76
- private Button _applyFpsButton;
77
- private Button _saveClipButton;
78
- private VisualElement _loadedClipsContainer;
79
- private VisualElement _previewPanelHost;
80
- private LayeredImage _animationPreview;
81
- private VisualElement _framesContainer;
82
- private Label _fpsDebugLabel;
83
- private Label _framesPanelTitle;
84
- private MultiFileSelectorElement _fileSelector;
85
-
86
- private readonly List<EditorLayerData> _loadedEditorLayers = new();
87
-
88
- private EditorLayerData _activeEditorLayer;
89
- private float _currentPreviewFps = AnimatedSpriteLayer.FrameRate;
90
-
91
- private VisualElement _draggedFrameElement;
92
- private int _draggedFrameOriginalDataIndex;
93
- private VisualElement _frameDropPlaceholder;
94
-
95
- private VisualElement _draggedLoadedClipElement;
96
- private int _draggedLoadedClipOriginalIndex;
97
- private VisualElement _loadedClipDropPlaceholder;
98
-
99
- private bool _isClipDragPending;
100
- private Vector3 _clipDragStartPosition;
101
- private VisualElement _clipDragPendingElement;
102
- private int _clipDragPendingOriginalIndex;
103
-
104
- public void CreateGUI()
105
- {
106
- VisualElement root = rootVisualElement;
107
-
108
- TryLoadStyleSheets();
109
-
110
- if (_visualTree == null)
111
- {
112
- root.Add(new Label("Error: AnimationViewer.uxml not found."));
113
- return;
114
- }
115
- if (_styleSheet != null)
116
- {
117
- root.styleSheets.Add(_styleSheet);
118
- }
119
-
120
- _visualTree.CloneTree(root);
121
-
122
- _addAnimationClipField = root.Q<ObjectField>("addAnimationClipField");
123
- _browseAndAddButton = root.Q<Button>("browseAndAddButton");
124
- _fpsField = root.Q<FloatField>("fpsField");
125
- _applyFpsButton = root.Q<Button>("applyFpsButton");
126
- _saveClipButton = root.Q<Button>("saveClipButton");
127
- _loadedClipsContainer = root.Q<VisualElement>("loadedClipsContainer");
128
- _previewPanelHost = root.Q<VisualElement>("preview-panel");
129
- _framesContainer = root.Q<VisualElement>("framesContainer");
130
- _fpsDebugLabel = root.Q<Label>("fpsDebugLabel");
131
- _framesPanelTitle = root.Q<Label>("framesPanelTitle");
132
-
133
- _previewPanelHost.AddToClassList("animation-preview-container");
134
-
135
- _fpsField.value = _currentPreviewFps;
136
- _saveClipButton.SetEnabled(false);
137
-
138
- _addAnimationClipField.RegisterValueChangedCallback(OnAddAnimationClipFieldChanged);
139
- _browseAndAddButton.text = "Add Selected Clips from Project";
140
- _browseAndAddButton.clicked -= OnBrowseAndAddClicked;
141
- if (_browseAndAddButton != null)
142
- {
143
- _browseAndAddButton.text = "Browse Clips (Multi)...";
144
- _browseAndAddButton.clicked -= OnAddSelectedClipsFromProjectClicked;
145
- _browseAndAddButton.clicked += ToggleMultiFileSelector;
146
- }
147
- else
148
- {
149
- this.LogError(
150
- $"'browseAndAddButton' not found in UXML. Multi-file browser cannot be triggered."
151
- );
152
- }
153
- _applyFpsButton.clicked += OnApplyFpsToPreviewClicked;
154
- _saveClipButton.clicked += OnSaveClipClicked;
155
-
156
- _frameDropPlaceholder = new VisualElement();
157
- _frameDropPlaceholder.AddToClassList("drop-placeholder");
158
- _frameDropPlaceholder.style.height = 5;
159
- _frameDropPlaceholder.style.visibility = Visibility.Hidden;
160
-
161
- _framesContainer.RegisterCallback<DragUpdatedEvent>(OnFramesContainerDragUpdated);
162
- _framesContainer.RegisterCallback<DragPerformEvent>(OnFramesContainerDragPerform);
163
- _framesContainer.RegisterCallback<DragLeaveEvent>(OnFramesContainerDragLeave);
164
-
165
- _loadedClipDropPlaceholder = new VisualElement();
166
- _loadedClipDropPlaceholder.AddToClassList("drop-placeholder");
167
- _loadedClipDropPlaceholder.style.height = 5;
168
- _loadedClipDropPlaceholder.style.visibility = Visibility.Hidden;
169
-
170
- _loadedClipsContainer.RegisterCallback<DragUpdatedEvent>(
171
- OnLoadedClipsContainerDragUpdated
172
- );
173
- _loadedClipsContainer.RegisterCallback<DragPerformEvent>(
174
- OnLoadedClipsContainerDragPerform
175
- );
176
- _loadedClipsContainer.RegisterCallback<DragLeaveEvent>(OnLoadedClipsContainerDragLeave);
177
-
178
- UpdateFramesPanelTitle();
179
- RebuildLoadedClipsUI();
180
- RecreatePreviewImage();
181
- }
182
-
183
- private void Update()
184
- {
185
- _animationPreview?.Update();
186
- }
187
-
188
- private void TryLoadStyleSheets()
189
- {
190
- string packageRoot = DirectoryHelper.FindPackageRootPath(
191
- DirectoryHelper.GetCallerScriptDirectory()
192
- );
193
- if (!string.IsNullOrWhiteSpace(packageRoot))
194
- {
195
- if (
196
- packageRoot.StartsWith("Packages", StringComparison.OrdinalIgnoreCase)
197
- && !packageRoot.Contains(PackageId, StringComparison.OrdinalIgnoreCase)
198
- )
199
- {
200
- int helpersIndex = packageRoot.LastIndexOf(
201
- "UnityHelpers",
202
- StringComparison.Ordinal
203
- );
204
- if (0 <= helpersIndex)
205
- {
206
- packageRoot = packageRoot[..helpersIndex];
207
- packageRoot += PackageId;
208
- }
209
- }
210
-
211
- char pathSeparator = Path.DirectorySeparatorChar;
212
- string styleSheetPath =
213
- $"{packageRoot}{pathSeparator}Editor{pathSeparator}Styles{pathSeparator}AnimationViewer.uss";
214
- string unityRelativeStyleSheetPath = DirectoryHelper.AbsoluteToUnityRelativePath(
215
- styleSheetPath
216
- );
217
- unityRelativeStyleSheetPath = unityRelativeStyleSheetPath.SanitizePath();
218
-
219
- const string packageCache = "PackageCache/";
220
- int packageCacheIndex;
221
- if (!string.IsNullOrWhiteSpace(unityRelativeStyleSheetPath))
222
- {
223
- _styleSheet = AssetDatabase.LoadAssetAtPath<StyleSheet>(
224
- unityRelativeStyleSheetPath
225
- );
226
- }
227
-
228
- if (_styleSheet == null && !string.IsNullOrWhiteSpace(unityRelativeStyleSheetPath))
229
- {
230
- packageCacheIndex = unityRelativeStyleSheetPath.IndexOf(
231
- packageCache,
232
- StringComparison.OrdinalIgnoreCase
233
- );
234
- if (0 <= packageCacheIndex)
235
- {
236
- unityRelativeStyleSheetPath = unityRelativeStyleSheetPath[
237
- (packageCacheIndex + packageCache.Length)..
238
- ];
239
- int forwardIndex = unityRelativeStyleSheetPath.IndexOf(
240
- "/",
241
- StringComparison.Ordinal
242
- );
243
- if (0 <= forwardIndex)
244
- {
245
- unityRelativeStyleSheetPath = unityRelativeStyleSheetPath.Substring(
246
- forwardIndex
247
- );
248
- unityRelativeStyleSheetPath =
249
- "Packages/" + PackageId + "/" + unityRelativeStyleSheetPath;
250
- }
251
- else
252
- {
253
- unityRelativeStyleSheetPath = "Packages/" + unityRelativeStyleSheetPath;
254
- }
255
- }
256
-
257
- if (!string.IsNullOrWhiteSpace(unityRelativeStyleSheetPath))
258
- {
259
- _styleSheet = AssetDatabase.LoadAssetAtPath<StyleSheet>(
260
- unityRelativeStyleSheetPath
261
- );
262
- if (_styleSheet == null)
263
- {
264
- this.LogError(
265
- $"Failed to load Animation Viewer style sheet (package root: '{packageRoot}'), relative path '{unityRelativeStyleSheetPath}'."
266
- );
267
- }
268
- }
269
- else
270
- {
271
- this.LogError(
272
- $"Failed to convert absolute path '{styleSheetPath}' to Unity relative path."
273
- );
274
- }
275
- }
276
-
277
- string visualTreePath =
278
- $"{packageRoot}{pathSeparator}Editor{pathSeparator}Styles{pathSeparator}AnimationViewer.uxml";
279
- string unityRelativeVisualTreePath = DirectoryHelper.AbsoluteToUnityRelativePath(
280
- visualTreePath
281
- );
282
-
283
- _visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>(
284
- unityRelativeVisualTreePath
285
- );
286
- if (_visualTree == null)
287
- {
288
- packageCacheIndex = unityRelativeVisualTreePath.IndexOf(
289
- packageCache,
290
- StringComparison.OrdinalIgnoreCase
291
- );
292
- if (0 <= packageCacheIndex)
293
- {
294
- unityRelativeVisualTreePath = unityRelativeVisualTreePath[
295
- (packageCacheIndex + packageCache.Length)..
296
- ];
297
- int forwardIndex = unityRelativeVisualTreePath.IndexOf(
298
- "/",
299
- StringComparison.Ordinal
300
- );
301
- if (0 <= forwardIndex)
302
- {
303
- unityRelativeVisualTreePath = unityRelativeVisualTreePath.Substring(
304
- forwardIndex
305
- );
306
- unityRelativeVisualTreePath =
307
- "Packages/" + PackageId + "/" + unityRelativeVisualTreePath;
308
- }
309
- else
310
- {
311
- unityRelativeVisualTreePath = "Packages/" + unityRelativeVisualTreePath;
312
- }
313
- }
314
-
315
- if (!string.IsNullOrWhiteSpace(unityRelativeVisualTreePath))
316
- {
317
- _visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>(
318
- unityRelativeVisualTreePath
319
- );
320
- }
321
- }
322
- }
323
- else
324
- {
325
- this.LogError(
326
- $"Failed to find Animation Viewer style sheet (package root: '{packageRoot}')."
327
- );
328
- }
329
- }
330
-
331
- private void ToggleMultiFileSelector()
332
- {
333
- VisualElement root = rootVisualElement;
334
- if (_fileSelector == null)
335
- {
336
- _fileSelector = new MultiFileSelectorElement(
337
- ProjectAnimationSettings.Instance.lastAnimationPath,
338
- new[] { ".anim" }
339
- );
340
- _fileSelector.OnFilesSelected += HandleFilesSelectedFromCustomBrowser;
341
- _fileSelector.OnCancelled += HideMultiFileSelector;
342
- root.Add(_fileSelector);
343
- if (root.childCount > 1)
344
- {
345
- _fileSelector.PlaceInFront(root.Children().FirstOrDefault());
346
- }
347
- }
348
- else if (_fileSelector.parent == null)
349
- {
350
- _fileSelector.ResetAndShow(ProjectAnimationSettings.Instance.lastAnimationPath);
351
- root.Add(_fileSelector);
352
- if (root.childCount > 1)
353
- {
354
- _fileSelector.PlaceInFront(root.Children().FirstOrDefault());
355
- }
356
- }
357
- else
358
- {
359
- HideMultiFileSelector();
360
- }
361
- }
362
-
363
- private void HideMultiFileSelector()
364
- {
365
- if (_fileSelector is { parent: not null })
366
- {
367
- _fileSelector.parent.Remove(_fileSelector);
368
- }
369
- }
370
-
371
- private void HandleFilesSelectedFromCustomBrowser(List<string> selectedFullPaths)
372
- {
373
- HideMultiFileSelector();
374
-
375
- if (selectedFullPaths == null || selectedFullPaths.Count == 0)
376
- {
377
- return;
378
- }
379
-
380
- int clipsAddedCount = 0;
381
- string lastValidDirectory = null;
382
-
383
- foreach (string fullPath in selectedFullPaths)
384
- {
385
- string assetPath = fullPath.SanitizePath();
386
- if (!assetPath.StartsWith("Assets", StringComparison.OrdinalIgnoreCase))
387
- {
388
- if (
389
- assetPath.StartsWith(
390
- Application.dataPath,
391
- StringComparison.OrdinalIgnoreCase
392
- )
393
- )
394
- {
395
- assetPath = "Assets" + assetPath.Substring(Application.dataPath.Length);
396
- }
397
- else
398
- {
399
- this.LogWarn(
400
- $"Selected file '{fullPath}' is outside the project's Assets folder or path is not project-relative. Skipping."
401
- );
402
- continue;
403
- }
404
- }
405
-
406
- AnimationClip clip = AssetDatabase.LoadAssetAtPath<AnimationClip>(assetPath);
407
- if (clip != null)
408
- {
409
- if (_loadedEditorLayers.All(layer => layer.SourceClip != clip))
410
- {
411
- AddEditorLayer(clip);
412
- clipsAddedCount++;
413
- lastValidDirectory = Path.GetDirectoryName(assetPath);
414
- }
415
- else
416
- {
417
- this.LogWarn($"Clip '{clip.name}' already loaded. Skipping.");
418
- }
419
- }
420
- else
421
- {
422
- this.LogWarn($"Could not load AnimationClip from: {assetPath}");
423
- }
424
- }
425
-
426
- if (clipsAddedCount > 0)
427
- {
428
- this.Log($"Added {clipsAddedCount} clip(s).");
429
- if (!string.IsNullOrWhiteSpace(lastValidDirectory))
430
- {
431
- ProjectAnimationSettings.Instance.lastAnimationPath = lastValidDirectory;
432
- ProjectAnimationSettings.Instance.Save();
433
- }
434
- }
435
- }
436
-
437
- private void OnAddAnimationClipFieldChanged(ChangeEvent<Object> evt)
438
- {
439
- AnimationClip clip = evt.newValue as AnimationClip;
440
- if (clip != null)
441
- {
442
- AddEditorLayer(clip);
443
- _addAnimationClipField.SetValueWithoutNotify(null);
444
- }
445
- }
446
-
447
- private void OnAddSelectedClipsFromProjectClicked()
448
- {
449
- Object[] selectedObjects = Selection.GetFiltered(
450
- typeof(AnimationClip),
451
- SelectionMode.Assets
452
- );
453
-
454
- if (selectedObjects == null || selectedObjects.Length == 0)
455
- {
456
- EditorUtility.DisplayDialog(
457
- "No Clips Selected",
458
- "Please select one or more AnimationClip assets in the Project window first.",
459
- "OK"
460
- );
461
- return;
462
- }
463
-
464
- int clipsAddedCount = 0;
465
- foreach (Object obj in selectedObjects)
466
- {
467
- if (obj is AnimationClip clip)
468
- {
469
- bool alreadyExists = _loadedEditorLayers.Any(layer => layer.SourceClip == clip);
470
- if (!alreadyExists)
471
- {
472
- AddEditorLayer(clip);
473
- clipsAddedCount++;
474
- }
475
- else
476
- {
477
- this.LogWarn($"Clip '{clip.name}' is already loaded. Skipping.");
478
- }
479
- }
480
- }
481
-
482
- if (clipsAddedCount > 0)
483
- {
484
- this.Log($"Added {clipsAddedCount} new AnimationClip(s) to the viewer.");
485
- }
486
- else if (selectedObjects.Length > 0)
487
- {
488
- this.Log($"All selected AnimationClips were already loaded.");
489
- }
490
- }
491
-
492
- private void OnBrowseAndAddClicked()
493
- {
494
- string path = EditorUtility.OpenFilePanelWithFilters(
495
- "Select Animation Clip to Add",
496
- ProjectAnimationSettings.Instance.lastAnimationPath,
497
- new[] { "Animation Clip", "anim" }
498
- );
499
-
500
- if (!string.IsNullOrWhiteSpace(path))
501
- {
502
- if (path.StartsWith(Application.dataPath))
503
- {
504
- path = "Assets" + path.Substring(Application.dataPath.Length);
505
- }
506
-
507
- ProjectAnimationSettings.Instance.lastAnimationPath = Path.GetDirectoryName(path);
508
- ProjectAnimationSettings.Instance.Save();
509
-
510
- AnimationClip clip = AssetDatabase.LoadAssetAtPath<AnimationClip>(path);
511
- if (clip != null)
512
- {
513
- AddEditorLayer(clip);
514
- }
515
- }
516
- }
517
-
518
- private void AddEditorLayer(AnimationClip clip)
519
- {
520
- if (clip == null || _loadedEditorLayers.Any(layer => layer.SourceClip == clip))
521
- {
522
- this.LogWarn($"Clip '{clip?.name}' is null or already loaded.");
523
- return;
524
- }
525
-
526
- EditorLayerData newEditorLayer = new(clip);
527
- _loadedEditorLayers.Add(newEditorLayer);
528
-
529
- if (_activeEditorLayer == null && newEditorLayer.Sprites.Count > 0)
530
- {
531
- SetActiveEditorLayer(newEditorLayer);
532
- }
533
- else if (_activeEditorLayer == null)
534
- {
535
- SetActiveEditorLayer(newEditorLayer);
536
- }
537
-
538
- RebuildLoadedClipsUI();
539
- RecreatePreviewImage();
540
- }
541
-
542
- private void RemoveEditorLayer(EditorLayerData layerToRemove)
543
- {
544
- if (layerToRemove == null)
545
- {
546
- return;
547
- }
548
-
549
- _loadedEditorLayers.Remove(layerToRemove);
550
-
551
- if (_activeEditorLayer == layerToRemove)
552
- {
553
- SetActiveEditorLayer(_loadedEditorLayers.FirstOrDefault());
554
- }
555
-
556
- RebuildLoadedClipsUI();
557
- RecreatePreviewImage();
558
- }
559
-
560
- private void SetActiveEditorLayer(EditorLayerData layer)
561
- {
562
- _activeEditorLayer = layer;
563
- _framesContainer.Clear();
564
- _fpsDebugLabel.text = "Detected FPS Info (Active Clip):";
565
-
566
- if (_activeEditorLayer != null)
567
- {
568
- UpdateFpsDebugLabelForActiveLayer();
569
- _saveClipButton.SetEnabled(_activeEditorLayer.SourceClip != null);
570
- }
571
- else
572
- {
573
- _saveClipButton.SetEnabled(false);
574
- }
575
-
576
- RebuildFramesListUI();
577
- RebuildLoadedClipsUI();
578
- UpdateFramesPanelTitle();
579
- }
580
-
581
- private void UpdateFramesPanelTitle()
582
- {
583
- _framesPanelTitle.text =
584
- _activeEditorLayer != null
585
- ? $"Frames (Editing: {_activeEditorLayer.ClipName})"
586
- : "Frames (No Active Clip Selected)";
587
- }
588
-
589
- private void RebuildLoadedClipsUI()
590
- {
591
- _loadedClipsContainer.Clear();
592
- if (_loadedClipDropPlaceholder.parent == _loadedClipsContainer)
593
- {
594
- _loadedClipsContainer.Remove(_loadedClipDropPlaceholder);
595
- }
596
-
597
- for (int i = 0; i < _loadedEditorLayers.Count; i++)
598
- {
599
- EditorLayerData editorLayer = _loadedEditorLayers[i];
600
-
601
- VisualElement itemElement = new();
602
- itemElement.AddToClassList("loaded-clip-item");
603
- if (editorLayer == _activeEditorLayer)
604
- {
605
- itemElement.AddToClassList("loaded-clip-item--active");
606
- }
607
- itemElement.userData = i;
608
-
609
- Label label = new(editorLayer.ClipName);
610
- itemElement.Add(label);
611
-
612
- Button removeButton = new(() => RemoveEditorLayer(editorLayer)) { text = "X" };
613
- itemElement.Add(removeButton);
614
-
615
- itemElement.RegisterCallback<PointerDownEvent>(evt =>
616
- {
617
- if (evt.button == 0 && _draggedLoadedClipElement == null)
618
- {
619
- SetActiveEditorLayer(editorLayer);
620
- }
621
- });
622
-
623
- int currentIndex = i;
624
- itemElement.RegisterCallback<PointerDownEvent>(evt =>
625
- OnLoadedClipItemPointerDownSetup(evt, itemElement, currentIndex)
626
- );
627
- itemElement.RegisterCallback<PointerMoveEvent>(OnLoadedClipItemPointerMove);
628
- itemElement.RegisterCallback<PointerUpEvent>(evt =>
629
- OnLoadedClipItemPointerUpForClick(evt, itemElement, currentIndex)
630
- );
631
-
632
- _loadedClipsContainer.Add(itemElement);
633
- }
634
- }
635
-
636
- private void OnLoadedClipItemPointerDownSetup(
637
- PointerDownEvent evt,
638
- VisualElement clipElement,
639
- int originalListIndex
640
- )
641
- {
642
- if (evt.button != 0 || _draggedLoadedClipElement != null || _isClipDragPending)
643
- {
644
- return;
645
- }
646
-
647
- _isClipDragPending = true;
648
- _clipDragPendingElement = clipElement;
649
- _clipDragPendingOriginalIndex = originalListIndex;
650
- _clipDragStartPosition = evt.position;
651
-
652
- clipElement.CapturePointer(evt.pointerId);
653
-
654
- evt.StopPropagation();
655
- }
656
-
657
- private void OnLoadedClipItemPointerMove(PointerMoveEvent evt)
658
- {
659
- if (!_isClipDragPending)
660
- {
661
- return;
662
- }
663
-
664
- float diffSqrMagnitude = (evt.position - _clipDragStartPosition).sqrMagnitude;
665
-
666
- if (diffSqrMagnitude >= DragThresholdSqrMagnitude)
667
- {
668
- _draggedLoadedClipElement = _clipDragPendingElement;
669
- _draggedLoadedClipOriginalIndex = _clipDragPendingOriginalIndex;
670
-
671
- _draggedLoadedClipElement.AddToClassList("frame-item-dragged");
672
-
673
- DragAndDrop.PrepareStartDrag();
674
- DragAndDrop.SetGenericData(
675
- "DraggedLoadedClipIndex",
676
- _draggedLoadedClipOriginalIndex
677
- );
678
- Object dragContextObject =
679
- _loadedEditorLayers[_draggedLoadedClipOriginalIndex]?.SourceClip
680
- ?? (Object)CreateInstance<ScriptableObject>();
681
- DragAndDrop.objectReferences = new[] { dragContextObject };
682
- DragAndDrop.StartDrag(
683
- _loadedEditorLayers[_draggedLoadedClipOriginalIndex].ClipName
684
- ?? "Dragging Layer"
685
- );
686
-
687
- _isClipDragPending = false;
688
- }
689
- }
690
-
691
- private void OnLoadedClipItemPointerUpForClick(
692
- PointerUpEvent evt,
693
- VisualElement clipElement,
694
- int listIndex
695
- )
696
- {
697
- if (evt.button != 0)
698
- {
699
- return;
700
- }
701
-
702
- if (clipElement.HasPointerCapture(evt.pointerId))
703
- {
704
- clipElement.ReleasePointer(evt.pointerId);
705
- }
706
- if (_isClipDragPending)
707
- {
708
- if (listIndex >= 0 && listIndex < _loadedEditorLayers.Count)
709
- {
710
- SetActiveEditorLayer(_loadedEditorLayers[listIndex]);
711
- }
712
- _isClipDragPending = false;
713
- _clipDragPendingElement = null;
714
- evt.StopPropagation();
715
- }
716
- else if (_draggedLoadedClipElement == _clipDragPendingElement)
717
- {
718
- if (DragAndDrop.GetGenericData("DraggedLoadedClipIndex") != null)
719
- {
720
- CleanupLoadedClipDragState(evt.pointerId);
721
- }
722
- evt.StopPropagation();
723
- }
724
-
725
- _isClipDragPending = false;
726
- _clipDragPendingElement = null;
727
- }
728
-
729
- private void OnDraggedLoadedClipItemPointerUp(PointerUpEvent evt)
730
- {
731
- if (_draggedLoadedClipElement == null || evt.currentTarget != _draggedLoadedClipElement)
732
- {
733
- return;
734
- }
735
-
736
- if (
737
- DragAndDrop.GetGenericData("DraggedLoadedClipIndex") != null
738
- || _draggedLoadedClipElement != null
739
- && _draggedLoadedClipElement.HasPointerCapture(evt.pointerId)
740
- )
741
- {
742
- CleanupLoadedClipDragState(evt.pointerId);
743
- }
744
-
745
- evt.StopPropagation();
746
- }
747
-
748
- private void OnLoadedClipsContainerDragUpdated(DragUpdatedEvent evt)
749
- {
750
- object draggedIndexData = DragAndDrop.GetGenericData("DraggedLoadedClipIndex");
751
- if (draggedIndexData != null && _draggedLoadedClipElement != null)
752
- {
753
- DragAndDrop.visualMode = DragAndDropVisualMode.Move;
754
- float mouseY = evt.localMousePosition.y;
755
- int newVisualIndex = -1;
756
-
757
- if (_loadedClipDropPlaceholder.parent == _loadedClipsContainer)
758
- {
759
- _loadedClipsContainer.Remove(_loadedClipDropPlaceholder);
760
- }
761
-
762
- for (int i = 0; i < _loadedClipsContainer.childCount; i++)
763
- {
764
- VisualElement child = _loadedClipsContainer[i];
765
- if (child == _draggedLoadedClipElement)
766
- {
767
- continue;
768
- }
769
-
770
- float childMidY = child.layout.yMin + child.layout.height / 2f;
771
- if (mouseY < childMidY)
772
- {
773
- newVisualIndex = i;
774
- break;
775
- }
776
- }
777
- if (
778
- newVisualIndex < 0
779
- && _loadedClipsContainer.childCount > 0
780
- && _draggedLoadedClipElement
781
- != _loadedClipsContainer.ElementAt(_loadedClipsContainer.childCount - 1)
782
- )
783
- {
784
- newVisualIndex = _loadedClipsContainer.childCount;
785
- }
786
-
787
- if (0 <= newVisualIndex)
788
- {
789
- _loadedClipsContainer.Insert(newVisualIndex, _loadedClipDropPlaceholder);
790
- _loadedClipDropPlaceholder.style.visibility = Visibility.Visible;
791
- }
792
- else if (_loadedClipsContainer.childCount == 0 && _draggedLoadedClipElement != null)
793
- {
794
- _loadedClipsContainer.Add(_loadedClipDropPlaceholder);
795
- _loadedClipDropPlaceholder.style.visibility = Visibility.Visible;
796
- }
797
- else
798
- {
799
- if (_loadedClipDropPlaceholder.parent == _loadedClipsContainer)
800
- {
801
- _loadedClipsContainer.Remove(_loadedClipDropPlaceholder);
802
- }
803
-
804
- _loadedClipDropPlaceholder.style.visibility = Visibility.Hidden;
805
- }
806
- }
807
- else
808
- {
809
- DragAndDrop.visualMode = DragAndDropVisualMode.Rejected;
810
- }
811
- evt.StopPropagation();
812
- }
813
-
814
- private void OnLoadedClipsContainerDragPerform(DragPerformEvent evt)
815
- {
816
- object draggedIndexData = DragAndDrop.GetGenericData("DraggedLoadedClipIndex");
817
- if (draggedIndexData != null && _draggedLoadedClipElement != null)
818
- {
819
- int originalListIndex = (int)draggedIndexData;
820
-
821
- if (originalListIndex < 0 || originalListIndex >= _loadedEditorLayers.Count)
822
- {
823
- this.LogError(
824
- $"DragPerform (LoadedClips): Stale or invalid dragged index. Aborting drop."
825
- );
826
- CleanupLoadedClipDragState(InvalidPointerId);
827
- evt.StopPropagation();
828
- return;
829
- }
830
-
831
- EditorLayerData movedLayer = _loadedEditorLayers[originalListIndex];
832
- _loadedEditorLayers.RemoveAt(originalListIndex);
833
-
834
- int placeholderVisualIndex = _loadedClipsContainer.IndexOf(
835
- _loadedClipDropPlaceholder
836
- );
837
- int targetListIndex;
838
-
839
- if (0 <= placeholderVisualIndex)
840
- {
841
- int itemsBeforePlaceholder = -1;
842
- for (int i = 0; i < placeholderVisualIndex; i++)
843
- {
844
- if (_loadedClipsContainer[i] != _loadedClipDropPlaceholder)
845
- {
846
- itemsBeforePlaceholder++;
847
- }
848
- else
849
- {
850
- break;
851
- }
852
- }
853
- targetListIndex = itemsBeforePlaceholder;
854
- }
855
- else
856
- {
857
- targetListIndex = _loadedEditorLayers.Count;
858
- }
859
- targetListIndex = Mathf.Clamp(targetListIndex, 0, _loadedEditorLayers.Count);
860
- _loadedEditorLayers.Insert(targetListIndex, movedLayer);
861
-
862
- DragAndDrop.AcceptDrag();
863
- CleanupLoadedClipDragState(InvalidPointerId);
864
-
865
- RebuildLoadedClipsUI();
866
- RecreatePreviewImage();
867
- }
868
- else
869
- {
870
- if (DragAndDrop.GetGenericData("DraggedLoadedClipIndex") != null)
871
- {
872
- CleanupLoadedClipDragState(InvalidPointerId);
873
- }
874
- }
875
- evt.StopPropagation();
876
- }
877
-
878
- private void OnLoadedClipsContainerDragLeave(DragLeaveEvent evt)
879
- {
880
- if (evt.target == _loadedClipsContainer)
881
- {
882
- if (_loadedClipDropPlaceholder.parent == _loadedClipsContainer)
883
- {
884
- _loadedClipsContainer.Remove(_loadedClipDropPlaceholder);
885
- }
886
-
887
- if (_loadedClipDropPlaceholder != null)
888
- {
889
- _loadedClipDropPlaceholder.style.visibility = Visibility.Hidden;
890
- }
891
- }
892
- }
893
-
894
- private void CleanupLoadedClipDragState(int pointerIdToRelease)
895
- {
896
- if (_draggedLoadedClipElement != null)
897
- {
898
- if (
899
- pointerIdToRelease != InvalidPointerId
900
- && _draggedLoadedClipElement.HasPointerCapture(pointerIdToRelease)
901
- )
902
- {
903
- _draggedLoadedClipElement.ReleasePointer(pointerIdToRelease);
904
- }
905
-
906
- _draggedLoadedClipElement.UnregisterCallback<PointerUpEvent>(
907
- OnDraggedLoadedClipItemPointerUp
908
- );
909
-
910
- _draggedLoadedClipElement.RemoveFromClassList("frame-item-dragged");
911
- _draggedLoadedClipElement = null;
912
- }
913
- _draggedLoadedClipOriginalIndex = -1;
914
-
915
- _isClipDragPending = false;
916
- if (_clipDragPendingElement != null)
917
- {
918
- if (
919
- pointerIdToRelease != InvalidPointerId
920
- && _clipDragPendingElement.HasPointerCapture(pointerIdToRelease)
921
- )
922
- {
923
- _clipDragPendingElement.ReleasePointer(pointerIdToRelease);
924
- }
925
-
926
- _clipDragPendingElement = null;
927
- }
928
-
929
- if (_loadedClipDropPlaceholder != null)
930
- {
931
- if (_loadedClipDropPlaceholder.parent == _loadedClipsContainer)
932
- {
933
- _loadedClipsContainer.Remove(_loadedClipDropPlaceholder);
934
- }
935
-
936
- _loadedClipDropPlaceholder.style.visibility = Visibility.Hidden;
937
- }
938
- DragAndDrop.SetGenericData("DraggedLoadedClipIndex", null);
939
- }
940
-
941
- private void RecreatePreviewImage()
942
- {
943
- if (_animationPreview != null)
944
- {
945
- if (_animationPreview.parent == _previewPanelHost)
946
- {
947
- _previewPanelHost.Remove(_animationPreview);
948
- }
949
-
950
- _animationPreview = null;
951
- }
952
-
953
- if (_previewPanelHost == null)
954
- {
955
- return;
956
- }
957
-
958
- List<AnimatedSpriteLayer> animatedSpriteLayers = new();
959
- if (_loadedEditorLayers.Count > 0)
960
- {
961
- foreach (EditorLayerData editorLayer in _loadedEditorLayers)
962
- {
963
- animatedSpriteLayers.Add(new AnimatedSpriteLayer(editorLayer.Sprites));
964
- }
965
- }
966
-
967
- _animationPreview = new LayeredImage(
968
- animatedSpriteLayers,
969
- Color.clear,
970
- _currentPreviewFps,
971
- updatesSelf: false
972
- )
973
- {
974
- name = "animationPreviewElement",
975
- };
976
-
977
- _previewPanelHost.Add(_animationPreview);
978
- }
979
-
980
- private void OnFramesContainerDragUpdated(DragUpdatedEvent evt)
981
- {
982
- object draggedIndexData = DragAndDrop.GetGenericData("DraggedFrameDataIndex");
983
- if (draggedIndexData != null && _draggedFrameElement != null)
984
- {
985
- DragAndDrop.visualMode = DragAndDropVisualMode.Move;
986
- float mouseY = evt.localMousePosition.y;
987
- int newVisualIndex = -1;
988
-
989
- if (_frameDropPlaceholder.parent == _framesContainer)
990
- {
991
- _framesContainer.Remove(_frameDropPlaceholder);
992
- }
993
-
994
- for (int i = 0; i < _framesContainer.childCount; i++)
995
- {
996
- VisualElement child = _framesContainer[i];
997
- if (child == _draggedFrameElement)
998
- {
999
- continue;
1000
- }
1001
-
1002
- float childMidY = child.layout.yMin + child.layout.height / 2f;
1003
- if (mouseY < childMidY)
1004
- {
1005
- newVisualIndex = i;
1006
- break;
1007
- }
1008
- }
1009
- if (
1010
- newVisualIndex < 0
1011
- && _framesContainer.childCount > 0
1012
- && _draggedFrameElement
1013
- != _framesContainer.ElementAt(_framesContainer.childCount - 1)
1014
- )
1015
- {
1016
- newVisualIndex = _framesContainer.childCount;
1017
- }
1018
-
1019
- if (0 <= newVisualIndex)
1020
- {
1021
- _framesContainer.Insert(newVisualIndex, _frameDropPlaceholder);
1022
- _frameDropPlaceholder.style.visibility = Visibility.Visible;
1023
- }
1024
- else if (_framesContainer.childCount == 0 && _draggedFrameElement != null)
1025
- {
1026
- _framesContainer.Add(_frameDropPlaceholder);
1027
- _frameDropPlaceholder.style.visibility = Visibility.Visible;
1028
- }
1029
- else
1030
- {
1031
- if (_frameDropPlaceholder.parent == _framesContainer)
1032
- {
1033
- _framesContainer.Remove(_frameDropPlaceholder);
1034
- }
1035
-
1036
- _frameDropPlaceholder.style.visibility = Visibility.Hidden;
1037
- }
1038
- }
1039
- else
1040
- {
1041
- DragAndDrop.visualMode = DragAndDropVisualMode.Rejected;
1042
- }
1043
- evt.StopPropagation();
1044
- }
1045
-
1046
- private void OnFramesContainerDragPerform(DragPerformEvent evt)
1047
- {
1048
- object draggedIndexData = DragAndDrop.GetGenericData("DraggedFrameDataIndex");
1049
- if (
1050
- draggedIndexData != null
1051
- && _draggedFrameElement != null
1052
- && _activeEditorLayer != null
1053
- )
1054
- {
1055
- int originalDataIndex = (int)draggedIndexData;
1056
-
1057
- if (originalDataIndex < 0 || originalDataIndex >= _activeEditorLayer.Sprites.Count)
1058
- {
1059
- this.LogError(
1060
- $"DragPerform (Frames): Stale or invalid dragged index. Aborting drop."
1061
- );
1062
- CleanupFrameDragState(InvalidPointerId);
1063
- evt.StopPropagation();
1064
- return;
1065
- }
1066
-
1067
- Sprite movedSprite = _activeEditorLayer.Sprites[originalDataIndex];
1068
- _activeEditorLayer.Sprites.RemoveAt(originalDataIndex);
1069
-
1070
- int placeholderVisualIndex = _framesContainer.IndexOf(_frameDropPlaceholder);
1071
- int targetDataIndex;
1072
-
1073
- if (0 <= placeholderVisualIndex)
1074
- {
1075
- int itemsBeforePlaceholder = 0;
1076
- for (int i = 0; i < placeholderVisualIndex; i++)
1077
- {
1078
- if (
1079
- _framesContainer[i] != _draggedFrameElement
1080
- && _framesContainer[i] != _frameDropPlaceholder
1081
- )
1082
- {
1083
- itemsBeforePlaceholder++;
1084
- }
1085
- }
1086
- targetDataIndex = itemsBeforePlaceholder;
1087
- }
1088
- else
1089
- {
1090
- targetDataIndex = _activeEditorLayer.Sprites.Count;
1091
- }
1092
- targetDataIndex = Mathf.Clamp(targetDataIndex, 0, _activeEditorLayer.Sprites.Count);
1093
- _activeEditorLayer.Sprites.Insert(targetDataIndex, movedSprite);
1094
-
1095
- DragAndDrop.AcceptDrag();
1096
- CleanupFrameDragState(InvalidPointerId);
1097
-
1098
- RebuildFramesListUI();
1099
- RecreatePreviewImage();
1100
- }
1101
- else
1102
- {
1103
- if (DragAndDrop.GetGenericData("DraggedFrameDataIndex") != null)
1104
- {
1105
- CleanupFrameDragState(InvalidPointerId);
1106
- }
1107
- }
1108
- evt.StopPropagation();
1109
- }
1110
-
1111
- private void OnFramesContainerDragLeave(DragLeaveEvent evt)
1112
- {
1113
- if (evt.target == _framesContainer)
1114
- {
1115
- if (_frameDropPlaceholder.parent == _framesContainer)
1116
- {
1117
- _framesContainer.Remove(_frameDropPlaceholder);
1118
- }
1119
-
1120
- if (_frameDropPlaceholder != null)
1121
- {
1122
- _frameDropPlaceholder.style.visibility = Visibility.Hidden;
1123
- }
1124
- }
1125
-
1126
- CleanupFrameDragState(InvalidPointerId);
1127
- }
1128
-
1129
- private void CleanupFrameDragState(int pointerIdToRelease)
1130
- {
1131
- this.Log($"Cleaning up frame drag state with pointer {pointerIdToRelease}");
1132
- if (_draggedFrameElement != null)
1133
- {
1134
- if (
1135
- pointerIdToRelease != InvalidPointerId
1136
- && _draggedFrameElement.HasPointerCapture(pointerIdToRelease)
1137
- )
1138
- {
1139
- _draggedFrameElement.ReleasePointer(pointerIdToRelease);
1140
- }
1141
-
1142
- _draggedFrameElement.UnregisterCallback<PointerUpEvent>(
1143
- OnDraggedFrameItemPointerUp
1144
- );
1145
- _draggedFrameElement.RemoveFromClassList("frame-item-dragged");
1146
- _draggedFrameElement = null;
1147
- }
1148
- _draggedFrameOriginalDataIndex = -1;
1149
-
1150
- if (_frameDropPlaceholder != null)
1151
- {
1152
- if (_frameDropPlaceholder.parent == _framesContainer)
1153
- {
1154
- _framesContainer.Remove(_frameDropPlaceholder);
1155
- }
1156
-
1157
- _frameDropPlaceholder.style.visibility = Visibility.Hidden;
1158
- }
1159
- DragAndDrop.SetGenericData("DraggedFrameDataIndex", null);
1160
- }
1161
-
1162
- private void UpdateFpsDebugLabelForActiveLayer()
1163
- {
1164
- if (_activeEditorLayer == null)
1165
- {
1166
- _fpsDebugLabel.text = "Detected FPS Info: No active clip.";
1167
- return;
1168
- }
1169
-
1170
- _fpsDebugLabel.text =
1171
- $"Active Clip FPS (Original): {FormatFps(_activeEditorLayer.OriginalClipFps)}fps. Preview uses global FPS.";
1172
- }
1173
-
1174
- private static string FormatFps(float fps)
1175
- {
1176
- return fps.ToString("F1");
1177
- }
1178
-
1179
- private void RebuildFramesListUI()
1180
- {
1181
- _framesContainer.Clear();
1182
-
1183
- if (_frameDropPlaceholder != null && _frameDropPlaceholder.parent == _framesContainer)
1184
- {
1185
- _framesContainer.Remove(_frameDropPlaceholder);
1186
- }
1187
-
1188
- if (_activeEditorLayer?.Sprites == null)
1189
- {
1190
- return;
1191
- }
1192
-
1193
- for (int i = 0; i < _activeEditorLayer.Sprites.Count; i++)
1194
- {
1195
- Sprite sprite = _activeEditorLayer.Sprites[i];
1196
-
1197
- VisualElement frameElement = new();
1198
- frameElement.AddToClassList("frame-item");
1199
-
1200
- Image frameImage = new() { sprite = sprite, scaleMode = ScaleMode.ScaleToFit };
1201
- frameImage.AddToClassList("frame-image");
1202
- frameElement.Add(frameImage);
1203
-
1204
- VisualElement frameInfo = new();
1205
- frameInfo.AddToClassList("frame-info");
1206
- frameInfo.Add(new Label($"Frame: {i + 1}"));
1207
- frameInfo.Add(new Label($"Sprite: {(sprite != null ? sprite.name : "(None)")}"));
1208
- frameElement.Add(frameInfo);
1209
-
1210
- IntegerField indexField = new(null) { value = i + 1 };
1211
- indexField.AddToClassList("frame-index-field");
1212
- frameElement.Add(indexField);
1213
-
1214
- VisualElement orderFieldContainer = new()
1215
- {
1216
- style =
1217
- {
1218
- flexDirection = FlexDirection.Row,
1219
- alignItems = Align.Center,
1220
- marginLeft = StyleKeyword.Auto,
1221
- },
1222
- };
1223
-
1224
- Label orderLabel = new("Order:") { style = { marginRight = 3 } };
1225
- orderFieldContainer.Add(orderLabel);
1226
- orderFieldContainer.Add(indexField);
1227
- frameElement.Add(orderFieldContainer);
1228
-
1229
- int currentDataIndex = i;
1230
- frameElement.RegisterCallback<PointerDownEvent>(evt =>
1231
- OnFrameItemPointerDown(evt, frameElement, currentDataIndex)
1232
- );
1233
-
1234
- indexField.userData = currentDataIndex;
1235
-
1236
- indexField.RegisterCallback<FocusInEvent>(_ =>
1237
- {
1238
- CleanupFrameDragState(InvalidPointerId);
1239
- CleanupLoadedClipDragState(InvalidPointerId);
1240
- });
1241
-
1242
- indexField.RegisterCallback<FocusOutEvent>(_ =>
1243
- OnFrameIndexFieldChanged(indexField)
1244
- );
1245
- indexField.RegisterCallback<KeyDownEvent>(evt =>
1246
- {
1247
- if (evt.keyCode is KeyCode.Return or KeyCode.KeypadEnter)
1248
- {
1249
- OnFrameIndexFieldChanged(indexField);
1250
- indexField.Blur();
1251
- }
1252
- });
1253
-
1254
- _framesContainer.Add(frameElement);
1255
- }
1256
- }
1257
-
1258
- private void OnFrameIndexFieldChanged(IntegerField field)
1259
- {
1260
- CleanupFrameDragState(InvalidPointerId);
1261
- CleanupLoadedClipDragState(InvalidPointerId);
1262
- if (_activeEditorLayer?.Sprites == null)
1263
- {
1264
- return;
1265
- }
1266
-
1267
- int originalDataIndex = (int)field.userData;
1268
- int newUiIndex = field.value;
1269
- int newRequestedDataIndex = newUiIndex - 1;
1270
- int newClampedDataIndex = Mathf.Clamp(
1271
- newRequestedDataIndex,
1272
- 0,
1273
- _activeEditorLayer.Sprites.Count - 1
1274
- );
1275
-
1276
- if (newClampedDataIndex != originalDataIndex)
1277
- {
1278
- if (originalDataIndex < 0 || originalDataIndex >= _activeEditorLayer.Sprites.Count)
1279
- {
1280
- this.LogWarn(
1281
- $"Original index {originalDataIndex} out of bounds. Rebuilding UI to correct."
1282
- );
1283
- RebuildFramesListUI();
1284
- return;
1285
- }
1286
- Sprite spriteToMove = _activeEditorLayer.Sprites[originalDataIndex];
1287
- _activeEditorLayer.Sprites.RemoveAt(originalDataIndex);
1288
- _activeEditorLayer.Sprites.Insert(newClampedDataIndex, spriteToMove);
1289
- RebuildFramesListUI();
1290
- RecreatePreviewImage();
1291
- }
1292
- else if (newUiIndex - 1 != newClampedDataIndex)
1293
- {
1294
- RebuildFramesListUI();
1295
- }
1296
- }
1297
-
1298
- private void OnFrameItemPointerDown(
1299
- PointerDownEvent evt,
1300
- VisualElement frameElement,
1301
- int originalDataIndex
1302
- )
1303
- {
1304
- if (evt.button != 0 || _draggedFrameElement != null)
1305
- {
1306
- return;
1307
- }
1308
-
1309
- if (
1310
- _activeEditorLayer == null
1311
- || originalDataIndex < 0
1312
- || originalDataIndex >= _activeEditorLayer.Sprites.Count
1313
- )
1314
- {
1315
- this.LogError(
1316
- $"OnFrameItemPointerDown: Invalid originalDataIndex ({originalDataIndex}) or no active layer. Sprite count: {_activeEditorLayer?.Sprites?.Count ?? -1}"
1317
- );
1318
- return;
1319
- }
1320
-
1321
- _draggedFrameElement = frameElement;
1322
- _draggedFrameOriginalDataIndex = originalDataIndex;
1323
-
1324
- try
1325
- {
1326
- _draggedFrameElement.RegisterCallback<PointerUpEvent>(OnDraggedFrameItemPointerUp);
1327
- _draggedFrameElement.AddToClassList("frame-item-dragged");
1328
-
1329
- DragAndDrop.PrepareStartDrag();
1330
- DragAndDrop.SetGenericData("DraggedFrameDataIndex", _draggedFrameOriginalDataIndex);
1331
-
1332
- Object dragContextObject =
1333
- _activeEditorLayer.SourceClip ?? (Object)CreateInstance<ScriptableObject>();
1334
- if (dragContextObject == null)
1335
- {
1336
- this.LogError($"Failed to create dragContextObject for frame drag.");
1337
-
1338
- _draggedFrameElement.ReleasePointer(evt.pointerId);
1339
- _draggedFrameElement.UnregisterCallback<PointerUpEvent>(
1340
- OnDraggedFrameItemPointerUp
1341
- );
1342
- _draggedFrameElement.RemoveFromClassList("frame-item-dragged");
1343
- _draggedFrameElement = null;
1344
- return;
1345
- }
1346
- DragAndDrop.objectReferences = new[] { dragContextObject };
1347
-
1348
- Sprite spriteBeingDragged = _activeEditorLayer.Sprites[originalDataIndex];
1349
- string dragTitle;
1350
- if (spriteBeingDragged != null)
1351
- {
1352
- dragTitle = !string.IsNullOrWhiteSpace(spriteBeingDragged.name)
1353
- ? spriteBeingDragged.name
1354
- : $"Unnamed Sprite Frame {originalDataIndex + 1}";
1355
- }
1356
- else
1357
- {
1358
- dragTitle = $"Empty Frame {originalDataIndex + 1}";
1359
- }
1360
-
1361
- if (string.IsNullOrWhiteSpace(dragTitle))
1362
- {
1363
- dragTitle = "Dragging Frame";
1364
- }
1365
-
1366
- DragAndDrop.StartDrag(dragTitle);
1367
- }
1368
- catch (Exception e)
1369
- {
1370
- this.LogError(
1371
- $"Exception during OnFrameItemPointerDown before StartDrag: {e.Message}\n{e.StackTrace}"
1372
- );
1373
-
1374
- if (_draggedFrameElement != null)
1375
- {
1376
- if (_draggedFrameElement.HasPointerCapture(evt.pointerId))
1377
- {
1378
- _draggedFrameElement.ReleasePointer(evt.pointerId);
1379
- }
1380
-
1381
- _draggedFrameElement.UnregisterCallback<PointerUpEvent>(
1382
- OnDraggedFrameItemPointerUp
1383
- );
1384
- _draggedFrameElement.RemoveFromClassList("frame-item-dragged");
1385
- _draggedFrameElement = null;
1386
- }
1387
- _draggedFrameOriginalDataIndex = -1;
1388
- }
1389
- }
1390
-
1391
- private void OnDraggedFrameItemPointerUp(PointerUpEvent evt)
1392
- {
1393
- if (_draggedFrameElement == null || evt.currentTarget != _draggedFrameElement)
1394
- {
1395
- return;
1396
- }
1397
-
1398
- if (DragAndDrop.GetGenericData("DraggedFrameDataIndex") != null)
1399
- {
1400
- CleanupFrameDragState(evt.pointerId);
1401
- }
1402
- else if (
1403
- _draggedFrameElement != null
1404
- && _draggedFrameElement.HasPointerCapture(evt.pointerId)
1405
- )
1406
- {
1407
- _draggedFrameElement.ReleasePointer(evt.pointerId);
1408
- _draggedFrameElement.UnregisterCallback<PointerUpEvent>(
1409
- OnDraggedFrameItemPointerUp
1410
- );
1411
- _draggedFrameElement.RemoveFromClassList("frame-item-dragged");
1412
- _draggedFrameElement = null;
1413
- }
1414
- evt.StopPropagation();
1415
- }
1416
-
1417
- private void OnApplyFpsToPreviewClicked()
1418
- {
1419
- _currentPreviewFps = Mathf.Max(0.1f, _fpsField.value);
1420
- _fpsField.SetValueWithoutNotify(_currentPreviewFps);
1421
- if (_animationPreview != null)
1422
- {
1423
- _animationPreview.Fps = _currentPreviewFps;
1424
- }
1425
- }
1426
-
1427
- private void OnSaveClipClicked()
1428
- {
1429
- if (_activeEditorLayer == null || _activeEditorLayer.SourceClip == null)
1430
- {
1431
- this.LogError($"No active animation clip to save.");
1432
- return;
1433
- }
1434
-
1435
- AnimationClip clipToSave = _activeEditorLayer.SourceClip;
1436
- string bindingPath = _activeEditorLayer.BindingPath;
1437
-
1438
- EditorCurveBinding spriteBinding = default;
1439
- bool bindingFound = false;
1440
- EditorCurveBinding[] allBindings = AnimationUtility.GetObjectReferenceCurveBindings(
1441
- clipToSave
1442
- );
1443
-
1444
- foreach (EditorCurveBinding b in allBindings)
1445
- {
1446
- if (
1447
- b.type == typeof(SpriteRenderer)
1448
- && b.propertyName == "m_Sprite"
1449
- && (string.IsNullOrWhiteSpace(bindingPath) || b.path == bindingPath)
1450
- )
1451
- {
1452
- spriteBinding = b;
1453
- bindingFound = true;
1454
- break;
1455
- }
1456
- }
1457
-
1458
- if (!bindingFound)
1459
- {
1460
- foreach (EditorCurveBinding b in allBindings)
1461
- {
1462
- if (b.type == typeof(SpriteRenderer) && b.propertyName == "m_Sprite")
1463
- {
1464
- spriteBinding = b;
1465
- bindingFound = true;
1466
- this.LogWarn(
1467
- $"Saving to first available m_Sprite binding on '{clipToSave.name}' as specific path '{bindingPath}' was not found or empty."
1468
- );
1469
- break;
1470
- }
1471
- }
1472
- }
1473
-
1474
- if (!bindingFound)
1475
- {
1476
- this.LogError(
1477
- $"Cannot save '{clipToSave.name}': No SpriteRenderer m_Sprite binding found (Path Hint: '{bindingPath}'). Clip might be empty or not a sprite animation."
1478
- );
1479
- return;
1480
- }
1481
-
1482
- List<Sprite> spritesToSave = _activeEditorLayer.Sprites;
1483
- ObjectReferenceKeyframe[] newKeyframes = new ObjectReferenceKeyframe[
1484
- spritesToSave.Count
1485
- ];
1486
- float timePerFrame = _currentPreviewFps > 0 ? 1.0f / _currentPreviewFps : 0f;
1487
-
1488
- for (int i = 0; i < spritesToSave.Count; i++)
1489
- {
1490
- newKeyframes[i] = new ObjectReferenceKeyframe
1491
- {
1492
- time = i * timePerFrame,
1493
- value = spritesToSave[i],
1494
- };
1495
- }
1496
-
1497
- Undo.RecordObject(clipToSave, "Modify Animation Clip Frames");
1498
- AnimationUtility.SetObjectReferenceCurve(clipToSave, spriteBinding, newKeyframes);
1499
- clipToSave.frameRate = _currentPreviewFps;
1500
-
1501
- EditorUtility.SetDirty(clipToSave);
1502
- AssetDatabase.SaveAssets();
1503
-
1504
- this.Log(
1505
- $"Animation clip '{clipToSave.name}' saved with {spritesToSave.Count} frames at {_currentPreviewFps} FPS."
1506
- );
1507
- }
1508
-
1509
- private void OnDisable()
1510
- {
1511
- CleanupFrameDragState(InvalidPointerId);
1512
- CleanupLoadedClipDragState(InvalidPointerId);
1513
-
1514
- if (_animationPreview != null && _animationPreview.parent == _previewPanelHost)
1515
- {
1516
- _previewPanelHost.Remove(_animationPreview);
1517
- }
1518
- _animationPreview = null;
1519
- }
1520
- }
1521
- #endif
1522
- }
1
+ // ReSharper disable HeapView.CanAvoidClosure
2
+ namespace WallstopStudios.UnityHelpers.Editor.Sprites
3
+ {
4
+ #if UNITY_EDITOR
5
+ using System;
6
+ using System.Collections.Generic;
7
+ using System.IO;
8
+ using System.Linq;
9
+ using UnityEditor;
10
+ using UnityEditor.UIElements;
11
+ using UnityEngine;
12
+ using UnityEngine.UIElements;
13
+ using WallstopStudios.UnityHelpers.Core.Extension;
14
+ using WallstopStudios.UnityHelpers.Core.Helper;
15
+ using WallstopStudios.UnityHelpers.Editor;
16
+ using WallstopStudios.UnityHelpers.Visuals;
17
+ using WallstopStudios.UnityHelpers.Visuals.UIToolkit;
18
+ using Object = UnityEngine.Object;
19
+
20
+ /// <summary>
21
+ /// UI Toolkit-based multi-clip 2D animation viewer and lightweight editor. Load multiple
22
+ /// AnimationClips, preview layered sprite animation, reorder frames via drag & drop, adjust
23
+ /// preview FPS, and save an updated clip back to disk.
24
+ /// </summary>
25
+ /// <remarks>
26
+ /// <para>
27
+ /// Problems this solves: quickly auditing and tweaking sprite-based clips without opening the
28
+ /// full Animation window workflow; comparing multiple clips; and adjusting timing visually.
29
+ /// </para>
30
+ /// <para>
31
+ /// How it works: for a selected clip, the tool resolves the <see cref="SpriteRenderer"/>
32
+ /// binding path and extracts its frames. The frames list supports reordering via drag & drop
33
+ /// with placeholders for clarity. Preview uses an in-editor <c>LayeredImage</c> to animate the
34
+ /// sprite sequence at the chosen FPS.
35
+ /// </para>
36
+ /// <para>
37
+ /// Usage:
38
+ /// </para>
39
+ /// <list type="bullet">
40
+ /// <item><description>Open via menu: Tools/Wallstop Studios/Unity Helpers/Sprite Animation Editor.</description></item>
41
+ /// <item><description>Add clips (object field or project selection button).</description></item>
42
+ /// <item><description>Drag frames to reorder, then Save to write an updated clip.</description></item>
43
+ /// </list>
44
+ /// <para>
45
+ /// Pros: intuitive drag/drop, live preview, handles multiple clips in a session.
46
+ /// Caveats: operates on SpriteRenderer curves only; saving overwrites the target clip asset.
47
+ /// </para>
48
+ /// </remarks>
49
+ public sealed class AnimationViewerWindow : EditorWindow
50
+ {
51
+ private const string PackageId = "com.wallstop-studios.unity-helpers";
52
+ private const float DragThresholdSqrMagnitude = 10f * 10f;
53
+ private const int InvalidPointerId = -1;
54
+ private const string DirToolName = "SpriteAnimationEditor";
55
+ private const string DirContextKey = "Clips";
56
+
57
+ private sealed class EditorLayerData
58
+ {
59
+ public AnimationClip SourceClip { get; }
60
+ public List<Sprite> Sprites { get; }
61
+ public string ClipName => SourceClip != null ? SourceClip.name : "Unnamed Layer";
62
+ public float OriginalClipFps { get; }
63
+ public string BindingPath { get; }
64
+
65
+ public EditorLayerData(AnimationClip clip)
66
+ {
67
+ SourceClip = clip;
68
+ Sprites = clip.GetSpritesFromClip()?.ToList();
69
+ OriginalClipFps =
70
+ clip.frameRate > 0 ? clip.frameRate : AnimatedSpriteLayer.FrameRate;
71
+
72
+ BindingPath = string.Empty;
73
+ if (SourceClip != null)
74
+ {
75
+ foreach (
76
+ EditorCurveBinding binding in AnimationUtility.GetObjectReferenceCurveBindings(
77
+ SourceClip
78
+ )
79
+ )
80
+ {
81
+ if (
82
+ binding.type == typeof(SpriteRenderer)
83
+ && string.Equals(
84
+ binding.propertyName,
85
+ "m_Sprite",
86
+ StringComparison.Ordinal
87
+ )
88
+ )
89
+ {
90
+ BindingPath = binding.path;
91
+ break;
92
+ }
93
+ }
94
+ }
95
+ }
96
+ }
97
+
98
+ [MenuItem("Tools/Wallstop Studios/Unity Helpers/Sprite Animation Editor")]
99
+ public static void ShowWindow()
100
+ {
101
+ AnimationViewerWindow wnd = GetWindow<AnimationViewerWindow>();
102
+ wnd.titleContent = new GUIContent("2D Animation Viewer");
103
+ wnd.minSize = new Vector2(750, 500);
104
+ }
105
+
106
+ private VisualTreeAsset _visualTree;
107
+ private StyleSheet _styleSheet;
108
+
109
+ private ObjectField _addAnimationClipField;
110
+ private Button _browseAndAddButton;
111
+ private FloatField _fpsField;
112
+ private Button _applyFpsButton;
113
+ private Button _saveClipButton;
114
+ private VisualElement _loadedClipsContainer;
115
+ private VisualElement _previewPanelHost;
116
+ private LayeredImage _animationPreview;
117
+ private VisualElement _framesContainer;
118
+ private Label _fpsDebugLabel;
119
+ private Label _framesPanelTitle;
120
+ private MultiFileSelectorElement _fileSelector;
121
+
122
+ private readonly List<EditorLayerData> _loadedEditorLayers = new();
123
+
124
+ private EditorLayerData _activeEditorLayer;
125
+ private float _currentPreviewFps = AnimatedSpriteLayer.FrameRate;
126
+
127
+ private VisualElement _draggedFrameElement;
128
+ private int _draggedFrameOriginalDataIndex;
129
+ private VisualElement _frameDropPlaceholder;
130
+
131
+ private VisualElement _draggedLoadedClipElement;
132
+ private int _draggedLoadedClipOriginalIndex;
133
+ private VisualElement _loadedClipDropPlaceholder;
134
+
135
+ private bool _isClipDragPending;
136
+ private Vector3 _clipDragStartPosition;
137
+ private VisualElement _clipDragPendingElement;
138
+ private int _clipDragPendingOriginalIndex;
139
+
140
+ public void CreateGUI()
141
+ {
142
+ VisualElement root = rootVisualElement;
143
+
144
+ TryLoadStyleSheets();
145
+
146
+ if (_visualTree == null)
147
+ {
148
+ root.Add(new Label("Error: AnimationViewer.uxml not found."));
149
+ return;
150
+ }
151
+ if (_styleSheet != null)
152
+ {
153
+ root.styleSheets.Add(_styleSheet);
154
+ }
155
+
156
+ _visualTree.CloneTree(root);
157
+
158
+ _addAnimationClipField = root.Q<ObjectField>("addAnimationClipField");
159
+ _browseAndAddButton = root.Q<Button>("browseAndAddButton");
160
+ _fpsField = root.Q<FloatField>("fpsField");
161
+ _applyFpsButton = root.Q<Button>("applyFpsButton");
162
+ _saveClipButton = root.Q<Button>("saveClipButton");
163
+ _loadedClipsContainer = root.Q<VisualElement>("loadedClipsContainer");
164
+ _previewPanelHost = root.Q<VisualElement>("preview-panel");
165
+ _framesContainer = root.Q<VisualElement>("framesContainer");
166
+ _fpsDebugLabel = root.Q<Label>("fpsDebugLabel");
167
+ _framesPanelTitle = root.Q<Label>("framesPanelTitle");
168
+
169
+ _previewPanelHost.AddToClassList("animation-preview-container");
170
+
171
+ _fpsField.value = _currentPreviewFps;
172
+ _saveClipButton.SetEnabled(false);
173
+
174
+ _addAnimationClipField.RegisterValueChangedCallback(OnAddAnimationClipFieldChanged);
175
+ _browseAndAddButton.text = "Add Selected Clips from Project";
176
+ _browseAndAddButton.clicked -= OnBrowseAndAddClicked;
177
+ if (_browseAndAddButton != null)
178
+ {
179
+ _browseAndAddButton.text = "Browse Clips (Multi)...";
180
+ _browseAndAddButton.clicked -= OnAddSelectedClipsFromProjectClicked;
181
+ _browseAndAddButton.clicked += ToggleMultiFileSelector;
182
+ }
183
+ else
184
+ {
185
+ this.LogError(
186
+ $"'browseAndAddButton' not found in UXML. Multi-file browser cannot be triggered."
187
+ );
188
+ }
189
+ _applyFpsButton.clicked += OnApplyFpsToPreviewClicked;
190
+ _saveClipButton.clicked += OnSaveClipClicked;
191
+
192
+ _frameDropPlaceholder = new VisualElement();
193
+ _frameDropPlaceholder.AddToClassList("drop-placeholder");
194
+ _frameDropPlaceholder.style.height = 5;
195
+ _frameDropPlaceholder.style.visibility = Visibility.Hidden;
196
+
197
+ _framesContainer.RegisterCallback<DragUpdatedEvent>(OnFramesContainerDragUpdated);
198
+ _framesContainer.RegisterCallback<DragPerformEvent>(OnFramesContainerDragPerform);
199
+ _framesContainer.RegisterCallback<DragLeaveEvent>(OnFramesContainerDragLeave);
200
+
201
+ _loadedClipDropPlaceholder = new VisualElement();
202
+ _loadedClipDropPlaceholder.AddToClassList("drop-placeholder");
203
+ _loadedClipDropPlaceholder.style.height = 5;
204
+ _loadedClipDropPlaceholder.style.visibility = Visibility.Hidden;
205
+
206
+ _loadedClipsContainer.RegisterCallback<DragUpdatedEvent>(
207
+ OnLoadedClipsContainerDragUpdated
208
+ );
209
+ _loadedClipsContainer.RegisterCallback<DragPerformEvent>(
210
+ OnLoadedClipsContainerDragPerform
211
+ );
212
+ _loadedClipsContainer.RegisterCallback<DragLeaveEvent>(OnLoadedClipsContainerDragLeave);
213
+
214
+ UpdateFramesPanelTitle();
215
+ RebuildLoadedClipsUI();
216
+ RecreatePreviewImage();
217
+ }
218
+
219
+ private void Update()
220
+ {
221
+ _animationPreview?.Update();
222
+ }
223
+
224
+ private void TryLoadStyleSheets()
225
+ {
226
+ string packageRoot = DirectoryHelper.FindPackageRootPath(
227
+ DirectoryHelper.GetCallerScriptDirectory()
228
+ );
229
+ if (!string.IsNullOrWhiteSpace(packageRoot))
230
+ {
231
+ if (
232
+ packageRoot.StartsWith("Packages", StringComparison.OrdinalIgnoreCase)
233
+ && !packageRoot.Contains(PackageId, StringComparison.OrdinalIgnoreCase)
234
+ )
235
+ {
236
+ int helpersIndex = packageRoot.LastIndexOf(
237
+ "UnityHelpers",
238
+ StringComparison.Ordinal
239
+ );
240
+ if (0 <= helpersIndex)
241
+ {
242
+ packageRoot = packageRoot[..helpersIndex];
243
+ packageRoot += PackageId;
244
+ }
245
+ }
246
+
247
+ char pathSeparator = Path.DirectorySeparatorChar;
248
+ string styleSheetPath =
249
+ $"{packageRoot}{pathSeparator}Editor{pathSeparator}Styles{pathSeparator}AnimationViewer.uss";
250
+ string unityRelativeStyleSheetPath = DirectoryHelper.AbsoluteToUnityRelativePath(
251
+ styleSheetPath
252
+ );
253
+ unityRelativeStyleSheetPath = unityRelativeStyleSheetPath.SanitizePath();
254
+
255
+ const string packageCache = "PackageCache/";
256
+ int packageCacheIndex;
257
+ if (!string.IsNullOrWhiteSpace(unityRelativeStyleSheetPath))
258
+ {
259
+ _styleSheet = AssetDatabase.LoadAssetAtPath<StyleSheet>(
260
+ unityRelativeStyleSheetPath
261
+ );
262
+ }
263
+
264
+ if (_styleSheet == null && !string.IsNullOrWhiteSpace(unityRelativeStyleSheetPath))
265
+ {
266
+ packageCacheIndex = unityRelativeStyleSheetPath.IndexOf(
267
+ packageCache,
268
+ StringComparison.OrdinalIgnoreCase
269
+ );
270
+ if (0 <= packageCacheIndex)
271
+ {
272
+ unityRelativeStyleSheetPath = unityRelativeStyleSheetPath[
273
+ (packageCacheIndex + packageCache.Length)..
274
+ ];
275
+ int forwardIndex = unityRelativeStyleSheetPath.IndexOf(
276
+ "/",
277
+ StringComparison.Ordinal
278
+ );
279
+ if (0 <= forwardIndex)
280
+ {
281
+ unityRelativeStyleSheetPath = unityRelativeStyleSheetPath.Substring(
282
+ forwardIndex
283
+ );
284
+ unityRelativeStyleSheetPath =
285
+ "Packages/" + PackageId + "/" + unityRelativeStyleSheetPath;
286
+ }
287
+ else
288
+ {
289
+ unityRelativeStyleSheetPath = "Packages/" + unityRelativeStyleSheetPath;
290
+ }
291
+ }
292
+
293
+ if (!string.IsNullOrWhiteSpace(unityRelativeStyleSheetPath))
294
+ {
295
+ _styleSheet = AssetDatabase.LoadAssetAtPath<StyleSheet>(
296
+ unityRelativeStyleSheetPath
297
+ );
298
+ if (_styleSheet == null)
299
+ {
300
+ this.LogError(
301
+ $"Failed to load Animation Viewer style sheet (package root: '{packageRoot}'), relative path '{unityRelativeStyleSheetPath}'."
302
+ );
303
+ }
304
+ }
305
+ else
306
+ {
307
+ this.LogError(
308
+ $"Failed to convert absolute path '{styleSheetPath}' to Unity relative path."
309
+ );
310
+ }
311
+ }
312
+
313
+ string visualTreePath =
314
+ $"{packageRoot}{pathSeparator}Editor{pathSeparator}Styles{pathSeparator}AnimationViewer.uxml";
315
+ string unityRelativeVisualTreePath = DirectoryHelper.AbsoluteToUnityRelativePath(
316
+ visualTreePath
317
+ );
318
+
319
+ _visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>(
320
+ unityRelativeVisualTreePath
321
+ );
322
+ if (_visualTree == null)
323
+ {
324
+ packageCacheIndex = unityRelativeVisualTreePath.IndexOf(
325
+ packageCache,
326
+ StringComparison.OrdinalIgnoreCase
327
+ );
328
+ if (0 <= packageCacheIndex)
329
+ {
330
+ unityRelativeVisualTreePath = unityRelativeVisualTreePath[
331
+ (packageCacheIndex + packageCache.Length)..
332
+ ];
333
+ int forwardIndex = unityRelativeVisualTreePath.IndexOf(
334
+ "/",
335
+ StringComparison.Ordinal
336
+ );
337
+ if (0 <= forwardIndex)
338
+ {
339
+ unityRelativeVisualTreePath = unityRelativeVisualTreePath.Substring(
340
+ forwardIndex
341
+ );
342
+ unityRelativeVisualTreePath =
343
+ "Packages/" + PackageId + "/" + unityRelativeVisualTreePath;
344
+ }
345
+ else
346
+ {
347
+ unityRelativeVisualTreePath = "Packages/" + unityRelativeVisualTreePath;
348
+ }
349
+ }
350
+
351
+ if (!string.IsNullOrWhiteSpace(unityRelativeVisualTreePath))
352
+ {
353
+ _visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>(
354
+ unityRelativeVisualTreePath
355
+ );
356
+ }
357
+ }
358
+ }
359
+ else
360
+ {
361
+ this.LogError(
362
+ $"Failed to find Animation Viewer style sheet (package root: '{packageRoot}')."
363
+ );
364
+ }
365
+ }
366
+
367
+ private void ToggleMultiFileSelector()
368
+ {
369
+ VisualElement root = rootVisualElement;
370
+ if (_fileSelector == null)
371
+ {
372
+ _fileSelector = new MultiFileSelectorElement(
373
+ GetLastAnimationDirectory(),
374
+ new[] { ".anim" }
375
+ );
376
+ _fileSelector.OnFilesSelected += HandleFilesSelectedFromCustomBrowser;
377
+ _fileSelector.OnCancelled += HideMultiFileSelector;
378
+ root.Add(_fileSelector);
379
+ if (root.childCount > 1)
380
+ {
381
+ _fileSelector.PlaceInFront(root.Children().FirstOrDefault());
382
+ }
383
+ }
384
+ else if (_fileSelector.parent == null)
385
+ {
386
+ _fileSelector.ResetAndShow(GetLastAnimationDirectory());
387
+ root.Add(_fileSelector);
388
+ if (root.childCount > 1)
389
+ {
390
+ _fileSelector.PlaceInFront(root.Children().FirstOrDefault());
391
+ }
392
+ }
393
+ else
394
+ {
395
+ HideMultiFileSelector();
396
+ }
397
+ }
398
+
399
+ private void HideMultiFileSelector()
400
+ {
401
+ if (_fileSelector is { parent: not null })
402
+ {
403
+ _fileSelector.parent.Remove(_fileSelector);
404
+ }
405
+ }
406
+
407
+ private void HandleFilesSelectedFromCustomBrowser(List<string> selectedFullPaths)
408
+ {
409
+ HideMultiFileSelector();
410
+
411
+ if (selectedFullPaths == null || selectedFullPaths.Count == 0)
412
+ {
413
+ return;
414
+ }
415
+
416
+ int clipsAddedCount = 0;
417
+ string lastValidDirectory = null;
418
+
419
+ foreach (string fullPath in selectedFullPaths)
420
+ {
421
+ string assetPath = fullPath.SanitizePath();
422
+ if (!assetPath.StartsWith("Assets", StringComparison.OrdinalIgnoreCase))
423
+ {
424
+ if (
425
+ assetPath.StartsWith(
426
+ Application.dataPath,
427
+ StringComparison.OrdinalIgnoreCase
428
+ )
429
+ )
430
+ {
431
+ assetPath = "Assets" + assetPath.Substring(Application.dataPath.Length);
432
+ }
433
+ else
434
+ {
435
+ this.LogWarn(
436
+ $"Selected file '{fullPath}' is outside the project's Assets folder or path is not project-relative. Skipping."
437
+ );
438
+ continue;
439
+ }
440
+ }
441
+
442
+ AnimationClip clip = AssetDatabase.LoadAssetAtPath<AnimationClip>(assetPath);
443
+ if (clip != null)
444
+ {
445
+ if (_loadedEditorLayers.All(layer => layer.SourceClip != clip))
446
+ {
447
+ AddEditorLayer(clip);
448
+ clipsAddedCount++;
449
+ lastValidDirectory = Path.GetDirectoryName(assetPath);
450
+ }
451
+ else
452
+ {
453
+ this.LogWarn($"Clip '{clip.name}' already loaded. Skipping.");
454
+ }
455
+ }
456
+ else
457
+ {
458
+ this.LogWarn($"Could not load AnimationClip from: {assetPath}");
459
+ }
460
+ }
461
+
462
+ if (clipsAddedCount > 0)
463
+ {
464
+ this.Log($"Added {clipsAddedCount} clip(s).");
465
+ if (!string.IsNullOrWhiteSpace(lastValidDirectory))
466
+ {
467
+ RecordLastAnimationDirectory(lastValidDirectory);
468
+ }
469
+ }
470
+ }
471
+
472
+ private void OnAddAnimationClipFieldChanged(ChangeEvent<Object> evt)
473
+ {
474
+ AnimationClip clip = evt.newValue as AnimationClip;
475
+ if (clip != null)
476
+ {
477
+ AddEditorLayer(clip);
478
+ _addAnimationClipField.SetValueWithoutNotify(null);
479
+ }
480
+ }
481
+
482
+ private void OnAddSelectedClipsFromProjectClicked()
483
+ {
484
+ Object[] selectedObjects = Selection.GetFiltered(
485
+ typeof(AnimationClip),
486
+ SelectionMode.Assets
487
+ );
488
+
489
+ if (selectedObjects == null || selectedObjects.Length == 0)
490
+ {
491
+ Utils.EditorUi.Info(
492
+ "No Clips Selected",
493
+ "Please select one or more AnimationClip assets in the Project window first."
494
+ );
495
+ return;
496
+ }
497
+
498
+ int clipsAddedCount = 0;
499
+ foreach (Object obj in selectedObjects)
500
+ {
501
+ if (obj is AnimationClip clip)
502
+ {
503
+ bool alreadyExists = _loadedEditorLayers.Any(layer => layer.SourceClip == clip);
504
+ if (!alreadyExists)
505
+ {
506
+ AddEditorLayer(clip);
507
+ clipsAddedCount++;
508
+ }
509
+ else
510
+ {
511
+ this.LogWarn($"Clip '{clip.name}' is already loaded. Skipping.");
512
+ }
513
+ }
514
+ }
515
+
516
+ if (clipsAddedCount > 0)
517
+ {
518
+ this.Log($"Added {clipsAddedCount} new AnimationClip(s) to the viewer.");
519
+ }
520
+ else if (selectedObjects.Length > 0)
521
+ {
522
+ this.Log($"All selected AnimationClips were already loaded.");
523
+ }
524
+ }
525
+
526
+ private void OnBrowseAndAddClicked()
527
+ {
528
+ string path = EditorUtility.OpenFilePanelWithFilters(
529
+ "Select Animation Clip to Add",
530
+ GetLastAnimationDirectory(),
531
+ new[] { "Animation Clip", "anim" }
532
+ );
533
+
534
+ if (!string.IsNullOrWhiteSpace(path))
535
+ {
536
+ if (path.StartsWith(Application.dataPath))
537
+ {
538
+ path = "Assets" + path.Substring(Application.dataPath.Length);
539
+ }
540
+
541
+ string dir = Path.GetDirectoryName(path);
542
+ if (!string.IsNullOrWhiteSpace(dir))
543
+ {
544
+ RecordLastAnimationDirectory(dir);
545
+ }
546
+
547
+ AnimationClip clip = AssetDatabase.LoadAssetAtPath<AnimationClip>(path);
548
+ if (clip != null)
549
+ {
550
+ AddEditorLayer(clip);
551
+ }
552
+ }
553
+ }
554
+
555
+ private static string GetLastAnimationDirectory()
556
+ {
557
+ try
558
+ {
559
+ PersistentDirectorySettings settings = PersistentDirectorySettings.Instance;
560
+ DirectoryUsageData[] paths =
561
+ settings != null
562
+ ? settings.GetPaths(DirToolName, DirContextKey, topOnly: true, topN: 1)
563
+ : Array.Empty<DirectoryUsageData>();
564
+ string candidate = paths is { Length: > 0 } ? paths[0]?.path : null;
565
+
566
+ if (string.IsNullOrWhiteSpace(candidate))
567
+ {
568
+ return "Assets";
569
+ }
570
+
571
+ // Prefer Assets-relative paths for UI components that expect them
572
+ if (!candidate.StartsWith("Assets", StringComparison.OrdinalIgnoreCase))
573
+ {
574
+ string assetsRoot = Application.dataPath.Replace('\\', '/');
575
+ string full = candidate.Replace('\\', '/');
576
+ if (full.StartsWith(assetsRoot, StringComparison.OrdinalIgnoreCase))
577
+ {
578
+ candidate = "Assets" + full.Substring(assetsRoot.Length);
579
+ }
580
+ }
581
+
582
+ return string.IsNullOrWhiteSpace(candidate) ? "Assets" : candidate;
583
+ }
584
+ catch
585
+ {
586
+ return "Assets";
587
+ }
588
+ }
589
+
590
+ private static void RecordLastAnimationDirectory(string assetsRelativeDir)
591
+ {
592
+ if (string.IsNullOrWhiteSpace(assetsRelativeDir))
593
+ {
594
+ return;
595
+ }
596
+
597
+ // Ensure Assets-relative if possible
598
+ string path = assetsRelativeDir.Replace('\\', '/');
599
+ if (!path.StartsWith("Assets", StringComparison.OrdinalIgnoreCase))
600
+ {
601
+ string assetsRoot = Application.dataPath.Replace('\\', '/');
602
+ string full = path;
603
+ if (full.StartsWith(assetsRoot, StringComparison.OrdinalIgnoreCase))
604
+ {
605
+ path = "Assets" + full.Substring(assetsRoot.Length);
606
+ }
607
+ }
608
+
609
+ PersistentDirectorySettings settings = PersistentDirectorySettings.Instance;
610
+ if (settings != null)
611
+ {
612
+ settings.RecordPath(DirToolName, DirContextKey, path);
613
+ }
614
+ }
615
+
616
+ private void AddEditorLayer(AnimationClip clip)
617
+ {
618
+ if (clip == null || _loadedEditorLayers.Any(layer => layer.SourceClip == clip))
619
+ {
620
+ string clipName = clip != null ? clip.name : "<null>";
621
+ this.LogWarn($"Clip '{clipName}' is null or already loaded.");
622
+ return;
623
+ }
624
+
625
+ EditorLayerData newEditorLayer = new(clip);
626
+ _loadedEditorLayers.Add(newEditorLayer);
627
+
628
+ if (_activeEditorLayer == null && newEditorLayer.Sprites.Count > 0)
629
+ {
630
+ SetActiveEditorLayer(newEditorLayer);
631
+ }
632
+ else if (_activeEditorLayer == null)
633
+ {
634
+ SetActiveEditorLayer(newEditorLayer);
635
+ }
636
+
637
+ RebuildLoadedClipsUI();
638
+ RecreatePreviewImage();
639
+ }
640
+
641
+ private void RemoveEditorLayer(EditorLayerData layerToRemove)
642
+ {
643
+ if (layerToRemove == null)
644
+ {
645
+ return;
646
+ }
647
+
648
+ _loadedEditorLayers.Remove(layerToRemove);
649
+
650
+ if (_activeEditorLayer == layerToRemove)
651
+ {
652
+ SetActiveEditorLayer(_loadedEditorLayers.FirstOrDefault());
653
+ }
654
+
655
+ RebuildLoadedClipsUI();
656
+ RecreatePreviewImage();
657
+ }
658
+
659
+ private void SetActiveEditorLayer(EditorLayerData layer)
660
+ {
661
+ _activeEditorLayer = layer;
662
+ _framesContainer.Clear();
663
+ _fpsDebugLabel.text = "Detected FPS Info (Active Clip):";
664
+
665
+ if (_activeEditorLayer != null)
666
+ {
667
+ UpdateFpsDebugLabelForActiveLayer();
668
+ _saveClipButton.SetEnabled(_activeEditorLayer.SourceClip != null);
669
+ }
670
+ else
671
+ {
672
+ _saveClipButton.SetEnabled(false);
673
+ }
674
+
675
+ RebuildFramesListUI();
676
+ RebuildLoadedClipsUI();
677
+ UpdateFramesPanelTitle();
678
+ }
679
+
680
+ private void UpdateFramesPanelTitle()
681
+ {
682
+ _framesPanelTitle.text =
683
+ _activeEditorLayer != null
684
+ ? $"Frames (Editing: {_activeEditorLayer.ClipName})"
685
+ : "Frames (No Active Clip Selected)";
686
+ }
687
+
688
+ private void RebuildLoadedClipsUI()
689
+ {
690
+ _loadedClipsContainer.Clear();
691
+ if (_loadedClipDropPlaceholder.parent == _loadedClipsContainer)
692
+ {
693
+ _loadedClipsContainer.Remove(_loadedClipDropPlaceholder);
694
+ }
695
+
696
+ for (int i = 0; i < _loadedEditorLayers.Count; i++)
697
+ {
698
+ EditorLayerData editorLayer = _loadedEditorLayers[i];
699
+
700
+ VisualElement itemElement = new();
701
+ itemElement.AddToClassList("loaded-clip-item");
702
+ if (editorLayer == _activeEditorLayer)
703
+ {
704
+ itemElement.AddToClassList("loaded-clip-item--active");
705
+ }
706
+ itemElement.userData = i;
707
+
708
+ Label label = new(editorLayer.ClipName);
709
+ itemElement.Add(label);
710
+
711
+ Button removeButton = new(() => RemoveEditorLayer(editorLayer)) { text = "X" };
712
+ itemElement.Add(removeButton);
713
+
714
+ itemElement.RegisterCallback<PointerDownEvent>(evt =>
715
+ {
716
+ if (evt.button == 0 && _draggedLoadedClipElement == null)
717
+ {
718
+ SetActiveEditorLayer(editorLayer);
719
+ }
720
+ });
721
+
722
+ int currentIndex = i;
723
+ itemElement.RegisterCallback<PointerDownEvent>(evt =>
724
+ OnLoadedClipItemPointerDownSetup(evt, itemElement, currentIndex)
725
+ );
726
+ itemElement.RegisterCallback<PointerMoveEvent>(OnLoadedClipItemPointerMove);
727
+ itemElement.RegisterCallback<PointerUpEvent>(evt =>
728
+ OnLoadedClipItemPointerUpForClick(evt, itemElement, currentIndex)
729
+ );
730
+
731
+ _loadedClipsContainer.Add(itemElement);
732
+ }
733
+ }
734
+
735
+ private void OnLoadedClipItemPointerDownSetup(
736
+ PointerDownEvent evt,
737
+ VisualElement clipElement,
738
+ int originalListIndex
739
+ )
740
+ {
741
+ if (evt.button != 0 || _draggedLoadedClipElement != null || _isClipDragPending)
742
+ {
743
+ return;
744
+ }
745
+
746
+ _isClipDragPending = true;
747
+ _clipDragPendingElement = clipElement;
748
+ _clipDragPendingOriginalIndex = originalListIndex;
749
+ _clipDragStartPosition = evt.position;
750
+
751
+ clipElement.CapturePointer(evt.pointerId);
752
+
753
+ evt.StopPropagation();
754
+ }
755
+
756
+ private void OnLoadedClipItemPointerMove(PointerMoveEvent evt)
757
+ {
758
+ if (!_isClipDragPending)
759
+ {
760
+ return;
761
+ }
762
+
763
+ float diffSqrMagnitude = (evt.position - _clipDragStartPosition).sqrMagnitude;
764
+
765
+ if (diffSqrMagnitude >= DragThresholdSqrMagnitude)
766
+ {
767
+ _draggedLoadedClipElement = _clipDragPendingElement;
768
+ _draggedLoadedClipOriginalIndex = _clipDragPendingOriginalIndex;
769
+
770
+ _draggedLoadedClipElement.AddToClassList("frame-item-dragged");
771
+
772
+ DragAndDrop.PrepareStartDrag();
773
+ DragAndDrop.SetGenericData(
774
+ "DraggedLoadedClipIndex",
775
+ _draggedLoadedClipOriginalIndex
776
+ );
777
+ Object dragContextObject = _loadedEditorLayers[
778
+ _draggedLoadedClipOriginalIndex
779
+ ]?.SourceClip;
780
+ if (dragContextObject == null)
781
+ {
782
+ dragContextObject = CreateInstance<ScriptableObject>();
783
+ }
784
+ DragAndDrop.objectReferences = new[] { dragContextObject };
785
+ DragAndDrop.StartDrag(
786
+ _loadedEditorLayers[_draggedLoadedClipOriginalIndex].ClipName
787
+ ?? "Dragging Layer"
788
+ );
789
+
790
+ _isClipDragPending = false;
791
+ }
792
+ }
793
+
794
+ private void OnLoadedClipItemPointerUpForClick(
795
+ PointerUpEvent evt,
796
+ VisualElement clipElement,
797
+ int listIndex
798
+ )
799
+ {
800
+ if (evt.button != 0)
801
+ {
802
+ return;
803
+ }
804
+
805
+ if (clipElement.HasPointerCapture(evt.pointerId))
806
+ {
807
+ clipElement.ReleasePointer(evt.pointerId);
808
+ }
809
+ if (_isClipDragPending)
810
+ {
811
+ if (listIndex >= 0 && listIndex < _loadedEditorLayers.Count)
812
+ {
813
+ SetActiveEditorLayer(_loadedEditorLayers[listIndex]);
814
+ }
815
+ _isClipDragPending = false;
816
+ _clipDragPendingElement = null;
817
+ evt.StopPropagation();
818
+ }
819
+ else if (_draggedLoadedClipElement == _clipDragPendingElement)
820
+ {
821
+ if (DragAndDrop.GetGenericData("DraggedLoadedClipIndex") != null)
822
+ {
823
+ CleanupLoadedClipDragState(evt.pointerId);
824
+ }
825
+ evt.StopPropagation();
826
+ }
827
+
828
+ _isClipDragPending = false;
829
+ _clipDragPendingElement = null;
830
+ }
831
+
832
+ private void OnDraggedLoadedClipItemPointerUp(PointerUpEvent evt)
833
+ {
834
+ if (_draggedLoadedClipElement == null || evt.currentTarget != _draggedLoadedClipElement)
835
+ {
836
+ return;
837
+ }
838
+
839
+ if (
840
+ DragAndDrop.GetGenericData("DraggedLoadedClipIndex") != null
841
+ || _draggedLoadedClipElement != null
842
+ && _draggedLoadedClipElement.HasPointerCapture(evt.pointerId)
843
+ )
844
+ {
845
+ CleanupLoadedClipDragState(evt.pointerId);
846
+ }
847
+
848
+ evt.StopPropagation();
849
+ }
850
+
851
+ private void OnLoadedClipsContainerDragUpdated(DragUpdatedEvent evt)
852
+ {
853
+ object draggedIndexData = DragAndDrop.GetGenericData("DraggedLoadedClipIndex");
854
+ if (draggedIndexData != null && _draggedLoadedClipElement != null)
855
+ {
856
+ DragAndDrop.visualMode = DragAndDropVisualMode.Move;
857
+ float mouseY = evt.localMousePosition.y;
858
+ int newVisualIndex = -1;
859
+
860
+ if (_loadedClipDropPlaceholder.parent == _loadedClipsContainer)
861
+ {
862
+ _loadedClipsContainer.Remove(_loadedClipDropPlaceholder);
863
+ }
864
+
865
+ for (int i = 0; i < _loadedClipsContainer.childCount; i++)
866
+ {
867
+ VisualElement child = _loadedClipsContainer[i];
868
+ if (child == _draggedLoadedClipElement)
869
+ {
870
+ continue;
871
+ }
872
+
873
+ float childMidY = child.layout.yMin + child.layout.height / 2f;
874
+ if (mouseY < childMidY)
875
+ {
876
+ newVisualIndex = i;
877
+ break;
878
+ }
879
+ }
880
+ if (
881
+ newVisualIndex < 0
882
+ && _loadedClipsContainer.childCount > 0
883
+ && _draggedLoadedClipElement
884
+ != _loadedClipsContainer.ElementAt(_loadedClipsContainer.childCount - 1)
885
+ )
886
+ {
887
+ newVisualIndex = _loadedClipsContainer.childCount;
888
+ }
889
+
890
+ if (0 <= newVisualIndex)
891
+ {
892
+ _loadedClipsContainer.Insert(newVisualIndex, _loadedClipDropPlaceholder);
893
+ _loadedClipDropPlaceholder.style.visibility = Visibility.Visible;
894
+ }
895
+ else if (_loadedClipsContainer.childCount == 0 && _draggedLoadedClipElement != null)
896
+ {
897
+ _loadedClipsContainer.Add(_loadedClipDropPlaceholder);
898
+ _loadedClipDropPlaceholder.style.visibility = Visibility.Visible;
899
+ }
900
+ else
901
+ {
902
+ if (_loadedClipDropPlaceholder.parent == _loadedClipsContainer)
903
+ {
904
+ _loadedClipsContainer.Remove(_loadedClipDropPlaceholder);
905
+ }
906
+
907
+ _loadedClipDropPlaceholder.style.visibility = Visibility.Hidden;
908
+ }
909
+ }
910
+ else
911
+ {
912
+ DragAndDrop.visualMode = DragAndDropVisualMode.Rejected;
913
+ }
914
+ evt.StopPropagation();
915
+ }
916
+
917
+ private void OnLoadedClipsContainerDragPerform(DragPerformEvent evt)
918
+ {
919
+ object draggedIndexData = DragAndDrop.GetGenericData("DraggedLoadedClipIndex");
920
+ if (draggedIndexData != null && _draggedLoadedClipElement != null)
921
+ {
922
+ int originalListIndex = (int)draggedIndexData;
923
+
924
+ if (originalListIndex < 0 || originalListIndex >= _loadedEditorLayers.Count)
925
+ {
926
+ this.LogError(
927
+ $"DragPerform (LoadedClips): Stale or invalid dragged index. Aborting drop."
928
+ );
929
+ CleanupLoadedClipDragState(InvalidPointerId);
930
+ evt.StopPropagation();
931
+ return;
932
+ }
933
+
934
+ EditorLayerData movedLayer = _loadedEditorLayers[originalListIndex];
935
+ _loadedEditorLayers.RemoveAt(originalListIndex);
936
+
937
+ int placeholderVisualIndex = _loadedClipsContainer.IndexOf(
938
+ _loadedClipDropPlaceholder
939
+ );
940
+ int targetListIndex;
941
+
942
+ if (0 <= placeholderVisualIndex)
943
+ {
944
+ int itemsBeforePlaceholder = -1;
945
+ for (int i = 0; i < placeholderVisualIndex; i++)
946
+ {
947
+ if (_loadedClipsContainer[i] != _loadedClipDropPlaceholder)
948
+ {
949
+ itemsBeforePlaceholder++;
950
+ }
951
+ else
952
+ {
953
+ break;
954
+ }
955
+ }
956
+ targetListIndex = itemsBeforePlaceholder;
957
+ }
958
+ else
959
+ {
960
+ targetListIndex = _loadedEditorLayers.Count;
961
+ }
962
+ targetListIndex = Mathf.Clamp(targetListIndex, 0, _loadedEditorLayers.Count);
963
+ _loadedEditorLayers.Insert(targetListIndex, movedLayer);
964
+
965
+ DragAndDrop.AcceptDrag();
966
+ CleanupLoadedClipDragState(InvalidPointerId);
967
+
968
+ RebuildLoadedClipsUI();
969
+ RecreatePreviewImage();
970
+ }
971
+ else
972
+ {
973
+ if (DragAndDrop.GetGenericData("DraggedLoadedClipIndex") != null)
974
+ {
975
+ CleanupLoadedClipDragState(InvalidPointerId);
976
+ }
977
+ }
978
+ evt.StopPropagation();
979
+ }
980
+
981
+ private void OnLoadedClipsContainerDragLeave(DragLeaveEvent evt)
982
+ {
983
+ if (evt.target == _loadedClipsContainer)
984
+ {
985
+ if (_loadedClipDropPlaceholder.parent == _loadedClipsContainer)
986
+ {
987
+ _loadedClipsContainer.Remove(_loadedClipDropPlaceholder);
988
+ }
989
+
990
+ if (_loadedClipDropPlaceholder != null)
991
+ {
992
+ _loadedClipDropPlaceholder.style.visibility = Visibility.Hidden;
993
+ }
994
+ }
995
+ }
996
+
997
+ private void CleanupLoadedClipDragState(int pointerIdToRelease)
998
+ {
999
+ if (_draggedLoadedClipElement != null)
1000
+ {
1001
+ if (
1002
+ pointerIdToRelease != InvalidPointerId
1003
+ && _draggedLoadedClipElement.HasPointerCapture(pointerIdToRelease)
1004
+ )
1005
+ {
1006
+ _draggedLoadedClipElement.ReleasePointer(pointerIdToRelease);
1007
+ }
1008
+
1009
+ _draggedLoadedClipElement.UnregisterCallback<PointerUpEvent>(
1010
+ OnDraggedLoadedClipItemPointerUp
1011
+ );
1012
+
1013
+ _draggedLoadedClipElement.RemoveFromClassList("frame-item-dragged");
1014
+ _draggedLoadedClipElement = null;
1015
+ }
1016
+ _draggedLoadedClipOriginalIndex = -1;
1017
+
1018
+ _isClipDragPending = false;
1019
+ if (_clipDragPendingElement != null)
1020
+ {
1021
+ if (
1022
+ pointerIdToRelease != InvalidPointerId
1023
+ && _clipDragPendingElement.HasPointerCapture(pointerIdToRelease)
1024
+ )
1025
+ {
1026
+ _clipDragPendingElement.ReleasePointer(pointerIdToRelease);
1027
+ }
1028
+
1029
+ _clipDragPendingElement = null;
1030
+ }
1031
+
1032
+ if (_loadedClipDropPlaceholder != null)
1033
+ {
1034
+ if (_loadedClipDropPlaceholder.parent == _loadedClipsContainer)
1035
+ {
1036
+ _loadedClipsContainer.Remove(_loadedClipDropPlaceholder);
1037
+ }
1038
+
1039
+ _loadedClipDropPlaceholder.style.visibility = Visibility.Hidden;
1040
+ }
1041
+ DragAndDrop.SetGenericData("DraggedLoadedClipIndex", null);
1042
+ }
1043
+
1044
+ private void RecreatePreviewImage()
1045
+ {
1046
+ if (_animationPreview != null)
1047
+ {
1048
+ if (_animationPreview.parent == _previewPanelHost)
1049
+ {
1050
+ _previewPanelHost.Remove(_animationPreview);
1051
+ }
1052
+
1053
+ _animationPreview = null;
1054
+ }
1055
+
1056
+ if (_previewPanelHost == null)
1057
+ {
1058
+ return;
1059
+ }
1060
+
1061
+ List<AnimatedSpriteLayer> animatedSpriteLayers = new();
1062
+ if (_loadedEditorLayers.Count > 0)
1063
+ {
1064
+ foreach (EditorLayerData editorLayer in _loadedEditorLayers)
1065
+ {
1066
+ animatedSpriteLayers.Add(new AnimatedSpriteLayer(editorLayer.Sprites));
1067
+ }
1068
+ }
1069
+
1070
+ _animationPreview = new LayeredImage(
1071
+ animatedSpriteLayers,
1072
+ Color.clear,
1073
+ _currentPreviewFps,
1074
+ updatesSelf: false
1075
+ )
1076
+ {
1077
+ name = "animationPreviewElement",
1078
+ };
1079
+
1080
+ _previewPanelHost.Add(_animationPreview);
1081
+ }
1082
+
1083
+ private void OnFramesContainerDragUpdated(DragUpdatedEvent evt)
1084
+ {
1085
+ object draggedIndexData = DragAndDrop.GetGenericData("DraggedFrameDataIndex");
1086
+ if (draggedIndexData != null && _draggedFrameElement != null)
1087
+ {
1088
+ DragAndDrop.visualMode = DragAndDropVisualMode.Move;
1089
+ float mouseY = evt.localMousePosition.y;
1090
+ int newVisualIndex = -1;
1091
+
1092
+ if (_frameDropPlaceholder.parent == _framesContainer)
1093
+ {
1094
+ _framesContainer.Remove(_frameDropPlaceholder);
1095
+ }
1096
+
1097
+ for (int i = 0; i < _framesContainer.childCount; i++)
1098
+ {
1099
+ VisualElement child = _framesContainer[i];
1100
+ if (child == _draggedFrameElement)
1101
+ {
1102
+ continue;
1103
+ }
1104
+
1105
+ float childMidY = child.layout.yMin + child.layout.height / 2f;
1106
+ if (mouseY < childMidY)
1107
+ {
1108
+ newVisualIndex = i;
1109
+ break;
1110
+ }
1111
+ }
1112
+ if (
1113
+ newVisualIndex < 0
1114
+ && _framesContainer.childCount > 0
1115
+ && _draggedFrameElement
1116
+ != _framesContainer.ElementAt(_framesContainer.childCount - 1)
1117
+ )
1118
+ {
1119
+ newVisualIndex = _framesContainer.childCount;
1120
+ }
1121
+
1122
+ if (0 <= newVisualIndex)
1123
+ {
1124
+ _framesContainer.Insert(newVisualIndex, _frameDropPlaceholder);
1125
+ _frameDropPlaceholder.style.visibility = Visibility.Visible;
1126
+ }
1127
+ else if (_framesContainer.childCount == 0 && _draggedFrameElement != null)
1128
+ {
1129
+ _framesContainer.Add(_frameDropPlaceholder);
1130
+ _frameDropPlaceholder.style.visibility = Visibility.Visible;
1131
+ }
1132
+ else
1133
+ {
1134
+ if (_frameDropPlaceholder.parent == _framesContainer)
1135
+ {
1136
+ _framesContainer.Remove(_frameDropPlaceholder);
1137
+ }
1138
+
1139
+ _frameDropPlaceholder.style.visibility = Visibility.Hidden;
1140
+ }
1141
+ }
1142
+ else
1143
+ {
1144
+ DragAndDrop.visualMode = DragAndDropVisualMode.Rejected;
1145
+ }
1146
+ evt.StopPropagation();
1147
+ }
1148
+
1149
+ private void OnFramesContainerDragPerform(DragPerformEvent evt)
1150
+ {
1151
+ object draggedIndexData = DragAndDrop.GetGenericData("DraggedFrameDataIndex");
1152
+ if (
1153
+ draggedIndexData != null
1154
+ && _draggedFrameElement != null
1155
+ && _activeEditorLayer != null
1156
+ )
1157
+ {
1158
+ int originalDataIndex = (int)draggedIndexData;
1159
+
1160
+ if (originalDataIndex < 0 || originalDataIndex >= _activeEditorLayer.Sprites.Count)
1161
+ {
1162
+ this.LogError(
1163
+ $"DragPerform (Frames): Stale or invalid dragged index. Aborting drop."
1164
+ );
1165
+ CleanupFrameDragState(InvalidPointerId);
1166
+ evt.StopPropagation();
1167
+ return;
1168
+ }
1169
+
1170
+ Sprite movedSprite = _activeEditorLayer.Sprites[originalDataIndex];
1171
+ _activeEditorLayer.Sprites.RemoveAt(originalDataIndex);
1172
+
1173
+ int placeholderVisualIndex = _framesContainer.IndexOf(_frameDropPlaceholder);
1174
+ int targetDataIndex;
1175
+
1176
+ if (0 <= placeholderVisualIndex)
1177
+ {
1178
+ int itemsBeforePlaceholder = 0;
1179
+ for (int i = 0; i < placeholderVisualIndex; i++)
1180
+ {
1181
+ if (
1182
+ _framesContainer[i] != _draggedFrameElement
1183
+ && _framesContainer[i] != _frameDropPlaceholder
1184
+ )
1185
+ {
1186
+ itemsBeforePlaceholder++;
1187
+ }
1188
+ }
1189
+ targetDataIndex = itemsBeforePlaceholder;
1190
+ }
1191
+ else
1192
+ {
1193
+ targetDataIndex = _activeEditorLayer.Sprites.Count;
1194
+ }
1195
+ targetDataIndex = Mathf.Clamp(targetDataIndex, 0, _activeEditorLayer.Sprites.Count);
1196
+ _activeEditorLayer.Sprites.Insert(targetDataIndex, movedSprite);
1197
+
1198
+ DragAndDrop.AcceptDrag();
1199
+ CleanupFrameDragState(InvalidPointerId);
1200
+
1201
+ RebuildFramesListUI();
1202
+ RecreatePreviewImage();
1203
+ }
1204
+ else
1205
+ {
1206
+ if (DragAndDrop.GetGenericData("DraggedFrameDataIndex") != null)
1207
+ {
1208
+ CleanupFrameDragState(InvalidPointerId);
1209
+ }
1210
+ }
1211
+ evt.StopPropagation();
1212
+ }
1213
+
1214
+ private void OnFramesContainerDragLeave(DragLeaveEvent evt)
1215
+ {
1216
+ if (evt.target == _framesContainer)
1217
+ {
1218
+ if (_frameDropPlaceholder.parent == _framesContainer)
1219
+ {
1220
+ _framesContainer.Remove(_frameDropPlaceholder);
1221
+ }
1222
+
1223
+ if (_frameDropPlaceholder != null)
1224
+ {
1225
+ _frameDropPlaceholder.style.visibility = Visibility.Hidden;
1226
+ }
1227
+ }
1228
+
1229
+ CleanupFrameDragState(InvalidPointerId);
1230
+ }
1231
+
1232
+ private void CleanupFrameDragState(int pointerIdToRelease)
1233
+ {
1234
+ this.Log($"Cleaning up frame drag state with pointer {pointerIdToRelease}");
1235
+ if (_draggedFrameElement != null)
1236
+ {
1237
+ if (
1238
+ pointerIdToRelease != InvalidPointerId
1239
+ && _draggedFrameElement.HasPointerCapture(pointerIdToRelease)
1240
+ )
1241
+ {
1242
+ _draggedFrameElement.ReleasePointer(pointerIdToRelease);
1243
+ }
1244
+
1245
+ _draggedFrameElement.UnregisterCallback<PointerUpEvent>(
1246
+ OnDraggedFrameItemPointerUp
1247
+ );
1248
+ _draggedFrameElement.RemoveFromClassList("frame-item-dragged");
1249
+ _draggedFrameElement = null;
1250
+ }
1251
+ _draggedFrameOriginalDataIndex = -1;
1252
+
1253
+ if (_frameDropPlaceholder != null)
1254
+ {
1255
+ if (_frameDropPlaceholder.parent == _framesContainer)
1256
+ {
1257
+ _framesContainer.Remove(_frameDropPlaceholder);
1258
+ }
1259
+
1260
+ _frameDropPlaceholder.style.visibility = Visibility.Hidden;
1261
+ }
1262
+ DragAndDrop.SetGenericData("DraggedFrameDataIndex", null);
1263
+ }
1264
+
1265
+ private void UpdateFpsDebugLabelForActiveLayer()
1266
+ {
1267
+ if (_activeEditorLayer == null)
1268
+ {
1269
+ _fpsDebugLabel.text = "Detected FPS Info: No active clip.";
1270
+ return;
1271
+ }
1272
+
1273
+ _fpsDebugLabel.text =
1274
+ $"Active Clip FPS (Original): {FormatFps(_activeEditorLayer.OriginalClipFps)}fps. Preview uses global FPS.";
1275
+ }
1276
+
1277
+ private static string FormatFps(float fps)
1278
+ {
1279
+ return fps.ToString("F1");
1280
+ }
1281
+
1282
+ private void RebuildFramesListUI()
1283
+ {
1284
+ _framesContainer.Clear();
1285
+
1286
+ if (_frameDropPlaceholder != null && _frameDropPlaceholder.parent == _framesContainer)
1287
+ {
1288
+ _framesContainer.Remove(_frameDropPlaceholder);
1289
+ }
1290
+
1291
+ if (_activeEditorLayer?.Sprites == null)
1292
+ {
1293
+ return;
1294
+ }
1295
+
1296
+ for (int i = 0; i < _activeEditorLayer.Sprites.Count; i++)
1297
+ {
1298
+ Sprite sprite = _activeEditorLayer.Sprites[i];
1299
+
1300
+ VisualElement frameElement = new();
1301
+ frameElement.AddToClassList("frame-item");
1302
+
1303
+ Image frameImage = new() { sprite = sprite, scaleMode = ScaleMode.ScaleToFit };
1304
+ frameImage.AddToClassList("frame-image");
1305
+ frameElement.Add(frameImage);
1306
+
1307
+ VisualElement frameInfo = new();
1308
+ frameInfo.AddToClassList("frame-info");
1309
+ frameInfo.Add(new Label($"Frame: {i + 1}"));
1310
+ frameInfo.Add(new Label($"Sprite: {(sprite != null ? sprite.name : "(None)")}"));
1311
+ frameElement.Add(frameInfo);
1312
+
1313
+ IntegerField indexField = new(null) { value = i + 1 };
1314
+ indexField.AddToClassList("frame-index-field");
1315
+ frameElement.Add(indexField);
1316
+
1317
+ VisualElement orderFieldContainer = new()
1318
+ {
1319
+ style =
1320
+ {
1321
+ flexDirection = FlexDirection.Row,
1322
+ alignItems = Align.Center,
1323
+ marginLeft = StyleKeyword.Auto,
1324
+ },
1325
+ };
1326
+
1327
+ Label orderLabel = new("Order:") { style = { marginRight = 3 } };
1328
+ orderFieldContainer.Add(orderLabel);
1329
+ orderFieldContainer.Add(indexField);
1330
+ frameElement.Add(orderFieldContainer);
1331
+
1332
+ int currentDataIndex = i;
1333
+ frameElement.RegisterCallback<PointerDownEvent>(evt =>
1334
+ OnFrameItemPointerDown(evt, frameElement, currentDataIndex)
1335
+ );
1336
+
1337
+ indexField.userData = currentDataIndex;
1338
+
1339
+ indexField.RegisterCallback<FocusInEvent>(_ =>
1340
+ {
1341
+ CleanupFrameDragState(InvalidPointerId);
1342
+ CleanupLoadedClipDragState(InvalidPointerId);
1343
+ });
1344
+
1345
+ indexField.RegisterCallback<FocusOutEvent>(_ =>
1346
+ OnFrameIndexFieldChanged(indexField)
1347
+ );
1348
+ indexField.RegisterCallback<KeyDownEvent>(evt =>
1349
+ {
1350
+ if (evt.keyCode is KeyCode.Return or KeyCode.KeypadEnter)
1351
+ {
1352
+ OnFrameIndexFieldChanged(indexField);
1353
+ indexField.Blur();
1354
+ }
1355
+ });
1356
+
1357
+ _framesContainer.Add(frameElement);
1358
+ }
1359
+ }
1360
+
1361
+ private void OnFrameIndexFieldChanged(IntegerField field)
1362
+ {
1363
+ CleanupFrameDragState(InvalidPointerId);
1364
+ CleanupLoadedClipDragState(InvalidPointerId);
1365
+ if (_activeEditorLayer?.Sprites == null)
1366
+ {
1367
+ return;
1368
+ }
1369
+
1370
+ int originalDataIndex = (int)field.userData;
1371
+ int newUiIndex = field.value;
1372
+ int newRequestedDataIndex = newUiIndex - 1;
1373
+ int newClampedDataIndex = Mathf.Clamp(
1374
+ newRequestedDataIndex,
1375
+ 0,
1376
+ _activeEditorLayer.Sprites.Count - 1
1377
+ );
1378
+
1379
+ if (newClampedDataIndex != originalDataIndex)
1380
+ {
1381
+ if (originalDataIndex < 0 || originalDataIndex >= _activeEditorLayer.Sprites.Count)
1382
+ {
1383
+ this.LogWarn(
1384
+ $"Original index {originalDataIndex} out of bounds. Rebuilding UI to correct."
1385
+ );
1386
+ RebuildFramesListUI();
1387
+ return;
1388
+ }
1389
+ Sprite spriteToMove = _activeEditorLayer.Sprites[originalDataIndex];
1390
+ _activeEditorLayer.Sprites.RemoveAt(originalDataIndex);
1391
+ _activeEditorLayer.Sprites.Insert(newClampedDataIndex, spriteToMove);
1392
+ RebuildFramesListUI();
1393
+ RecreatePreviewImage();
1394
+ }
1395
+ else if (newUiIndex - 1 != newClampedDataIndex)
1396
+ {
1397
+ RebuildFramesListUI();
1398
+ }
1399
+ }
1400
+
1401
+ private void OnFrameItemPointerDown(
1402
+ PointerDownEvent evt,
1403
+ VisualElement frameElement,
1404
+ int originalDataIndex
1405
+ )
1406
+ {
1407
+ if (evt.button != 0 || _draggedFrameElement != null)
1408
+ {
1409
+ return;
1410
+ }
1411
+
1412
+ if (
1413
+ _activeEditorLayer == null
1414
+ || originalDataIndex < 0
1415
+ || originalDataIndex >= _activeEditorLayer.Sprites.Count
1416
+ )
1417
+ {
1418
+ this.LogError(
1419
+ $"OnFrameItemPointerDown: Invalid originalDataIndex ({originalDataIndex}) or no active layer. Sprite count: {_activeEditorLayer?.Sprites?.Count ?? -1}"
1420
+ );
1421
+ return;
1422
+ }
1423
+
1424
+ _draggedFrameElement = frameElement;
1425
+ _draggedFrameOriginalDataIndex = originalDataIndex;
1426
+
1427
+ try
1428
+ {
1429
+ _draggedFrameElement.RegisterCallback<PointerUpEvent>(OnDraggedFrameItemPointerUp);
1430
+ _draggedFrameElement.AddToClassList("frame-item-dragged");
1431
+
1432
+ DragAndDrop.PrepareStartDrag();
1433
+ DragAndDrop.SetGenericData("DraggedFrameDataIndex", _draggedFrameOriginalDataIndex);
1434
+
1435
+ Object dragContextObject = _activeEditorLayer.SourceClip;
1436
+ if (dragContextObject == null)
1437
+ {
1438
+ dragContextObject = CreateInstance<ScriptableObject>();
1439
+ }
1440
+ if (dragContextObject == null)
1441
+ {
1442
+ this.LogError($"Failed to create dragContextObject for frame drag.");
1443
+
1444
+ _draggedFrameElement.ReleasePointer(evt.pointerId);
1445
+ _draggedFrameElement.UnregisterCallback<PointerUpEvent>(
1446
+ OnDraggedFrameItemPointerUp
1447
+ );
1448
+ _draggedFrameElement.RemoveFromClassList("frame-item-dragged");
1449
+ _draggedFrameElement = null;
1450
+ return;
1451
+ }
1452
+ DragAndDrop.objectReferences = new[] { dragContextObject };
1453
+
1454
+ Sprite spriteBeingDragged = _activeEditorLayer.Sprites[originalDataIndex];
1455
+ string dragTitle;
1456
+ if (spriteBeingDragged != null)
1457
+ {
1458
+ dragTitle = !string.IsNullOrWhiteSpace(spriteBeingDragged.name)
1459
+ ? spriteBeingDragged.name
1460
+ : $"Unnamed Sprite Frame {originalDataIndex + 1}";
1461
+ }
1462
+ else
1463
+ {
1464
+ dragTitle = $"Empty Frame {originalDataIndex + 1}";
1465
+ }
1466
+
1467
+ if (string.IsNullOrWhiteSpace(dragTitle))
1468
+ {
1469
+ dragTitle = "Dragging Frame";
1470
+ }
1471
+
1472
+ DragAndDrop.StartDrag(dragTitle);
1473
+ }
1474
+ catch (Exception e)
1475
+ {
1476
+ this.LogError(
1477
+ $"Exception during OnFrameItemPointerDown before StartDrag: {e.Message}\n{e.StackTrace}"
1478
+ );
1479
+
1480
+ if (_draggedFrameElement != null)
1481
+ {
1482
+ if (_draggedFrameElement.HasPointerCapture(evt.pointerId))
1483
+ {
1484
+ _draggedFrameElement.ReleasePointer(evt.pointerId);
1485
+ }
1486
+
1487
+ _draggedFrameElement.UnregisterCallback<PointerUpEvent>(
1488
+ OnDraggedFrameItemPointerUp
1489
+ );
1490
+ _draggedFrameElement.RemoveFromClassList("frame-item-dragged");
1491
+ _draggedFrameElement = null;
1492
+ }
1493
+ _draggedFrameOriginalDataIndex = -1;
1494
+ }
1495
+ }
1496
+
1497
+ private void OnDraggedFrameItemPointerUp(PointerUpEvent evt)
1498
+ {
1499
+ if (_draggedFrameElement == null || evt.currentTarget != _draggedFrameElement)
1500
+ {
1501
+ return;
1502
+ }
1503
+
1504
+ if (DragAndDrop.GetGenericData("DraggedFrameDataIndex") != null)
1505
+ {
1506
+ CleanupFrameDragState(evt.pointerId);
1507
+ }
1508
+ else if (
1509
+ _draggedFrameElement != null
1510
+ && _draggedFrameElement.HasPointerCapture(evt.pointerId)
1511
+ )
1512
+ {
1513
+ _draggedFrameElement.ReleasePointer(evt.pointerId);
1514
+ _draggedFrameElement.UnregisterCallback<PointerUpEvent>(
1515
+ OnDraggedFrameItemPointerUp
1516
+ );
1517
+ _draggedFrameElement.RemoveFromClassList("frame-item-dragged");
1518
+ _draggedFrameElement = null;
1519
+ }
1520
+ evt.StopPropagation();
1521
+ }
1522
+
1523
+ private void OnApplyFpsToPreviewClicked()
1524
+ {
1525
+ _currentPreviewFps = Mathf.Max(0.1f, _fpsField.value);
1526
+ _fpsField.SetValueWithoutNotify(_currentPreviewFps);
1527
+ if (_animationPreview != null)
1528
+ {
1529
+ _animationPreview.Fps = _currentPreviewFps;
1530
+ }
1531
+ }
1532
+
1533
+ private void OnSaveClipClicked()
1534
+ {
1535
+ if (_activeEditorLayer == null || _activeEditorLayer.SourceClip == null)
1536
+ {
1537
+ this.LogError($"No active animation clip to save.");
1538
+ return;
1539
+ }
1540
+
1541
+ AnimationClip clipToSave = _activeEditorLayer.SourceClip;
1542
+ string bindingPath = _activeEditorLayer.BindingPath;
1543
+
1544
+ EditorCurveBinding spriteBinding = default;
1545
+ bool bindingFound = false;
1546
+ EditorCurveBinding[] allBindings = AnimationUtility.GetObjectReferenceCurveBindings(
1547
+ clipToSave
1548
+ );
1549
+
1550
+ foreach (EditorCurveBinding b in allBindings)
1551
+ {
1552
+ if (
1553
+ b.type == typeof(SpriteRenderer)
1554
+ && string.Equals(b.propertyName, "m_Sprite", StringComparison.Ordinal)
1555
+ && (
1556
+ string.IsNullOrWhiteSpace(bindingPath)
1557
+ || string.Equals(b.path, bindingPath, StringComparison.Ordinal)
1558
+ )
1559
+ )
1560
+ {
1561
+ spriteBinding = b;
1562
+ bindingFound = true;
1563
+ break;
1564
+ }
1565
+ }
1566
+
1567
+ if (!bindingFound)
1568
+ {
1569
+ foreach (EditorCurveBinding b in allBindings)
1570
+ {
1571
+ if (
1572
+ b.type == typeof(SpriteRenderer)
1573
+ && string.Equals(b.propertyName, "m_Sprite", StringComparison.Ordinal)
1574
+ )
1575
+ {
1576
+ spriteBinding = b;
1577
+ bindingFound = true;
1578
+ this.LogWarn(
1579
+ $"Saving to first available m_Sprite binding on '{clipToSave.name}' as specific path '{bindingPath}' was not found or empty."
1580
+ );
1581
+ break;
1582
+ }
1583
+ }
1584
+ }
1585
+
1586
+ if (!bindingFound)
1587
+ {
1588
+ this.LogError(
1589
+ $"Cannot save '{clipToSave.name}': No SpriteRenderer m_Sprite binding found (Path Hint: '{bindingPath}'). Clip might be empty or not a sprite animation."
1590
+ );
1591
+ return;
1592
+ }
1593
+
1594
+ List<Sprite> spritesToSave = _activeEditorLayer.Sprites;
1595
+ ObjectReferenceKeyframe[] newKeyframes = new ObjectReferenceKeyframe[
1596
+ spritesToSave.Count
1597
+ ];
1598
+ float timePerFrame = _currentPreviewFps > 0 ? 1.0f / _currentPreviewFps : 0f;
1599
+
1600
+ for (int i = 0; i < spritesToSave.Count; i++)
1601
+ {
1602
+ newKeyframes[i] = new ObjectReferenceKeyframe
1603
+ {
1604
+ time = i * timePerFrame,
1605
+ value = spritesToSave[i],
1606
+ };
1607
+ }
1608
+
1609
+ Undo.RecordObject(clipToSave, "Modify Animation Clip Frames");
1610
+ AnimationUtility.SetObjectReferenceCurve(clipToSave, spriteBinding, newKeyframes);
1611
+ clipToSave.frameRate = _currentPreviewFps;
1612
+
1613
+ EditorUtility.SetDirty(clipToSave);
1614
+ AssetDatabase.SaveAssets();
1615
+
1616
+ this.Log(
1617
+ $"Animation clip '{clipToSave.name}' saved with {spritesToSave.Count} frames at {_currentPreviewFps} FPS."
1618
+ );
1619
+ }
1620
+
1621
+ private void OnDisable()
1622
+ {
1623
+ CleanupFrameDragState(InvalidPointerId);
1624
+ CleanupLoadedClipDragState(InvalidPointerId);
1625
+
1626
+ if (_animationPreview != null && _animationPreview.parent == _previewPanelHost)
1627
+ {
1628
+ _previewPanelHost.Remove(_animationPreview);
1629
+ }
1630
+ _animationPreview = null;
1631
+ }
1632
+ }
1633
+ #endif
1634
+ }