@alpsckr/unitycli 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1066) hide show
  1. package/README.md +389 -0
  2. package/contracts/command-contract.json +3972 -0
  3. package/contracts/stable-session/admission-acquire-v1.schema.json +16 -0
  4. package/contracts/stable-session/admission-response-v1.schema.json +30 -0
  5. package/contracts/stable-session/admission-revoke-v1.schema.json +15 -0
  6. package/contracts/stable-session/admission-transport-v1.json +36 -0
  7. package/contracts/stable-session/bridge-request-v2.schema.json +26 -0
  8. package/contracts/stable-session/canonical-path-v1-golden.json +23 -0
  9. package/contracts/stable-session/completion-contract.schema.json +46 -0
  10. package/contracts/stable-session/direct-call-semantics.json +102 -0
  11. package/contracts/stable-session/editor-state.schema.json +92 -0
  12. package/contracts/stable-session/health-v3.schema.json +47 -0
  13. package/contracts/stable-session/instance-registry-v3.schema.json +152 -0
  14. package/contracts/stable-session/removal-map.json +27 -0
  15. package/contracts/stable-session/request-digest-v1-golden.json +7 -0
  16. package/contracts/stable-session/runtime-config-v2.schema.json +27 -0
  17. package/contracts/static-capability-catalog.json +48226 -0
  18. package/contracts/tool-completion-contract.json +11322 -0
  19. package/dist/args.d.ts +27 -0
  20. package/dist/args.js +109 -0
  21. package/dist/args.js.map +1 -0
  22. package/dist/bridge/admission.d.ts +28 -0
  23. package/dist/bridge/admission.js +29 -0
  24. package/dist/bridge/admission.js.map +1 -0
  25. package/dist/bridge/args.d.ts +16 -0
  26. package/dist/bridge/args.js +123 -0
  27. package/dist/bridge/args.js.map +1 -0
  28. package/dist/bridge/domains/animation.d.ts +2 -0
  29. package/dist/bridge/domains/animation.js +199 -0
  30. package/dist/bridge/domains/animation.js.map +1 -0
  31. package/dist/bridge/domains/asset.d.ts +2 -0
  32. package/dist/bridge/domains/asset.js +85 -0
  33. package/dist/bridge/domains/asset.js.map +1 -0
  34. package/dist/bridge/domains/build.d.ts +2 -0
  35. package/dist/bridge/domains/build.js +35 -0
  36. package/dist/bridge/domains/build.js.map +1 -0
  37. package/dist/bridge/domains/camera.d.ts +2 -0
  38. package/dist/bridge/domains/camera.js +54 -0
  39. package/dist/bridge/domains/camera.js.map +1 -0
  40. package/dist/bridge/domains/code.d.ts +2 -0
  41. package/dist/bridge/domains/code.js +17 -0
  42. package/dist/bridge/domains/code.js.map +1 -0
  43. package/dist/bridge/domains/console.d.ts +2 -0
  44. package/dist/bridge/domains/console.js +34 -0
  45. package/dist/bridge/domains/console.js.map +1 -0
  46. package/dist/bridge/domains/diagnose.d.ts +2 -0
  47. package/dist/bridge/domains/diagnose.js +11 -0
  48. package/dist/bridge/domains/diagnose.js.map +1 -0
  49. package/dist/bridge/domains/editor.d.ts +2 -0
  50. package/dist/bridge/domains/editor.js +66 -0
  51. package/dist/bridge/domains/editor.js.map +1 -0
  52. package/dist/bridge/domains/extension.d.ts +8 -0
  53. package/dist/bridge/domains/extension.js +20 -0
  54. package/dist/bridge/domains/extension.js.map +1 -0
  55. package/dist/bridge/domains/game-object.d.ts +2 -0
  56. package/dist/bridge/domains/game-object.js +179 -0
  57. package/dist/bridge/domains/game-object.js.map +1 -0
  58. package/dist/bridge/domains/graphics.d.ts +2 -0
  59. package/dist/bridge/domains/graphics.js +185 -0
  60. package/dist/bridge/domains/graphics.js.map +1 -0
  61. package/dist/bridge/domains/material.d.ts +2 -0
  62. package/dist/bridge/domains/material.js +70 -0
  63. package/dist/bridge/domains/material.js.map +1 -0
  64. package/dist/bridge/domains/navmesh.d.ts +2 -0
  65. package/dist/bridge/domains/navmesh.js +34 -0
  66. package/dist/bridge/domains/navmesh.js.map +1 -0
  67. package/dist/bridge/domains/object.d.ts +2 -0
  68. package/dist/bridge/domains/object.js +43 -0
  69. package/dist/bridge/domains/object.js.map +1 -0
  70. package/dist/bridge/domains/occlusion.d.ts +2 -0
  71. package/dist/bridge/domains/occlusion.js +12 -0
  72. package/dist/bridge/domains/occlusion.js.map +1 -0
  73. package/dist/bridge/domains/package.d.ts +2 -0
  74. package/dist/bridge/domains/package.js +2 -0
  75. package/dist/bridge/domains/package.js.map +1 -0
  76. package/dist/bridge/domains/physics.d.ts +2 -0
  77. package/dist/bridge/domains/physics.js +139 -0
  78. package/dist/bridge/domains/physics.js.map +1 -0
  79. package/dist/bridge/domains/prefab.d.ts +2 -0
  80. package/dist/bridge/domains/prefab.js +104 -0
  81. package/dist/bridge/domains/prefab.js.map +1 -0
  82. package/dist/bridge/domains/profiler.d.ts +2 -0
  83. package/dist/bridge/domains/profiler.js +105 -0
  84. package/dist/bridge/domains/profiler.js.map +1 -0
  85. package/dist/bridge/domains/project-tool.d.ts +2 -0
  86. package/dist/bridge/domains/project-tool.js +46 -0
  87. package/dist/bridge/domains/project-tool.js.map +1 -0
  88. package/dist/bridge/domains/reflection.d.ts +2 -0
  89. package/dist/bridge/domains/reflection.js +48 -0
  90. package/dist/bridge/domains/reflection.js.map +1 -0
  91. package/dist/bridge/domains/runtime-tool.d.ts +2 -0
  92. package/dist/bridge/domains/runtime-tool.js +48 -0
  93. package/dist/bridge/domains/runtime-tool.js.map +1 -0
  94. package/dist/bridge/domains/scene.d.ts +2 -0
  95. package/dist/bridge/domains/scene.js +100 -0
  96. package/dist/bridge/domains/scene.js.map +1 -0
  97. package/dist/bridge/domains/screenshot.d.ts +2 -0
  98. package/dist/bridge/domains/screenshot.js +85 -0
  99. package/dist/bridge/domains/screenshot.js.map +1 -0
  100. package/dist/bridge/domains/scriptable-object.d.ts +2 -0
  101. package/dist/bridge/domains/scriptable-object.js +53 -0
  102. package/dist/bridge/domains/scriptable-object.js.map +1 -0
  103. package/dist/bridge/domains/shader.d.ts +2 -0
  104. package/dist/bridge/domains/shader.js +66 -0
  105. package/dist/bridge/domains/shader.js.map +1 -0
  106. package/dist/bridge/domains/texture.d.ts +2 -0
  107. package/dist/bridge/domains/texture.js +78 -0
  108. package/dist/bridge/domains/texture.js.map +1 -0
  109. package/dist/bridge/domains/timeline.d.ts +2 -0
  110. package/dist/bridge/domains/timeline.js +75 -0
  111. package/dist/bridge/domains/timeline.js.map +1 -0
  112. package/dist/bridge/domains/ui.d.ts +2 -0
  113. package/dist/bridge/domains/ui.js +193 -0
  114. package/dist/bridge/domains/ui.js.map +1 -0
  115. package/dist/bridge/index.d.ts +9 -0
  116. package/dist/bridge/index.js +124 -0
  117. package/dist/bridge/index.js.map +1 -0
  118. package/dist/bridge/registry.d.ts +19 -0
  119. package/dist/bridge/registry.js +114 -0
  120. package/dist/bridge/registry.js.map +1 -0
  121. package/dist/bridge/session-supervisor.d.ts +138 -0
  122. package/dist/bridge/session-supervisor.js +873 -0
  123. package/dist/bridge/session-supervisor.js.map +1 -0
  124. package/dist/bridge/types.d.ts +61 -0
  125. package/dist/bridge/types.js +17 -0
  126. package/dist/bridge/types.js.map +1 -0
  127. package/dist/capabilities.d.ts +5 -0
  128. package/dist/capabilities.js +84 -0
  129. package/dist/capabilities.js.map +1 -0
  130. package/dist/cli-commands/command.d.ts +7 -0
  131. package/dist/cli-commands/command.js +513 -0
  132. package/dist/cli-commands/command.js.map +1 -0
  133. package/dist/cli-commands/extension-auto-detect.d.ts +62 -0
  134. package/dist/cli-commands/extension-auto-detect.js +119 -0
  135. package/dist/cli-commands/extension-auto-detect.js.map +1 -0
  136. package/dist/cli-commands/extensions.d.ts +24 -0
  137. package/dist/cli-commands/extensions.js +428 -0
  138. package/dist/cli-commands/extensions.js.map +1 -0
  139. package/dist/cli-commands/package.d.ts +4 -0
  140. package/dist/cli-commands/package.js +151 -0
  141. package/dist/cli-commands/package.js.map +1 -0
  142. package/dist/cli-commands/skill-installer.d.ts +83 -0
  143. package/dist/cli-commands/skill-installer.js +703 -0
  144. package/dist/cli-commands/skill-installer.js.map +1 -0
  145. package/dist/cli-commands/types.d.ts +17 -0
  146. package/dist/cli-commands/types.js +2 -0
  147. package/dist/cli-commands/types.js.map +1 -0
  148. package/dist/cli.d.ts +17 -0
  149. package/dist/cli.js +302 -0
  150. package/dist/cli.js.map +1 -0
  151. package/dist/contracts/command-contract.d.ts +21 -0
  152. package/dist/contracts/command-contract.js +143 -0
  153. package/dist/contracts/command-contract.js.map +1 -0
  154. package/dist/contracts/csharp-command-extractor.d.ts +1 -0
  155. package/dist/contracts/csharp-command-extractor.js +89 -0
  156. package/dist/contracts/csharp-command-extractor.js.map +1 -0
  157. package/dist/contracts/validate-command-contract.d.ts +1 -0
  158. package/dist/contracts/validate-command-contract.js +86 -0
  159. package/dist/contracts/validate-command-contract.js.map +1 -0
  160. package/dist/doctor.d.ts +22 -0
  161. package/dist/doctor.js +498 -0
  162. package/dist/doctor.js.map +1 -0
  163. package/dist/editor-blocker-observer.d.ts +45 -0
  164. package/dist/editor-blocker-observer.js +55 -0
  165. package/dist/editor-blocker-observer.js.map +1 -0
  166. package/dist/editor-dialogs.d.ts +53 -0
  167. package/dist/editor-dialogs.js +79 -0
  168. package/dist/editor-dialogs.js.map +1 -0
  169. package/dist/extension-availability.d.ts +30 -0
  170. package/dist/extension-availability.js +83 -0
  171. package/dist/extension-availability.js.map +1 -0
  172. package/dist/extensions/.generated-bridge-domains/cinemachine.d.ts +2 -0
  173. package/dist/extensions/.generated-bridge-domains/cinemachine.js +104 -0
  174. package/dist/extensions/.generated-bridge-domains/cinemachine.js.map +1 -0
  175. package/dist/extensions/.generated-bridge-domains/hdrp.d.ts +2 -0
  176. package/dist/extensions/.generated-bridge-domains/hdrp.js +35 -0
  177. package/dist/extensions/.generated-bridge-domains/hdrp.js.map +1 -0
  178. package/dist/extensions/.generated-bridge-domains/probuilder.d.ts +13 -0
  179. package/dist/extensions/.generated-bridge-domains/probuilder.js +342 -0
  180. package/dist/extensions/.generated-bridge-domains/probuilder.js.map +1 -0
  181. package/dist/extensions/.generated-bridge-domains/urp.d.ts +2 -0
  182. package/dist/extensions/.generated-bridge-domains/urp.js +52 -0
  183. package/dist/extensions/.generated-bridge-domains/urp.js.map +1 -0
  184. package/dist/extensions/.generated-bridge-domains/vfx.d.ts +2 -0
  185. package/dist/extensions/.generated-bridge-domains/vfx.js +312 -0
  186. package/dist/extensions/.generated-bridge-domains/vfx.js.map +1 -0
  187. package/dist/extensions/.generated-registry-data.d.ts +7 -0
  188. package/dist/extensions/.generated-registry-data.js +895 -0
  189. package/dist/extensions/.generated-registry-data.js.map +1 -0
  190. package/dist/extensions/contribution-loader.d.ts +27 -0
  191. package/dist/extensions/contribution-loader.js +60 -0
  192. package/dist/extensions/contribution-loader.js.map +1 -0
  193. package/dist/extensions/descriptor-loader.d.ts +73 -0
  194. package/dist/extensions/descriptor-loader.js +126 -0
  195. package/dist/extensions/descriptor-loader.js.map +1 -0
  196. package/dist/extensions/index.d.ts +19 -0
  197. package/dist/extensions/index.js +23 -0
  198. package/dist/extensions/index.js.map +1 -0
  199. package/dist/extensions/installer.d.ts +80 -0
  200. package/dist/extensions/installer.js +594 -0
  201. package/dist/extensions/installer.js.map +1 -0
  202. package/dist/extensions/metadata/index.d.ts +15 -0
  203. package/dist/extensions/metadata/index.js +41 -0
  204. package/dist/extensions/metadata/index.js.map +1 -0
  205. package/dist/extensions/metadata/types.d.ts +38 -0
  206. package/dist/extensions/metadata/types.js +11 -0
  207. package/dist/extensions/metadata/types.js.map +1 -0
  208. package/dist/extensions/project-resolver.d.ts +35 -0
  209. package/dist/extensions/project-resolver.js +61 -0
  210. package/dist/extensions/project-resolver.js.map +1 -0
  211. package/dist/extensions/registry.d.ts +86 -0
  212. package/dist/extensions/registry.js +262 -0
  213. package/dist/extensions/registry.js.map +1 -0
  214. package/dist/extensions/tool-manifest.d.ts +29 -0
  215. package/dist/extensions/tool-manifest.js +53 -0
  216. package/dist/extensions/tool-manifest.js.map +1 -0
  217. package/dist/extensions/types.d.ts +115 -0
  218. package/dist/extensions/types.js +12 -0
  219. package/dist/extensions/types.js.map +1 -0
  220. package/dist/instances.d.ts +163 -0
  221. package/dist/instances.js +1137 -0
  222. package/dist/instances.js.map +1 -0
  223. package/dist/output.d.ts +119 -0
  224. package/dist/output.js +204 -0
  225. package/dist/output.js.map +1 -0
  226. package/dist/package-manager.d.ts +280 -0
  227. package/dist/package-manager.js +1832 -0
  228. package/dist/package-manager.js.map +1 -0
  229. package/dist/platform.d.ts +3 -0
  230. package/dist/platform.js +19 -0
  231. package/dist/platform.js.map +1 -0
  232. package/dist/project-identity.d.ts +48 -0
  233. package/dist/project-identity.js +254 -0
  234. package/dist/project-identity.js.map +1 -0
  235. package/dist/project-tool-discovery.d.ts +23 -0
  236. package/dist/project-tool-discovery.js +292 -0
  237. package/dist/project-tool-discovery.js.map +1 -0
  238. package/dist/protocol/envelope.d.ts +64 -0
  239. package/dist/protocol/envelope.js +8 -0
  240. package/dist/protocol/envelope.js.map +1 -0
  241. package/dist/protocol/index.d.ts +7 -0
  242. package/dist/protocol/index.js +2 -0
  243. package/dist/protocol/index.js.map +1 -0
  244. package/dist/runtime-code.d.ts +20 -0
  245. package/dist/runtime-code.js +232 -0
  246. package/dist/runtime-code.js.map +1 -0
  247. package/dist/schema/any-json.d.ts +4 -0
  248. package/dist/schema/any-json.js +2 -0
  249. package/dist/schema/any-json.js.map +1 -0
  250. package/dist/schema/validator.d.ts +7 -0
  251. package/dist/schema/validator.js +135 -0
  252. package/dist/schema/validator.js.map +1 -0
  253. package/dist/services/docs-reflect-cache.d.ts +106 -0
  254. package/dist/services/docs-reflect-cache.js +301 -0
  255. package/dist/services/docs-reflect-cache.js.map +1 -0
  256. package/dist/services/docs-service.d.ts +16 -0
  257. package/dist/services/docs-service.js +208 -0
  258. package/dist/services/docs-service.js.map +1 -0
  259. package/dist/services/reflect-service.d.ts +12 -0
  260. package/dist/services/reflect-service.js +122 -0
  261. package/dist/services/reflect-service.js.map +1 -0
  262. package/dist/static-capability-catalog.d.ts +13 -0
  263. package/dist/static-capability-catalog.js +41 -0
  264. package/dist/static-capability-catalog.js.map +1 -0
  265. package/dist/test-results.d.ts +13 -0
  266. package/dist/test-results.js +44 -0
  267. package/dist/test-results.js.map +1 -0
  268. package/dist/tools/.generated-completion-registry.d.ts +17 -0
  269. package/dist/tools/.generated-completion-registry.js +5862 -0
  270. package/dist/tools/.generated-completion-registry.js.map +1 -0
  271. package/dist/tools/.generated-registry.d.ts +53 -0
  272. package/dist/tools/.generated-registry.js +55 -0
  273. package/dist/tools/.generated-registry.js.map +1 -0
  274. package/dist/tools/.generated-schemas.d.ts +1 -0
  275. package/dist/tools/.generated-schemas.js +56 -0
  276. package/dist/tools/.generated-schemas.js.map +1 -0
  277. package/dist/tools/asset/refresh.d.ts +26 -0
  278. package/dist/tools/asset/refresh.js +97 -0
  279. package/dist/tools/asset/refresh.js.map +1 -0
  280. package/dist/tools/build/run.d.ts +45 -0
  281. package/dist/tools/build/run.js +115 -0
  282. package/dist/tools/build/run.js.map +1 -0
  283. package/dist/tools/catalog.d.ts +33 -0
  284. package/dist/tools/catalog.js +202 -0
  285. package/dist/tools/catalog.js.map +1 -0
  286. package/dist/tools/code/exec.d.ts +53 -0
  287. package/dist/tools/code/exec.js +59 -0
  288. package/dist/tools/code/exec.js.map +1 -0
  289. package/dist/tools/commands.d.ts +5 -0
  290. package/dist/tools/commands.js +45 -0
  291. package/dist/tools/commands.js.map +1 -0
  292. package/dist/tools/completion-probe.d.ts +22 -0
  293. package/dist/tools/completion-probe.js +2 -0
  294. package/dist/tools/completion-probe.js.map +1 -0
  295. package/dist/tools/define.d.ts +77 -0
  296. package/dist/tools/define.js +58 -0
  297. package/dist/tools/define.js.map +1 -0
  298. package/dist/tools/diagnose/capabilities.d.ts +13 -0
  299. package/dist/tools/diagnose/capabilities.js +34 -0
  300. package/dist/tools/diagnose/capabilities.js.map +1 -0
  301. package/dist/tools/dispatcher.d.ts +27 -0
  302. package/dist/tools/dispatcher.js +971 -0
  303. package/dist/tools/dispatcher.js.map +1 -0
  304. package/dist/tools/docs/get.d.ts +22 -0
  305. package/dist/tools/docs/get.js +22 -0
  306. package/dist/tools/docs/get.js.map +1 -0
  307. package/dist/tools/docs/search.d.ts +31 -0
  308. package/dist/tools/docs/search.js +22 -0
  309. package/dist/tools/docs/search.js.map +1 -0
  310. package/dist/tools/editor/compile.d.ts +66 -0
  311. package/dist/tools/editor/compile.js +225 -0
  312. package/dist/tools/editor/compile.js.map +1 -0
  313. package/dist/tools/editor/dialog/click.d.ts +12 -0
  314. package/dist/tools/editor/dialog/click.js +71 -0
  315. package/dist/tools/editor/dialog/click.js.map +1 -0
  316. package/dist/tools/editor/dialogs.d.ts +12 -0
  317. package/dist/tools/editor/dialogs.js +58 -0
  318. package/dist/tools/editor/dialogs.js.map +1 -0
  319. package/dist/tools/editor/readiness.d.ts +13 -0
  320. package/dist/tools/editor/readiness.js +24 -0
  321. package/dist/tools/editor/readiness.js.map +1 -0
  322. package/dist/tools/editor/refresh.d.ts +25 -0
  323. package/dist/tools/editor/refresh.js +154 -0
  324. package/dist/tools/editor/refresh.js.map +1 -0
  325. package/dist/tools/editor/state.d.ts +63 -0
  326. package/dist/tools/editor/state.js +286 -0
  327. package/dist/tools/editor/state.js.map +1 -0
  328. package/dist/tools/errors.d.ts +30 -0
  329. package/dist/tools/errors.js +46 -0
  330. package/dist/tools/errors.js.map +1 -0
  331. package/dist/tools/metadata/derived.d.ts +34 -0
  332. package/dist/tools/metadata/derived.js +136 -0
  333. package/dist/tools/metadata/derived.js.map +1 -0
  334. package/dist/tools/metadata/index.d.ts +34 -0
  335. package/dist/tools/metadata/index.js +130 -0
  336. package/dist/tools/metadata/index.js.map +1 -0
  337. package/dist/tools/metadata/schemas.d.ts +3 -0
  338. package/dist/tools/metadata/schemas.js +19 -0
  339. package/dist/tools/metadata/schemas.js.map +1 -0
  340. package/dist/tools/metadata/status.d.ts +4 -0
  341. package/dist/tools/metadata/status.js +61 -0
  342. package/dist/tools/metadata/status.js.map +1 -0
  343. package/dist/tools/metadata/types.d.ts +79 -0
  344. package/dist/tools/metadata/types.js +2 -0
  345. package/dist/tools/metadata/types.js.map +1 -0
  346. package/dist/tools/navmesh/bake-cancel.d.ts +7 -0
  347. package/dist/tools/navmesh/bake-cancel.js +21 -0
  348. package/dist/tools/navmesh/bake-cancel.js.map +1 -0
  349. package/dist/tools/navmesh/bake-status.d.ts +5 -0
  350. package/dist/tools/navmesh/bake-status.js +18 -0
  351. package/dist/tools/navmesh/bake-status.js.map +1 -0
  352. package/dist/tools/navmesh/bake.d.ts +5 -0
  353. package/dist/tools/navmesh/bake.js +23 -0
  354. package/dist/tools/navmesh/bake.js.map +1 -0
  355. package/dist/tools/navmesh/live.d.ts +86 -0
  356. package/dist/tools/navmesh/live.js +206 -0
  357. package/dist/tools/navmesh/live.js.map +1 -0
  358. package/dist/tools/navmesh/surface-bake.d.ts +5 -0
  359. package/dist/tools/navmesh/surface-bake.js +24 -0
  360. package/dist/tools/navmesh/surface-bake.js.map +1 -0
  361. package/dist/tools/occlusion/bake-cancel.d.ts +7 -0
  362. package/dist/tools/occlusion/bake-cancel.js +21 -0
  363. package/dist/tools/occlusion/bake-cancel.js.map +1 -0
  364. package/dist/tools/occlusion/bake-status.d.ts +5 -0
  365. package/dist/tools/occlusion/bake-status.js +18 -0
  366. package/dist/tools/occlusion/bake-status.js.map +1 -0
  367. package/dist/tools/occlusion/bake.d.ts +11 -0
  368. package/dist/tools/occlusion/bake.js +23 -0
  369. package/dist/tools/occlusion/bake.js.map +1 -0
  370. package/dist/tools/occlusion/live.d.ts +74 -0
  371. package/dist/tools/occlusion/live.js +201 -0
  372. package/dist/tools/occlusion/live.js.map +1 -0
  373. package/dist/tools/package/bridge-remove.d.ts +26 -0
  374. package/dist/tools/package/bridge-remove.js +32 -0
  375. package/dist/tools/package/bridge-remove.js.map +1 -0
  376. package/dist/tools/package/deploy.d.ts +49 -0
  377. package/dist/tools/package/deploy.js +134 -0
  378. package/dist/tools/package/deploy.js.map +1 -0
  379. package/dist/tools/package/embed.d.ts +14 -0
  380. package/dist/tools/package/embed.js +93 -0
  381. package/dist/tools/package/embed.js.map +1 -0
  382. package/dist/tools/package/file-mutation-worker.d.ts +6 -0
  383. package/dist/tools/package/file-mutation-worker.js +154 -0
  384. package/dist/tools/package/file-mutation-worker.js.map +1 -0
  385. package/dist/tools/package/info.d.ts +19 -0
  386. package/dist/tools/package/info.js +27 -0
  387. package/dist/tools/package/info.js.map +1 -0
  388. package/dist/tools/package/install.d.ts +24 -0
  389. package/dist/tools/package/install.js +65 -0
  390. package/dist/tools/package/install.js.map +1 -0
  391. package/dist/tools/package/list.d.ts +27 -0
  392. package/dist/tools/package/list.js +21 -0
  393. package/dist/tools/package/list.js.map +1 -0
  394. package/dist/tools/package/live-resolve.d.ts +46 -0
  395. package/dist/tools/package/live-resolve.js +497 -0
  396. package/dist/tools/package/live-resolve.js.map +1 -0
  397. package/dist/tools/package/public-result.d.ts +4 -0
  398. package/dist/tools/package/public-result.js +25 -0
  399. package/dist/tools/package/public-result.js.map +1 -0
  400. package/dist/tools/package/registry-clear.d.ts +15 -0
  401. package/dist/tools/package/registry-clear.js +27 -0
  402. package/dist/tools/package/registry-clear.js.map +1 -0
  403. package/dist/tools/package/registry-get.d.ts +10 -0
  404. package/dist/tools/package/registry-get.js +22 -0
  405. package/dist/tools/package/registry-get.js.map +1 -0
  406. package/dist/tools/package/registry-set.d.ts +17 -0
  407. package/dist/tools/package/registry-set.js +28 -0
  408. package/dist/tools/package/registry-set.js.map +1 -0
  409. package/dist/tools/package/remove.d.ts +47 -0
  410. package/dist/tools/package/remove.js +67 -0
  411. package/dist/tools/package/remove.js.map +1 -0
  412. package/dist/tools/package/resolve.d.ts +6 -0
  413. package/dist/tools/package/resolve.js +14 -0
  414. package/dist/tools/package/resolve.js.map +1 -0
  415. package/dist/tools/package/restore.d.ts +42 -0
  416. package/dist/tools/package/restore.js +122 -0
  417. package/dist/tools/package/restore.js.map +1 -0
  418. package/dist/tools/package/scoped-registry-add.d.ts +25 -0
  419. package/dist/tools/package/scoped-registry-add.js +30 -0
  420. package/dist/tools/package/scoped-registry-add.js.map +1 -0
  421. package/dist/tools/package/scoped-registry-list.d.ts +14 -0
  422. package/dist/tools/package/scoped-registry-list.js +22 -0
  423. package/dist/tools/package/scoped-registry-list.js.map +1 -0
  424. package/dist/tools/package/scoped-registry-remove.d.ts +29 -0
  425. package/dist/tools/package/scoped-registry-remove.js +31 -0
  426. package/dist/tools/package/scoped-registry-remove.js.map +1 -0
  427. package/dist/tools/package/search.d.ts +17 -0
  428. package/dist/tools/package/search.js +39 -0
  429. package/dist/tools/package/search.js.map +1 -0
  430. package/dist/tools/package/status.d.ts +21 -0
  431. package/dist/tools/package/status.js +37 -0
  432. package/dist/tools/package/status.js.map +1 -0
  433. package/dist/tools/reflect/member.d.ts +22 -0
  434. package/dist/tools/reflect/member.js +22 -0
  435. package/dist/tools/reflect/member.js.map +1 -0
  436. package/dist/tools/reflect/search.d.ts +30 -0
  437. package/dist/tools/reflect/search.js +22 -0
  438. package/dist/tools/reflect/search.js.map +1 -0
  439. package/dist/tools/reflect/type.d.ts +21 -0
  440. package/dist/tools/reflect/type.js +22 -0
  441. package/dist/tools/reflect/type.js.map +1 -0
  442. package/dist/tools/runtime/console.d.ts +24 -0
  443. package/dist/tools/runtime/console.js +17 -0
  444. package/dist/tools/runtime/console.js.map +1 -0
  445. package/dist/tools/runtime/input/key.d.ts +23 -0
  446. package/dist/tools/runtime/input/key.js +18 -0
  447. package/dist/tools/runtime/input/key.js.map +1 -0
  448. package/dist/tools/runtime/input/pointer.d.ts +34 -0
  449. package/dist/tools/runtime/input/pointer.js +18 -0
  450. package/dist/tools/runtime/input/pointer.js.map +1 -0
  451. package/dist/tools/runtime/log.d.ts +20 -0
  452. package/dist/tools/runtime/log.js +17 -0
  453. package/dist/tools/runtime/log.js.map +1 -0
  454. package/dist/tools/runtime/state.d.ts +45 -0
  455. package/dist/tools/runtime/state.js +17 -0
  456. package/dist/tools/runtime/state.js.map +1 -0
  457. package/dist/tools/runtime/target-framerate/set.d.ts +16 -0
  458. package/dist/tools/runtime/target-framerate/set.js +17 -0
  459. package/dist/tools/runtime/target-framerate/set.js.map +1 -0
  460. package/dist/tools/runtime/time-scale/set.d.ts +16 -0
  461. package/dist/tools/runtime/time-scale/set.js +17 -0
  462. package/dist/tools/runtime/time-scale/set.js.map +1 -0
  463. package/dist/tools/runtime/ui/capture-element.d.ts +31 -0
  464. package/dist/tools/runtime/ui/capture-element.js +17 -0
  465. package/dist/tools/runtime/ui/capture-element.js.map +1 -0
  466. package/dist/tools/test/cancel.d.ts +19 -0
  467. package/dist/tools/test/cancel.js +94 -0
  468. package/dist/tools/test/cancel.js.map +1 -0
  469. package/dist/tools/test/run.d.ts +39 -0
  470. package/dist/tools/test/run.js +101 -0
  471. package/dist/tools/test/run.js.map +1 -0
  472. package/dist/tools/tools/describe.d.ts +27 -0
  473. package/dist/tools/tools/describe.js +35 -0
  474. package/dist/tools/tools/describe.js.map +1 -0
  475. package/dist/tools/tools/group-list.d.ts +20 -0
  476. package/dist/tools/tools/group-list.js +39 -0
  477. package/dist/tools/tools/group-list.js.map +1 -0
  478. package/dist/tools/tools/group-summaries.d.ts +3 -0
  479. package/dist/tools/tools/group-summaries.js +52 -0
  480. package/dist/tools/tools/group-summaries.js.map +1 -0
  481. package/dist/tools/tools/group.d.ts +13 -0
  482. package/dist/tools/tools/group.js +34 -0
  483. package/dist/tools/tools/group.js.map +1 -0
  484. package/dist/tools/tools/search.d.ts +17 -0
  485. package/dist/tools/tools/search.js +42 -0
  486. package/dist/tools/tools/search.js.map +1 -0
  487. package/dist/types.d.ts +5 -0
  488. package/dist/types.js +2 -0
  489. package/dist/types.js.map +1 -0
  490. package/dist/unity-project-processes.d.ts +12 -0
  491. package/dist/unity-project-processes.js +59 -0
  492. package/dist/unity-project-processes.js.map +1 -0
  493. package/dist/util.d.ts +11 -0
  494. package/dist/util.js +22 -0
  495. package/dist/util.js.map +1 -0
  496. package/dist/windows-editor-state.d.ts +31 -0
  497. package/dist/windows-editor-state.js +98 -0
  498. package/dist/windows-editor-state.js.map +1 -0
  499. package/docs/README.md +43 -0
  500. package/docs/availability-differences.md +97 -0
  501. package/docs/command-execution.md +89 -0
  502. package/docs/error-codes.md +204 -0
  503. package/docs/extensions.md +132 -0
  504. package/docs/risk-and-side-effects.md +93 -0
  505. package/docs/safety-boundaries.md +103 -0
  506. package/docs/target-and-instance.md +83 -0
  507. package/docs/tool-discovery.md +104 -0
  508. package/docs/tool-execution.md +178 -0
  509. package/extensions/cinemachine/bridge/domains/cinemachine.ts +115 -0
  510. package/extensions/cinemachine/docs/cinemachine.md +50 -0
  511. package/extensions/cinemachine/extension.json +129 -0
  512. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/CinemachineExtensionToolSupport.cs +15 -0
  513. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/CinemachineToolSupport.cs +854 -0
  514. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/aim.cs +96 -0
  515. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/blend.cs +140 -0
  516. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/body.cs +96 -0
  517. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/brain-ensure.cs +16 -0
  518. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/brain-status.cs +12 -0
  519. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/create.cs +147 -0
  520. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/extension-add.cs +13 -0
  521. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/extension-list.cs +13 -0
  522. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/extension-remove.cs +13 -0
  523. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/lens.cs +142 -0
  524. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/noise.cs +126 -0
  525. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/ping.cs +43 -0
  526. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/priority.cs +113 -0
  527. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/target.cs +84 -0
  528. package/extensions/cinemachine/unitypkg/UnityCli.Extensions.Cinemachine.Editor.asmdef +18 -0
  529. package/extensions/hdrp/bridge/domains/hdrp.ts +41 -0
  530. package/extensions/hdrp/docs/hdrp.md +15 -0
  531. package/extensions/hdrp/extension.json +31 -0
  532. package/extensions/hdrp/unitypkg/Editor/Hdrp/HdrpToolSupport.cs +607 -0
  533. package/extensions/hdrp/unitypkg/Editor/Hdrp/settings-get.cs +29 -0
  534. package/extensions/hdrp/unitypkg/Editor/Hdrp/settings-set.cs +47 -0
  535. package/extensions/hdrp/unitypkg/Editor/Hdrp/volume-add-effect.cs +28 -0
  536. package/extensions/hdrp/unitypkg/Editor/Hdrp/volume-create.cs +28 -0
  537. package/extensions/hdrp/unitypkg/Editor/Hdrp/volume-info.cs +25 -0
  538. package/extensions/hdrp/unitypkg/Editor/Hdrp/volume-list.cs +25 -0
  539. package/extensions/hdrp/unitypkg/Editor/Hdrp/volume-set.cs +28 -0
  540. package/extensions/hdrp/unitypkg/UnityCli.Extensions.Hdrp.Editor.asmdef +19 -0
  541. package/extensions/probuilder/bridge/domains/probuilder.ts +386 -0
  542. package/extensions/probuilder/docs/probuilder.md +125 -0
  543. package/extensions/probuilder/extension.json +291 -0
  544. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderAppendCompletionProof.cs +254 -0
  545. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderAtomicReadback.cs +293 -0
  546. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderBevelCompletionProof.cs +299 -0
  547. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderCanonicalMeshSnapshot.cs +951 -0
  548. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderConnectCompletionProof.cs +407 -0
  549. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderEdgeCompletionProof.cs +318 -0
  550. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderErrors.cs +83 -0
  551. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderFaceCompletionProof.cs +152 -0
  552. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderFaceExtrudeCompletionProof.cs +283 -0
  553. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderFlipCompletionProof.cs +170 -0
  554. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderInput.cs +85 -0
  555. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderInsertCompletionProof.cs +674 -0
  556. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderOperationProof.cs +137 -0
  557. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderReflection.cs +1064 -0
  558. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderRefreshUvProof.cs +53 -0
  559. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderSceneTool.cs +184 -0
  560. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderShapeTopologyRecords.g.cs +82 -0
  561. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderVertexObjectCompletionProof.cs +346 -0
  562. package/extensions/probuilder/unitypkg/Editor/ProBuilder/append-vertices-to-edge.cs +118 -0
  563. package/extensions/probuilder/unitypkg/Editor/ProBuilder/auto-smooth.cs +104 -0
  564. package/extensions/probuilder/unitypkg/Editor/ProBuilder/bevel-edges.cs +119 -0
  565. package/extensions/probuilder/unitypkg/Editor/ProBuilder/bridge-edges.cs +113 -0
  566. package/extensions/probuilder/unitypkg/Editor/ProBuilder/center-pivot.cs +43 -0
  567. package/extensions/probuilder/unitypkg/Editor/ProBuilder/combine-meshes.cs +58 -0
  568. package/extensions/probuilder/unitypkg/Editor/ProBuilder/connect-elements.cs +128 -0
  569. package/extensions/probuilder/unitypkg/Editor/ProBuilder/convert-to-probuilder.cs +40 -0
  570. package/extensions/probuilder/unitypkg/Editor/ProBuilder/create-poly-shape.cs +55 -0
  571. package/extensions/probuilder/unitypkg/Editor/ProBuilder/create-polygon.cs +28 -0
  572. package/extensions/probuilder/unitypkg/Editor/ProBuilder/create-shape.cs +168 -0
  573. package/extensions/probuilder/unitypkg/Editor/ProBuilder/delete-faces.cs +42 -0
  574. package/extensions/probuilder/unitypkg/Editor/ProBuilder/detach-faces.cs +46 -0
  575. package/extensions/probuilder/unitypkg/Editor/ProBuilder/duplicate-and-flip.cs +100 -0
  576. package/extensions/probuilder/unitypkg/Editor/ProBuilder/extrude-edges.cs +118 -0
  577. package/extensions/probuilder/unitypkg/Editor/ProBuilder/extrude-faces.cs +110 -0
  578. package/extensions/probuilder/unitypkg/Editor/ProBuilder/flip-normals.cs +102 -0
  579. package/extensions/probuilder/unitypkg/Editor/ProBuilder/freeze-transform.cs +45 -0
  580. package/extensions/probuilder/unitypkg/Editor/ProBuilder/insert-vertex.cs +132 -0
  581. package/extensions/probuilder/unitypkg/Editor/ProBuilder/merge-faces.cs +44 -0
  582. package/extensions/probuilder/unitypkg/Editor/ProBuilder/merge-objects.cs +130 -0
  583. package/extensions/probuilder/unitypkg/Editor/ProBuilder/merge-vertices.cs +109 -0
  584. package/extensions/probuilder/unitypkg/Editor/ProBuilder/mesh-info.cs +117 -0
  585. package/extensions/probuilder/unitypkg/Editor/ProBuilder/move-vertices.cs +33 -0
  586. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ping.cs +51 -0
  587. package/extensions/probuilder/unitypkg/Editor/ProBuilder/repair-mesh.cs +40 -0
  588. package/extensions/probuilder/unitypkg/Editor/ProBuilder/select-faces.cs +161 -0
  589. package/extensions/probuilder/unitypkg/Editor/ProBuilder/set-face-color.cs +24 -0
  590. package/extensions/probuilder/unitypkg/Editor/ProBuilder/set-face-material.cs +23 -0
  591. package/extensions/probuilder/unitypkg/Editor/ProBuilder/set-face-uvs.cs +28 -0
  592. package/extensions/probuilder/unitypkg/Editor/ProBuilder/set-pivot.cs +42 -0
  593. package/extensions/probuilder/unitypkg/Editor/ProBuilder/set-smoothing.cs +23 -0
  594. package/extensions/probuilder/unitypkg/Editor/ProBuilder/split-vertices.cs +64 -0
  595. package/extensions/probuilder/unitypkg/Editor/ProBuilder/subdivide.cs +111 -0
  596. package/extensions/probuilder/unitypkg/Editor/ProBuilder/validate-mesh.cs +75 -0
  597. package/extensions/probuilder/unitypkg/Editor/ProBuilder/weld-vertices.cs +112 -0
  598. package/extensions/probuilder/unitypkg/UnityCli.Extensions.ProBuilder.Editor.asmdef +25 -0
  599. package/extensions/urp/bridge/domains/urp.ts +62 -0
  600. package/extensions/urp/docs/urp.md +20 -0
  601. package/extensions/urp/extension.json +41 -0
  602. package/extensions/urp/unitypkg/Editor/Urp/UrpFeatureToolSupport.cs +336 -0
  603. package/extensions/urp/unitypkg/Editor/Urp/UrpToolSupport.cs +801 -0
  604. package/extensions/urp/unitypkg/Editor/Urp/feature-add.cs +12 -0
  605. package/extensions/urp/unitypkg/Editor/Urp/feature-configure.cs +12 -0
  606. package/extensions/urp/unitypkg/Editor/Urp/feature-list.cs +12 -0
  607. package/extensions/urp/unitypkg/Editor/Urp/feature-remove.cs +12 -0
  608. package/extensions/urp/unitypkg/Editor/Urp/feature-toggle.cs +12 -0
  609. package/extensions/urp/unitypkg/Editor/Urp/settings-get.cs +27 -0
  610. package/extensions/urp/unitypkg/Editor/Urp/settings-set.cs +47 -0
  611. package/extensions/urp/unitypkg/Editor/Urp/volume-add-effect.cs +33 -0
  612. package/extensions/urp/unitypkg/Editor/Urp/volume-create.cs +33 -0
  613. package/extensions/urp/unitypkg/Editor/Urp/volume-info.cs +31 -0
  614. package/extensions/urp/unitypkg/Editor/Urp/volume-list.cs +39 -0
  615. package/extensions/urp/unitypkg/Editor/Urp/volume-set.cs +33 -0
  616. package/extensions/urp/unitypkg/UnityCli.Extensions.Urp.Editor.asmdef +19 -0
  617. package/extensions/vfx-graph/bridge/domains/vfx.ts +337 -0
  618. package/extensions/vfx-graph/docs/vfx.md +28 -0
  619. package/extensions/vfx-graph/extension.json +72 -0
  620. package/extensions/vfx-graph/unitypkg/Editor/Vfx/VfxActionToolSupport.cs +248 -0
  621. package/extensions/vfx-graph/unitypkg/Editor/Vfx/VfxToolSupport.cs +1325 -0
  622. package/extensions/vfx-graph/unitypkg/Editor/Vfx/control-pause.cs +37 -0
  623. package/extensions/vfx-graph/unitypkg/Editor/Vfx/control-play.cs +40 -0
  624. package/extensions/vfx-graph/unitypkg/Editor/Vfx/control-reinitialize.cs +37 -0
  625. package/extensions/vfx-graph/unitypkg/Editor/Vfx/control-set-rate.cs +36 -0
  626. package/extensions/vfx-graph/unitypkg/Editor/Vfx/control-set-seed.cs +42 -0
  627. package/extensions/vfx-graph/unitypkg/Editor/Vfx/control-stop.cs +37 -0
  628. package/extensions/vfx-graph/unitypkg/Editor/Vfx/effect-add.cs +55 -0
  629. package/extensions/vfx-graph/unitypkg/Editor/Vfx/effect-assign.cs +44 -0
  630. package/extensions/vfx-graph/unitypkg/Editor/Vfx/effect-info.cs +30 -0
  631. package/extensions/vfx-graph/unitypkg/Editor/Vfx/graph-create.cs +62 -0
  632. package/extensions/vfx-graph/unitypkg/Editor/Vfx/graph-info.cs +32 -0
  633. package/extensions/vfx-graph/unitypkg/Editor/Vfx/line-create.cs +75 -0
  634. package/extensions/vfx-graph/unitypkg/Editor/Vfx/line-positions.cs +100 -0
  635. package/extensions/vfx-graph/unitypkg/Editor/Vfx/parameter.cs +216 -0
  636. package/extensions/vfx-graph/unitypkg/Editor/Vfx/particle-clear.cs +39 -0
  637. package/extensions/vfx-graph/unitypkg/Editor/Vfx/particle-create.cs +80 -0
  638. package/extensions/vfx-graph/unitypkg/Editor/Vfx/particle-emission.cs +126 -0
  639. package/extensions/vfx-graph/unitypkg/Editor/Vfx/particle-info.cs +55 -0
  640. package/extensions/vfx-graph/unitypkg/Editor/Vfx/particle-main.cs +75 -0
  641. package/extensions/vfx-graph/unitypkg/Editor/Vfx/particle-pause.cs +38 -0
  642. package/extensions/vfx-graph/unitypkg/Editor/Vfx/particle-play.cs +38 -0
  643. package/extensions/vfx-graph/unitypkg/Editor/Vfx/particle-shape.cs +148 -0
  644. package/extensions/vfx-graph/unitypkg/Editor/Vfx/particle-stop.cs +41 -0
  645. package/extensions/vfx-graph/unitypkg/Editor/Vfx/template-create.cs +58 -0
  646. package/extensions/vfx-graph/unitypkg/Editor/Vfx/template-list.cs +31 -0
  647. package/extensions/vfx-graph/unitypkg/Editor/Vfx/trail-create.cs +41 -0
  648. package/extensions/vfx-graph/unitypkg/Editor/Vfx/trail-set.cs +44 -0
  649. package/extensions/vfx-graph/unitypkg/UnityCli.Extensions.VfxGraph.Editor.asmdef +18 -0
  650. package/package.json +46 -0
  651. package/schemas/error-code.schema.json +70 -0
  652. package/schemas/extension-descriptor.schema.json +88 -0
  653. package/schemas/extension-manifest.schema.json +125 -0
  654. package/schemas/request-envelope.schema.json +34 -0
  655. package/schemas/response-envelope.schema.json +42 -0
  656. package/schemas/tool-metadata.schema.json +111 -0
  657. package/skills/unitycli/SKILL.md +61 -0
  658. package/skills/unitycli/agents/interface.yaml +30 -0
  659. package/skills/unitycli/evals/history/2026-08-05-governed-baseline.json +44 -0
  660. package/skills/unitycli/evals/output/cases.jsonl +5 -0
  661. package/skills/unitycli/evals/output/fixtures/feedback-scenario.json +27 -0
  662. package/skills/unitycli/evals/output/schema.json +32 -0
  663. package/skills/unitycli/evals/semantic_config.json +46 -0
  664. package/skills/unitycli/evals/trigger_cases.json +39 -0
  665. package/skills/unitycli/examples/feedback-event.input.json +8 -0
  666. package/skills/unitycli/examples/feedback-record.output.json +12 -0
  667. package/skills/unitycli/manifest.json +112 -0
  668. package/skills/unitycli/references/custom-tools.md +111 -0
  669. package/skills/unitycli/references/feedback.md +59 -0
  670. package/skills/unitycli/references/operation-protocol.md +83 -0
  671. package/skills/unitycli/reports/output_quality_scorecard.md +56 -0
  672. package/skills/unitycli/reports/trust-report.md +57 -0
  673. package/skills/unitycli/scripts/record-feedback.ps1 +210 -0
  674. package/skills/unitycli/security/network_policy.json +18 -0
  675. package/skills/unitycli/security/permission_policy.json +40 -0
  676. package/unitypkg/Editor/Bridge/BridgeCommandContext.cs +64 -0
  677. package/unitypkg/Editor/Bridge/BridgeCommandException.cs +39 -0
  678. package/unitypkg/Editor/Bridge/BridgeCommandRegistry.cs +172 -0
  679. package/unitypkg/Editor/Bridge/BridgeHttpServer.cs +534 -0
  680. package/unitypkg/Editor/Bridge/BridgeResponse.cs +58 -0
  681. package/unitypkg/Editor/Bridge/BridgeWorkQueue.cs +325 -0
  682. package/unitypkg/Editor/BridgeStartupStateMachine.cs +81 -0
  683. package/unitypkg/Editor/Commands/ProjectToolCommands.cs +43 -0
  684. package/unitypkg/Editor/Commands/RuntimeToolCommands.cs +43 -0
  685. package/unitypkg/Editor/Generated/UnityCliToolCompletionRegistry.g.cs +428 -0
  686. package/unitypkg/Editor/Infrastructure/CodeExecSupport.cs +664 -0
  687. package/unitypkg/Editor/Infrastructure/RegistryOwnershipResolver.cs +148 -0
  688. package/unitypkg/Editor/Infrastructure/UnityCliActiveOperation.cs +411 -0
  689. package/unitypkg/Editor/Infrastructure/UnityCliAdmission.cs +485 -0
  690. package/unitypkg/Editor/Infrastructure/UnityCliArtifacts.cs +110 -0
  691. package/unitypkg/Editor/Infrastructure/UnityCliAssetRefreshCoordinator.cs +106 -0
  692. package/unitypkg/Editor/Infrastructure/UnityCliBridgeHelpers.cs +155 -0
  693. package/unitypkg/Editor/Infrastructure/UnityCliCanonicalProjectPath.cs +325 -0
  694. package/unitypkg/Editor/Infrastructure/UnityCliCompilationEventBroker.cs +192 -0
  695. package/unitypkg/Editor/Infrastructure/UnityCliCompileCoordinator.cs +271 -0
  696. package/unitypkg/Editor/Infrastructure/UnityCliCompletionProbe.cs +515 -0
  697. package/unitypkg/Editor/Infrastructure/UnityCliEditorStateSnapshot.cs +84 -0
  698. package/unitypkg/Editor/Infrastructure/UnityCliInstanceRegistry.cs +558 -0
  699. package/unitypkg/Editor/Infrastructure/UnityCliJson.cs +155 -0
  700. package/unitypkg/Editor/Infrastructure/UnityCliLargeOutput.cs +128 -0
  701. package/unitypkg/Editor/Infrastructure/UnityCliLiveBuildCoordinator.cs +230 -0
  702. package/unitypkg/Editor/Infrastructure/UnityCliLiveRefreshCoordinator.cs +164 -0
  703. package/unitypkg/Editor/Infrastructure/UnityCliLog.cs +127 -0
  704. package/unitypkg/Editor/Infrastructure/UnityCliNavMeshBakeCoordinator.cs +2073 -0
  705. package/unitypkg/Editor/Infrastructure/UnityCliObjectPatch.cs +193 -0
  706. package/unitypkg/Editor/Infrastructure/UnityCliObjectRef.cs +278 -0
  707. package/unitypkg/Editor/Infrastructure/UnityCliObjectSerializer.cs +620 -0
  708. package/unitypkg/Editor/Infrastructure/UnityCliOcclusionBakeCoordinator.cs +1739 -0
  709. package/unitypkg/Editor/Infrastructure/UnityCliOperationCoordinator.cs +828 -0
  710. package/unitypkg/Editor/Infrastructure/UnityCliPackageEmbedCoordinator.cs +147 -0
  711. package/unitypkg/Editor/Infrastructure/UnityCliPackageResolveCoordinator.cs +454 -0
  712. package/unitypkg/Editor/Infrastructure/UnityCliPackageResolveState.cs +561 -0
  713. package/unitypkg/Editor/Infrastructure/UnityCliPipelineHandoff.cs +742 -0
  714. package/unitypkg/Editor/Infrastructure/UnityCliProjectSettings.cs +92 -0
  715. package/unitypkg/Editor/Infrastructure/UnityCliProtocolRequest.cs +116 -0
  716. package/unitypkg/Editor/Infrastructure/UnityCliReflection.cs +477 -0
  717. package/unitypkg/Editor/Infrastructure/UnityCliReloadOperation.cs +664 -0
  718. package/unitypkg/Editor/Infrastructure/UnityCliRequestDigest.cs +34 -0
  719. package/unitypkg/Editor/Infrastructure/UnityCliRuntimeBuildInjection.cs +121 -0
  720. package/unitypkg/Editor/Infrastructure/UnityCliRuntimeExecutor.cs +391 -0
  721. package/unitypkg/Editor/Infrastructure/UnityCliSceneMutation.cs +84 -0
  722. package/unitypkg/Editor/Infrastructure/UnityCliScriptableObjectHelpers.cs +235 -0
  723. package/unitypkg/Editor/Infrastructure/UnityCliSerializer.cs +580 -0
  724. package/unitypkg/Editor/Infrastructure/UnityCliSessionMutationLease.cs +568 -0
  725. package/unitypkg/Editor/Infrastructure/UnityCliStateIO.cs +73 -0
  726. package/unitypkg/Editor/Infrastructure/UnityCliTestRunCoordinator.cs +598 -0
  727. package/unitypkg/Editor/Infrastructure/UnityCliTransactionLog.cs +112 -0
  728. package/unitypkg/Editor/Infrastructure/UnityCliValueConverter.cs +146 -0
  729. package/unitypkg/Editor/Infrastructure/UnityCliWaiter.cs +716 -0
  730. package/unitypkg/Editor/ProjectTools/IUnityCliTool.cs +152 -0
  731. package/unitypkg/Editor/ProjectTools/OfficialAttributeToolRegistry.cs +992 -0
  732. package/unitypkg/Editor/ProjectTools/ProjectToolRegistry.cs +938 -0
  733. package/unitypkg/Editor/ProjectTools/ProjectToolSchemaValidator.cs +258 -0
  734. package/unitypkg/Editor/ProjectTools/RegisteredTool.cs +75 -0
  735. package/unitypkg/Editor/ProjectTools/UnityCliProjectToolContext.cs +68 -0
  736. package/unitypkg/Editor/ProjectTools/UnityCliSchemaDeriver.cs +297 -0
  737. package/unitypkg/Editor/Protocol/ProtocolEnvelopeFactory.cs +92 -0
  738. package/unitypkg/Editor/Protocol/envelope.cs +50 -0
  739. package/unitypkg/Editor/Roslyn/LICENSE.txt +23 -0
  740. package/unitypkg/Editor/Roslyn/Microsoft.CodeAnalysis.CSharp.dll +0 -0
  741. package/unitypkg/Editor/Roslyn/Microsoft.CodeAnalysis.dll +0 -0
  742. package/unitypkg/Editor/Roslyn/System.Collections.Immutable.dll +0 -0
  743. package/unitypkg/Editor/Roslyn/System.Reflection.Metadata.dll +0 -0
  744. package/unitypkg/Editor/Tools/animation/AnimationToolSupport.cs +335 -0
  745. package/unitypkg/Editor/Tools/animation/AnimatorRuntimeToolSupport.cs +24 -0
  746. package/unitypkg/Editor/Tools/animation/animator/crossfade.cs +117 -0
  747. package/unitypkg/Editor/Tools/animation/animator/get-info.cs +24 -0
  748. package/unitypkg/Editor/Tools/animation/animator/get-parameter.cs +36 -0
  749. package/unitypkg/Editor/Tools/animation/animator/set-enabled.cs +33 -0
  750. package/unitypkg/Editor/Tools/animation/animator/set-parameter.cs +71 -0
  751. package/unitypkg/Editor/Tools/animation/animator/set-speed.cs +33 -0
  752. package/unitypkg/Editor/Tools/animation/clip/create.cs +48 -0
  753. package/unitypkg/Editor/Tools/animation/clip/modify.cs +43 -0
  754. package/unitypkg/Editor/Tools/animation/clip.cs +23 -0
  755. package/unitypkg/Editor/Tools/animation/play.cs +41 -0
  756. package/unitypkg/Editor/Tools/animation/state.cs +25 -0
  757. package/unitypkg/Editor/Tools/animation/stop.cs +45 -0
  758. package/unitypkg/Editor/Tools/asset/AssetImportSettingsToolSupport.cs +633 -0
  759. package/unitypkg/Editor/Tools/asset/AssetToolSupport.cs +253 -0
  760. package/unitypkg/Editor/Tools/asset/create.cs +84 -0
  761. package/unitypkg/Editor/Tools/asset/delete.cs +88 -0
  762. package/unitypkg/Editor/Tools/asset/duplicate.cs +68 -0
  763. package/unitypkg/Editor/Tools/asset/get-components.cs +177 -0
  764. package/unitypkg/Editor/Tools/asset/get-data.cs +73 -0
  765. package/unitypkg/Editor/Tools/asset/import-settings/set.cs +127 -0
  766. package/unitypkg/Editor/Tools/asset/import-settings.cs +54 -0
  767. package/unitypkg/Editor/Tools/asset/import.cs +132 -0
  768. package/unitypkg/Editor/Tools/asset/info.cs +48 -0
  769. package/unitypkg/Editor/Tools/asset/modify.cs +69 -0
  770. package/unitypkg/Editor/Tools/asset/move.cs +70 -0
  771. package/unitypkg/Editor/Tools/asset/preview.cs +86 -0
  772. package/unitypkg/Editor/Tools/asset/rename.cs +84 -0
  773. package/unitypkg/Editor/Tools/asset/search-built-in.cs +90 -0
  774. package/unitypkg/Editor/Tools/asset/search.cs +83 -0
  775. package/unitypkg/Editor/Tools/build/BuildSceneStateTool.cs +37 -0
  776. package/unitypkg/Editor/Tools/build/BuildSettingsToolSupport.cs +4 -0
  777. package/unitypkg/Editor/Tools/build/BuildToolDtos.cs +15 -0
  778. package/unitypkg/Editor/Tools/build/BuildToolSupport.cs +111 -0
  779. package/unitypkg/Editor/Tools/build/platform/get.cs +12 -0
  780. package/unitypkg/Editor/Tools/build/platform/set.cs +45 -0
  781. package/unitypkg/Editor/Tools/build/profile/create.cs +44 -0
  782. package/unitypkg/Editor/Tools/build/profile/list.cs +12 -0
  783. package/unitypkg/Editor/Tools/build/profile/modify.cs +42 -0
  784. package/unitypkg/Editor/Tools/build/profile/switch.cs +30 -0
  785. package/unitypkg/Editor/Tools/build/scene/add.cs +45 -0
  786. package/unitypkg/Editor/Tools/build/scene/disable.cs +3 -0
  787. package/unitypkg/Editor/Tools/build/scene/enable.cs +4 -0
  788. package/unitypkg/Editor/Tools/build/scene/list.cs +4 -0
  789. package/unitypkg/Editor/Tools/build/scene/remove.cs +29 -0
  790. package/unitypkg/Editor/Tools/build/settings/get.cs +3 -0
  791. package/unitypkg/Editor/Tools/build/settings/set.cs +74 -0
  792. package/unitypkg/Editor/Tools/camera/CameraToolSupport.cs +292 -0
  793. package/unitypkg/Editor/Tools/camera/create.cs +114 -0
  794. package/unitypkg/Editor/Tools/camera/info.cs +49 -0
  795. package/unitypkg/Editor/Tools/camera/lens.cs +119 -0
  796. package/unitypkg/Editor/Tools/camera/list.cs +52 -0
  797. package/unitypkg/Editor/Tools/camera/multiview.cs +96 -0
  798. package/unitypkg/Editor/Tools/camera/screenshot.cs +65 -0
  799. package/unitypkg/Editor/Tools/camera/target.cs +94 -0
  800. package/unitypkg/Editor/Tools/component/add.cs +125 -0
  801. package/unitypkg/Editor/Tools/component/get.cs +73 -0
  802. package/unitypkg/Editor/Tools/component/list-types.cs +90 -0
  803. package/unitypkg/Editor/Tools/component/modify.cs +103 -0
  804. package/unitypkg/Editor/Tools/component/remove.cs +147 -0
  805. package/unitypkg/Editor/Tools/component/set.cs +93 -0
  806. package/unitypkg/Editor/Tools/console/clear.cs +38 -0
  807. package/unitypkg/Editor/Tools/console/get.cs +28 -0
  808. package/unitypkg/Editor/Tools/controller/add-blend-tree-child.cs +88 -0
  809. package/unitypkg/Editor/Tools/controller/add-layer.cs +43 -0
  810. package/unitypkg/Editor/Tools/controller/add-parameter.cs +51 -0
  811. package/unitypkg/Editor/Tools/controller/add-state.cs +44 -0
  812. package/unitypkg/Editor/Tools/controller/add-transition.cs +71 -0
  813. package/unitypkg/Editor/Tools/controller/assign.cs +38 -0
  814. package/unitypkg/Editor/Tools/controller/create-blend-tree-1d.cs +40 -0
  815. package/unitypkg/Editor/Tools/controller/create-blend-tree-2d.cs +42 -0
  816. package/unitypkg/Editor/Tools/controller/create.cs +31 -0
  817. package/unitypkg/Editor/Tools/controller/get-info.cs +27 -0
  818. package/unitypkg/Editor/Tools/controller/remove-layer.cs +57 -0
  819. package/unitypkg/Editor/Tools/controller/set-layer-weight.cs +42 -0
  820. package/unitypkg/Editor/Tools/diagnose/preflight.cs +269 -0
  821. package/unitypkg/Editor/Tools/editor/EditorActionToolSupport.cs +117 -0
  822. package/unitypkg/Editor/Tools/editor/EditorSearchToolSupport.cs +146 -0
  823. package/unitypkg/Editor/Tools/editor/EditorToolSupport.cs +132 -0
  824. package/unitypkg/Editor/Tools/editor/EditorWindowFocusToolSupport.cs +194 -0
  825. package/unitypkg/Editor/Tools/editor/active-tool/set.cs +33 -0
  826. package/unitypkg/Editor/Tools/editor/active-tool.cs +100 -0
  827. package/unitypkg/Editor/Tools/editor/autotick/set.cs +102 -0
  828. package/unitypkg/Editor/Tools/editor/console.cs +26 -0
  829. package/unitypkg/Editor/Tools/editor/focus.cs +80 -0
  830. package/unitypkg/Editor/Tools/editor/menu-items.cs +50 -0
  831. package/unitypkg/Editor/Tools/editor/menu.cs +53 -0
  832. package/unitypkg/Editor/Tools/editor/pause.cs +38 -0
  833. package/unitypkg/Editor/Tools/editor/play.cs +43 -0
  834. package/unitypkg/Editor/Tools/editor/redo.cs +56 -0
  835. package/unitypkg/Editor/Tools/editor/resolution.cs +34 -0
  836. package/unitypkg/Editor/Tools/editor/search.cs +55 -0
  837. package/unitypkg/Editor/Tools/editor/selection/set.cs +37 -0
  838. package/unitypkg/Editor/Tools/editor/selection.cs +153 -0
  839. package/unitypkg/Editor/Tools/editor/stop.cs +43 -0
  840. package/unitypkg/Editor/Tools/editor/tool-states.cs +140 -0
  841. package/unitypkg/Editor/Tools/editor/undo.cs +56 -0
  842. package/unitypkg/Editor/Tools/editor/windows.cs +87 -0
  843. package/unitypkg/Editor/Tools/extension/status.cs +87 -0
  844. package/unitypkg/Editor/Tools/go/GameObjectToolSupport.cs +524 -0
  845. package/unitypkg/Editor/Tools/go/create.cs +333 -0
  846. package/unitypkg/Editor/Tools/go/delete.cs +87 -0
  847. package/unitypkg/Editor/Tools/go/duplicate.cs +76 -0
  848. package/unitypkg/Editor/Tools/go/find.cs +152 -0
  849. package/unitypkg/Editor/Tools/go/inspect.cs +49 -0
  850. package/unitypkg/Editor/Tools/go/look-at.cs +76 -0
  851. package/unitypkg/Editor/Tools/go/modify.cs +156 -0
  852. package/unitypkg/Editor/Tools/go/move-relative.cs +74 -0
  853. package/unitypkg/Editor/Tools/go/set-parent.cs +84 -0
  854. package/unitypkg/Editor/Tools/graphics/GraphicsToolSupport.cs +396 -0
  855. package/unitypkg/Editor/Tools/graphics/bake-cancel.cs +27 -0
  856. package/unitypkg/Editor/Tools/graphics/bake-clear.cs +31 -0
  857. package/unitypkg/Editor/Tools/graphics/bake-reflection-probe.cs +35 -0
  858. package/unitypkg/Editor/Tools/graphics/bake-settings.cs +131 -0
  859. package/unitypkg/Editor/Tools/graphics/bake-start.cs +27 -0
  860. package/unitypkg/Editor/Tools/graphics/bake-status.cs +31 -0
  861. package/unitypkg/Editor/Tools/graphics/light-probe-group.cs +56 -0
  862. package/unitypkg/Editor/Tools/graphics/pipeline-info.cs +19 -0
  863. package/unitypkg/Editor/Tools/graphics/pipeline-quality.cs +24 -0
  864. package/unitypkg/Editor/Tools/graphics/pipeline-settings.cs +46 -0
  865. package/unitypkg/Editor/Tools/graphics/probe-positions.cs +58 -0
  866. package/unitypkg/Editor/Tools/graphics/quality.cs +85 -0
  867. package/unitypkg/Editor/Tools/graphics/reflection-probe.cs +73 -0
  868. package/unitypkg/Editor/Tools/graphics/scene-debug.cs +37 -0
  869. package/unitypkg/Editor/Tools/graphics/settings.cs +104 -0
  870. package/unitypkg/Editor/Tools/graphics/skybox-get.cs +33 -0
  871. package/unitypkg/Editor/Tools/graphics/skybox-set-ambient.cs +24 -0
  872. package/unitypkg/Editor/Tools/graphics/skybox-set-fog.cs +24 -0
  873. package/unitypkg/Editor/Tools/graphics/skybox-set-material.cs +33 -0
  874. package/unitypkg/Editor/Tools/graphics/skybox-set-properties.cs +51 -0
  875. package/unitypkg/Editor/Tools/graphics/skybox-set-reflection.cs +31 -0
  876. package/unitypkg/Editor/Tools/graphics/skybox-set-sun.cs +35 -0
  877. package/unitypkg/Editor/Tools/graphics/stats-counters.cs +28 -0
  878. package/unitypkg/Editor/Tools/graphics/stats-memory.cs +21 -0
  879. package/unitypkg/Editor/Tools/graphics/stats.cs +17 -0
  880. package/unitypkg/Editor/Tools/graphics/volume.cs +59 -0
  881. package/unitypkg/Editor/Tools/instances/list.cs +71 -0
  882. package/unitypkg/Editor/Tools/material/MaterialToolSupport.cs +401 -0
  883. package/unitypkg/Editor/Tools/material/assign.cs +124 -0
  884. package/unitypkg/Editor/Tools/material/create.cs +82 -0
  885. package/unitypkg/Editor/Tools/material/info.cs +55 -0
  886. package/unitypkg/Editor/Tools/material/set-renderer-color.cs +108 -0
  887. package/unitypkg/Editor/Tools/material/set.cs +114 -0
  888. package/unitypkg/Editor/Tools/navmesh/NavMeshToolSupport.cs +404 -0
  889. package/unitypkg/Editor/Tools/navmesh/bake-clear.cs +70 -0
  890. package/unitypkg/Editor/Tools/navmesh/settings/set.cs +73 -0
  891. package/unitypkg/Editor/Tools/navmesh/settings.cs +37 -0
  892. package/unitypkg/Editor/Tools/object/ObjectToolSupport.cs +99 -0
  893. package/unitypkg/Editor/Tools/object/get-data.cs +69 -0
  894. package/unitypkg/Editor/Tools/object/modify.cs +126 -0
  895. package/unitypkg/Editor/Tools/occlusion/OcclusionToolSupport.cs +422 -0
  896. package/unitypkg/Editor/Tools/occlusion/bake-clear.cs +67 -0
  897. package/unitypkg/Editor/Tools/physics/PhysicsJointToolSupport.cs +13 -0
  898. package/unitypkg/Editor/Tools/physics/PhysicsToolSupport.cs +389 -0
  899. package/unitypkg/Editor/Tools/physics/assign-material.cs +88 -0
  900. package/unitypkg/Editor/Tools/physics/collision-matrix.cs +90 -0
  901. package/unitypkg/Editor/Tools/physics/force.cs +127 -0
  902. package/unitypkg/Editor/Tools/physics/joint/add.cs +99 -0
  903. package/unitypkg/Editor/Tools/physics/joint/remove.cs +4 -0
  904. package/unitypkg/Editor/Tools/physics/linecast.cs +59 -0
  905. package/unitypkg/Editor/Tools/physics/material.cs +73 -0
  906. package/unitypkg/Editor/Tools/physics/overlap.cs +84 -0
  907. package/unitypkg/Editor/Tools/physics/raycast-all.cs +67 -0
  908. package/unitypkg/Editor/Tools/physics/raycast.cs +96 -0
  909. package/unitypkg/Editor/Tools/physics/rigidbody.cs +116 -0
  910. package/unitypkg/Editor/Tools/physics/settings.cs +116 -0
  911. package/unitypkg/Editor/Tools/physics/shapecast.cs +127 -0
  912. package/unitypkg/Editor/Tools/physics/simulation.cs +89 -0
  913. package/unitypkg/Editor/Tools/physics/validate.cs +67 -0
  914. package/unitypkg/Editor/Tools/prefab/PrefabOverrideToolSupport.cs +355 -0
  915. package/unitypkg/Editor/Tools/prefab/PrefabToolSupport.cs +446 -0
  916. package/unitypkg/Editor/Tools/prefab/create.cs +125 -0
  917. package/unitypkg/Editor/Tools/prefab/hierarchy.cs +157 -0
  918. package/unitypkg/Editor/Tools/prefab/info.cs +44 -0
  919. package/unitypkg/Editor/Tools/prefab/instantiate.cs +106 -0
  920. package/unitypkg/Editor/Tools/prefab/modify.cs +112 -0
  921. package/unitypkg/Editor/Tools/prefab/overrides/apply.cs +51 -0
  922. package/unitypkg/Editor/Tools/prefab/overrides/revert.cs +51 -0
  923. package/unitypkg/Editor/Tools/prefab/stage-close.cs +67 -0
  924. package/unitypkg/Editor/Tools/prefab/stage-open.cs +69 -0
  925. package/unitypkg/Editor/Tools/prefab/stage-save.cs +64 -0
  926. package/unitypkg/Editor/Tools/prefab/stage.cs +68 -0
  927. package/unitypkg/Editor/Tools/prefab/unpack.cs +80 -0
  928. package/unitypkg/Editor/Tools/prefab/variant/create.cs +53 -0
  929. package/unitypkg/Editor/Tools/profiler/ProfilerFrameDebuggerSupport.cs +68 -0
  930. package/unitypkg/Editor/Tools/profiler/ProfilerMemorySnapshotSupport.cs +30 -0
  931. package/unitypkg/Editor/Tools/profiler/ProfilerToolSupport.cs +515 -0
  932. package/unitypkg/Editor/Tools/profiler/areas.cs +36 -0
  933. package/unitypkg/Editor/Tools/profiler/capture.cs +188 -0
  934. package/unitypkg/Editor/Tools/profiler/clear.cs +57 -0
  935. package/unitypkg/Editor/Tools/profiler/counter.cs +34 -0
  936. package/unitypkg/Editor/Tools/profiler/deep.cs +48 -0
  937. package/unitypkg/Editor/Tools/profiler/export.cs +85 -0
  938. package/unitypkg/Editor/Tools/profiler/frame-debugger/disable.cs +53 -0
  939. package/unitypkg/Editor/Tools/profiler/frame-debugger/enable.cs +66 -0
  940. package/unitypkg/Editor/Tools/profiler/frame-debugger/events.cs +140 -0
  941. package/unitypkg/Editor/Tools/profiler/frame.cs +38 -0
  942. package/unitypkg/Editor/Tools/profiler/hierarchy.cs +183 -0
  943. package/unitypkg/Editor/Tools/profiler/load.cs +85 -0
  944. package/unitypkg/Editor/Tools/profiler/memory-snapshot/compare.cs +78 -0
  945. package/unitypkg/Editor/Tools/profiler/memory-snapshot/list.cs +73 -0
  946. package/unitypkg/Editor/Tools/profiler/memory-snapshot/take.cs +147 -0
  947. package/unitypkg/Editor/Tools/profiler/memory.cs +34 -0
  948. package/unitypkg/Editor/Tools/profiler/module-enable.cs +52 -0
  949. package/unitypkg/Editor/Tools/profiler/modules.cs +33 -0
  950. package/unitypkg/Editor/Tools/profiler/object-memory.cs +49 -0
  951. package/unitypkg/Editor/Tools/profiler/pause.cs +49 -0
  952. package/unitypkg/Editor/Tools/profiler/rendering-stats.cs +109 -0
  953. package/unitypkg/Editor/Tools/profiler/script-stats.cs +35 -0
  954. package/unitypkg/Editor/Tools/profiler/start.cs +55 -0
  955. package/unitypkg/Editor/Tools/profiler/status.cs +36 -0
  956. package/unitypkg/Editor/Tools/profiler/stop.cs +53 -0
  957. package/unitypkg/Editor/Tools/project/ProjectSettingsReader.cs +31 -0
  958. package/unitypkg/Editor/Tools/project/ProjectSettingsToolSupport.cs +757 -0
  959. package/unitypkg/Editor/Tools/project/ProjectTagLayerToolSupport.cs +23 -0
  960. package/unitypkg/Editor/Tools/project/audio-settings/set.cs +35 -0
  961. package/unitypkg/Editor/Tools/project/audio-settings.cs +31 -0
  962. package/unitypkg/Editor/Tools/project/info.cs +52 -0
  963. package/unitypkg/Editor/Tools/project/input-settings/set.cs +35 -0
  964. package/unitypkg/Editor/Tools/project/input-settings.cs +35 -0
  965. package/unitypkg/Editor/Tools/project/layer/add.cs +3 -0
  966. package/unitypkg/Editor/Tools/project/layer/remove.cs +3 -0
  967. package/unitypkg/Editor/Tools/project/layers.cs +61 -0
  968. package/unitypkg/Editor/Tools/project/player-settings/set.cs +35 -0
  969. package/unitypkg/Editor/Tools/project/player-settings.cs +31 -0
  970. package/unitypkg/Editor/Tools/project/tag/add.cs +3 -0
  971. package/unitypkg/Editor/Tools/project/tag/remove.cs +3 -0
  972. package/unitypkg/Editor/Tools/project/tags.cs +45 -0
  973. package/unitypkg/Editor/Tools/project/time-settings/set.cs +35 -0
  974. package/unitypkg/Editor/Tools/project/time-settings.cs +31 -0
  975. package/unitypkg/Editor/Tools/reflection/method/call.cs +114 -0
  976. package/unitypkg/Editor/Tools/reflection/method/find.cs +72 -0
  977. package/unitypkg/Editor/Tools/reflection/type/schema.cs +56 -0
  978. package/unitypkg/Editor/Tools/scene/SceneToolSupport.cs +181 -0
  979. package/unitypkg/Editor/Tools/scene/active.cs +62 -0
  980. package/unitypkg/Editor/Tools/scene/build-settings.cs +69 -0
  981. package/unitypkg/Editor/Tools/scene/create.cs +78 -0
  982. package/unitypkg/Editor/Tools/scene/data.cs +125 -0
  983. package/unitypkg/Editor/Tools/scene/gameobject/component.cs +63 -0
  984. package/unitypkg/Editor/Tools/scene/gameobject/components.cs +77 -0
  985. package/unitypkg/Editor/Tools/scene/gameobject-support.cs +101 -0
  986. package/unitypkg/Editor/Tools/scene/gameobject.cs +83 -0
  987. package/unitypkg/Editor/Tools/scene/hierarchy.cs +250 -0
  988. package/unitypkg/Editor/Tools/scene/list-opened.cs +77 -0
  989. package/unitypkg/Editor/Tools/scene/load.cs +68 -0
  990. package/unitypkg/Editor/Tools/scene/move-object.cs +122 -0
  991. package/unitypkg/Editor/Tools/scene/save.cs +231 -0
  992. package/unitypkg/Editor/Tools/scene/set-active.cs +76 -0
  993. package/unitypkg/Editor/Tools/scene/unload.cs +109 -0
  994. package/unitypkg/Editor/Tools/scene/validate.cs +115 -0
  995. package/unitypkg/Editor/Tools/scene/view-frame.cs +218 -0
  996. package/unitypkg/Editor/Tools/screenshot/EditorElementCaptureToolSupport.cs +181 -0
  997. package/unitypkg/Editor/Tools/screenshot/ScreenshotToolSupport.cs +196 -0
  998. package/unitypkg/Editor/Tools/screenshot/editor-element.cs +87 -0
  999. package/unitypkg/Editor/Tools/screenshot/game-view.cs +116 -0
  1000. package/unitypkg/Editor/Tools/screenshot/isolated-object.cs +93 -0
  1001. package/unitypkg/Editor/Tools/screenshot/orbit.cs +103 -0
  1002. package/unitypkg/Editor/Tools/screenshot/scene-view.cs +99 -0
  1003. package/unitypkg/Editor/Tools/screenshot/screen.cs +89 -0
  1004. package/unitypkg/Editor/Tools/screenshot/surround.cs +181 -0
  1005. package/unitypkg/Editor/Tools/scriptable-object/ScriptableObjectToolSupport.cs +196 -0
  1006. package/unitypkg/Editor/Tools/scriptable-object/create.cs +79 -0
  1007. package/unitypkg/Editor/Tools/scriptable-object/info.cs +49 -0
  1008. package/unitypkg/Editor/Tools/scriptable-object/list-types.cs +103 -0
  1009. package/unitypkg/Editor/Tools/scriptable-object/modify.cs +208 -0
  1010. package/unitypkg/Editor/Tools/shader/ShaderToolSupport.cs +326 -0
  1011. package/unitypkg/Editor/Tools/shader/create.cs +82 -0
  1012. package/unitypkg/Editor/Tools/shader/delete.cs +90 -0
  1013. package/unitypkg/Editor/Tools/shader/get-data.cs +125 -0
  1014. package/unitypkg/Editor/Tools/shader/info.cs +48 -0
  1015. package/unitypkg/Editor/Tools/shader/list.cs +82 -0
  1016. package/unitypkg/Editor/Tools/shader/read.cs +84 -0
  1017. package/unitypkg/Editor/Tools/shader/update.cs +71 -0
  1018. package/unitypkg/Editor/Tools/tests/list.cs +98 -0
  1019. package/unitypkg/Editor/Tools/texture/TextureToolSupport.cs +327 -0
  1020. package/unitypkg/Editor/Tools/texture/create.cs +182 -0
  1021. package/unitypkg/Editor/Tools/texture/delete.cs +89 -0
  1022. package/unitypkg/Editor/Tools/texture/generate.cs +189 -0
  1023. package/unitypkg/Editor/Tools/texture/import-settings.cs +104 -0
  1024. package/unitypkg/Editor/Tools/texture/info.cs +50 -0
  1025. package/unitypkg/Editor/Tools/texture/modify.cs +154 -0
  1026. package/unitypkg/Editor/Tools/texture/sprite.cs +132 -0
  1027. package/unitypkg/Editor/Tools/timeline/TimelineMutationToolSupport.cs +696 -0
  1028. package/unitypkg/Editor/Tools/timeline/TimelineReadToolSupport.cs +439 -0
  1029. package/unitypkg/Editor/Tools/timeline/TimelineToolSupport.cs +203 -0
  1030. package/unitypkg/Editor/Tools/timeline/clip/add.cs +93 -0
  1031. package/unitypkg/Editor/Tools/timeline/create.cs +88 -0
  1032. package/unitypkg/Editor/Tools/timeline/info.cs +54 -0
  1033. package/unitypkg/Editor/Tools/timeline/track/add.cs +91 -0
  1034. package/unitypkg/Editor/Tools/ui/UiToolSupport.cs +162 -0
  1035. package/unitypkg/Editor/Tools/ui/UiUguiToolSupport.cs +24 -0
  1036. package/unitypkg/Editor/Tools/ui/attach-document.cs +46 -0
  1037. package/unitypkg/Editor/Tools/ui/button/create.cs +58 -0
  1038. package/unitypkg/Editor/Tools/ui/canvas/create.cs +40 -0
  1039. package/unitypkg/Editor/Tools/ui/create-panel-settings.cs +44 -0
  1040. package/unitypkg/Editor/Tools/ui/detach-document.cs +41 -0
  1041. package/unitypkg/Editor/Tools/ui/document/create.cs +49 -0
  1042. package/unitypkg/Editor/Tools/ui/document/delete.cs +33 -0
  1043. package/unitypkg/Editor/Tools/ui/document/info.cs +33 -0
  1044. package/unitypkg/Editor/Tools/ui/document/update.cs +36 -0
  1045. package/unitypkg/Editor/Tools/ui/get-visual-tree.cs +34 -0
  1046. package/unitypkg/Editor/Tools/ui/hierarchy.cs +27 -0
  1047. package/unitypkg/Editor/Tools/ui/image/create.cs +47 -0
  1048. package/unitypkg/Editor/Tools/ui/link-stylesheet.cs +54 -0
  1049. package/unitypkg/Editor/Tools/ui/list-documents.cs +34 -0
  1050. package/unitypkg/Editor/Tools/ui/modify-visual-element.cs +76 -0
  1051. package/unitypkg/Editor/Tools/ui/render-preview.cs +128 -0
  1052. package/unitypkg/Editor/Tools/ui/text/create.cs +45 -0
  1053. package/unitypkg/Editor/Tools/ui/update-panel-settings.cs +49 -0
  1054. package/unitypkg/Editor/UnityCliBridge.cs +431 -0
  1055. package/unitypkg/Editor/UnityCliBridgeBuildInfo.cs +9 -0
  1056. package/unitypkg/Runtime/Infrastructure/UnityCliRuntimeBridge.cs +580 -0
  1057. package/unitypkg/Runtime/Infrastructure/UnityCliRuntimeJson.cs +232 -0
  1058. package/unitypkg/Runtime/Infrastructure/UnityCliRuntimeRegistry.cs +297 -0
  1059. package/unitypkg/Runtime/Tools/UnityCliRuntimeTools.cs +701 -0
  1060. package/unitypkg/Runtime/UnityCli.Runtime.asmdef +14 -0
  1061. package/unitypkg/Shared/UnityCli.Shared.asmdef +14 -0
  1062. package/unitypkg/Shared/UnityCliAdmissionPool.cs +426 -0
  1063. package/unitypkg/Tests/Editor/UnityCli.Editor.Tests.asmdef +15 -0
  1064. package/unitypkg/Tests/Editor/UnityCliAdmissionPoolTests.cs +262 -0
  1065. package/unitypkg/UnityCli.Editor.asmdef +26 -0
  1066. package/unitypkg/package.json +11 -0
@@ -0,0 +1,951 @@
1
+ #if UNITY_EDITOR
2
+ using System;
3
+ using System.Collections.Generic;
4
+ using System.Linq;
5
+ using System.Reflection;
6
+ using UnityEditor;
7
+ using UnityEngine;
8
+ using UnityEngine.ProBuilder;
9
+
10
+ namespace UnityCli.ProBuilder
11
+ {
12
+ /// <summary>ProBuilder completion proof 的不可变规范快照;只读捕获,任何不可读、非有限或映射不完整状态都拒绝证明。</summary>
13
+ internal sealed class CanonicalMeshSnapshot
14
+ {
15
+ /// <summary>effect 前冻结的对象和组件身份;listener generation 在当前接口不可取得,故不伪造该字段。</summary>
16
+ internal sealed class ObjectIdentityClaim
17
+ {
18
+ internal readonly int GameObjectInstanceId, TransformInstanceId, ParentTransformInstanceId, SceneHandle, ProBuilderMeshInstanceId, MeshFilterInstanceId, MeshRendererInstanceId, CompiledMeshInstanceId;
19
+ internal readonly string GlobalObjectId, ScenePath;
20
+ internal ObjectIdentityClaim(GameObject go, ProBuilderMesh mesh, MeshFilter filter, MeshRenderer renderer, Mesh compiled)
21
+ {
22
+ GameObjectInstanceId = go.GetInstanceID(); TransformInstanceId = go.transform.GetInstanceID(); ParentTransformInstanceId = go.transform.parent == null ? 0 : go.transform.parent.GetInstanceID();
23
+ GlobalObjectId = UnityEditor.GlobalObjectId.GetGlobalObjectIdSlow(go).ToString(); SceneHandle = go.scene.handle; ScenePath = go.scene.path;
24
+ ProBuilderMeshInstanceId = mesh.GetInstanceID(); MeshFilterInstanceId = filter.GetInstanceID(); MeshRendererInstanceId = renderer.GetInstanceID(); CompiledMeshInstanceId = compiled.GetInstanceID();
25
+ }
26
+ }
27
+
28
+ /// <summary>可选顶点通道同时保存存在性和值;IsPresent=false 时 Value 不具有数据语义。</summary>
29
+ internal sealed class ChannelValue
30
+ {
31
+ internal readonly bool IsPresent;
32
+ internal readonly Vector4 Value;
33
+ internal ChannelValue(bool present, Vector4 value) { IsPresent = present; Value = value; }
34
+ }
35
+
36
+ /// <summary>Unity Mesh 的一个 submesh 终态;topology 与 index 流均为完成证明的一部分。</summary>
37
+ internal sealed class CompiledSubmeshSnapshot
38
+ {
39
+ internal readonly MeshTopology Topology;
40
+ private readonly int[] indexes;
41
+ internal int[] Indexes { get { return (int[])indexes.Clone(); } }
42
+ internal CompiledSubmeshSnapshot(MeshTopology topology, IEnumerable<int> values) { Topology = topology; indexes = values.ToArray(); }
43
+ }
44
+
45
+ /// <summary>MeshFilter.sharedMesh 的完整不可变终态,用于拒绝 stale 或部分 Refresh。</summary>
46
+ internal sealed class CompiledMeshSnapshot
47
+ {
48
+ internal readonly int InstanceId;
49
+ internal readonly UnityEngine.Rendering.IndexFormat IndexFormat;
50
+ private readonly Vector3[] positions, normals;
51
+ private readonly Vector4[] tangents;
52
+ private readonly Color[] colors;
53
+ private readonly Vector4[][] uvs;
54
+ private readonly CompiledSubmeshSnapshot[] submeshes;
55
+ internal readonly Bounds Bounds;
56
+ internal Vector3[] Positions { get { return (Vector3[])positions.Clone(); } }
57
+ internal Vector3[] Normals { get { return (Vector3[])normals.Clone(); } }
58
+ internal Vector4[] Tangents { get { return (Vector4[])tangents.Clone(); } }
59
+ internal Color[] Colors { get { return (Color[])colors.Clone(); } }
60
+ internal Vector4[][] Uvs { get { return uvs.Select(values => (Vector4[])values.Clone()).ToArray(); } }
61
+ internal CompiledSubmeshSnapshot[] Submeshes { get { return (CompiledSubmeshSnapshot[])submeshes.Clone(); } }
62
+ internal CompiledMeshSnapshot(Mesh mesh, Vector3[] positionValues, Vector3[] normalValues, Vector4[] tangentValues, Color[] colorValues, Vector4[][] uvValues, CompiledSubmeshSnapshot[] submeshValues)
63
+ {
64
+ InstanceId = mesh.GetInstanceID(); IndexFormat = mesh.indexFormat; positions = (Vector3[])positionValues.Clone(); normals = (Vector3[])normalValues.Clone(); tangents = (Vector4[])tangentValues.Clone(); colors = (Color[])colorValues.Clone();
65
+ uvs = uvValues.Select(values => (Vector4[])values.Clone()).ToArray(); submeshes = (CompiledSubmeshSnapshot[])submeshValues.Clone(); Bounds = mesh.bounds;
66
+ }
67
+ }
68
+
69
+ /// <summary>raw index 和 shared handle 仅在本快照内定位;跨快照比较必须经 shared value claim,不能直接比较这些数字。</summary>
70
+ internal sealed class RawVertex
71
+ {
72
+ internal readonly int RawIndex, SharedHandle;
73
+ internal readonly Vector3 LocalPosition, WorldPosition;
74
+ internal readonly ChannelValue LocalNormal, Tangent, Color;
75
+ private readonly ChannelValue[] uvs;
76
+ internal ChannelValue[] Uvs { get { return (ChannelValue[])uvs.Clone(); } }
77
+ internal RawVertex(int raw, int handle, Vector3 local, Vector3 world, ChannelValue normal, ChannelValue tangent, ChannelValue color, ChannelValue[] values)
78
+ { RawIndex = raw; SharedHandle = handle; LocalPosition = local; WorldPosition = world; LocalNormal = normal; Tangent = tangent; Color = color; uvs = (ChannelValue[])values.Clone(); }
79
+ }
80
+
81
+ /// <summary>shared handle 的成员闭集、原始迭代顺序和规范 local position;每个 raw index 必须恰好属于一个 handle。</summary>
82
+ internal sealed class SharedVertexSnapshot
83
+ {
84
+ internal readonly int Handle;
85
+ private readonly int[] members;
86
+ internal int[] MemberRawIndexes { get { return (int[])members.Clone(); } }
87
+ internal readonly Vector3 CanonicalPosition;
88
+ internal SharedVertexSnapshot(int handle, IEnumerable<int> rawMembers, Vector3 position) { Handle = handle; members = rawMembers.ToArray(); CanonicalPosition = position; }
89
+ }
90
+
91
+ /// <summary>effective material 按 5.2.4 的 clamped submesh slot 解析;raw submeshIndex 由 FaceOccurrence 独立保存。</summary>
92
+ internal sealed class MaterialClaim
93
+ {
94
+ internal readonly MaterialState State;
95
+ internal readonly int EffectiveSlot, InstanceId;
96
+ internal readonly bool HasAssetIdentity;
97
+ internal readonly string AssetGuid;
98
+ internal readonly long AssetLocalId;
99
+ internal readonly MaterialClaim SerializedFaceMaterial;
100
+ internal MaterialClaim(MaterialState state, int effectiveSlot, int instanceId, bool hasAsset, string guid, long localId, MaterialClaim serializedFaceMaterial = null)
101
+ { State = state; EffectiveSlot = effectiveSlot; InstanceId = instanceId; HasAssetIdentity = hasAsset; AssetGuid = guid; AssetLocalId = localId; SerializedFaceMaterial = serializedFaceMaterial; }
102
+ }
103
+ internal enum MaterialState { RendererMissing, NoSlots, Null, Object }
104
+
105
+ /// <summary>Face.edges 的原始有向引用;raw/shared 数字只供本快照请求映射,跨快照由共享值端点比较。</summary>
106
+ internal sealed class BoundaryReference
107
+ {
108
+ internal readonly int RawA, RawB, SharedA, SharedB;
109
+ internal BoundaryReference(int rawA, int rawB, int sharedA, int sharedB) { RawA = rawA; RawB = rawB; SharedA = sharedA; SharedB = sharedB; }
110
+ }
111
+
112
+ /// <summary>occurrence index 是 capture 时的位置,不是跨 effect 身份;面保存原始流以支持同快照请求映射。</summary>
113
+ internal sealed class FaceOccurrence
114
+ {
115
+ internal readonly int OccurrenceIndex, SubmeshIndex, SmoothingGroup, TextureGroup, ElementGroup;
116
+ internal readonly bool ManualUv;
117
+ private readonly int[] directedRawTriangleStream, directedSharedTriangleStream;
118
+ private readonly BoundaryReference[] boundary;
119
+ internal int[] DirectedRawTriangleStream { get { return (int[])directedRawTriangleStream.Clone(); } }
120
+ internal int[] DirectedSharedTriangleStream { get { return (int[])directedSharedTriangleStream.Clone(); } }
121
+ internal BoundaryReference[] Boundary { get { return (BoundaryReference[])boundary.Clone(); } }
122
+ internal readonly AutoUnwrapSettings Uv;
123
+ internal readonly MaterialClaim Material;
124
+ internal FaceOccurrence(int occurrence, Face face, int[] raw, int[] shared, BoundaryReference[] edges, int elementGroup, MaterialClaim material)
125
+ {
126
+ OccurrenceIndex = occurrence; SubmeshIndex = face.submeshIndex; SmoothingGroup = face.smoothingGroup; ManualUv = face.manualUV;
127
+ TextureGroup = face.textureGroup; ElementGroup = elementGroup; directedRawTriangleStream = (int[])raw.Clone(); directedSharedTriangleStream = (int[])shared.Clone();
128
+ boundary = edges.ToArray(); Uv = new AutoUnwrapSettings(face.uv); Material = material;
129
+ }
130
+ }
131
+
132
+ /// <summary>每个无向 shared 边保留所有 incident face occurrence 及原有方向;不会因去重丢失非流形重数。</summary>
133
+ internal sealed class SharedEdgeOccurrence
134
+ {
135
+ internal readonly int SharedMin, SharedMax;
136
+ private readonly BoundaryIncidence[] incidences;
137
+ internal BoundaryIncidence[] Incidences { get { return (BoundaryIncidence[])incidences.Clone(); } }
138
+ internal SharedEdgeOccurrence(int min, int max, IEnumerable<BoundaryIncidence> values) { SharedMin = min; SharedMax = max; incidences = values.ToArray(); }
139
+ }
140
+ internal sealed class BoundaryIncidence
141
+ {
142
+ internal readonly int FaceOccurrenceIndex, RawA, RawB, SharedA, SharedB;
143
+ internal BoundaryIncidence(int occurrence, BoundaryReference edge) { FaceOccurrenceIndex = occurrence; RawA = edge.RawA; RawB = edge.RawB; SharedA = edge.SharedA; SharedB = edge.SharedB; }
144
+ }
145
+
146
+ internal sealed class SharedTextureSnapshot
147
+ {
148
+ internal readonly int Group;
149
+ private readonly int[] members;
150
+ internal int[] MemberRawIndexes { get { return (int[])members.Clone(); } }
151
+ internal SharedTextureSnapshot(int group, IEnumerable<int> values) { Group = group; members = values.ToArray(); }
152
+ }
153
+
154
+ internal readonly ObjectIdentityClaim Identity;
155
+ internal readonly Matrix4x4 LocalToWorldMatrix, WorldToLocalMatrix;
156
+ internal readonly bool HasSharedTextures;
157
+ internal readonly CompiledMeshSnapshot CompiledMesh;
158
+ private readonly MaterialClaim[] rendererMaterials;
159
+ private readonly RawVertex[] rawVertices;
160
+ private readonly SharedVertexSnapshot[] sharedVertices;
161
+ private readonly SharedTextureSnapshot[] sharedTextures;
162
+ private readonly FaceOccurrence[] faces;
163
+ private readonly SharedEdgeOccurrence[] edges;
164
+ private readonly int[] touchedOccurrences;
165
+ internal MaterialClaim[] RendererMaterials { get { return (MaterialClaim[])rendererMaterials.Clone(); } }
166
+ internal RawVertex[] RawVertices { get { return (RawVertex[])rawVertices.Clone(); } }
167
+ internal SharedVertexSnapshot[] SharedVertices { get { return (SharedVertexSnapshot[])sharedVertices.Clone(); } }
168
+ internal SharedTextureSnapshot[] SharedTextures { get { return (SharedTextureSnapshot[])sharedTextures.Clone(); } }
169
+ internal FaceOccurrence[] Faces { get { return (FaceOccurrence[])faces.Clone(); } }
170
+ internal SharedEdgeOccurrence[] Edges { get { return (SharedEdgeOccurrence[])edges.Clone(); } }
171
+ internal int[] TouchedOccurrences { get { return (int[])touchedOccurrences.Clone(); } }
172
+ private CanonicalMeshSnapshot(ObjectIdentityClaim identity, Matrix4x4 localToWorld, Matrix4x4 worldToLocal, MaterialClaim[] materialSlots, RawVertex[] raw, SharedVertexSnapshot[] shared, bool hasSharedTextures, SharedTextureSnapshot[] textureGroups, FaceOccurrence[] faceValues, SharedEdgeOccurrence[] edgeValues, int[] touched, CompiledMeshSnapshot compiled)
173
+ {
174
+ Identity = identity; LocalToWorldMatrix = localToWorld; WorldToLocalMatrix = worldToLocal; rendererMaterials = (MaterialClaim[])materialSlots.Clone(); rawVertices = (RawVertex[])raw.Clone(); sharedVertices = (SharedVertexSnapshot[])shared.Clone();
175
+ HasSharedTextures = hasSharedTextures; sharedTextures = (SharedTextureSnapshot[])textureGroups.Clone(); faces = (FaceOccurrence[])faceValues.Clone(); edges = (SharedEdgeOccurrence[])edgeValues.Clone(); touchedOccurrences = (int[])touched.Clone(); CompiledMesh = compiled;
176
+ }
177
+
178
+ /// <summary>从 canonical raw 通道构造纯 managed clone,禁止 GetVertices 物化 ProBuilder 的 serialized normals/tangents 缓存。</summary>
179
+ internal static List<Vertex> BuildManagedVertices(CanonicalMeshSnapshot snapshot)
180
+ {
181
+ if (snapshot == null || snapshot.RawVertices == null) return null;
182
+ var result = new List<Vertex>(snapshot.RawVertices.Length);
183
+ foreach (var raw in snapshot.RawVertices)
184
+ {
185
+ var vertex = new Vertex { position = raw.LocalPosition };
186
+ if (raw.LocalNormal.IsPresent) vertex.normal = new Vector3(raw.LocalNormal.Value.x, raw.LocalNormal.Value.y, raw.LocalNormal.Value.z);
187
+ if (raw.Tangent.IsPresent) vertex.tangent = raw.Tangent.Value;
188
+ if (raw.Color.IsPresent) vertex.color = new Color(raw.Color.Value.x, raw.Color.Value.y, raw.Color.Value.z, raw.Color.Value.w);
189
+ var uvs = raw.Uvs;
190
+ if (uvs[0].IsPresent) vertex.uv0 = new Vector2(uvs[0].Value.x, uvs[0].Value.y);
191
+ if (uvs[1].IsPresent) vertex.uv2 = new Vector2(uvs[1].Value.x, uvs[1].Value.y);
192
+ if (uvs[2].IsPresent) vertex.uv3 = uvs[2].Value;
193
+ if (uvs[3].IsPresent) vertex.uv4 = uvs[3].Value;
194
+ result.Add(vertex);
195
+ }
196
+ return result;
197
+ }
198
+
199
+ /// <summary>验证 serialized ProBuilder 格式与当前锁定的 5.2.4 profile 一致;反射不可读时 fail closed。</summary>
200
+ internal static bool CurrentMeshFormat(ProBuilderMesh mesh)
201
+ {
202
+ try
203
+ {
204
+ var field = typeof(ProBuilderMesh).GetField("m_MeshFormatVersion", BindingFlags.Instance | BindingFlags.NonPublic);
205
+ return mesh != null && field != null && field.FieldType == typeof(int) && field.GetValue(mesh) is int version && version == 2;
206
+ }
207
+ catch { return false; }
208
+ }
209
+
210
+ /// <summary>总是捕获全部 face occurrence 和完整 shared-edge incidence;touched 只决定哪些面必须通过非退化和单一简单环预检。</summary>
211
+ internal static CanonicalMeshSnapshot Capture(GameObject go, int[] touchedFaceOccurrences = null)
212
+ {
213
+ return CaptureCore(go, touchedFaceOccurrences, false, false);
214
+ }
215
+
216
+ /// <summary>weld effect 后专用的宽松 fresh capture;仍验证所有原始流,只允许 shared 折叠后的退化边存在。</summary>
217
+ internal static CanonicalMeshSnapshot CaptureRelaxedAfterWeld(GameObject go)
218
+ {
219
+ return CaptureCore(go, null, true, false);
220
+ }
221
+
222
+ /// <summary>merge-vertices effect 后专用 fresh capture;只额外允许 5.2.4 删除全部 face/raw 后形成空 mesh。</summary>
223
+ internal static CanonicalMeshSnapshot CaptureAfterMergeVertices(GameObject go)
224
+ {
225
+ return CaptureCore(go, null, false, true);
226
+ }
227
+
228
+ private static CanonicalMeshSnapshot CaptureCore(GameObject go, int[] touchedFaceOccurrences, bool allowCollapsedSharedEdges, bool allowEmptyMesh)
229
+ {
230
+ var mesh = go == null ? null : go.GetComponent<ProBuilderMesh>();
231
+ var filter = go == null ? null : go.GetComponent<MeshFilter>(); var renderer = go == null ? null : go.GetComponent<MeshRenderer>(); var compiledMesh = filter == null ? null : filter.sharedMesh;
232
+ if (go == null || mesh == null || filter == null || renderer == null || compiledMesh == null || !go.scene.IsValid() || !go.scene.isLoaded || !Finite(go.transform.localToWorldMatrix) || !Finite(go.transform.worldToLocalMatrix)
233
+ || !CurrentMeshFormat(mesh) || !CompiledMeshBindingMatches(mesh, compiledMesh)) return null;
234
+ var positions = mesh.positions; var allFaces = mesh.faces; var groups = mesh.sharedVertices;
235
+ if (positions == null || (!allowEmptyMesh && positions.Count == 0) || allFaces == null || groups == null) return null;
236
+ var touched = SelectOccurrences(allFaces.Count, touchedFaceOccurrences); if (touched == null) return null;
237
+ var touchedSet = new HashSet<int>(touched);
238
+ var handles = Enumerable.Repeat(-1, positions.Count).ToArray(); var shared = new List<SharedVertexSnapshot>();
239
+ for (var handle = 0; handle < groups.Count; handle++)
240
+ {
241
+ var group = groups[handle]; if (group == null || group.Count == 0) return null;
242
+ var members = group.ToArray(); if (members.Any(raw => raw < 0 || raw >= positions.Count || handles[raw] >= 0)) return null;
243
+ var canonical = positions[members[0]];
244
+ if (!Finite(canonical) || members.Any(raw => !Finite(positions[raw]) || !ExactEquals(positions[raw], canonical))) return null;
245
+ foreach (var raw in members) handles[raw] = handle;
246
+ shared.Add(new SharedVertexSnapshot(handle, members, canonical));
247
+ }
248
+ if (handles.Any(handle => handle < 0)) return null;
249
+ if (!TryReadSharedTextures(mesh, positions.Count, out var hasSharedTextures, out var sharedTextureGroups)) return null;
250
+ var normals = ReadOptional(mesh.normals, positions.Count); var tangents = ReadOptional(mesh.tangents, positions.Count); var colors = ReadOptional(mesh.colors, positions.Count); var uv = ReadUvChannels(mesh, go, positions.Count);
251
+ if (normals == null || tangents == null || colors == null || uv == null) return null;
252
+ var rawVertices = new RawVertex[positions.Count];
253
+ for (var raw = 0; raw < positions.Count; raw++)
254
+ {
255
+ var world = go.transform.TransformPoint(positions[raw]); if (!Finite(positions[raw]) || !Finite(world)) return null;
256
+ rawVertices[raw] = new RawVertex(raw, handles[raw], positions[raw], world, normals[raw], tangents[raw], colors[raw], uv.Select(channel => channel[raw]).ToArray());
257
+ }
258
+ var materials = renderer.sharedMaterials;
259
+ if (materials == null) return null;
260
+ var serializedMaterialField = typeof(Face).GetField("m_Material", BindingFlags.Instance | BindingFlags.NonPublic);
261
+ if (serializedMaterialField == null || serializedMaterialField.FieldType != typeof(Material)) return null;
262
+ var materialSlots = materials.Select((material, slot) => CaptureMaterialSlot(material, slot)).ToArray();
263
+ var captured = new List<FaceOccurrence>();
264
+ for (var occurrence = 0; occurrence < allFaces.Count; occurrence++)
265
+ {
266
+ var face = allFaces[occurrence]; if (face == null || face.indexes == null || face.indexes.Count < 3 || face.indexes.Count % 3 != 0 || !Finite(face.uv)) return null;
267
+ var triangles = face.indexes.ToArray(); if (triangles.Any(raw => raw < 0 || raw >= rawVertices.Length)) return null;
268
+ // 未触及面仍需完整保留 raw/triangle/属性;其既有 shared 折叠边不能阻断无关请求。
269
+ var touchedFace = touchedSet.Contains(occurrence);
270
+ var boundary = CaptureBoundary(triangles, handles, allowCollapsedSharedEdges || !touchedFace); var elementGroup = ReadElementGroup(face);
271
+ if (boundary == null || !elementGroup.HasValue) return null;
272
+ if (!allowCollapsedSharedEdges && touchedFace && (HasDegenerateTriangle(triangles, positions) || !HasSimpleConnectedBoundary(boundary))) return null;
273
+ var material = WithSerializedFaceMaterial(CaptureMaterial(renderer, materials, face.submeshIndex), serializedMaterialField.GetValue(face) as Material);
274
+ captured.Add(new FaceOccurrence(occurrence, face, triangles, triangles.Select(raw => handles[raw]).ToArray(), boundary, elementGroup.Value, material));
275
+ }
276
+ var compiled = CaptureCompiledMesh(compiledMesh, renderer, rawVertices, captured.ToArray(), allowEmptyMesh);
277
+ if (compiled == null) return null;
278
+ return new CanonicalMeshSnapshot(new ObjectIdentityClaim(go, mesh, filter, renderer, compiledMesh), go.transform.localToWorldMatrix, go.transform.worldToLocalMatrix, materialSlots, rawVertices, shared.ToArray(), hasSharedTextures, sharedTextureGroups, captured.ToArray(), BuildEdges(captured), touched, compiled);
279
+ }
280
+
281
+ /// <summary>fresh 解析只能校验 effect 前 claim,候选 target 不能替代对象、场景或组件身份。</summary>
282
+ internal static ProBuilderMesh ResolveFreshMesh(string target, ObjectIdentityClaim claim)
283
+ {
284
+ var go = ProBuilderInput.ResolveTarget(target); var mesh = go == null ? null : go.GetComponent<ProBuilderMesh>(); var filter = go == null ? null : go.GetComponent<MeshFilter>(); var renderer = go == null ? null : go.GetComponent<MeshRenderer>(); var compiled = filter == null ? null : filter.sharedMesh;
285
+ return claim == null || go == null || mesh == null || filter == null || renderer == null || compiled == null || !go.scene.IsValid() || !go.scene.isLoaded
286
+ || go.GetInstanceID() != claim.GameObjectInstanceId || go.transform.GetInstanceID() != claim.TransformInstanceId || (go.transform.parent == null ? 0 : go.transform.parent.GetInstanceID()) != claim.ParentTransformInstanceId
287
+ || mesh.GetInstanceID() != claim.ProBuilderMeshInstanceId || filter.GetInstanceID() != claim.MeshFilterInstanceId || renderer.GetInstanceID() != claim.MeshRendererInstanceId || compiled.GetInstanceID() != claim.CompiledMeshInstanceId
288
+ || go.scene.handle != claim.SceneHandle || !string.Equals(go.scene.path, claim.ScenePath, StringComparison.Ordinal) || !string.Equals(UnityEditor.GlobalObjectId.GetGlobalObjectIdSlow(go).ToString(), claim.GlobalObjectId, StringComparison.Ordinal) ? null : mesh;
289
+ }
290
+
291
+ /// <summary>同一 snapshot 内的有向三角形 helper 只允许循环旋转,不允许反向 winding 或排序。</summary>
292
+ internal static bool DirectedTriangleCyclicEquals(IList<int> left, IList<int> right)
293
+ {
294
+ if (left == null || right == null || left.Count != 3 || right.Count != 3) return false;
295
+ for (var offset = 0; offset < 3; offset++) if (left[0] == right[offset] && left[1] == right[(offset + 1) % 3] && left[2] == right[(offset + 2) % 3]) return true;
296
+ return false;
297
+ }
298
+ /// <summary>同一 snapshot 的数字三角流逐段比较,供请求映射使用,不能作为跨 snapshot preservation 的身份比较。</summary>
299
+ internal static bool DirectedTriangleStreamEquals(IList<int> left, IList<int> right)
300
+ {
301
+ if (left == null || right == null || left.Count != right.Count || left.Count % 3 != 0) return false;
302
+ for (var index = 0; index < left.Count; index += 3) if (!DirectedTriangleCyclicEquals(new[] { left[index], left[index + 1], left[index + 2] }, new[] { right[index], right[index + 1], right[index + 2] })) return false;
303
+ return true;
304
+ }
305
+ /// <summary>预演 5.2.4 CalculateNormals 的全 triangle normal,防止有限坐标差值或叉乘溢出。</summary>
306
+ internal static bool NormalArithmeticFinite(IList<Vector3> positions, IEnumerable<int[]> streams)
307
+ {
308
+ if (positions == null || streams == null || positions.Count == 0 || positions.Any(value => !Finite(value))) return false;
309
+ foreach (var stream in streams)
310
+ {
311
+ if (stream == null || stream.Length < 3 || stream.Length % 3 != 0 || stream.Any(raw => raw < 0 || raw >= positions.Count)) return false;
312
+ for (var index = 0; index < stream.Length; index += 3)
313
+ if (!Finite(UnityEngine.ProBuilder.Math.Normal(positions[stream[index]], positions[stream[index + 1]], positions[stream[index + 2]]))) return false;
314
+ }
315
+ return true;
316
+ }
317
+
318
+ /// <summary>逐句预演 5.2.4 CalculateTangents 的倒数、方向与 raw 累加;任一步非有限即禁止进入 effect。</summary>
319
+ internal static bool TangentArithmeticFinite(IList<Vector3> positions, IList<Vector2> uvs, IEnumerable<int[]> streams)
320
+ {
321
+ if (positions == null || uvs == null || streams == null || positions.Count == 0 || positions.Count != uvs.Count || positions.Any(value => !Finite(value)) || uvs.Any(value => !Finite(value))) return false;
322
+ var tan1 = new Vector3[positions.Count]; var tan2 = new Vector3[positions.Count];
323
+ foreach (var stream in streams)
324
+ {
325
+ if (stream == null || stream.Length < 3 || stream.Length % 3 != 0 || stream.Any(raw => raw < 0 || raw >= positions.Count)) return false;
326
+ for (var index = 0; index < stream.Length; index += 3)
327
+ {
328
+ var i1 = stream[index]; var i2 = stream[index + 1]; var i3 = stream[index + 2];
329
+ var v1 = positions[i1]; var v2 = positions[i2]; var v3 = positions[i3]; var w1 = uvs[i1]; var w2 = uvs[i2]; var w3 = uvs[i3];
330
+ var x1 = v2.x - v1.x; var x2 = v3.x - v1.x; var y1 = v2.y - v1.y; var y2 = v3.y - v1.y; var z1 = v2.z - v1.z; var z2 = v3.z - v1.z;
331
+ var s1 = w2.x - w1.x; var s2 = w3.x - w1.x; var t1 = w2.y - w1.y; var t2 = w3.y - w1.y; var r = 1.0f / (s1 * t2 - s2 * t1);
332
+ var sdir = new Vector3((t2 * x1 - t1 * x2) * r, (t2 * y1 - t1 * y2) * r, (t2 * z1 - t1 * z2) * r);
333
+ var tdir = new Vector3((s1 * x2 - s2 * x1) * r, (s1 * y2 - s2 * y1) * r, (s1 * z2 - s2 * z1) * r);
334
+ if (!IsFinite(r) || !Finite(sdir) || !Finite(tdir)) return false;
335
+ foreach (var raw in new[] { i1, i2, i3 })
336
+ {
337
+ var next1 = tan1[raw] + sdir; var next2 = tan2[raw] + tdir;
338
+ if (!Finite(next1) || !Finite(next2)) return false;
339
+ tan1[raw] = next1; tan2[raw] = next2;
340
+ }
341
+ }
342
+ }
343
+ return true;
344
+ }
345
+
346
+ /// <summary>统一验证会触发全网格 Refresh 的预测终态;positive smoothing lookup、normal 与 tangent 必须全部有界。</summary>
347
+ internal static bool RefreshArithmeticFinite(CanonicalMeshSnapshot snapshot, bool allowAbsentUv0 = false)
348
+ {
349
+ return snapshot != null && RefreshArithmeticFinite(
350
+ snapshot.RawVertices.Select(raw => raw.LocalPosition).ToArray(),
351
+ snapshot.RawVertices.Select(raw => raw.Uvs[0]).ToArray(),
352
+ snapshot.Faces.Select(face => face.DirectedRawTriangleStream),
353
+ snapshot.Faces.Select(face => face.SmoothingGroup),
354
+ allowAbsentUv0);
355
+ }
356
+ /// <summary>payload-preserving refresh 可接受全缺 UV0;部分缺失仍不是合法的 ProBuilder channel profile。</summary>
357
+ internal static bool RefreshArithmeticFinite(IList<Vector3> positions, IList<ChannelValue> uv0, IEnumerable<int[]> streams, IEnumerable<int> smoothingGroups, bool allowAbsentUv0 = false)
358
+ {
359
+ if (positions == null || uv0 == null || streams == null || smoothingGroups == null || positions.Count != uv0.Count
360
+ || uv0.Any(value => value == null)) return false;
361
+ var allUv0Absent = uv0.All(value => !value.IsPresent);
362
+ if (allUv0Absent ? !allowAbsentUv0 : uv0.Any(value => !value.IsPresent || !Finite(value.Value))) return false;
363
+ var frozenStreams = streams.Select(stream => stream == null ? null : stream.ToArray()).ToArray();
364
+ var groups = smoothingGroups.ToArray();
365
+ var referenced = new HashSet<int>(frozenStreams.Where(stream => stream != null).SelectMany(stream => stream));
366
+ return referenced.Count == positions.Count && referenced.All(raw => raw >= 0 && raw < positions.Count)
367
+ && groups.All(group => group <= ushort.MaxValue)
368
+ && NormalArithmeticFinite(positions, frozenStreams)
369
+ && (allUv0Absent || TangentArithmeticFinite(positions, uv0.Select(value => (Vector2)value.Value).ToArray(), frozenStreams));
370
+ }
371
+
372
+ /// <summary>验证 effect 前预测终态能被 strict canonical capture 完整读取;非逐值相等的 shared 合并、退化三角或非简单边界一律拒绝。</summary>
373
+ internal static bool TerminalTopologyReadable(IList<Vector3> positions, IEnumerable<int[]> streams, IEnumerable<int[]> sharedPartitions)
374
+ {
375
+ if (positions == null || streams == null || sharedPartitions == null || positions.Count == 0 || positions.Any(value => !Finite(value))) return false;
376
+ var handles = Enumerable.Repeat(-1, positions.Count).ToArray();
377
+ var groups = sharedPartitions.Select(group => group == null ? null : group.ToArray()).ToArray();
378
+ for (var handle = 0; handle < groups.Length; handle++)
379
+ {
380
+ var members = groups[handle];
381
+ if (members == null || members.Length == 0) return false;
382
+ var canonical = members[0] < 0 || members[0] >= positions.Count ? Vector3.zero : positions[members[0]];
383
+ if (!Finite(canonical)) return false;
384
+ foreach (var raw in members)
385
+ {
386
+ if (raw < 0 || raw >= positions.Count || handles[raw] >= 0 || !ExactEquals(positions[raw], canonical)) return false;
387
+ handles[raw] = handle;
388
+ }
389
+ }
390
+ if (handles.Any(handle => handle < 0)) return false;
391
+ foreach (var stream in streams)
392
+ {
393
+ if (stream == null || stream.Length < 3 || stream.Length % 3 != 0 || stream.Any(raw => raw < 0 || raw >= positions.Count) || HasDegenerateTriangle(stream, positions)) return false;
394
+ var boundary = CaptureBoundary(stream, handles);
395
+ if (boundary == null || !HasSimpleConnectedBoundary(boundary)) return false;
396
+ }
397
+ return true;
398
+ }
399
+
400
+ /// <summary>逐项移除的 exact multiset/bijection;hash 只能候选加速,绝不能成为最终相等结论。</summary>
401
+ internal static bool ExactMultisetEquals<T>(IEnumerable<T> left, IEnumerable<T> right, Func<T, T, bool> equals)
402
+ {
403
+ if (left == null || right == null || equals == null) return false;
404
+ var leftValues = left.ToArray(); var rightValues = right.ToArray();
405
+ if (leftValues.Length != rightValues.Length) return false;
406
+ var matchedLeftByRight = Enumerable.Repeat(-1, rightValues.Length).ToArray();
407
+ for (var leftIndex = 0; leftIndex < leftValues.Length; leftIndex++)
408
+ if (!TryAugment(leftIndex, leftValues, rightValues, equals, matchedLeftByRight, new bool[rightValues.Length])) return false;
409
+ return true;
410
+ }
411
+ /// <summary>重复值的 multiset 必须用增广路径逐项配对,不能重复消费同一候选。</summary>
412
+ private static bool TryAugment<T>(int leftIndex, T[] left, T[] right, Func<T, T, bool> equals, int[] matchedLeftByRight, bool[] visitedRight)
413
+ {
414
+ for (var rightIndex = 0; rightIndex < right.Length; rightIndex++)
415
+ {
416
+ if (visitedRight[rightIndex] || !equals(left[leftIndex], right[rightIndex])) continue;
417
+ visitedRight[rightIndex] = true;
418
+ if (matchedLeftByRight[rightIndex] < 0 || TryAugment(matchedLeftByRight[rightIndex], left, right, equals, matchedLeftByRight, visitedRight))
419
+ { matchedLeftByRight[rightIndex] = leftIndex; return true; }
420
+ }
421
+ return false;
422
+ }
423
+ /// <summary>跨 snapshot 的面全属性比较只使用 value claim;occurrence/raw/shared 数字均不是稳定身份,三角形列表可重排但保留 winding 与重数。</summary>
424
+ internal static bool FaceFullAttributeEquals(CanonicalMeshSnapshot leftSnapshot, FaceOccurrence left, CanonicalMeshSnapshot rightSnapshot, FaceOccurrence right)
425
+ {
426
+ return leftSnapshot != null && rightSnapshot != null && left != null && right != null && left.SubmeshIndex == right.SubmeshIndex && left.SmoothingGroup == right.SmoothingGroup
427
+ && left.ManualUv == right.ManualUv && left.TextureGroup == right.TextureGroup && left.ElementGroup == right.ElementGroup && MaterialValueEquals(left.Material, right.Material)
428
+ && UvValueEquals(left.Uv, right.Uv) && DirectedTriangleValueMultisetEquals(leftSnapshot, left, rightSnapshot, right) && BoundaryValueMultisetEquals(leftSnapshot, left, rightSnapshot, right);
429
+ }
430
+ /// <summary>auto-smooth 专用比较:忽略会被框架重算的 normal 和请求允许变化的 smoothingGroup,其余 face/vertex 值必须完整相等。</summary>
431
+ internal static bool FaceEqualsIgnoringSmoothingAndNormals(CanonicalMeshSnapshot leftSnapshot, FaceOccurrence left, CanonicalMeshSnapshot rightSnapshot, FaceOccurrence right)
432
+ {
433
+ return leftSnapshot != null && rightSnapshot != null && left != null && right != null && left.SubmeshIndex == right.SubmeshIndex
434
+ && left.ManualUv == right.ManualUv && left.TextureGroup == right.TextureGroup && left.ElementGroup == right.ElementGroup
435
+ && MaterialValueEquals(left.Material, right.Material) && UvValueEquals(left.Uv, right.Uv)
436
+ && DirectedTriangleValueMultisetEqualsIgnoringNormals(leftSnapshot, left, rightSnapshot, right)
437
+ && BoundaryValueMultisetEqualsIgnoringNormals(leftSnapshot, left, rightSnapshot, right);
438
+ }
439
+
440
+ /// <summary>从完整 fresh face multiset 逐一消费每个 effect 前未选面;after occurrence 不稳定,不能再按原数字过滤。</summary>
441
+ internal static bool UnselectedFacesExactlyPreserved(CanonicalMeshSnapshot before, CanonicalMeshSnapshot after, IEnumerable<int> selectedOccurrences)
442
+ {
443
+ if (before == null || after == null || selectedOccurrences == null) return false;
444
+ var selected = new HashSet<int>(selectedOccurrences); var remaining = new List<FaceOccurrence>(after.faces);
445
+ foreach (var source in before.faces.Where(face => !selected.Contains(face.OccurrenceIndex)))
446
+ {
447
+ var index = remaining.FindIndex(candidate => FaceFullAttributeEquals(before, source, after, candidate));
448
+ if (index < 0) return false;
449
+ remaining.RemoveAt(index);
450
+ }
451
+ return true;
452
+ }
453
+ /// <summary>调用方可按操作语义要求 transform 不变;矩阵和 identity 均逐值精确比较。</summary>
454
+ internal static bool TransformMatricesEqual(CanonicalMeshSnapshot left, CanonicalMeshSnapshot right) => left != null && right != null && ExactEquals(left.LocalToWorldMatrix, right.LocalToWorldMatrix) && ExactEquals(left.WorldToLocalMatrix, right.WorldToLocalMatrix);
455
+ /// <summary>不改变对象身份的 mesh operation 必须保持对象、父级、组件、compiled Mesh、场景与 transform identity。</summary>
456
+ internal static bool IdentityAndTransformEqual(CanonicalMeshSnapshot left, CanonicalMeshSnapshot right)
457
+ {
458
+ if (left == null || right == null || left.Identity == null || right.Identity == null) return false;
459
+ var a = left.Identity; var b = right.Identity;
460
+ return a.GameObjectInstanceId == b.GameObjectInstanceId && a.TransformInstanceId == b.TransformInstanceId && a.ParentTransformInstanceId == b.ParentTransformInstanceId
461
+ && a.SceneHandle == b.SceneHandle && a.ProBuilderMeshInstanceId == b.ProBuilderMeshInstanceId && a.MeshFilterInstanceId == b.MeshFilterInstanceId
462
+ && a.MeshRendererInstanceId == b.MeshRendererInstanceId && a.CompiledMeshInstanceId == b.CompiledMeshInstanceId
463
+ && string.Equals(a.GlobalObjectId, b.GlobalObjectId, StringComparison.Ordinal) && string.Equals(a.ScenePath, b.ScenePath, StringComparison.Ordinal)
464
+ && TransformMatricesEqual(left, right);
465
+ }
466
+ /// <summary>renderer slots 按顺序和 material identity 全量比较;face 为零时仍保留该契约。</summary>
467
+ internal static bool RendererMaterialsEqual(CanonicalMeshSnapshot left, CanonicalMeshSnapshot right)
468
+ {
469
+ if (left == null || right == null) return false;
470
+ var a = left.rendererMaterials; var b = right.rendererMaterials;
471
+ return a.Length == b.Length && a.Zip(b, MaterialValueEquals).All(value => value);
472
+ }
473
+
474
+ /// <summary>逐句复演 ProBuilder 5.2.4 Normals.CalculateNormals/CalculateTangents,拒绝 self-consistent 但非 package terminal 的通道。</summary>
475
+ internal static bool DerivedChannelsMatch(CanonicalMeshSnapshot snapshot)
476
+ => DerivedChannelsMatch(snapshot, snapshot == null ? 0 : snapshot.rawVertices.Length);
477
+
478
+ /// <summary>repair 前只允许尾部 raw 未被 face 引用;其通道仍须有限并与 compiled Mesh 精确一致。</summary>
479
+ internal static bool DerivedChannelsMatchReferencedPrefix(CanonicalMeshSnapshot snapshot, int referencedPrefixLength)
480
+ => DerivedChannelsMatch(snapshot, referencedPrefixLength);
481
+
482
+ private static bool DerivedChannelsMatch(CanonicalMeshSnapshot snapshot, int referencedPrefixLength)
483
+ {
484
+ if (snapshot == null) return false;
485
+ var raw = snapshot.rawVertices;
486
+ if (raw.Length == 0) return referencedPrefixLength == 0 && snapshot.faces.Length == 0;
487
+ if (snapshot.faces.Length == 0 || referencedPrefixLength <= 0 || referencedPrefixLength > raw.Length) return false;
488
+ var normals = new Vector3[raw.Length]; var counts = new int[raw.Length]; var smoothingByRaw = new int[raw.Length];
489
+ foreach (var face in snapshot.faces)
490
+ {
491
+ var stream = face.DirectedRawTriangleStream;
492
+ for (var index = 0; index < stream.Length; index += 3)
493
+ {
494
+ var a = stream[index]; var b = stream[index + 1]; var c = stream[index + 2];
495
+ var normal = UnityEngine.ProBuilder.Math.Normal(raw[a].LocalPosition, raw[b].LocalPosition, raw[c].LocalPosition); normal.Normalize();
496
+ if (!Finite(normal)) return false;
497
+ normals[a] += normal; normals[b] += normal; normals[c] += normal; counts[a]++; counts[b]++; counts[c]++;
498
+ }
499
+ foreach (var index in stream.Distinct()) smoothingByRaw[index] = face.SmoothingGroup;
500
+ }
501
+ if (counts.Take(referencedPrefixLength).Any(count => count == 0) || counts.Skip(referencedPrefixLength).Any(count => count != 0)) return false;
502
+ for (var index = 0; index < referencedPrefixLength; index++) normals[index] /= counts[index];
503
+ foreach (var shared in snapshot.sharedVertices)
504
+ {
505
+ var sharedMembers = shared.MemberRawIndexes;
506
+ var smoothGroups = sharedMembers.Where(index => index < referencedPrefixLength).Select(index => smoothingByRaw[index]).Where(group => group > 0 && (group <= 24 || group >= 42)).Distinct().ToArray();
507
+ foreach (var group in smoothGroups)
508
+ {
509
+ var members = sharedMembers.Where(index => index < referencedPrefixLength && smoothingByRaw[index] == group).ToArray();
510
+ var average = members.Aggregate(Vector3.zero, (sum, index) => sum + normals[index]) / members.Length;
511
+ average = EnsureUnitVector(average);
512
+ foreach (var index in members) normals[index] = average;
513
+ }
514
+ }
515
+ for (var index = 0; index < raw.Length; index++)
516
+ {
517
+ var actual = raw[index].LocalNormal;
518
+ if (actual == null || !actual.IsPresent || !Finite(actual.Value) || index < referencedPrefixLength && !ExactEquals(actual.Value, (Vector4)normals[index])) return false;
519
+ }
520
+
521
+ var uv0 = raw.Select(value => value.Uvs[0]).ToArray();
522
+ if (uv0.All(value => !value.IsPresent))
523
+ return raw.Select((value, index) => value.Tangent != null && value.Tangent.IsPresent && Finite(value.Tangent.Value) && (index >= referencedPrefixLength || ExactEquals(value.Tangent.Value, Vector4.zero))).All(value => value);
524
+ if (uv0.Any(value => !value.IsPresent)) return false;
525
+ var tan1 = new Vector3[raw.Length]; var tan2 = new Vector3[raw.Length];
526
+ foreach (var face in snapshot.faces)
527
+ {
528
+ var stream = face.DirectedRawTriangleStream;
529
+ for (var index = 0; index < stream.Length; index += 3)
530
+ {
531
+ var a = stream[index]; var b = stream[index + 1]; var c = stream[index + 2];
532
+ var v1 = raw[a].LocalPosition; var v2 = raw[b].LocalPosition; var v3 = raw[c].LocalPosition;
533
+ var w1 = uv0[a].Value; var w2 = uv0[b].Value; var w3 = uv0[c].Value;
534
+ var x1 = v2.x - v1.x; var x2 = v3.x - v1.x; var y1 = v2.y - v1.y; var y2 = v3.y - v1.y; var z1 = v2.z - v1.z; var z2 = v3.z - v1.z;
535
+ var s1 = w2.x - w1.x; var s2 = w3.x - w1.x; var t1 = w2.y - w1.y; var t2 = w3.y - w1.y; var reciprocal = 1f / (s1 * t2 - s2 * t1);
536
+ var sdir = new Vector3((t2 * x1 - t1 * x2) * reciprocal, (t2 * y1 - t1 * y2) * reciprocal, (t2 * z1 - t1 * z2) * reciprocal);
537
+ var tdir = new Vector3((s1 * x2 - s2 * x1) * reciprocal, (s1 * y2 - s2 * y1) * reciprocal, (s1 * z2 - s2 * z1) * reciprocal);
538
+ tan1[a] += sdir; tan1[b] += sdir; tan1[c] += sdir; tan2[a] += tdir; tan2[b] += tdir; tan2[c] += tdir;
539
+ }
540
+ }
541
+ for (var index = 0; index < raw.Length; index++)
542
+ {
543
+ var actual = raw[index].Tangent;
544
+ if (actual == null || !actual.IsPresent || !Finite(actual.Value)) return false;
545
+ if (index >= referencedPrefixLength) continue;
546
+ var normal = normals[index]; var tangent = EnsureUnitVector(tan1[index]); Vector3.OrthoNormalize(ref normal, ref tangent);
547
+ var expected = new Vector4(tangent.x, tangent.y, tangent.z, Vector3.Dot(Vector3.Cross(normal, tangent), tan2[index]) < 0f ? -1f : 1f);
548
+ if (!Finite(expected) || !ExactEquals(actual.Value, expected)) return false;
549
+ }
550
+ return true;
551
+ }
552
+
553
+ private static Vector3 EnsureUnitVector(Vector3 value) => Mathf.Abs(value.sqrMagnitude) < float.Epsilon ? Vector3.up : value.normalized;
554
+
555
+ /// <summary>terminal 数值逐分量精确相等;非有限值一律拒绝。</summary>
556
+ internal static bool ExactEquals(float left, float right) => IsFinite(left) && IsFinite(right) && left == right;
557
+ internal static bool ExactEquals(Vector2 left, Vector2 right) => ExactEquals(left.x, right.x) && ExactEquals(left.y, right.y);
558
+ internal static bool ExactEquals(Vector3 left, Vector3 right) => ExactEquals(left.x, right.x) && ExactEquals(left.y, right.y) && ExactEquals(left.z, right.z);
559
+ internal static bool ExactEquals(Vector4 left, Vector4 right) => ExactEquals(left.x, right.x) && ExactEquals(left.y, right.y) && ExactEquals(left.z, right.z) && ExactEquals(left.w, right.w);
560
+ internal static bool ExactEquals(Matrix4x4 left, Matrix4x4 right) { for (var i = 0; i < 16; i++) if (!ExactEquals(left[i], right[i])) return false; return true; }
561
+
562
+ /// <summary>null 表示整网格操作;空数组表示只捕获拓扑而不声明任何被请求消费的面。</summary>
563
+ private static int[] SelectOccurrences(int count, int[] requested) => requested == null ? Enumerable.Range(0, count).ToArray() : requested.Distinct().Count() != requested.Length || requested.Any(index => index < 0 || index >= count) ? null : requested.ToArray();
564
+
565
+ /// <summary>完整捕获 compiled Mesh,并证明它是当前 raw/face/material 状态的精确三角形投影。</summary>
566
+ private static CompiledMeshSnapshot CaptureCompiledMesh(Mesh mesh, MeshRenderer renderer, RawVertex[] raw, FaceOccurrence[] faceValues, bool allowEmptyMesh)
567
+ {
568
+ try
569
+ {
570
+ if (mesh == null || renderer == null || raw == null || faceValues == null || mesh.vertexCount != raw.Length) return null;
571
+ var expectedIndexFormat = raw.Length > ushort.MaxValue ? UnityEngine.Rendering.IndexFormat.UInt32 : UnityEngine.Rendering.IndexFormat.UInt16;
572
+ if (mesh.indexFormat != expectedIndexFormat) return null;
573
+ var positions = mesh.vertices; var normals = mesh.normals; var tangents = mesh.tangents; var colors = mesh.colors;
574
+ if (!CompiledPositionsMatch(positions, raw) || !CompiledChannelMatches(normals, raw.Select(value => value.LocalNormal).ToArray())
575
+ || !CompiledChannelMatches(tangents, raw.Select(value => value.Tangent).ToArray()) || !CompiledChannelMatches(colors, raw.Select(value => value.Color).ToArray())) return null;
576
+ var uvs = new Vector4[4][];
577
+ for (var channel = 0; channel < 4; channel++) { var values = new List<Vector4>(); mesh.GetUVs(channel, values); uvs[channel] = values.ToArray(); if (!CompiledChannelMatches(uvs[channel], raw.Select(value => value.Uvs[channel]).ToArray())) return null; }
578
+
579
+ var materials = renderer.sharedMaterials;
580
+ if (raw.Length == 0 && faceValues.Length == 0 && allowEmptyMesh)
581
+ {
582
+ if (mesh.subMeshCount != 0 || positions.Length != 0 || !BoundsEqual(mesh.bounds, new Bounds(Vector3.zero, Vector3.zero))) return null;
583
+ return new CompiledMeshSnapshot(mesh, positions, normals, tangents, colors, uvs, Array.Empty<CompiledSubmeshSnapshot>());
584
+ }
585
+ if (faceValues.Length == 0 || materials == null || materials.Length == 0 || mesh.subMeshCount != materials.Length
586
+ || faceValues.Any(face => face.SubmeshIndex < 0 || face.SubmeshIndex >= materials.Length)
587
+ || Enumerable.Range(0, materials.Length).Any(slot => !faceValues.Any(face => face.SubmeshIndex == slot))) return null;
588
+ var submeshes = new CompiledSubmeshSnapshot[mesh.subMeshCount];
589
+ for (var slot = 0; slot < submeshes.Length; slot++)
590
+ {
591
+ var topology = mesh.GetTopology(slot); var indexes = mesh.GetIndices(slot); var expected = faceValues.Where(face => face.SubmeshIndex == slot).SelectMany(face => face.DirectedRawTriangleStream).ToArray();
592
+ if (topology != MeshTopology.Triangles || !indexes.SequenceEqual(expected)) return null;
593
+ submeshes[slot] = new CompiledSubmeshSnapshot(topology, indexes);
594
+ }
595
+ var expectedBounds = BoundsFromPositions(raw.Select(value => value.LocalPosition).ToArray());
596
+ return expectedBounds.HasValue && BoundsEqual(mesh.bounds, expectedBounds.Value) ? new CompiledMeshSnapshot(mesh, positions, normals, tangents, colors, uvs, submeshes) : null;
597
+ }
598
+ catch { return null; }
599
+ }
600
+
601
+ /// <summary>ToMesh 使用 serialized m_Mesh;它必须与当前 MeshFilter.sharedMesh 为同一对象,禁止 barrier 后隐式换绑。</summary>
602
+ private static bool CompiledMeshBindingMatches(ProBuilderMesh mesh, Mesh compiledMesh)
603
+ {
604
+ try
605
+ {
606
+ var field = typeof(ProBuilderMesh).GetField("m_Mesh", BindingFlags.Instance | BindingFlags.NonPublic);
607
+ return mesh != null && compiledMesh != null && field != null && field.FieldType == typeof(Mesh) && ReferenceEquals(field.GetValue(mesh), compiledMesh);
608
+ }
609
+ catch { return false; }
610
+ }
611
+
612
+ private static bool CompiledPositionsMatch(IList<Vector3> actual, IList<RawVertex> expected)
613
+ => actual != null && expected != null && actual.Count == expected.Count && actual.Select((value, index) => Finite(value) && ExactEquals(value, expected[index].LocalPosition)).All(value => value);
614
+ private static bool CompiledChannelMatches(IList<Vector3> actual, IList<ChannelValue> expected)
615
+ => CompiledChannelMatches(actual == null ? null : actual.Select(value => (Vector4)value).ToArray(), expected);
616
+ private static bool CompiledChannelMatches(IList<Vector4> actual, IList<ChannelValue> expected)
617
+ {
618
+ if (actual == null || expected == null || expected.Any(value => value == null)) return false;
619
+ if (expected.All(value => !value.IsPresent)) return actual.Count == 0;
620
+ return expected.All(value => value.IsPresent) && actual.Count == expected.Count && actual.Select((value, index) => Finite(value) && ExactEquals(value, expected[index].Value)).All(value => value);
621
+ }
622
+ private static bool CompiledChannelMatches(IList<Color> actual, IList<ChannelValue> expected)
623
+ => CompiledChannelMatches(actual == null ? null : actual.Select(value => new Vector4(value.r, value.g, value.b, value.a)).ToArray(), expected);
624
+ private static Bounds? BoundsFromPositions(IList<Vector3> positions)
625
+ {
626
+ if (positions == null || positions.Count == 0 || positions.Any(value => !Finite(value))) return null;
627
+ var bounds = new Bounds(positions[0], Vector3.zero); for (var index = 1; index < positions.Count; index++) bounds.Encapsulate(positions[index]); return bounds;
628
+ }
629
+ private static bool BoundsEqual(Bounds left, Bounds right) => ExactEquals(left.center, right.center) && ExactEquals(left.size, right.size);
630
+
631
+ private static ChannelValue[] ReadOptional(IList<Vector3> values, int count)
632
+ {
633
+ if (values == null || values.Count == 0) return Enumerable.Range(0, count).Select(_ => new ChannelValue(false, Vector4.zero)).ToArray();
634
+ if (values.Count != count || values.Any(value => !Finite(value))) return null;
635
+ return values.Select(value => new ChannelValue(true, value)).ToArray();
636
+ }
637
+ private static ChannelValue[] ReadOptional(IList<Vector4> values, int count)
638
+ {
639
+ if (values == null || values.Count == 0) return Enumerable.Range(0, count).Select(_ => new ChannelValue(false, Vector4.zero)).ToArray();
640
+ if (values.Count != count || values.Any(value => !Finite(value))) return null;
641
+ return values.Select(value => new ChannelValue(true, value)).ToArray();
642
+ }
643
+ private static ChannelValue[] ReadOptional(IList<Color> values, int count)
644
+ {
645
+ if (values == null || values.Count == 0) return Enumerable.Range(0, count).Select(_ => new ChannelValue(false, Vector4.zero)).ToArray();
646
+ if (values.Count != count || values.Any(value => !Finite(value))) return null;
647
+ return values.Select(value => new ChannelValue(true, new Vector4(value.r, value.g, value.b, value.a))).ToArray();
648
+ }
649
+ private static ChannelValue[] Channel(IEnumerable<Vector4> source, int count)
650
+ {
651
+ var values = source == null ? Array.Empty<Vector4>() : source.ToArray();
652
+ if (values.Length != 0 && values.Length != count || values.Any(value => !Finite(value))) return null;
653
+ return Enumerable.Range(0, count).Select(index => new ChannelValue(values.Length == count, values.Length == count ? values[index] : Vector4.zero)).ToArray();
654
+ }
655
+ private static ChannelValue[][] ReadUvChannels(ProBuilderMesh mesh, GameObject go, int count)
656
+ {
657
+ try
658
+ {
659
+ var result = new ChannelValue[4][];
660
+ result[0] = Channel(mesh.textures?.Select(value => (Vector4)value), count);
661
+ var unityMesh = go.GetComponent<MeshFilter>()?.sharedMesh;
662
+ result[1] = Channel(unityMesh == null || unityMesh.uv2 == null ? null : unityMesh.uv2.Select(value => (Vector4)value), count);
663
+ for (var channel = 2; channel <= 3; channel++)
664
+ {
665
+ var values = new List<Vector4>(); mesh.GetUVs(channel, values); result[channel] = Channel(values, count);
666
+ }
667
+ return result.Any(values => values == null) ? null : result;
668
+ }
669
+ catch { return null; }
670
+ }
671
+ private static bool TryReadSharedTextures(ProBuilderMesh mesh, int count, out bool present, out SharedTextureSnapshot[] groups)
672
+ {
673
+ present = false; groups = null;
674
+ try
675
+ {
676
+ var property = typeof(ProBuilderMesh).GetProperty("sharedTextures", BindingFlags.Instance | BindingFlags.NonPublic);
677
+ if (property == null) return false;
678
+ var values = property.GetValue(mesh) as IEnumerable<SharedVertex>;
679
+ if (values == null) { groups = Array.Empty<SharedTextureSnapshot>(); return true; }
680
+ present = true; var seen = new HashSet<int>(); var result = new List<SharedTextureSnapshot>(); var groupIndex = 0;
681
+ foreach (var value in values)
682
+ {
683
+ if (value == null || value.Count == 0) return false;
684
+ var members = value.ToArray();
685
+ if (members.Any(raw => raw < 0 || raw >= count || !seen.Add(raw))) return false;
686
+ result.Add(new SharedTextureSnapshot(groupIndex++, members));
687
+ }
688
+ groups = result.ToArray(); return true;
689
+ }
690
+ catch { return false; }
691
+ }
692
+ /// <summary>从有向 triangle half-edge 消除内部反向边;不访问 Face.edges cache,并保留 boundary 方向与异常重数。</summary>
693
+ private static BoundaryReference[] CaptureBoundary(int[] triangles, int[] handles, bool allowCollapsedSharedEdges = false)
694
+ {
695
+ if (triangles == null || triangles.Length < 3 || triangles.Length % 3 != 0) return null;
696
+ var grouped = new Dictionary<ulong, List<BoundaryReference>>();
697
+ for (var index = 0; index < triangles.Length; index += 3)
698
+ {
699
+ foreach (var pair in new[] { new[] { triangles[index], triangles[index + 1] }, new[] { triangles[index + 1], triangles[index + 2] }, new[] { triangles[index + 2], triangles[index] } })
700
+ {
701
+ var rawA = pair[0]; var rawB = pair[1];
702
+ if (rawA < 0 || rawB < 0 || rawA >= handles.Length || rawB >= handles.Length || rawA == rawB || (!allowCollapsedSharedEdges && handles[rawA] == handles[rawB])) return null;
703
+ var min = System.Math.Min(rawA, rawB); var max = System.Math.Max(rawA, rawB); var key = ((ulong)(uint)min << 32) | (uint)max;
704
+ if (!grouped.TryGetValue(key, out var values)) grouped.Add(key, values = new List<BoundaryReference>());
705
+ values.Add(new BoundaryReference(rawA, rawB, handles[rawA], handles[rawB]));
706
+ }
707
+ }
708
+ var result = new List<BoundaryReference>();
709
+ foreach (var values in grouped.Values)
710
+ {
711
+ if (values.Count == 1) { result.Add(values[0]); continue; }
712
+ if (values.Count != 2 || values[0].RawA != values[1].RawB || values[0].RawB != values[1].RawA) return null;
713
+ }
714
+ return result.ToArray();
715
+ }
716
+ private static bool HasSimpleConnectedBoundary(IList<BoundaryReference> boundary)
717
+ {
718
+ if (boundary == null || boundary.Count < 3) return false;
719
+ var outgoing = new Dictionary<int, int>(); var incoming = new Dictionary<int, int>(); var unique = new HashSet<ulong>();
720
+ foreach (var edge in boundary)
721
+ {
722
+ var min = System.Math.Min(edge.SharedA, edge.SharedB); var max = System.Math.Max(edge.SharedA, edge.SharedB); var key = ((ulong)(uint)min << 32) | (uint)max;
723
+ if (!unique.Add(key) || outgoing.ContainsKey(edge.SharedA) || incoming.ContainsKey(edge.SharedB)) return false;
724
+ outgoing.Add(edge.SharedA, edge.SharedB); incoming.Add(edge.SharedB, edge.SharedA);
725
+ }
726
+ if (outgoing.Count < 3 || outgoing.Count != incoming.Count || outgoing.Keys.Any(vertex => !incoming.ContainsKey(vertex))) return false;
727
+ var start = outgoing.Keys.First(); var current = start; var visited = new HashSet<int>();
728
+ do { if (!visited.Add(current) || !outgoing.TryGetValue(current, out current)) return false; } while (current != start);
729
+ return visited.Count == outgoing.Count && unique.Count == boundary.Count;
730
+ }
731
+ private static SharedEdgeOccurrence[] BuildEdges(IEnumerable<FaceOccurrence> faceValues)
732
+ {
733
+ var groups = new Dictionary<ulong, List<BoundaryIncidence>>();
734
+ foreach (var face in faceValues) foreach (var edge in face.Boundary)
735
+ {
736
+ var min = System.Math.Min(edge.SharedA, edge.SharedB); var max = System.Math.Max(edge.SharedA, edge.SharedB); var key = ((ulong)(uint)min << 32) | (uint)max;
737
+ if (!groups.TryGetValue(key, out var incidences)) groups.Add(key, incidences = new List<BoundaryIncidence>());
738
+ incidences.Add(new BoundaryIncidence(face.OccurrenceIndex, edge));
739
+ }
740
+ return groups.Select(pair => new SharedEdgeOccurrence(System.Math.Min(pair.Value[0].SharedA, pair.Value[0].SharedB), System.Math.Max(pair.Value[0].SharedA, pair.Value[0].SharedB), pair.Value)).ToArray();
741
+ }
742
+ private static bool DirectedTriangleValueMultisetEquals(CanonicalMeshSnapshot leftSnapshot, FaceOccurrence left, CanonicalMeshSnapshot rightSnapshot, FaceOccurrence right)
743
+ {
744
+ var leftTriangles = SplitTriangles(left.DirectedSharedTriangleStream); var rightTriangles = SplitTriangles(right.DirectedSharedTriangleStream);
745
+ return ExactMultisetEquals(leftTriangles, rightTriangles, (a, b) => DirectedSharedValueCyclicEquals(leftSnapshot, a, rightSnapshot, b));
746
+ }
747
+ private static bool BoundaryValueMultisetEquals(CanonicalMeshSnapshot leftSnapshot, FaceOccurrence left, CanonicalMeshSnapshot rightSnapshot, FaceOccurrence right)
748
+ {
749
+ return ExactMultisetEquals(left.Boundary, right.Boundary, (a, b) => SharedVertexValueEquals(leftSnapshot, a.SharedA, rightSnapshot, b.SharedA)
750
+ && SharedVertexValueEquals(leftSnapshot, a.SharedB, rightSnapshot, b.SharedB));
751
+ }
752
+ private static bool DirectedSharedValueCyclicEquals(CanonicalMeshSnapshot leftSnapshot, int[] left, CanonicalMeshSnapshot rightSnapshot, int[] right)
753
+ {
754
+ for (var offset = 0; offset < 3; offset++) if (SharedVertexValueEquals(leftSnapshot, left[0], rightSnapshot, right[offset]) && SharedVertexValueEquals(leftSnapshot, left[1], rightSnapshot, right[(offset + 1) % 3]) && SharedVertexValueEquals(leftSnapshot, left[2], rightSnapshot, right[(offset + 2) % 3])) return true;
755
+ return false;
756
+ }
757
+ /// <summary>跨快照 shared vertex 值比较包含规范位置和全部 raw member channel multiset,不比较 handle/raw 数字。</summary>
758
+ /// <summary>纯只读镜像 ProBuilder 5.2.4 Normals.CalculateHardNormals;不调用 Refresh/GetNormals,也不修改 mesh 缓存。</summary>
759
+ internal bool TryCalculateHardNormals(out Vector3[] normals)
760
+ {
761
+ normals = null;
762
+ var sums = new Vector3[rawVertices.Length]; var counts = new int[rawVertices.Length];
763
+ foreach (var face in faces)
764
+ {
765
+ var stream = face.DirectedRawTriangleStream;
766
+ for (var index = 0; index < stream.Length; index += 3)
767
+ {
768
+ var a = stream[index]; var b = stream[index + 1]; var c = stream[index + 2];
769
+ var cross = UnityEngine.ProBuilder.Math.Normal(rawVertices[a].LocalPosition, rawVertices[b].LocalPosition, rawVertices[c].LocalPosition);
770
+ cross.Normalize();
771
+ sums[a] += cross; sums[b] += cross; sums[c] += cross; counts[a]++; counts[b]++; counts[c]++;
772
+ }
773
+ }
774
+ if (counts.Any(count => count == 0)) return false;
775
+ var calculated = new Vector3[rawVertices.Length];
776
+ for (var index = 0; index < calculated.Length; index++)
777
+ {
778
+ calculated[index] = sums[index] / counts[index];
779
+ if (!Finite(calculated[index])) return false;
780
+ }
781
+ normals = calculated;
782
+ return true;
783
+ }
784
+
785
+ /// <summary>
786
+ /// 只读镜像 ProBuilder 5.2.4 Normals.CalculateNormals,并把即将由 ApplySmoothingGroups 清零的 face occurrence 视为 smoothing none。
787
+ /// 输入必须来自同一 canonical snapshot;输出是 effect 前可冻结的 raw normal 终态,不读取或写入 Unity mesh cache。
788
+ /// </summary>
789
+ internal bool TryCalculateNormalsAfterSmoothingReset(ISet<int> resetOccurrences, out Vector3[] normals)
790
+ {
791
+ normals = null;
792
+ if (resetOccurrences == null || resetOccurrences.Any(occurrence => !faces.Any(face => face.OccurrenceIndex == occurrence))
793
+ || !TryCalculateHardNormals(out var calculated)) return false;
794
+
795
+ var smoothingByRaw = new int[rawVertices.Length];
796
+ var smoothGroupMax = 24;
797
+ foreach (var face in faces)
798
+ {
799
+ var group = resetOccurrences.Contains(face.OccurrenceIndex) ? 0 : face.SmoothingGroup;
800
+ if (group > ushort.MaxValue) return false;
801
+ foreach (var raw in face.DirectedRawTriangleStream.Distinct())
802
+ {
803
+ if (raw < 0 || raw >= smoothingByRaw.Length) return false;
804
+ smoothingByRaw[raw] = group;
805
+ }
806
+ if (group >= smoothGroupMax) smoothGroupMax = group + 1;
807
+ }
808
+
809
+ foreach (var shared in sharedVertices)
810
+ {
811
+ var smoothAverage = new Vector3[smoothGroupMax];
812
+ var smoothAverageCount = new float[smoothGroupMax];
813
+ foreach (var raw in shared.MemberRawIndexes)
814
+ {
815
+ if (raw < 0 || raw >= calculated.Length) return false;
816
+ var group = smoothingByRaw[raw];
817
+ if (group <= 0 || (group > 24 && group < 42)) continue;
818
+ smoothAverage[group] += calculated[raw];
819
+ smoothAverageCount[group] += 1f;
820
+ }
821
+ foreach (var raw in shared.MemberRawIndexes)
822
+ {
823
+ var group = smoothingByRaw[raw];
824
+ if (group <= 0 || (group > 24 && group < 42)) continue;
825
+ if (smoothAverageCount[group] <= 0f) return false;
826
+ calculated[raw] = EnsureUnitVector(smoothAverage[group] / smoothAverageCount[group]);
827
+ if (!Finite(calculated[raw])) return false;
828
+ }
829
+ }
830
+
831
+ normals = calculated;
832
+ return true;
833
+ }
834
+
835
+ internal static bool SharedVertexValueEquals(CanonicalMeshSnapshot leftSnapshot, int leftHandle, CanonicalMeshSnapshot rightSnapshot, int rightHandle)
836
+ {
837
+ var left = leftSnapshot.sharedVertices.FirstOrDefault(value => value.Handle == leftHandle); var right = rightSnapshot.sharedVertices.FirstOrDefault(value => value.Handle == rightHandle);
838
+ if (!SharedVertexBaseValueEquals(leftSnapshot, left, rightSnapshot, right)) return false;
839
+ return leftSnapshot.sharedVertices.Count(candidate => SharedVertexBaseValueEquals(leftSnapshot, candidate, rightSnapshot, right)) == 1
840
+ && rightSnapshot.sharedVertices.Count(candidate => SharedVertexBaseValueEquals(leftSnapshot, left, rightSnapshot, candidate)) == 1;
841
+ }
842
+ private static bool SharedVertexBaseValueEquals(CanonicalMeshSnapshot leftSnapshot, SharedVertexSnapshot left, CanonicalMeshSnapshot rightSnapshot, SharedVertexSnapshot right)
843
+ {
844
+ return leftSnapshot != null && rightSnapshot != null && left != null && right != null && ExactEquals(left.CanonicalPosition, right.CanonicalPosition)
845
+ && ExactMultisetEquals(left.MemberRawIndexes.Select(raw => leftSnapshot.rawVertices[raw]), right.MemberRawIndexes.Select(raw => rightSnapshot.rawVertices[raw]), RawChannelValueEquals);
846
+ }
847
+ /// <summary>跨快照稳定 raw payload 仅含 authoritative color/UV;normal/tangent cache 可由 Refresh 合法重建。</summary>
848
+ internal static bool RawChannelValueEquals(RawVertex left, RawVertex right) => RawChannelValueEqualsIgnoringNormal(left, right);
849
+ internal static bool RawChannelValueEqualsIgnoringNormal(RawVertex left, RawVertex right)
850
+ {
851
+ if (left == null || right == null || !ChannelValueEquals(left.Color, right.Color)) return false;
852
+ var leftUvs = left.Uvs; var rightUvs = right.Uvs;
853
+ return leftUvs.Length == rightUvs.Length && leftUvs.Zip(rightUvs, ChannelValueEquals).All(value => value);
854
+ }
855
+ internal static bool ChannelValueEquals(ChannelValue left, ChannelValue right) => left != null && right != null && left.IsPresent == right.IsPresent && (!left.IsPresent || ExactEquals(left.Value, right.Value));
856
+ private static bool DirectedTriangleValueMultisetEqualsIgnoringNormals(CanonicalMeshSnapshot leftSnapshot, FaceOccurrence left, CanonicalMeshSnapshot rightSnapshot, FaceOccurrence right)
857
+ {
858
+ return ExactMultisetEquals(SplitTriangles(left.DirectedSharedTriangleStream), SplitTriangles(right.DirectedSharedTriangleStream),
859
+ (a, b) => DirectedSharedValueCyclicEqualsIgnoringNormals(leftSnapshot, a, rightSnapshot, b));
860
+ }
861
+ private static bool BoundaryValueMultisetEqualsIgnoringNormals(CanonicalMeshSnapshot leftSnapshot, FaceOccurrence left, CanonicalMeshSnapshot rightSnapshot, FaceOccurrence right)
862
+ {
863
+ return ExactMultisetEquals(left.Boundary, right.Boundary, (a, b) => SharedVertexValueEqualsIgnoringNormal(leftSnapshot, a.SharedA, rightSnapshot, b.SharedA)
864
+ && SharedVertexValueEqualsIgnoringNormal(leftSnapshot, a.SharedB, rightSnapshot, b.SharedB));
865
+ }
866
+ private static bool DirectedSharedValueCyclicEqualsIgnoringNormals(CanonicalMeshSnapshot leftSnapshot, int[] left, CanonicalMeshSnapshot rightSnapshot, int[] right)
867
+ {
868
+ for (var offset = 0; offset < 3; offset++)
869
+ if (SharedVertexValueEqualsIgnoringNormal(leftSnapshot, left[0], rightSnapshot, right[offset])
870
+ && SharedVertexValueEqualsIgnoringNormal(leftSnapshot, left[1], rightSnapshot, right[(offset + 1) % 3])
871
+ && SharedVertexValueEqualsIgnoringNormal(leftSnapshot, left[2], rightSnapshot, right[(offset + 2) % 3])) return true;
872
+ return false;
873
+ }
874
+ private static bool SharedVertexValueEqualsIgnoringNormal(CanonicalMeshSnapshot leftSnapshot, int leftHandle, CanonicalMeshSnapshot rightSnapshot, int rightHandle)
875
+ => SharedVertexValueEquals(leftSnapshot, leftHandle, rightSnapshot, rightHandle);
876
+ private static int[][] SplitTriangles(int[] stream) { var result = new List<int[]>(); for (var index = 0; index < stream.Length; index += 3) result.Add(new[] { stream[index], stream[index + 1], stream[index + 2] }); return result.ToArray(); }
877
+ private static MaterialClaim CaptureMaterial(Renderer renderer, Material[] materials, int rawSubmeshIndex)
878
+ {
879
+ if (renderer == null) return new MaterialClaim(MaterialState.RendererMissing, -1, 0, false, null, 0);
880
+ if (materials == null || materials.Length == 0) return new MaterialClaim(MaterialState.NoSlots, -1, 0, false, null, 0);
881
+ return CaptureMaterialSlot(materials[Mathf.Clamp(rawSubmeshIndex, 0, materials.Length - 1)], Mathf.Clamp(rawSubmeshIndex, 0, materials.Length - 1));
882
+ }
883
+ /// <summary>把 5.2.4 Face 当前序列化的 material 值附加到 effective renderer slot claim。</summary>
884
+ internal static MaterialClaim WithSerializedFaceMaterial(MaterialClaim effective, Material material)
885
+ {
886
+ if (effective == null) return null;
887
+ var serialized = CaptureMaterialSlot(material, -1);
888
+ return new MaterialClaim(effective.State, effective.EffectiveSlot, effective.InstanceId, effective.HasAssetIdentity, effective.AssetGuid, effective.AssetLocalId, serialized);
889
+ }
890
+ internal static MaterialClaim WithSerializedFaceMaterialFromFace(MaterialClaim effective, Face face)
891
+ {
892
+ var field = typeof(Face).GetField("m_Material", BindingFlags.Instance | BindingFlags.NonPublic);
893
+ return effective == null || face == null || field == null || field.FieldType != typeof(Material) ? null : WithSerializedFaceMaterial(effective, field.GetValue(face) as Material);
894
+ }
895
+ /// <summary>Combine 只重映射 effective renderer slot;material identity 与序列化 face material 必须原样保留。</summary>
896
+ internal static MaterialClaim WithEffectiveSlot(MaterialClaim source, int effectiveSlot)
897
+ {
898
+ return source == null ? null : new MaterialClaim(source.State, effectiveSlot, source.InstanceId, source.HasAssetIdentity, source.AssetGuid, source.AssetLocalId, source.SerializedFaceMaterial);
899
+ }
900
+ /// <summary>renderer material slot 独立于 face 捕获,空 mesh 也不能丢失 slot identity。</summary>
901
+ private static MaterialClaim CaptureMaterialSlot(Material material, int slot)
902
+ {
903
+ if (material == null) return new MaterialClaim(MaterialState.Null, slot, 0, false, null, 0);
904
+ var hasAsset = AssetDatabase.TryGetGUIDAndLocalFileIdentifier(material, out string guid, out long localId);
905
+ return new MaterialClaim(MaterialState.Object, slot, material.GetInstanceID(), hasAsset, hasAsset ? guid : null, hasAsset ? localId : 0);
906
+ }
907
+ private static int? ReadElementGroup(Face face) { var field = typeof(Face).GetField("elementGroup", BindingFlags.Instance | BindingFlags.NonPublic); return field == null || !(field.GetValue(face) is int value) ? (int?)null : value; }
908
+ private static bool HasDegenerateTriangle(int[] triangles, IList<Vector3> positions) { for (var index = 0; index < triangles.Length; index += 3) if (!(UnityEngine.ProBuilder.Math.TriangleArea(positions[triangles[index]], positions[triangles[index + 1]], positions[triangles[index + 2]]) > Mathf.Epsilon)) return true; return false; }
909
+ internal static bool MaterialValueEquals(MaterialClaim left, MaterialClaim right)
910
+ {
911
+ if (!MaterialIdentityEquals(left, right)) return false;
912
+ if (left.SerializedFaceMaterial == null || right.SerializedFaceMaterial == null)
913
+ return left.SerializedFaceMaterial == null && right.SerializedFaceMaterial == null;
914
+ return MaterialIdentityEquals(left.SerializedFaceMaterial, right.SerializedFaceMaterial);
915
+ }
916
+ internal static bool EffectiveMaterialMatches(MaterialClaim actual, Material expected)
917
+ => actual != null && MaterialIdentityMatches(actual, expected);
918
+ internal static bool SerializedFaceMaterialValueEquals(MaterialClaim left, MaterialClaim right)
919
+ {
920
+ if (left?.SerializedFaceMaterial == null || right?.SerializedFaceMaterial == null)
921
+ return left?.SerializedFaceMaterial == null && right?.SerializedFaceMaterial == null;
922
+ return MaterialIdentityEquals(left.SerializedFaceMaterial, right.SerializedFaceMaterial);
923
+ }
924
+ internal static bool SerializedFaceMaterialMatches(MaterialClaim actual, Material expected)
925
+ => actual?.SerializedFaceMaterial != null && MaterialIdentityMatches(actual.SerializedFaceMaterial, expected);
926
+ private static bool MaterialIdentityEquals(MaterialClaim left, MaterialClaim right)
927
+ {
928
+ if (left == null || right == null || left.State != right.State || left.EffectiveSlot != right.EffectiveSlot) return false;
929
+ if (left.State != MaterialState.Object) return true;
930
+ if (left.HasAssetIdentity || right.HasAssetIdentity) return left.HasAssetIdentity && right.HasAssetIdentity && left.AssetGuid == right.AssetGuid && left.AssetLocalId == right.AssetLocalId;
931
+ return left.InstanceId == right.InstanceId;
932
+ }
933
+ private static bool MaterialIdentityMatches(MaterialClaim actual, Material expected)
934
+ {
935
+ if (actual == null || actual.EffectiveSlot < -1) return false;
936
+ if (expected == null) return actual.State == MaterialState.Null;
937
+ if (actual.State != MaterialState.Object) return false;
938
+ var hasAsset = AssetDatabase.TryGetGUIDAndLocalFileIdentifier(expected, out string guid, out long localId);
939
+ return hasAsset ? actual.HasAssetIdentity && actual.AssetGuid == guid && actual.AssetLocalId == localId : !actual.HasAssetIdentity && actual.InstanceId == expected.GetInstanceID();
940
+ }
941
+ internal static bool UvValueEquals(AutoUnwrapSettings left, AutoUnwrapSettings right) => left.useWorldSpace == right.useWorldSpace && left.flipU == right.flipU && left.flipV == right.flipV && left.swapUV == right.swapUV && left.fill == right.fill && left.anchor == right.anchor && ExactEquals(left.scale, right.scale) && ExactEquals(left.offset, right.offset) && ExactEquals(left.rotation, right.rotation);
942
+ private static bool Finite(AutoUnwrapSettings value) => Finite(value.scale) && Finite(value.offset) && IsFinite(value.rotation);
943
+ private static bool Finite(Matrix4x4 value) { for (var index = 0; index < 16; index++) if (!IsFinite(value[index])) return false; return true; }
944
+ private static bool Finite(Vector2 value) => IsFinite(value.x) && IsFinite(value.y);
945
+ private static bool Finite(Vector3 value) => IsFinite(value.x) && IsFinite(value.y) && IsFinite(value.z);
946
+ private static bool Finite(Vector4 value) => IsFinite(value.x) && IsFinite(value.y) && IsFinite(value.z) && IsFinite(value.w);
947
+ private static bool Finite(Color value) => IsFinite(value.r) && IsFinite(value.g) && IsFinite(value.b) && IsFinite(value.a);
948
+ private static bool IsFinite(float value) => !float.IsNaN(value) && !float.IsInfinity(value);
949
+ }
950
+ }
951
+ #endif