@fps-games/editor 0.1.6-beta.1 → 0.1.7-beta.1

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 (352) hide show
  1. package/dist/agent-bridge/capabilities/assets.d.ts +8 -0
  2. package/dist/agent-bridge/capabilities/assets.d.ts.map +1 -0
  3. package/dist/agent-bridge/capabilities/assets.js +226 -0
  4. package/dist/agent-bridge/capabilities/assets.js.map +1 -0
  5. package/dist/agent-bridge/capabilities/editor-state.d.ts +5 -0
  6. package/dist/agent-bridge/capabilities/editor-state.d.ts.map +1 -0
  7. package/dist/agent-bridge/capabilities/editor-state.js +72 -0
  8. package/dist/agent-bridge/capabilities/editor-state.js.map +1 -0
  9. package/dist/agent-bridge/capabilities/host-lifecycle.d.ts +4 -0
  10. package/dist/agent-bridge/capabilities/host-lifecycle.d.ts.map +1 -0
  11. package/dist/agent-bridge/capabilities/host-lifecycle.js +87 -0
  12. package/dist/agent-bridge/capabilities/host-lifecycle.js.map +1 -0
  13. package/dist/agent-bridge/capabilities/prefabs.d.ts +5 -0
  14. package/dist/agent-bridge/capabilities/prefabs.d.ts.map +1 -0
  15. package/dist/agent-bridge/capabilities/prefabs.js +735 -0
  16. package/dist/agent-bridge/capabilities/prefabs.js.map +1 -0
  17. package/dist/agent-bridge/capabilities/scene-objects.d.ts +9 -0
  18. package/dist/agent-bridge/capabilities/scene-objects.d.ts.map +1 -0
  19. package/dist/agent-bridge/capabilities/scene-objects.js +394 -0
  20. package/dist/agent-bridge/capabilities/scene-objects.js.map +1 -0
  21. package/dist/agent-bridge/capabilities/selection.d.ts +5 -0
  22. package/dist/agent-bridge/capabilities/selection.d.ts.map +1 -0
  23. package/dist/agent-bridge/capabilities/selection.js +57 -0
  24. package/dist/agent-bridge/capabilities/selection.js.map +1 -0
  25. package/dist/agent-bridge/capabilities/shadows.d.ts +5 -0
  26. package/dist/agent-bridge/capabilities/shadows.d.ts.map +1 -0
  27. package/dist/agent-bridge/capabilities/shadows.js +1876 -0
  28. package/dist/agent-bridge/capabilities/shadows.js.map +1 -0
  29. package/dist/agent-bridge/capabilities/transform.d.ts +5 -0
  30. package/dist/agent-bridge/capabilities/transform.d.ts.map +1 -0
  31. package/dist/agent-bridge/capabilities/transform.js +162 -0
  32. package/dist/agent-bridge/capabilities/transform.js.map +1 -0
  33. package/dist/agent-bridge/capabilities/ui-regions.d.ts +4 -0
  34. package/dist/agent-bridge/capabilities/ui-regions.d.ts.map +1 -0
  35. package/dist/agent-bridge/capabilities/ui-regions.js +168 -0
  36. package/dist/agent-bridge/capabilities/ui-regions.js.map +1 -0
  37. package/dist/agent-bridge/capabilities/viewport.d.ts +5 -0
  38. package/dist/agent-bridge/capabilities/viewport.d.ts.map +1 -0
  39. package/dist/agent-bridge/capabilities/viewport.js +407 -0
  40. package/dist/agent-bridge/capabilities/viewport.js.map +1 -0
  41. package/dist/agent-bridge/capability-sources.d.ts +6 -0
  42. package/dist/agent-bridge/capability-sources.d.ts.map +1 -0
  43. package/dist/agent-bridge/capability-sources.js +26 -0
  44. package/dist/agent-bridge/capability-sources.js.map +1 -0
  45. package/dist/agent-bridge/diagnostics.d.ts +12 -0
  46. package/dist/agent-bridge/diagnostics.d.ts.map +1 -0
  47. package/dist/agent-bridge/diagnostics.js +45 -0
  48. package/dist/agent-bridge/diagnostics.js.map +1 -0
  49. package/dist/agent-bridge/index.d.ts +5 -0
  50. package/dist/agent-bridge/index.d.ts.map +1 -0
  51. package/dist/agent-bridge/index.js +5 -0
  52. package/dist/agent-bridge/index.js.map +1 -0
  53. package/dist/agent-bridge/register.d.ts +4 -0
  54. package/dist/agent-bridge/register.d.ts.map +1 -0
  55. package/dist/agent-bridge/register.js +908 -0
  56. package/dist/agent-bridge/register.js.map +1 -0
  57. package/dist/agent-bridge/shared.d.ts +189 -0
  58. package/dist/agent-bridge/shared.d.ts.map +1 -0
  59. package/dist/agent-bridge/shared.js +39 -0
  60. package/dist/agent-bridge/shared.js.map +1 -0
  61. package/dist/agent-bridge/source-types.d.ts +90 -0
  62. package/dist/agent-bridge/source-types.d.ts.map +1 -0
  63. package/dist/agent-bridge/source-types.js +2 -0
  64. package/dist/agent-bridge/source-types.js.map +1 -0
  65. package/dist/build-info.json +17 -17
  66. package/dist/local-editor-agent-bridge-transport.d.ts +95 -0
  67. package/dist/local-editor-agent-bridge-transport.d.ts.map +1 -0
  68. package/dist/local-editor-agent-bridge-transport.js +340 -0
  69. package/dist/local-editor-agent-bridge-transport.js.map +1 -0
  70. package/dist/local-editor-agent-bridge.d.ts +2 -0
  71. package/dist/local-editor-agent-bridge.d.ts.map +1 -0
  72. package/dist/local-editor-agent-bridge.js +2 -0
  73. package/dist/local-editor-agent-bridge.js.map +1 -0
  74. package/dist/local-editor-harness.d.ts +26 -2
  75. package/dist/local-editor-harness.d.ts.map +1 -1
  76. package/dist/local-editor-harness.js +773 -75
  77. package/dist/local-editor-harness.js.map +1 -1
  78. package/dist/playable-babylon-rendering.js +20 -0
  79. package/dist/playable-babylon-rendering.js.map +1 -1
  80. package/dist/playable-local-editor-host.d.ts +5 -0
  81. package/dist/playable-local-editor-host.d.ts.map +1 -1
  82. package/dist/playable-local-editor-host.js +2 -0
  83. package/dist/playable-local-editor-host.js.map +1 -1
  84. package/node_modules/@fps-games/babylon-renderer/dist/shadows/blob-shadow-system.d.ts.map +1 -1
  85. package/node_modules/@fps-games/babylon-renderer/dist/shadows/blob-shadow-system.js +6 -4
  86. package/node_modules/@fps-games/babylon-renderer/dist/shadows/blob-shadow-system.js.map +1 -1
  87. package/node_modules/@fps-games/babylon-renderer/dist/shadows/planar-shadow-shaders.d.ts.map +1 -1
  88. package/node_modules/@fps-games/babylon-renderer/dist/shadows/planar-shadow-shaders.js +103 -1
  89. package/node_modules/@fps-games/babylon-renderer/dist/shadows/planar-shadow-shaders.js.map +1 -1
  90. package/node_modules/@fps-games/babylon-renderer/dist/shadows/planar-shadow-system.d.ts.map +1 -1
  91. package/node_modules/@fps-games/babylon-renderer/dist/shadows/planar-shadow-system.js +330 -27
  92. package/node_modules/@fps-games/babylon-renderer/dist/shadows/planar-shadow-system.js.map +1 -1
  93. package/node_modules/@fps-games/babylon-renderer/dist/shadows/static-projected-shadow-artifact-system.d.ts.map +1 -1
  94. package/node_modules/@fps-games/babylon-renderer/dist/shadows/static-projected-shadow-artifact-system.js +159 -0
  95. package/node_modules/@fps-games/babylon-renderer/dist/shadows/static-projected-shadow-artifact-system.js.map +1 -1
  96. package/node_modules/@fps-games/babylon-renderer/dist/shadows/static-projected-shadow-baker.js +8 -1
  97. package/node_modules/@fps-games/babylon-renderer/dist/shadows/static-projected-shadow-baker.js.map +1 -1
  98. package/node_modules/@fps-games/babylon-renderer/dist/shadows/types.d.ts +53 -2
  99. package/node_modules/@fps-games/babylon-renderer/dist/shadows/types.d.ts.map +1 -1
  100. package/node_modules/@fps-games/babylon-renderer/dist/shadows/types.js +1 -0
  101. package/node_modules/@fps-games/babylon-renderer/dist/shadows/types.js.map +1 -1
  102. package/node_modules/@fps-games/babylon-renderer/package.json +1 -1
  103. package/node_modules/@fps-games/editor-babylon/dist/projection.d.ts +30 -0
  104. package/node_modules/@fps-games/editor-babylon/dist/projection.d.ts.map +1 -1
  105. package/node_modules/@fps-games/editor-babylon/dist/projection.js +346 -11
  106. package/node_modules/@fps-games/editor-babylon/dist/projection.js.map +1 -1
  107. package/node_modules/@fps-games/editor-babylon/dist/scene-view-camera-controller.d.ts +11 -0
  108. package/node_modules/@fps-games/editor-babylon/dist/scene-view-camera-controller.d.ts.map +1 -1
  109. package/node_modules/@fps-games/editor-babylon/dist/scene-view-camera-controller.js +113 -29
  110. package/node_modules/@fps-games/editor-babylon/dist/scene-view-camera-controller.js.map +1 -1
  111. package/node_modules/@fps-games/editor-babylon/dist/shadow-preview-controller.d.ts +13 -1
  112. package/node_modules/@fps-games/editor-babylon/dist/shadow-preview-controller.d.ts.map +1 -1
  113. package/node_modules/@fps-games/editor-babylon/dist/shadow-preview-controller.js +543 -3
  114. package/node_modules/@fps-games/editor-babylon/dist/shadow-preview-controller.js.map +1 -1
  115. package/node_modules/@fps-games/editor-babylon/package.json +5 -5
  116. package/node_modules/@fps-games/editor-browser/dist/index.d.ts +5 -2
  117. package/node_modules/@fps-games/editor-browser/dist/index.d.ts.map +1 -1
  118. package/node_modules/@fps-games/editor-browser/dist/index.js +3 -1
  119. package/node_modules/@fps-games/editor-browser/dist/index.js.map +1 -1
  120. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-context-menu.js +1 -1
  121. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-context-menu.js.map +1 -1
  122. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-actions.d.ts.map +1 -1
  123. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-actions.js +7 -9
  124. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-actions.js.map +1 -1
  125. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-attach-dialog.js +2 -2
  126. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-attach-dialog.js.map +1 -1
  127. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-command-adapter.d.ts +21 -0
  128. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-command-adapter.d.ts.map +1 -0
  129. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-command-adapter.js +75 -0
  130. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-command-adapter.js.map +1 -0
  131. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-controller.d.ts.map +1 -1
  132. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-controller.js +288 -71
  133. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-controller.js.map +1 -1
  134. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-scope.d.ts +5 -0
  135. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-scope.d.ts.map +1 -0
  136. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-scope.js +92 -0
  137. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-scope.js.map +1 -0
  138. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-tree.d.ts +3 -0
  139. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-tree.d.ts.map +1 -1
  140. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-tree.js +22 -7
  141. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-tree.js.map +1 -1
  142. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-view.d.ts +4 -0
  143. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-view.d.ts.map +1 -1
  144. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-view.js +21 -14
  145. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-view.js.map +1 -1
  146. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-prefab-stage.d.ts +19 -1
  147. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-prefab-stage.d.ts.map +1 -1
  148. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-prefab-stage.js +79 -39
  149. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-prefab-stage.js.map +1 -1
  150. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-primitives.js +2 -2
  151. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-primitives.js.map +1 -1
  152. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-types.d.ts +68 -1
  153. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-types.d.ts.map +1 -1
  154. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-workbench.d.ts +2 -0
  155. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-workbench.d.ts.map +1 -1
  156. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-workbench.js +10 -0
  157. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-workbench.js.map +1 -1
  158. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.d.ts +3 -2
  159. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.d.ts.map +1 -1
  160. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.js +401 -241
  161. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.js.map +1 -1
  162. package/node_modules/@fps-games/editor-browser/package.json +3 -3
  163. package/node_modules/@fps-games/editor-core/dist/agent-bridge.d.ts +18 -0
  164. package/node_modules/@fps-games/editor-core/dist/agent-bridge.d.ts.map +1 -0
  165. package/node_modules/@fps-games/editor-core/dist/agent-bridge.js +102 -0
  166. package/node_modules/@fps-games/editor-core/dist/agent-bridge.js.map +1 -0
  167. package/node_modules/@fps-games/editor-core/dist/index.d.ts +1 -0
  168. package/node_modules/@fps-games/editor-core/dist/index.d.ts.map +1 -1
  169. package/node_modules/@fps-games/editor-core/dist/index.js +1 -0
  170. package/node_modules/@fps-games/editor-core/dist/index.js.map +1 -1
  171. package/node_modules/@fps-games/editor-core/dist/viewport-tools.d.ts +1 -1
  172. package/node_modules/@fps-games/editor-core/dist/viewport-tools.d.ts.map +1 -1
  173. package/node_modules/@fps-games/editor-core/dist/viewport-tools.js.map +1 -1
  174. package/node_modules/@fps-games/editor-core/package.json +2 -2
  175. package/node_modules/@fps-games/editor-forge-play/package.json +2 -2
  176. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/config.d.ts +3 -0
  177. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/config.d.ts.map +1 -0
  178. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/config.js +9 -0
  179. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/config.js.map +1 -0
  180. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/generated-module.d.ts +6 -0
  181. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/generated-module.d.ts.map +1 -0
  182. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/generated-module.js +89 -0
  183. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/generated-module.js.map +1 -0
  184. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/identity.d.ts +18 -0
  185. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/identity.d.ts.map +1 -0
  186. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/identity.js +121 -0
  187. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/identity.js.map +1 -0
  188. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/index.d.ts +4 -0
  189. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/index.d.ts.map +1 -0
  190. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/index.js +3 -0
  191. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/index.js.map +1 -0
  192. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/metadata.d.ts +27 -0
  193. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/metadata.d.ts.map +1 -0
  194. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/metadata.js +782 -0
  195. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/metadata.js.map +1 -0
  196. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/node.d.ts +5 -0
  197. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/node.d.ts.map +1 -0
  198. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/node.js +5 -0
  199. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/node.js.map +1 -0
  200. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/registry.d.ts +80 -0
  201. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/registry.d.ts.map +1 -0
  202. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/registry.js +600 -0
  203. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/registry.js.map +1 -0
  204. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/types.d.ts +51 -0
  205. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/types.d.ts.map +1 -0
  206. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/types.js +2 -0
  207. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/types.js.map +1 -0
  208. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/document.d.ts +0 -1
  209. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/document.d.ts.map +1 -1
  210. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/document.js +4 -42
  211. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/document.js.map +1 -1
  212. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/index.d.ts +1 -1
  213. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/index.d.ts.map +1 -1
  214. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/index.js +1 -1
  215. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/index.js.map +1 -1
  216. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/placement.d.ts.map +1 -1
  217. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/placement.js +2 -1
  218. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/placement.js.map +1 -1
  219. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/types.d.ts +3 -0
  220. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/types.d.ts.map +1 -1
  221. package/node_modules/@fps-games/editor-playable-sdk/dist/document/helpers.d.ts +42 -2
  222. package/node_modules/@fps-games/editor-playable-sdk/dist/document/helpers.d.ts.map +1 -1
  223. package/node_modules/@fps-games/editor-playable-sdk/dist/document/helpers.js +612 -8
  224. package/node_modules/@fps-games/editor-playable-sdk/dist/document/helpers.js.map +1 -1
  225. package/node_modules/@fps-games/editor-playable-sdk/dist/document/types.d.ts +42 -0
  226. package/node_modules/@fps-games/editor-playable-sdk/dist/document/types.d.ts.map +1 -1
  227. package/node_modules/@fps-games/editor-playable-sdk/dist/field-schema/index.d.ts +1 -1
  228. package/node_modules/@fps-games/editor-playable-sdk/dist/field-schema/index.d.ts.map +1 -1
  229. package/node_modules/@fps-games/editor-playable-sdk/dist/field-schema/index.js +1 -1
  230. package/node_modules/@fps-games/editor-playable-sdk/dist/field-schema/index.js.map +1 -1
  231. package/node_modules/@fps-games/editor-playable-sdk/dist/field-schema/schema.d.ts.map +1 -1
  232. package/node_modules/@fps-games/editor-playable-sdk/dist/field-schema/schema.js +16 -9
  233. package/node_modules/@fps-games/editor-playable-sdk/dist/field-schema/schema.js.map +1 -1
  234. package/node_modules/@fps-games/editor-playable-sdk/dist/field-schema/validators.d.ts +5 -0
  235. package/node_modules/@fps-games/editor-playable-sdk/dist/field-schema/validators.d.ts.map +1 -1
  236. package/node_modules/@fps-games/editor-playable-sdk/dist/field-schema/validators.js +28 -0
  237. package/node_modules/@fps-games/editor-playable-sdk/dist/field-schema/validators.js.map +1 -1
  238. package/node_modules/@fps-games/editor-playable-sdk/dist/index.d.ts +3 -0
  239. package/node_modules/@fps-games/editor-playable-sdk/dist/index.d.ts.map +1 -1
  240. package/node_modules/@fps-games/editor-playable-sdk/dist/index.js +3 -0
  241. package/node_modules/@fps-games/editor-playable-sdk/dist/index.js.map +1 -1
  242. package/node_modules/@fps-games/editor-playable-sdk/dist/inspector/document-sections.d.ts +82 -2
  243. package/node_modules/@fps-games/editor-playable-sdk/dist/inspector/document-sections.d.ts.map +1 -1
  244. package/node_modules/@fps-games/editor-playable-sdk/dist/inspector/document-sections.js +396 -22
  245. package/node_modules/@fps-games/editor-playable-sdk/dist/inspector/document-sections.js.map +1 -1
  246. package/node_modules/@fps-games/editor-playable-sdk/dist/inspector/index.d.ts +1 -1
  247. package/node_modules/@fps-games/editor-playable-sdk/dist/inspector/index.d.ts.map +1 -1
  248. package/node_modules/@fps-games/editor-playable-sdk/dist/inspector/index.js +1 -1
  249. package/node_modules/@fps-games/editor-playable-sdk/dist/inspector/index.js.map +1 -1
  250. package/node_modules/@fps-games/editor-playable-sdk/dist/inspector/validation.d.ts.map +1 -1
  251. package/node_modules/@fps-games/editor-playable-sdk/dist/inspector/validation.js +0 -3
  252. package/node_modules/@fps-games/editor-playable-sdk/dist/inspector/validation.js.map +1 -1
  253. package/node_modules/@fps-games/editor-playable-sdk/dist/lighting-debug/math.d.ts +29 -1
  254. package/node_modules/@fps-games/editor-playable-sdk/dist/lighting-debug/math.d.ts.map +1 -1
  255. package/node_modules/@fps-games/editor-playable-sdk/dist/lighting-debug/math.js +143 -0
  256. package/node_modules/@fps-games/editor-playable-sdk/dist/lighting-debug/math.js.map +1 -1
  257. package/node_modules/@fps-games/editor-playable-sdk/dist/mutation/field-patch.d.ts.map +1 -1
  258. package/node_modules/@fps-games/editor-playable-sdk/dist/mutation/field-patch.js +99 -11
  259. package/node_modules/@fps-games/editor-playable-sdk/dist/mutation/field-patch.js.map +1 -1
  260. package/node_modules/@fps-games/editor-playable-sdk/dist/mutation/reducer.d.ts.map +1 -1
  261. package/node_modules/@fps-games/editor-playable-sdk/dist/mutation/reducer.js +4 -1
  262. package/node_modules/@fps-games/editor-playable-sdk/dist/mutation/reducer.js.map +1 -1
  263. package/node_modules/@fps-games/editor-playable-sdk/dist/mutation/transform.d.ts.map +1 -1
  264. package/node_modules/@fps-games/editor-playable-sdk/dist/mutation/transform.js +19 -1
  265. package/node_modules/@fps-games/editor-playable-sdk/dist/mutation/transform.js.map +1 -1
  266. package/node_modules/@fps-games/editor-playable-sdk/dist/rendering-profile/panel.d.ts.map +1 -1
  267. package/node_modules/@fps-games/editor-playable-sdk/dist/rendering-profile/panel.js +19 -3
  268. package/node_modules/@fps-games/editor-playable-sdk/dist/rendering-profile/panel.js.map +1 -1
  269. package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/assets.d.ts +1 -2
  270. package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/assets.d.ts.map +1 -1
  271. package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/assets.js +0 -14
  272. package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/assets.js.map +1 -1
  273. package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/import-plan.d.ts +1 -7
  274. package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/import-plan.d.ts.map +1 -1
  275. package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/import-plan.js +3 -32
  276. package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/import-plan.js.map +1 -1
  277. package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/nodes.d.ts.map +1 -1
  278. package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/nodes.js +16 -32
  279. package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/nodes.js.map +1 -1
  280. package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/types.d.ts +5 -22
  281. package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/types.d.ts.map +1 -1
  282. package/node_modules/@fps-games/editor-playable-sdk/dist/scene-compiler/compiler.d.ts +5 -0
  283. package/node_modules/@fps-games/editor-playable-sdk/dist/scene-compiler/compiler.d.ts.map +1 -0
  284. package/node_modules/@fps-games/editor-playable-sdk/dist/scene-compiler/compiler.js +996 -0
  285. package/node_modules/@fps-games/editor-playable-sdk/dist/scene-compiler/compiler.js.map +1 -0
  286. package/node_modules/@fps-games/editor-playable-sdk/dist/scene-compiler/index.d.ts +3 -0
  287. package/node_modules/@fps-games/editor-playable-sdk/dist/scene-compiler/index.d.ts.map +1 -0
  288. package/node_modules/@fps-games/editor-playable-sdk/dist/scene-compiler/index.js +3 -0
  289. package/node_modules/@fps-games/editor-playable-sdk/dist/scene-compiler/index.js.map +1 -0
  290. package/node_modules/@fps-games/editor-playable-sdk/dist/scene-compiler/types.d.ts +152 -0
  291. package/node_modules/@fps-games/editor-playable-sdk/dist/scene-compiler/types.d.ts.map +1 -0
  292. package/node_modules/@fps-games/editor-playable-sdk/dist/scene-compiler/types.js +2 -0
  293. package/node_modules/@fps-games/editor-playable-sdk/dist/scene-compiler/types.js.map +1 -0
  294. package/node_modules/@fps-games/editor-playable-sdk/dist/scene-source/protocol.d.ts.map +1 -1
  295. package/node_modules/@fps-games/editor-playable-sdk/dist/scene-source/protocol.js +4 -0
  296. package/node_modules/@fps-games/editor-playable-sdk/dist/scene-source/protocol.js.map +1 -1
  297. package/node_modules/@fps-games/editor-playable-sdk/dist/serialized-property/descriptors.d.ts.map +1 -1
  298. package/node_modules/@fps-games/editor-playable-sdk/dist/serialized-property/descriptors.js +224 -12
  299. package/node_modules/@fps-games/editor-playable-sdk/dist/serialized-property/descriptors.js.map +1 -1
  300. package/node_modules/@fps-games/editor-playable-sdk/dist/serialized-property/inspector.d.ts.map +1 -1
  301. package/node_modules/@fps-games/editor-playable-sdk/dist/serialized-property/inspector.js +158 -50
  302. package/node_modules/@fps-games/editor-playable-sdk/dist/serialized-property/inspector.js.map +1 -1
  303. package/node_modules/@fps-games/editor-playable-sdk/dist/serialized-property/patch.d.ts.map +1 -1
  304. package/node_modules/@fps-games/editor-playable-sdk/dist/serialized-property/patch.js +45 -1
  305. package/node_modules/@fps-games/editor-playable-sdk/dist/serialized-property/patch.js.map +1 -1
  306. package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/index.d.ts +5 -0
  307. package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/index.d.ts.map +1 -0
  308. package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/index.js +5 -0
  309. package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/index.js.map +1 -0
  310. package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/legacy.d.ts +21 -0
  311. package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/legacy.d.ts.map +1 -0
  312. package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/legacy.js +158 -0
  313. package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/legacy.js.map +1 -0
  314. package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/quality.d.ts +5 -0
  315. package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/quality.d.ts.map +1 -0
  316. package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/quality.js +83 -0
  317. package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/quality.js.map +1 -0
  318. package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/resolver.d.ts +35 -0
  319. package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/resolver.d.ts.map +1 -0
  320. package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/resolver.js +363 -0
  321. package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/resolver.js.map +1 -0
  322. package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/types.d.ts +105 -0
  323. package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/types.d.ts.map +1 -0
  324. package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/types.js +6 -0
  325. package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/types.js.map +1 -0
  326. package/node_modules/@fps-games/editor-playable-sdk/dist/static-shadows/artifact.d.ts +3 -0
  327. package/node_modules/@fps-games/editor-playable-sdk/dist/static-shadows/artifact.d.ts.map +1 -1
  328. package/node_modules/@fps-games/editor-playable-sdk/dist/static-shadows/artifact.js +44 -0
  329. package/node_modules/@fps-games/editor-playable-sdk/dist/static-shadows/artifact.js.map +1 -1
  330. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/asset-authoring.d.ts +26 -0
  331. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/asset-authoring.d.ts.map +1 -0
  332. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/asset-authoring.js +105 -0
  333. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/asset-authoring.js.map +1 -0
  334. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/index.d.ts +3 -0
  335. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/index.d.ts.map +1 -1
  336. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/index.js +3 -0
  337. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/index.js.map +1 -1
  338. package/node_modules/@fps-games/editor-playable-sdk/package.json +3 -3
  339. package/node_modules/@fps-games/editor-protocol/dist/agent-bridge.d.ts +1127 -0
  340. package/node_modules/@fps-games/editor-protocol/dist/agent-bridge.d.ts.map +1 -0
  341. package/node_modules/@fps-games/editor-protocol/dist/agent-bridge.js +2180 -0
  342. package/node_modules/@fps-games/editor-protocol/dist/agent-bridge.js.map +1 -0
  343. package/node_modules/@fps-games/editor-protocol/dist/agent-trace.d.ts +68 -0
  344. package/node_modules/@fps-games/editor-protocol/dist/agent-trace.d.ts.map +1 -0
  345. package/node_modules/@fps-games/editor-protocol/dist/agent-trace.js +23 -0
  346. package/node_modules/@fps-games/editor-protocol/dist/agent-trace.js.map +1 -0
  347. package/node_modules/@fps-games/editor-protocol/dist/index.d.ts +2 -0
  348. package/node_modules/@fps-games/editor-protocol/dist/index.d.ts.map +1 -1
  349. package/node_modules/@fps-games/editor-protocol/dist/index.js +2 -0
  350. package/node_modules/@fps-games/editor-protocol/dist/index.js.map +1 -1
  351. package/node_modules/@fps-games/editor-protocol/package.json +1 -1
  352. package/package.json +8 -8
@@ -1,5 +1,8 @@
1
1
  import { mergeArtistMaterialProfiles, } from '@fps-games/editor-protocol';
2
2
  import { isEditorSceneArtistMaterialPatchPath, normalizeEditorSceneMaterialSlotOwnerPath, readEditorSceneChildMaterialBindingOwnerPath, readEditorSceneMaterialSlotBindingSlotId, } from '../material-binding/paths.js';
3
+ export const EDITOR_SCENE_PREFAB_COMPOSITION_VERSION = 1;
4
+ export const EDITOR_SCENE_PREFAB_LEGACY_ROOT_NODE_ID = 'prefab-root';
5
+ export const EDITOR_SCENE_PREFAB_LEGACY_MODEL_NODE_ID = 'prefab-model';
3
6
  const EDITOR_SCENE_PREFAB_OVERRIDE_FIELD_PATH_PREFIX = 'prefab.';
4
7
  const EDITOR_SCENE_PREFAB_CORE_MATERIAL_OVERRIDE_PROFILE_FIELD_PATHS = new Set([
5
8
  'profile.baseColor.color',
@@ -30,6 +33,512 @@ export function isEditorScenePrefabInstance(gameObject) {
30
33
  export function resolveEditorScenePrefabSourceAssetId(prefabAsset) {
31
34
  return readEditorSceneNonEmptyString(prefabAsset?.prefab?.sourceAssetId);
32
35
  }
36
+ export function readEditorScenePrefabRootNodeId(prefabAsset) {
37
+ if (!prefabAsset?.prefab)
38
+ return null;
39
+ const nodes = readEditorScenePrefabExplicitNodes(prefabAsset.prefab);
40
+ const explicitRootNodeId = readEditorSceneNonEmptyString(prefabAsset.prefab.rootNodeId);
41
+ if (explicitRootNodeId && nodes.some(node => node.id === explicitRootNodeId))
42
+ return explicitRootNodeId;
43
+ const explicitRoot = nodes.find(node => node.kind === 'root' && !node.parentId);
44
+ if (explicitRoot)
45
+ return explicitRoot.id;
46
+ if (nodes.length > 0)
47
+ return null;
48
+ const legacyRoot = createEditorScenePrefabLegacyRootNode(prefabAsset);
49
+ return legacyRoot ? legacyRoot.id : null;
50
+ }
51
+ export function readEditorScenePrefabNodes(prefabAsset) {
52
+ if (!prefabAsset?.prefab)
53
+ return [];
54
+ const explicitNodes = readEditorScenePrefabExplicitNodes(prefabAsset.prefab);
55
+ if (explicitNodes.length > 0)
56
+ return explicitNodes;
57
+ return createEditorScenePrefabLegacyCompositionNodes(prefabAsset);
58
+ }
59
+ export function findEditorScenePrefabNode(prefabAsset, nodeId) {
60
+ const normalizedNodeId = readEditorSceneNonEmptyString(nodeId);
61
+ if (!normalizedNodeId)
62
+ return null;
63
+ return readEditorScenePrefabNodes(prefabAsset).find(node => node.id === normalizedNodeId) ?? null;
64
+ }
65
+ export function readEditorScenePrefabNodeChildren(prefabAsset, parentNodeId) {
66
+ const normalizedParentId = readEditorSceneNonEmptyString(parentNodeId);
67
+ return readEditorScenePrefabNodes(prefabAsset).filter((node) => {
68
+ const parentId = readEditorSceneNonEmptyString(node.parentId);
69
+ return normalizedParentId ? parentId === normalizedParentId : !parentId;
70
+ });
71
+ }
72
+ export function ensureEditorScenePrefabComposition(prefabAsset) {
73
+ if (!isEditorScenePrefabAsset(prefabAsset)) {
74
+ return createEditorScenePrefabMutationResult(prefabAsset, false, null, [{
75
+ code: 'prefab.invalidDefinition',
76
+ severity: 'error',
77
+ message: `Asset "${prefabAsset.id}" is not a valid prefab definition.`,
78
+ assetId: prefabAsset.id,
79
+ }]);
80
+ }
81
+ const next = cloneEditorScenePrefabAssetWithComposition(prefabAsset);
82
+ return createEditorScenePrefabMutationResult(next, JSON.stringify(next.prefab) !== JSON.stringify(prefabAsset.prefab));
83
+ }
84
+ export function selectEditorScenePrefabNode(prefabAsset, nodeId) {
85
+ const prepared = ensureEditorScenePrefabComposition(prefabAsset);
86
+ if (!prepared.ok)
87
+ return prepared;
88
+ const normalizedNodeId = readEditorSceneNonEmptyString(nodeId);
89
+ const node = normalizedNodeId ? findEditorScenePrefabNode(prepared.prefabAsset, normalizedNodeId) : null;
90
+ if (!node) {
91
+ return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, [{
92
+ code: 'prefab.nodeNotFound',
93
+ severity: 'error',
94
+ message: `Prefab node "${nodeId}" was not found.`,
95
+ assetId: prefabAsset.id,
96
+ nodeId,
97
+ }]);
98
+ }
99
+ return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, node, [], {
100
+ selectedNodeId: node.id,
101
+ });
102
+ }
103
+ export function renameEditorScenePrefabAsset(document, assetId, displayName) {
104
+ const normalizedAssetId = readEditorSceneNonEmptyString(assetId);
105
+ const prefabAsset = normalizedAssetId
106
+ ? document.assets.find(asset => asset.id === normalizedAssetId && isEditorScenePrefabAsset(asset))
107
+ : null;
108
+ if (!prefabAsset) {
109
+ return createEditorScenePrefabMutationResult({
110
+ id: normalizedAssetId ?? String(assetId ?? ''),
111
+ type: 'prefab',
112
+ prefab: { sourceAssetId: '' },
113
+ }, false, null, [{
114
+ code: 'prefab.invalidDefinition',
115
+ severity: 'error',
116
+ message: `Prefab asset "${assetId}" was not found.`,
117
+ assetId,
118
+ }]);
119
+ }
120
+ const nameResult = normalizeEditorScenePrefabEditableName(displayName);
121
+ if (!nameResult.ok) {
122
+ return createEditorScenePrefabMutationResult(prefabAsset, false, null, [{
123
+ code: 'prefab.invalidName',
124
+ severity: 'error',
125
+ message: nameResult.message,
126
+ assetId: prefabAsset.id,
127
+ }]);
128
+ }
129
+ const normalizedDisplayName = nameResult.name;
130
+ const lowerName = normalizedDisplayName.toLowerCase();
131
+ const conflict = document.assets.find(candidate => (candidate.id !== prefabAsset.id
132
+ && isEditorScenePrefabAsset(candidate)
133
+ && readEditorSceneNonEmptyString(candidate.displayName)?.toLowerCase() === lowerName));
134
+ if (conflict) {
135
+ return createEditorScenePrefabMutationResult(prefabAsset, false, null, [{
136
+ code: 'prefab.nameConflict',
137
+ severity: 'error',
138
+ message: `Prefab asset name "${normalizedDisplayName}" is already used by "${conflict.id}".`,
139
+ assetId: prefabAsset.id,
140
+ }]);
141
+ }
142
+ if (prefabAsset.displayName === normalizedDisplayName) {
143
+ return createEditorScenePrefabMutationResult(prefabAsset, false);
144
+ }
145
+ const next = cloneEditorScenePrefabAssetWithComposition({
146
+ ...structuredClone(prefabAsset),
147
+ displayName: normalizedDisplayName,
148
+ });
149
+ const rootNodeId = readEditorScenePrefabRootNodeId(next);
150
+ if (rootNodeId && Array.isArray(next.prefab?.nodes)) {
151
+ const rootIndex = next.prefab.nodes.findIndex(node => node.id === rootNodeId);
152
+ if (rootIndex >= 0) {
153
+ next.prefab.nodes = [...next.prefab.nodes];
154
+ next.prefab.nodes[rootIndex] = {
155
+ ...structuredClone(next.prefab.nodes[rootIndex]),
156
+ name: normalizedDisplayName,
157
+ };
158
+ }
159
+ }
160
+ return createEditorScenePrefabMutationResult(next, true);
161
+ }
162
+ export function renameEditorScenePrefabNode(prefabAsset, nodeId, name) {
163
+ const prepared = ensureEditorScenePrefabComposition(prefabAsset);
164
+ if (!prepared.ok)
165
+ return prepared;
166
+ const normalizedNodeId = readEditorSceneNonEmptyString(nodeId);
167
+ const node = normalizedNodeId ? findEditorScenePrefabNode(prepared.prefabAsset, normalizedNodeId) : null;
168
+ if (!node) {
169
+ return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, [{
170
+ code: 'prefab.nodeNotFound',
171
+ severity: 'error',
172
+ message: `Prefab node "${nodeId}" was not found.`,
173
+ assetId: prefabAsset.id,
174
+ nodeId,
175
+ }]);
176
+ }
177
+ const rootNodeId = readEditorScenePrefabRootNodeId(prepared.prefabAsset);
178
+ if (node.id === rootNodeId) {
179
+ return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, node, [{
180
+ code: 'prefab.rootRenameRejected',
181
+ severity: 'error',
182
+ message: 'Prefab root node name follows the prefab asset displayName; use prefab.asset.rename instead.',
183
+ assetId: prefabAsset.id,
184
+ nodeId: node.id,
185
+ }]);
186
+ }
187
+ const nameResult = normalizeEditorScenePrefabEditableName(name);
188
+ if (!nameResult.ok) {
189
+ return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, node, [{
190
+ code: 'prefab.invalidName',
191
+ severity: 'error',
192
+ message: nameResult.message,
193
+ assetId: prefabAsset.id,
194
+ nodeId: node.id,
195
+ }]);
196
+ }
197
+ const normalizedName = nameResult.name;
198
+ const siblings = readEditorScenePrefabNodeChildren(prepared.prefabAsset, node.parentId);
199
+ const conflict = siblings.find(candidate => (candidate.id !== node.id
200
+ && readEditorSceneNonEmptyString(candidate.name)?.toLowerCase() === normalizedName.toLowerCase()));
201
+ if (conflict) {
202
+ return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, node, [{
203
+ code: 'prefab.nameConflict',
204
+ severity: 'error',
205
+ message: `Prefab node name "${normalizedName}" is already used by sibling "${conflict.id}".`,
206
+ assetId: prefabAsset.id,
207
+ nodeId: node.id,
208
+ parentId: node.parentId,
209
+ }]);
210
+ }
211
+ return updateEditorScenePrefabNode(prepared.prefabAsset, node.id, (candidate) => ({
212
+ ...candidate,
213
+ name: normalizedName,
214
+ }));
215
+ }
216
+ export function createEditorScenePrefabNodeFromAsset(prefabAsset, asset, options = {}) {
217
+ const prepared = ensureEditorScenePrefabComposition(prefabAsset);
218
+ if (!prepared.ok)
219
+ return prepared;
220
+ if (asset.id === prefabAsset.id) {
221
+ return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, [{
222
+ code: 'prefab.selfReferenceRejected',
223
+ severity: 'error',
224
+ message: `Prefab "${prefabAsset.id}" cannot contain itself directly.`,
225
+ assetId: asset.id,
226
+ }]);
227
+ }
228
+ const parentResult = resolveEditorScenePrefabMutationParent(prepared.prefabAsset, options.parentId);
229
+ if (!parentResult.ok)
230
+ return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, parentResult.diagnostics);
231
+ const nodes = readEditorScenePrefabNodes(prepared.prefabAsset);
232
+ const isChildPrefab = isEditorScenePrefabAsset(asset);
233
+ const isModel = asset.type !== 'prefab' && (asset.type === 'glb' || asset.type === 'model' || asset.type === 'gltf');
234
+ if (!isChildPrefab && !isModel) {
235
+ return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, [{
236
+ code: 'prefab.assetUnsupported',
237
+ severity: 'error',
238
+ message: `Asset "${asset.id}" cannot be added to a prefab composition.`,
239
+ assetId: asset.id,
240
+ }]);
241
+ }
242
+ const node = {
243
+ id: options.id ?? createUniqueEditorScenePrefabNodeId(nodes, `${isChildPrefab ? 'prefab' : 'model'}-${asset.id}`),
244
+ ...(options.guid ? { guid: options.guid } : {}),
245
+ name: options.name ?? asset.displayName ?? asset.id,
246
+ parentId: parentResult.parentId,
247
+ kind: isChildPrefab ? 'prefabInstance' : 'model',
248
+ ...(options.transform ? { transform: structuredClone(options.transform) } : {}),
249
+ ...(isChildPrefab ? { childPrefabId: asset.id } : { sourceAssetId: asset.id }),
250
+ ...(readEditorSceneNonEmptyString(options.sourceNodePath) ? { sourceNodePath: readEditorSceneNonEmptyString(options.sourceNodePath) } : {}),
251
+ };
252
+ return appendEditorScenePrefabNode(prepared.prefabAsset, node);
253
+ }
254
+ export function createEditorScenePrefabPrimitiveNode(prefabAsset, options) {
255
+ const prepared = ensureEditorScenePrefabComposition(prefabAsset);
256
+ if (!prepared.ok)
257
+ return prepared;
258
+ const parentResult = resolveEditorScenePrefabMutationParent(prepared.prefabAsset, options.parentId);
259
+ if (!parentResult.ok)
260
+ return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, parentResult.diagnostics);
261
+ const shape = readEditorSceneNonEmptyString(options.shape);
262
+ if (!shape) {
263
+ return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, [{
264
+ code: 'prefab.assetUnsupported',
265
+ severity: 'error',
266
+ message: 'Prefab primitive shape must be a non-empty string.',
267
+ assetId: prefabAsset.id,
268
+ }]);
269
+ }
270
+ const nodes = readEditorScenePrefabNodes(prepared.prefabAsset);
271
+ const node = {
272
+ id: options.id ?? createUniqueEditorScenePrefabNodeId(nodes, `primitive-${shape}`),
273
+ ...(options.guid ? { guid: options.guid } : {}),
274
+ name: options.name ?? `${shape[0].toUpperCase()}${shape.slice(1)}`,
275
+ parentId: parentResult.parentId,
276
+ kind: 'primitive',
277
+ primitive: { shape },
278
+ ...(options.transform ? { transform: structuredClone(options.transform) } : {}),
279
+ };
280
+ return appendEditorScenePrefabNode(prepared.prefabAsset, node);
281
+ }
282
+ export function createEditorScenePrefabGroupNode(prefabAsset, options = {}) {
283
+ const prepared = ensureEditorScenePrefabComposition(prefabAsset);
284
+ if (!prepared.ok)
285
+ return prepared;
286
+ const parentResult = resolveEditorScenePrefabMutationParent(prepared.prefabAsset, options.parentId);
287
+ if (!parentResult.ok)
288
+ return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, parentResult.diagnostics);
289
+ const nodes = readEditorScenePrefabNodes(prepared.prefabAsset);
290
+ const node = {
291
+ id: options.id ?? createUniqueEditorScenePrefabNodeId(nodes, 'group'),
292
+ ...(options.guid ? { guid: options.guid } : {}),
293
+ name: options.name ?? 'Empty',
294
+ parentId: parentResult.parentId,
295
+ kind: 'group',
296
+ ...(options.transform ? { transform: structuredClone(options.transform) } : {}),
297
+ };
298
+ return appendEditorScenePrefabNode(prepared.prefabAsset, node);
299
+ }
300
+ export function setEditorScenePrefabNodeTransform(prefabAsset, nodeId, transform) {
301
+ const prepared = ensureEditorScenePrefabComposition(prefabAsset);
302
+ if (!prepared.ok)
303
+ return prepared;
304
+ if (!transform || transform.type !== 'Transform') {
305
+ return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, [{
306
+ code: 'prefab.invalidTransform',
307
+ severity: 'error',
308
+ message: `Prefab node "${nodeId}" requires a Transform component payload.`,
309
+ assetId: prefabAsset.id,
310
+ nodeId,
311
+ }]);
312
+ }
313
+ return updateEditorScenePrefabNode(prepared.prefabAsset, nodeId, (node) => ({
314
+ ...node,
315
+ transform: structuredClone(transform),
316
+ }));
317
+ }
318
+ export function setEditorScenePrefabNodeShadow(prefabAsset, nodeId, shadow) {
319
+ const prepared = ensureEditorScenePrefabComposition(prefabAsset);
320
+ if (!prepared.ok)
321
+ return prepared;
322
+ return updateEditorScenePrefabNode(prepared.prefabAsset, nodeId, (node) => {
323
+ const defaults = { ...(node.defaults ?? {}) };
324
+ if (shadow && Object.keys(shadow).length > 0)
325
+ defaults.shadow = structuredClone(shadow);
326
+ else
327
+ delete defaults.shadow;
328
+ if (Object.keys(defaults).length > 0)
329
+ return { ...node, defaults };
330
+ const { defaults: _defaults, ...rest } = node;
331
+ return rest;
332
+ });
333
+ }
334
+ export function reparentEditorScenePrefabNode(prefabAsset, nodeId, parentId) {
335
+ const prepared = ensureEditorScenePrefabComposition(prefabAsset);
336
+ if (!prepared.ok)
337
+ return prepared;
338
+ const rootNodeId = readEditorScenePrefabRootNodeId(prepared.prefabAsset);
339
+ if (nodeId === rootNodeId) {
340
+ return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, [{
341
+ code: 'prefab.rootReparentRejected',
342
+ severity: 'error',
343
+ message: 'Prefab root node cannot be reparented.',
344
+ assetId: prefabAsset.id,
345
+ nodeId,
346
+ }]);
347
+ }
348
+ const nodes = readEditorScenePrefabNodes(prepared.prefabAsset);
349
+ if (!nodes.some(node => node.id === nodeId)) {
350
+ return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, [{
351
+ code: 'prefab.nodeNotFound',
352
+ severity: 'error',
353
+ message: `Prefab node "${nodeId}" was not found.`,
354
+ assetId: prefabAsset.id,
355
+ nodeId,
356
+ }]);
357
+ }
358
+ if (!nodes.some(node => node.id === parentId)) {
359
+ return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, [{
360
+ code: 'prefab.parentNotFound',
361
+ severity: 'error',
362
+ message: `Prefab parent node "${parentId}" was not found.`,
363
+ assetId: prefabAsset.id,
364
+ nodeId,
365
+ parentId,
366
+ }]);
367
+ }
368
+ if (nodeId === parentId || isEditorScenePrefabNodeDescendant(nodes, parentId, nodeId)) {
369
+ return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, [{
370
+ code: 'prefab.cycleReparentRejected',
371
+ severity: 'error',
372
+ message: `Prefab node "${nodeId}" cannot be parented under its own descendant "${parentId}".`,
373
+ assetId: prefabAsset.id,
374
+ nodeId,
375
+ parentId,
376
+ }]);
377
+ }
378
+ return updateEditorScenePrefabNode(prepared.prefabAsset, nodeId, (node) => ({
379
+ ...node,
380
+ parentId,
381
+ }));
382
+ }
383
+ export function deleteEditorScenePrefabNode(prefabAsset, nodeId) {
384
+ const prepared = ensureEditorScenePrefabComposition(prefabAsset);
385
+ if (!prepared.ok)
386
+ return prepared;
387
+ const rootNodeId = readEditorScenePrefabRootNodeId(prepared.prefabAsset);
388
+ if (nodeId === rootNodeId) {
389
+ return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, [{
390
+ code: 'prefab.rootDeleteRejected',
391
+ severity: 'error',
392
+ message: 'Prefab root node cannot be deleted.',
393
+ assetId: prefabAsset.id,
394
+ nodeId,
395
+ }]);
396
+ }
397
+ const nodes = readEditorScenePrefabNodes(prepared.prefabAsset);
398
+ const target = nodes.find(node => node.id === nodeId);
399
+ if (!target) {
400
+ return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, [{
401
+ code: 'prefab.nodeNotFound',
402
+ severity: 'error',
403
+ message: `Prefab node "${nodeId}" was not found.`,
404
+ assetId: prefabAsset.id,
405
+ nodeId,
406
+ }]);
407
+ }
408
+ const deleted = new Set();
409
+ collectEditorScenePrefabNodeSubtree(nodes, nodeId, deleted);
410
+ const next = structuredClone(prepared.prefabAsset);
411
+ next.prefab = structuredClone(next.prefab);
412
+ next.prefab.nodes = nodes.filter(node => !deleted.has(node.id));
413
+ return createEditorScenePrefabMutationResult(next, true, target, [], {
414
+ deletedNodeIds: [...deleted],
415
+ });
416
+ }
417
+ function createEditorScenePrefabMutationResult(prefabAsset, changed, node = null, diagnostics = [], extra = {}) {
418
+ return {
419
+ ok: diagnostics.every(diagnostic => diagnostic.severity !== 'error'),
420
+ changed,
421
+ prefabAsset,
422
+ ...(extra.selectedNodeId ? { selectedNodeId: extra.selectedNodeId } : {}),
423
+ ...(extra.createdNodeId ? { createdNodeId: extra.createdNodeId } : {}),
424
+ ...(extra.deletedNodeIds ? { deletedNodeIds: [...extra.deletedNodeIds] } : {}),
425
+ ...(node ? { node: structuredClone(node) } : {}),
426
+ diagnostics: diagnostics.map(diagnostic => ({ ...diagnostic })),
427
+ };
428
+ }
429
+ function cloneEditorScenePrefabAssetWithComposition(prefabAsset) {
430
+ const next = structuredClone(prefabAsset);
431
+ const nodes = readEditorScenePrefabNodes(prefabAsset);
432
+ next.prefab = structuredClone(next.prefab);
433
+ next.prefab.compositionVersion = EDITOR_SCENE_PREFAB_COMPOSITION_VERSION;
434
+ next.prefab.nodes = nodes;
435
+ const rootNodeId = readEditorScenePrefabRootNodeId({ ...prefabAsset, prefab: { ...prefabAsset.prefab, nodes } });
436
+ if (rootNodeId)
437
+ next.prefab.rootNodeId = rootNodeId;
438
+ else
439
+ delete next.prefab.rootNodeId;
440
+ return next;
441
+ }
442
+ function resolveEditorScenePrefabMutationParent(prefabAsset, parentId) {
443
+ const rootNodeId = readEditorScenePrefabRootNodeId(prefabAsset);
444
+ const normalizedParentId = readEditorSceneNonEmptyString(parentId) ?? rootNodeId;
445
+ if (!normalizedParentId || !findEditorScenePrefabNode(prefabAsset, normalizedParentId)) {
446
+ return {
447
+ ok: false,
448
+ diagnostics: [{
449
+ code: 'prefab.parentNotFound',
450
+ severity: 'error',
451
+ message: `Prefab parent node "${normalizedParentId ?? parentId ?? 'root'}" was not found.`,
452
+ assetId: prefabAsset.id,
453
+ ...(normalizedParentId ? { parentId: normalizedParentId } : {}),
454
+ }],
455
+ };
456
+ }
457
+ return { ok: true, parentId: normalizedParentId };
458
+ }
459
+ function appendEditorScenePrefabNode(prefabAsset, node) {
460
+ const next = structuredClone(prefabAsset);
461
+ const nodes = readEditorScenePrefabNodes(prefabAsset);
462
+ const nodeId = createUniqueEditorScenePrefabNodeId(nodes, node.id);
463
+ const nextNode = {
464
+ ...structuredClone(node),
465
+ id: nodeId,
466
+ };
467
+ next.prefab = structuredClone(next.prefab);
468
+ next.prefab.compositionVersion = EDITOR_SCENE_PREFAB_COMPOSITION_VERSION;
469
+ const rootNodeId = readEditorScenePrefabRootNodeId(prefabAsset);
470
+ if (rootNodeId)
471
+ next.prefab.rootNodeId = rootNodeId;
472
+ else
473
+ delete next.prefab.rootNodeId;
474
+ next.prefab.nodes = [...nodes, nextNode];
475
+ return createEditorScenePrefabMutationResult(next, true, nextNode, [], {
476
+ createdNodeId: nextNode.id,
477
+ selectedNodeId: nextNode.id,
478
+ });
479
+ }
480
+ function updateEditorScenePrefabNode(prefabAsset, nodeId, update) {
481
+ const nodes = readEditorScenePrefabNodes(prefabAsset);
482
+ const index = nodes.findIndex(node => node.id === nodeId);
483
+ if (index < 0) {
484
+ return createEditorScenePrefabMutationResult(prefabAsset, false, null, [{
485
+ code: 'prefab.nodeNotFound',
486
+ severity: 'error',
487
+ message: `Prefab node "${nodeId}" was not found.`,
488
+ assetId: prefabAsset.id,
489
+ nodeId,
490
+ }]);
491
+ }
492
+ const updated = update(structuredClone(nodes[index]));
493
+ const nextNodes = [...nodes];
494
+ nextNodes[index] = updated;
495
+ const next = structuredClone(prefabAsset);
496
+ next.prefab = structuredClone(next.prefab);
497
+ next.prefab.compositionVersion = EDITOR_SCENE_PREFAB_COMPOSITION_VERSION;
498
+ const rootNodeId = readEditorScenePrefabRootNodeId(prefabAsset);
499
+ if (rootNodeId)
500
+ next.prefab.rootNodeId = rootNodeId;
501
+ else
502
+ delete next.prefab.rootNodeId;
503
+ next.prefab.nodes = nextNodes;
504
+ return createEditorScenePrefabMutationResult(next, JSON.stringify(nodes[index]) !== JSON.stringify(updated), updated, [], {
505
+ selectedNodeId: updated.id,
506
+ });
507
+ }
508
+ function createUniqueEditorScenePrefabNodeId(nodes, preferredId) {
509
+ const used = new Set(nodes.map(node => node.id));
510
+ const base = normalizeEditorScenePrefabIdentifierPart(preferredId) ?? 'prefab_node';
511
+ if (!used.has(base))
512
+ return base;
513
+ let suffix = 1;
514
+ let candidate = `${base}_${suffix}`;
515
+ while (used.has(candidate)) {
516
+ suffix += 1;
517
+ candidate = `${base}_${suffix}`;
518
+ }
519
+ return candidate;
520
+ }
521
+ function isEditorScenePrefabNodeDescendant(nodes, candidateNodeId, ancestorNodeId) {
522
+ let current = nodes.find(node => node.id === candidateNodeId);
523
+ const visited = new Set();
524
+ while (current?.parentId) {
525
+ if (current.parentId === ancestorNodeId)
526
+ return true;
527
+ if (visited.has(current.parentId))
528
+ return false;
529
+ visited.add(current.parentId);
530
+ current = nodes.find(node => node.id === current?.parentId);
531
+ }
532
+ return false;
533
+ }
534
+ function collectEditorScenePrefabNodeSubtree(nodes, nodeId, output) {
535
+ if (output.has(nodeId))
536
+ return;
537
+ output.add(nodeId);
538
+ for (const child of nodes.filter(node => node.parentId === nodeId)) {
539
+ collectEditorScenePrefabNodeSubtree(nodes, child.id, output);
540
+ }
541
+ }
33
542
  export function createEditorScenePrefabDefinitionFromAsset(sourceAsset, options = {}) {
34
543
  return {
35
544
  id: options.id ?? `${sourceAsset.id}-prefab`,
@@ -41,10 +550,98 @@ export function createEditorScenePrefabDefinitionFromAsset(sourceAsset, options
41
550
  sourceAssetId: sourceAsset.id,
42
551
  ...(sourceAsset.guid ? { sourceAssetGuid: sourceAsset.guid } : {}),
43
552
  ...(options.defaults ? { defaults: { ...options.defaults } } : {}),
553
+ compositionVersion: EDITOR_SCENE_PREFAB_COMPOSITION_VERSION,
554
+ rootNodeId: EDITOR_SCENE_PREFAB_LEGACY_ROOT_NODE_ID,
555
+ nodes: [
556
+ {
557
+ id: EDITOR_SCENE_PREFAB_LEGACY_ROOT_NODE_ID,
558
+ name: options.displayName ?? createEditorScenePrefabDisplayName(sourceAsset),
559
+ kind: 'root',
560
+ ...(options.defaults ? { defaults: { ...options.defaults } } : {}),
561
+ },
562
+ {
563
+ id: EDITOR_SCENE_PREFAB_LEGACY_MODEL_NODE_ID,
564
+ name: sourceAsset.displayName ?? sourceAsset.id,
565
+ parentId: EDITOR_SCENE_PREFAB_LEGACY_ROOT_NODE_ID,
566
+ kind: 'model',
567
+ sourceAssetId: sourceAsset.id,
568
+ },
569
+ ],
44
570
  },
45
571
  ...(options.metadata ? { metadata: { ...options.metadata } } : {}),
46
572
  };
47
573
  }
574
+ function readEditorScenePrefabExplicitNodes(prefab) {
575
+ if (!Array.isArray(prefab.nodes))
576
+ return [];
577
+ const nodes = [];
578
+ for (const rawNode of prefab.nodes) {
579
+ const node = readEditorScenePrefabNode(rawNode);
580
+ if (node && !nodes.some(existing => existing.id === node.id))
581
+ nodes.push(node);
582
+ }
583
+ return structuredClone(nodes);
584
+ }
585
+ function readEditorScenePrefabNode(value) {
586
+ if (!value || typeof value !== 'object' || Array.isArray(value))
587
+ return null;
588
+ const record = value;
589
+ const id = readEditorSceneNonEmptyString(record.id);
590
+ if (!id || !isEditorScenePrefabNodeKind(record.kind))
591
+ return null;
592
+ return {
593
+ id,
594
+ ...(readEditorSceneNonEmptyString(record.guid) ? { guid: readEditorSceneNonEmptyString(record.guid) } : {}),
595
+ ...(readEditorSceneNonEmptyString(record.name) ? { name: readEditorSceneNonEmptyString(record.name) } : {}),
596
+ ...(readEditorSceneNonEmptyString(record.parentId) ? { parentId: readEditorSceneNonEmptyString(record.parentId) } : {}),
597
+ kind: record.kind,
598
+ ...(record.transform ? { transform: structuredClone(record.transform) } : {}),
599
+ ...(readEditorSceneNonEmptyString(record.sourceAssetId) ? { sourceAssetId: readEditorSceneNonEmptyString(record.sourceAssetId) } : {}),
600
+ ...(readEditorSceneNonEmptyString(record.sourceNodePath) ? { sourceNodePath: readEditorSceneNonEmptyString(record.sourceNodePath) } : {}),
601
+ ...(readEditorSceneNonEmptyString(record.childPrefabId) ? { childPrefabId: readEditorSceneNonEmptyString(record.childPrefabId) } : {}),
602
+ ...(record.primitive ? { primitive: structuredClone(record.primitive) } : {}),
603
+ ...(record.light ? { light: structuredClone(record.light) } : {}),
604
+ ...(record.defaults ? { defaults: structuredClone(record.defaults) } : {}),
605
+ ...(record.overrides ? { overrides: structuredClone(record.overrides) } : {}),
606
+ ...(record.metadata ? { metadata: structuredClone(record.metadata) } : {}),
607
+ };
608
+ }
609
+ function isEditorScenePrefabNodeKind(value) {
610
+ return value === 'root'
611
+ || value === 'group'
612
+ || value === 'model'
613
+ || value === 'primitive'
614
+ || value === 'light'
615
+ || value === 'prefabInstance'
616
+ || value === 'collision';
617
+ }
618
+ function createEditorScenePrefabLegacyCompositionNodes(prefabAsset) {
619
+ const root = createEditorScenePrefabLegacyRootNode(prefabAsset);
620
+ const sourceAssetId = resolveEditorScenePrefabSourceAssetId(prefabAsset);
621
+ if (!root || !sourceAssetId)
622
+ return [];
623
+ return [
624
+ root,
625
+ {
626
+ id: EDITOR_SCENE_PREFAB_LEGACY_MODEL_NODE_ID,
627
+ name: readEditorSceneNonEmptyString(prefabAsset.displayName) ?? sourceAssetId,
628
+ parentId: root.id,
629
+ kind: 'model',
630
+ sourceAssetId,
631
+ },
632
+ ];
633
+ }
634
+ function createEditorScenePrefabLegacyRootNode(prefabAsset) {
635
+ if (!resolveEditorScenePrefabSourceAssetId(prefabAsset))
636
+ return null;
637
+ return {
638
+ id: EDITOR_SCENE_PREFAB_LEGACY_ROOT_NODE_ID,
639
+ name: readEditorSceneNonEmptyString(prefabAsset.displayName) ?? 'Prefab',
640
+ kind: 'root',
641
+ ...(prefabAsset.prefab?.defaults ? { defaults: structuredClone(prefabAsset.prefab.defaults) } : {}),
642
+ ...(prefabAsset.prefab?.overrides ? { overrides: structuredClone(prefabAsset.prefab.overrides) } : {}),
643
+ };
644
+ }
48
645
  export function createEditorScenePrefabInstanceGameObject(input) {
49
646
  const sourceAssetId = resolveEditorScenePrefabSourceAssetId(input.prefabAsset);
50
647
  if (!sourceAssetId) {
@@ -59,6 +656,7 @@ export function createEditorScenePrefabInstanceGameObject(input) {
59
656
  ...(input.parentId ? { parentId: input.parentId } : {}),
60
657
  active: input.active ?? defaults?.active ?? true,
61
658
  ...(input.shadowMode ?? defaults?.shadowMode ? { shadowMode: input.shadowMode ?? defaults?.shadowMode } : {}),
659
+ ...(input.shadow ?? defaults?.shadow ? { shadow: structuredClone(input.shadow ?? defaults?.shadow) } : {}),
62
660
  prefab: {
63
661
  prefabId: input.prefabAsset.id,
64
662
  ...(input.prefabAsset.guid ? { prefabGuid: input.prefabAsset.guid } : {}),
@@ -374,8 +972,7 @@ export function resolveEditorSceneGameObjectRendering(gameObject) {
374
972
  ? gameObject.rendering
375
973
  : undefined;
376
974
  const renderingGroupId = readEditorSceneGameObjectRenderingGroupId(rendering?.renderingGroupId);
377
- const alphaIndex = readEditorSceneFiniteNumber(rendering?.alphaIndex)
378
- ?? readEditorSceneLegacyGroundDecalAlphaIndex(gameObject);
975
+ const alphaIndex = readEditorSceneFiniteNumber(rendering?.alphaIndex);
379
976
  const resolved = {};
380
977
  if (renderingGroupId != null)
381
978
  resolved.renderingGroupId = renderingGroupId;
@@ -395,18 +992,25 @@ function isEditorSceneTransformComponent(component) {
395
992
  function isEditorSceneModelRendererComponent(component) {
396
993
  return component.type === 'ModelRenderer';
397
994
  }
398
- function readEditorSceneLegacyGroundDecalAlphaIndex(gameObject) {
399
- const groundDecal = gameObject.groundDecal;
400
- if (!groundDecal || typeof groundDecal !== 'object' || Array.isArray(groundDecal))
401
- return null;
402
- return readEditorSceneFiniteNumber(groundDecal.alphaIndex);
403
- }
404
995
  function readEditorSceneFiniteNumber(value) {
405
996
  return typeof value === 'number' && Number.isFinite(value) ? value : null;
406
997
  }
407
998
  function readEditorSceneNonEmptyString(value) {
408
999
  return typeof value === 'string' && value.trim().length > 0 ? value.trim() : null;
409
1000
  }
1001
+ function normalizeEditorScenePrefabEditableName(value) {
1002
+ if (typeof value !== 'string')
1003
+ return { ok: false, message: 'Prefab name must be a string.' };
1004
+ const name = value.trim();
1005
+ if (!name)
1006
+ return { ok: false, message: 'Prefab name cannot be empty.' };
1007
+ if (name.length > 80)
1008
+ return { ok: false, message: 'Prefab name cannot be longer than 80 characters.' };
1009
+ if (/[\u0000-\u001f\u007f/\\]/u.test(name)) {
1010
+ return { ok: false, message: 'Prefab name cannot contain control characters, /, or \\.' };
1011
+ }
1012
+ return { ok: true, name };
1013
+ }
410
1014
  function findEditorSceneGameObject(document, gameObjectId) {
411
1015
  return document.scene.gameObjects.find(gameObject => gameObject.id === gameObjectId) ?? null;
412
1016
  }