@cavegiant/cave-world-r3f 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/LICENSE +21 -0
  3. package/README.md +189 -0
  4. package/dist/core/connector-label/readiness.d.ts +11 -0
  5. package/dist/core/connector-label/readiness.d.ts.map +1 -0
  6. package/dist/core/connector-label/readiness.js +31 -0
  7. package/dist/core/connector-label/readiness.js.map +1 -0
  8. package/dist/core/connector-label/types.d.ts +64 -0
  9. package/dist/core/connector-label/types.d.ts.map +1 -0
  10. package/dist/core/connector-label/types.js +47 -0
  11. package/dist/core/connector-label/types.js.map +1 -0
  12. package/dist/core/context/cave-world-context.d.ts +96 -0
  13. package/dist/core/context/cave-world-context.d.ts.map +1 -0
  14. package/dist/core/context/cave-world-context.js +100 -0
  15. package/dist/core/context/cave-world-context.js.map +1 -0
  16. package/dist/core/errors.d.ts +34 -0
  17. package/dist/core/errors.d.ts.map +1 -0
  18. package/dist/core/errors.js +17 -0
  19. package/dist/core/errors.js.map +1 -0
  20. package/dist/core/events/event-bus.d.ts +122 -0
  21. package/dist/core/events/event-bus.d.ts.map +1 -0
  22. package/dist/core/events/event-bus.js +62 -0
  23. package/dist/core/events/event-bus.js.map +1 -0
  24. package/dist/core/hooks/use-cave-event.d.ts +13 -0
  25. package/dist/core/hooks/use-cave-event.d.ts.map +1 -0
  26. package/dist/core/hooks/use-cave-event.js +12 -0
  27. package/dist/core/hooks/use-cave-event.js.map +1 -0
  28. package/dist/core/i18n/messages.d.ts +82 -0
  29. package/dist/core/i18n/messages.d.ts.map +1 -0
  30. package/dist/core/i18n/messages.js +131 -0
  31. package/dist/core/i18n/messages.js.map +1 -0
  32. package/dist/core/index.d.ts +11 -0
  33. package/dist/core/index.d.ts.map +1 -0
  34. package/dist/core/index.js +47 -0
  35. package/dist/core/index.js.map +1 -0
  36. package/dist/core/logging/logger.d.ts +29 -0
  37. package/dist/core/logging/logger.d.ts.map +1 -0
  38. package/dist/core/logging/logger.js +47 -0
  39. package/dist/core/logging/logger.js.map +1 -0
  40. package/dist/core/registry/component-registry.d.ts +41 -0
  41. package/dist/core/registry/component-registry.d.ts.map +1 -0
  42. package/dist/core/registry/component-registry.js +34 -0
  43. package/dist/core/registry/component-registry.js.map +1 -0
  44. package/dist/core/registry/object-registry.d.ts +38 -0
  45. package/dist/core/registry/object-registry.d.ts.map +1 -0
  46. package/dist/core/registry/object-registry.js +32 -0
  47. package/dist/core/registry/object-registry.js.map +1 -0
  48. package/dist/explore/cave-explore.d.ts +85 -0
  49. package/dist/explore/cave-explore.d.ts.map +1 -0
  50. package/dist/explore/cave-explore.js +204 -0
  51. package/dist/explore/cave-explore.js.map +1 -0
  52. package/dist/explore/cave-orbit-viewer.d.ts +76 -0
  53. package/dist/explore/cave-orbit-viewer.d.ts.map +1 -0
  54. package/dist/explore/cave-orbit-viewer.js +123 -0
  55. package/dist/explore/cave-orbit-viewer.js.map +1 -0
  56. package/dist/explore/characters/character-configs.d.ts +38 -0
  57. package/dist/explore/characters/character-configs.d.ts.map +1 -0
  58. package/dist/explore/characters/character-configs.js +45 -0
  59. package/dist/explore/characters/character-configs.js.map +1 -0
  60. package/dist/explore/characters/character-controls.d.ts +44 -0
  61. package/dist/explore/characters/character-controls.d.ts.map +1 -0
  62. package/dist/explore/characters/character-pose.d.ts +19 -0
  63. package/dist/explore/characters/character-pose.d.ts.map +1 -0
  64. package/dist/explore/characters/character-pose.js +13 -0
  65. package/dist/explore/characters/character-pose.js.map +1 -0
  66. package/dist/explore/characters/local-character-model.d.ts +53 -0
  67. package/dist/explore/characters/local-character-model.d.ts.map +1 -0
  68. package/dist/explore/characters/local-character-model.js +36 -0
  69. package/dist/explore/characters/local-character-model.js.map +1 -0
  70. package/dist/explore/characters/mixamo-style-bone-map.d.ts +9 -0
  71. package/dist/explore/characters/mixamo-style-bone-map.d.ts.map +1 -0
  72. package/dist/explore/characters/mixamo-style-bone-map.js +28 -0
  73. package/dist/explore/characters/mixamo-style-bone-map.js.map +1 -0
  74. package/dist/explore/characters/remote-character-controller.d.ts +38 -0
  75. package/dist/explore/characters/remote-character-controller.d.ts.map +1 -0
  76. package/dist/explore/characters/remote-character-controller.js +135 -0
  77. package/dist/explore/characters/remote-character-controller.js.map +1 -0
  78. package/dist/explore/characters/remote-character.d.ts +19 -0
  79. package/dist/explore/characters/remote-character.d.ts.map +1 -0
  80. package/dist/explore/characters/remote-character.js +63 -0
  81. package/dist/explore/characters/remote-character.js.map +1 -0
  82. package/dist/explore/connected-spaces-renderer.d.ts +16 -0
  83. package/dist/explore/connected-spaces-renderer.d.ts.map +1 -0
  84. package/dist/explore/connected-spaces-renderer.js +103 -0
  85. package/dist/explore/connected-spaces-renderer.js.map +1 -0
  86. package/dist/explore/hooks/use-action-shortcuts.d.ts +16 -0
  87. package/dist/explore/hooks/use-action-shortcuts.d.ts.map +1 -0
  88. package/dist/explore/hooks/use-action-shortcuts.js +23 -0
  89. package/dist/explore/hooks/use-action-shortcuts.js.map +1 -0
  90. package/dist/explore/hooks/use-active-space-notify.d.ts +11 -0
  91. package/dist/explore/hooks/use-active-space-notify.d.ts.map +1 -0
  92. package/dist/explore/hooks/use-active-space-notify.js +17 -0
  93. package/dist/explore/hooks/use-active-space-notify.js.map +1 -0
  94. package/dist/explore/hooks/use-character-sync.d.ts +46 -0
  95. package/dist/explore/hooks/use-character-sync.d.ts.map +1 -0
  96. package/dist/explore/hooks/use-character-sync.js +72 -0
  97. package/dist/explore/hooks/use-character-sync.js.map +1 -0
  98. package/dist/explore/hooks/use-connector-preloader.d.ts +20 -0
  99. package/dist/explore/hooks/use-connector-preloader.d.ts.map +1 -0
  100. package/dist/explore/hooks/use-connector-preloader.js +78 -0
  101. package/dist/explore/hooks/use-connector-preloader.js.map +1 -0
  102. package/dist/explore/hooks/use-connector-transitions.d.ts +31 -0
  103. package/dist/explore/hooks/use-connector-transitions.d.ts.map +1 -0
  104. package/dist/explore/hooks/use-connector-transitions.js +63 -0
  105. package/dist/explore/hooks/use-connector-transitions.js.map +1 -0
  106. package/dist/explore/hooks/use-explore-actions.d.ts +17 -0
  107. package/dist/explore/hooks/use-explore-actions.d.ts.map +1 -0
  108. package/dist/explore/hooks/use-explore-actions.js +134 -0
  109. package/dist/explore/hooks/use-explore-actions.js.map +1 -0
  110. package/dist/explore/hooks/use-load-error-notify.d.ts +11 -0
  111. package/dist/explore/hooks/use-load-error-notify.d.ts.map +1 -0
  112. package/dist/explore/hooks/use-load-error-notify.js +18 -0
  113. package/dist/explore/hooks/use-load-error-notify.js.map +1 -0
  114. package/dist/explore/hooks/use-primary-space-loader.d.ts +24 -0
  115. package/dist/explore/hooks/use-primary-space-loader.d.ts.map +1 -0
  116. package/dist/explore/hooks/use-primary-space-loader.js +29 -0
  117. package/dist/explore/hooks/use-primary-space-loader.js.map +1 -0
  118. package/dist/explore/index.d.ts +37 -0
  119. package/dist/explore/index.d.ts.map +1 -0
  120. package/dist/explore/index.js +107 -0
  121. package/dist/explore/index.js.map +1 -0
  122. package/dist/explore/loaders/cave-loader.d.ts +58 -0
  123. package/dist/explore/loaders/cave-loader.d.ts.map +1 -0
  124. package/dist/explore/loaders/cave-loader.js +79 -0
  125. package/dist/explore/loaders/cave-loader.js.map +1 -0
  126. package/dist/explore/math/space-transforms.d.ts +49 -0
  127. package/dist/explore/math/space-transforms.d.ts.map +1 -0
  128. package/dist/explore/math/space-transforms.js +54 -0
  129. package/dist/explore/math/space-transforms.js.map +1 -0
  130. package/dist/explore/overlays/action-bubble.d.ts +8 -0
  131. package/dist/explore/overlays/action-bubble.d.ts.map +1 -0
  132. package/dist/explore/overlays/action-bubble.js +18 -0
  133. package/dist/explore/overlays/action-bubble.js.map +1 -0
  134. package/dist/explore/overlays/action-panel.d.ts +12 -0
  135. package/dist/explore/overlays/action-panel.d.ts.map +1 -0
  136. package/dist/explore/overlays/action-panel.js +69 -0
  137. package/dist/explore/overlays/action-panel.js.map +1 -0
  138. package/dist/explore/overlays/connector-label-beacon.d.ts +11 -0
  139. package/dist/explore/overlays/connector-label-beacon.d.ts.map +1 -0
  140. package/dist/explore/overlays/connector-label-beacon.js +38 -0
  141. package/dist/explore/overlays/connector-label-beacon.js.map +1 -0
  142. package/dist/explore/overlays/connector-label-tag-shell.d.ts +16 -0
  143. package/dist/explore/overlays/connector-label-tag-shell.d.ts.map +1 -0
  144. package/dist/explore/overlays/connector-label-tag-shell.js +18 -0
  145. package/dist/explore/overlays/connector-label-tag-shell.js.map +1 -0
  146. package/dist/explore/overlays/detail-window.d.ts +9 -0
  147. package/dist/explore/overlays/detail-window.d.ts.map +1 -0
  148. package/dist/explore/overlays/detail-window.js +92 -0
  149. package/dist/explore/overlays/detail-window.js.map +1 -0
  150. package/dist/explore/overlays/explore-helper.d.ts +44 -0
  151. package/dist/explore/overlays/explore-helper.d.ts.map +1 -0
  152. package/dist/explore/overlays/explore-helper.js +57 -0
  153. package/dist/explore/overlays/explore-helper.js.map +1 -0
  154. package/dist/explore/overlays/icons.d.ts +16 -0
  155. package/dist/explore/overlays/icons.d.ts.map +1 -0
  156. package/dist/explore/overlays/icons.js +34 -0
  157. package/dist/explore/overlays/icons.js.map +1 -0
  158. package/dist/explore/overlays/space-load-error-overlay.d.ts +27 -0
  159. package/dist/explore/overlays/space-load-error-overlay.d.ts.map +1 -0
  160. package/dist/explore/overlays/space-load-error-overlay.js +24 -0
  161. package/dist/explore/overlays/space-load-error-overlay.js.map +1 -0
  162. package/dist/explore/services/websocket.service.d.ts +180 -0
  163. package/dist/explore/services/websocket.service.d.ts.map +1 -0
  164. package/dist/explore/services/websocket.service.js +187 -0
  165. package/dist/explore/services/websocket.service.js.map +1 -0
  166. package/dist/explore/simple-character.d.ts +46 -0
  167. package/dist/explore/simple-character.d.ts.map +1 -0
  168. package/dist/explore/simple-character.js +119 -0
  169. package/dist/explore/simple-character.js.map +1 -0
  170. package/dist/explore/stores/action-prompt.store.d.ts +27 -0
  171. package/dist/explore/stores/action-prompt.store.d.ts.map +1 -0
  172. package/dist/explore/stores/action-prompt.store.js +14 -0
  173. package/dist/explore/stores/action-prompt.store.js.map +1 -0
  174. package/dist/explore/stores/cave-explore.store.d.ts +77 -0
  175. package/dist/explore/stores/cave-explore.store.d.ts.map +1 -0
  176. package/dist/explore/stores/cave-explore.store.js +66 -0
  177. package/dist/explore/stores/cave-explore.store.js.map +1 -0
  178. package/dist/explore/stores/explore-context.d.ts +35 -0
  179. package/dist/explore/stores/explore-context.d.ts.map +1 -0
  180. package/dist/explore/stores/explore-context.js +43 -0
  181. package/dist/explore/stores/explore-context.js.map +1 -0
  182. package/dist/explore/styles/cave-world-css.d.ts +10 -0
  183. package/dist/explore/styles/cave-world-css.d.ts.map +1 -0
  184. package/dist/explore/styles/cave-world-css.js +935 -0
  185. package/dist/explore/styles/cave-world-css.js.map +1 -0
  186. package/dist/explore/styles/inject.d.ts +32 -0
  187. package/dist/explore/styles/inject.d.ts.map +1 -0
  188. package/dist/explore/styles/inject.js +40 -0
  189. package/dist/explore/styles/inject.js.map +1 -0
  190. package/dist/explore/utils/schedule-idle.d.ts +12 -0
  191. package/dist/explore/utils/schedule-idle.d.ts.map +1 -0
  192. package/dist/explore/utils/schedule-idle.js +16 -0
  193. package/dist/explore/utils/schedule-idle.js.map +1 -0
  194. package/dist/explore/viewer-shared.d.ts +56 -0
  195. package/dist/explore/viewer-shared.d.ts.map +1 -0
  196. package/dist/index.d.ts +16 -0
  197. package/dist/index.d.ts.map +1 -0
  198. package/dist/index.js +78 -0
  199. package/dist/index.js.map +1 -0
  200. package/dist/space/cave-base-layer.d.ts +42 -0
  201. package/dist/space/cave-base-layer.d.ts.map +1 -0
  202. package/dist/space/cave-base-layer.js +221 -0
  203. package/dist/space/cave-base-layer.js.map +1 -0
  204. package/dist/space/cave-custom-layer.d.ts +12 -0
  205. package/dist/space/cave-custom-layer.d.ts.map +1 -0
  206. package/dist/space/cave-custom-layer.js +17 -0
  207. package/dist/space/cave-custom-layer.js.map +1 -0
  208. package/dist/space/cave-env.d.ts +6 -0
  209. package/dist/space/cave-env.d.ts.map +1 -0
  210. package/dist/space/cave-env.js +23 -0
  211. package/dist/space/cave-env.js.map +1 -0
  212. package/dist/space/cave-space.d.ts +46 -0
  213. package/dist/space/cave-space.d.ts.map +1 -0
  214. package/dist/space/cave-space.js +37 -0
  215. package/dist/space/cave-space.js.map +1 -0
  216. package/dist/space/connector-label-host.d.ts +21 -0
  217. package/dist/space/connector-label-host.d.ts.map +1 -0
  218. package/dist/space/connector-label-host.js +65 -0
  219. package/dist/space/connector-label-host.js.map +1 -0
  220. package/dist/space/index.d.ts +18 -0
  221. package/dist/space/index.d.ts.map +1 -0
  222. package/dist/space/index.js +47 -0
  223. package/dist/space/index.js.map +1 -0
  224. package/dist/space/objects/builtin-registrar.d.ts +17 -0
  225. package/dist/space/objects/builtin-registrar.d.ts.map +1 -0
  226. package/dist/space/objects/builtin-registrar.js +19 -0
  227. package/dist/space/objects/builtin-registrar.js.map +1 -0
  228. package/dist/space/objects/custom-object.d.ts +9 -0
  229. package/dist/space/objects/custom-object.d.ts.map +1 -0
  230. package/dist/space/objects/custom-object.js +56 -0
  231. package/dist/space/objects/custom-object.js.map +1 -0
  232. package/dist/space/objects/image-object.d.ts +7 -0
  233. package/dist/space/objects/image-object.d.ts.map +1 -0
  234. package/dist/space/objects/image-object.js +14 -0
  235. package/dist/space/objects/image-object.js.map +1 -0
  236. package/dist/space/objects/model-object/fbx-object.d.ts +8 -0
  237. package/dist/space/objects/model-object/fbx-object.d.ts.map +1 -0
  238. package/dist/space/objects/model-object/fbx-object.js +26 -0
  239. package/dist/space/objects/model-object/fbx-object.js.map +1 -0
  240. package/dist/space/objects/model-object/gltf-object.d.ts +9 -0
  241. package/dist/space/objects/model-object/gltf-object.d.ts.map +1 -0
  242. package/dist/space/objects/model-object/gltf-object.js +66 -0
  243. package/dist/space/objects/model-object/gltf-object.js.map +1 -0
  244. package/dist/space/objects/model-object/index.d.ts +9 -0
  245. package/dist/space/objects/model-object/index.d.ts.map +1 -0
  246. package/dist/space/objects/model-object/index.js +12 -0
  247. package/dist/space/objects/model-object/index.js.map +1 -0
  248. package/dist/space/objects/model-object/splat-object.d.ts +9 -0
  249. package/dist/space/objects/model-object/splat-object.d.ts.map +1 -0
  250. package/dist/space/objects/model-object/splat-object.js +19 -0
  251. package/dist/space/objects/model-object/splat-object.js.map +1 -0
  252. package/dist/space/objects/object-components/windows/index.d.ts +5 -0
  253. package/dist/space/objects/object-components/windows/index.d.ts.map +1 -0
  254. package/dist/space/objects/object-components/windows/index.js +20 -0
  255. package/dist/space/objects/object-components/windows/index.js.map +1 -0
  256. package/dist/space/objects/placeholder-object.d.ts +7 -0
  257. package/dist/space/objects/placeholder-object.d.ts.map +1 -0
  258. package/dist/space/objects/placeholder-object.js +12 -0
  259. package/dist/space/objects/placeholder-object.js.map +1 -0
  260. package/dist/space/objects/poi-object.d.ts +7 -0
  261. package/dist/space/objects/poi-object.d.ts.map +1 -0
  262. package/dist/space/objects/poi-object.js +38 -0
  263. package/dist/space/objects/poi-object.js.map +1 -0
  264. package/dist/space/objects/portal-object.d.ts +7 -0
  265. package/dist/space/objects/portal-object.d.ts.map +1 -0
  266. package/dist/space/objects/portal-object.js +84 -0
  267. package/dist/space/objects/portal-object.js.map +1 -0
  268. package/dist/space/objects/video-object.d.ts +7 -0
  269. package/dist/space/objects/video-object.d.ts.map +1 -0
  270. package/dist/space/objects/video-object.js +32 -0
  271. package/dist/space/objects/video-object.js.map +1 -0
  272. package/dist/space/polygon-boundary.d.ts +10 -0
  273. package/dist/space/polygon-boundary.d.ts.map +1 -0
  274. package/dist/space/polygon-boundary.js +205 -0
  275. package/dist/space/polygon-boundary.js.map +1 -0
  276. package/dist/space/splats/spark/robust-splat-mesh.d.ts +59 -0
  277. package/dist/space/splats/spark/robust-splat-mesh.d.ts.map +1 -0
  278. package/dist/space/splats/spark/robust-splat-mesh.js +105 -0
  279. package/dist/space/splats/spark/robust-splat-mesh.js.map +1 -0
  280. package/dist/space/splats/spark/splat-mesh.d.ts +5 -0
  281. package/dist/space/splats/spark/splat-mesh.d.ts.map +1 -0
  282. package/dist/space/splats/spark/splat-mesh.js +7 -0
  283. package/dist/space/splats/spark/splat-mesh.js.map +1 -0
  284. package/dist/space/splats/spark/splat-spread-reveal.d.ts +14 -0
  285. package/dist/space/splats/spark/splat-spread-reveal.d.ts.map +1 -0
  286. package/dist/space/splats/spark/splat-spread-reveal.js +45 -0
  287. package/dist/space/splats/spark/splat-spread-reveal.js.map +1 -0
  288. package/dist/space/utils/cave-world-player.d.ts +3 -0
  289. package/dist/space/utils/cave-world-player.d.ts.map +1 -0
  290. package/dist/space/utils/cave-world-player.js +5 -0
  291. package/dist/space/utils/cave-world-player.js.map +1 -0
  292. package/dist/space/utils/configure-canvas.d.ts +20 -0
  293. package/dist/space/utils/configure-canvas.d.ts.map +1 -0
  294. package/dist/space/utils/configure-canvas.js +12 -0
  295. package/dist/space/utils/configure-canvas.js.map +1 -0
  296. package/dist/space/utils/polygon-boundary-geometry.d.ts +8 -0
  297. package/dist/space/utils/polygon-boundary-geometry.d.ts.map +1 -0
  298. package/dist/space/utils/polygon-boundary-geometry.js +20 -0
  299. package/dist/space/utils/polygon-boundary-geometry.js.map +1 -0
  300. package/dist/space/utils/polygon-boundary-segments.d.ts +50 -0
  301. package/dist/space/utils/polygon-boundary-segments.d.ts.map +1 -0
  302. package/dist/space/utils/polygon-boundary-segments.js +64 -0
  303. package/dist/space/utils/polygon-boundary-segments.js.map +1 -0
  304. package/dist/space/utils/rotation-compat.d.ts +4 -0
  305. package/dist/space/utils/rotation-compat.d.ts.map +1 -0
  306. package/dist/space/utils/rotation-compat.js +9 -0
  307. package/dist/space/utils/rotation-compat.js.map +1 -0
  308. package/dist/space/utils/select-splat-level.d.ts +52 -0
  309. package/dist/space/utils/select-splat-level.d.ts.map +1 -0
  310. package/dist/space/utils/select-splat-level.js +43 -0
  311. package/dist/space/utils/select-splat-level.js.map +1 -0
  312. package/dist/space/utils/spark-performance.d.ts +10 -0
  313. package/dist/space/utils/spark-performance.d.ts.map +1 -0
  314. package/dist/space/utils/spark-performance.js +10 -0
  315. package/dist/space/utils/spark-performance.js.map +1 -0
  316. package/dist/space/utils/splat-collider-helper.d.ts +5 -0
  317. package/dist/space/utils/splat-collider-helper.d.ts.map +1 -0
  318. package/dist/space/utils/splat-collider-helper.js +162 -0
  319. package/dist/space/utils/splat-collider-helper.js.map +1 -0
  320. package/dist/space/utils/touch-primary-device.d.ts +16 -0
  321. package/dist/space/utils/touch-primary-device.d.ts.map +1 -0
  322. package/dist/space/utils/touch-primary-device.js +52 -0
  323. package/dist/space/utils/touch-primary-device.js.map +1 -0
  324. package/dist/space/utils/use-visibility-frameloop.d.ts +20 -0
  325. package/dist/space/utils/use-visibility-frameloop.d.ts.map +1 -0
  326. package/dist/space/utils/use-visibility-frameloop.js +18 -0
  327. package/dist/space/utils/use-visibility-frameloop.js.map +1 -0
  328. package/dist/styles.css +930 -0
  329. package/dist/types/index.d.ts +2 -0
  330. package/dist/types/index.d.ts.map +1 -0
  331. package/dist/types/index.js +2 -0
  332. package/dist/types/index.js.map +1 -0
  333. package/dist/types/space-types.d.ts +404 -0
  334. package/dist/types/space-types.d.ts.map +1 -0
  335. package/doc/API.md +617 -0
  336. package/doc/ARCHITECTURE.md +264 -0
  337. package/doc/multiplayer-protocol.md +757 -0
  338. package/doc/scene-json-structure.md +567 -0
  339. package/package.json +131 -0
@@ -0,0 +1,8 @@
1
+ import type { CustomObject } from '../../../types/index.js';
2
+ import type { ThreeEvent } from '@react-three/fiber';
3
+ export default function FbxObject(props: {
4
+ object: CustomObject;
5
+ onClick?: (event: ThreeEvent<MouseEvent>) => void;
6
+ static?: boolean;
7
+ }): import("react").JSX.Element | null;
8
+ //# sourceMappingURL=fbx-object.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fbx-object.d.ts","sourceRoot":"","sources":["../../../../space/objects/model-object/fbx-object.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAElD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAIpD,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,KAAK,EAAE;IACvC,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,KAAK,IAAI,CAAA;IACjD,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,sCAkCA"}
@@ -0,0 +1,26 @@
1
+ import { jsx as u } from "react/jsx-runtime";
2
+ import { useFBX as f, useAnimations as l, Clone as a } from "@react-three/drei";
3
+ import { useRef as m, useEffect as p } from "react";
4
+ function d(i) {
5
+ const { object: c, onClick: s } = i, r = m(null), e = f(c.model?.url || ""), t = l(e?.animations, r);
6
+ return p(() => {
7
+ if (i.static || !e || !t)
8
+ return;
9
+ const n = r.current, o = t.clips?.[0];
10
+ return o && n && t.mixer.clipAction(o, n).reset().fadeIn(0.2).play(), () => {
11
+ o && n && t.mixer.clipAction(o, n).fadeOut(0.2);
12
+ };
13
+ }, [t, t.clips, t.mixer, e, i.static]), e ? /* @__PURE__ */ u(
14
+ a,
15
+ {
16
+ ref: r,
17
+ object: e,
18
+ onPointerDown: s,
19
+ userData: { customObject: c }
20
+ }
21
+ ) : null;
22
+ }
23
+ export {
24
+ d as default
25
+ };
26
+ //# sourceMappingURL=fbx-object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fbx-object.js","sources":["../../../../space/objects/model-object/fbx-object.tsx"],"sourcesContent":["import type { CustomObject } from '../../../types'\nimport { Clone, useAnimations, useFBX } from '@react-three/drei'\nimport type { ThreeEvent } from '@react-three/fiber'\nimport { useEffect, useRef } from 'react'\nimport type { Group } from 'three'\n\nexport default function FbxObject(props: {\n object: CustomObject\n onClick?: (event: ThreeEvent<MouseEvent>) => void\n static?: boolean\n}) {\n const { object, onClick } = props\n const group = useRef<Group>(null)\n const fbx = useFBX(object.model?.url || '')\n const animations = useAnimations(fbx?.animations, group)\n\n useEffect(() => {\n if (props.static || !fbx || !animations) {\n return\n }\n\n const root = group.current\n const clip = animations.clips?.[0]\n if (clip && root) {\n animations.mixer.clipAction(clip, root).reset().fadeIn(0.2).play()\n }\n\n return () => {\n if (clip && root) {\n animations.mixer.clipAction(clip, root).fadeOut(0.2)\n }\n }\n }, [animations, animations.clips, animations.mixer, fbx, props.static])\n\n if (!fbx) return null\n\n return (\n <Clone\n ref={group}\n object={fbx}\n onPointerDown={onClick}\n userData={{ customObject: object }}\n ></Clone>\n )\n}\n"],"names":["FbxObject","props","object","onClick","group","useRef","fbx","useFBX","animations","useAnimations","useEffect","root","clip","jsx","Clone"],"mappings":";;;AAMA,SAAwBA,EAAUC,GAI/B;AACD,QAAM,EAAE,QAAAC,GAAQ,SAAAC,EAAA,IAAYF,GACtBG,IAAQC,EAAc,IAAI,GAC1BC,IAAMC,EAAOL,EAAO,OAAO,OAAO,EAAE,GACpCM,IAAaC,EAAcH,GAAK,YAAYF,CAAK;AAoBvD,SAlBAM,EAAU,MAAM;AACd,QAAIT,EAAM,UAAU,CAACK,KAAO,CAACE;AAC3B;AAGF,UAAMG,IAAOP,EAAM,SACbQ,IAAOJ,EAAW,QAAQ,CAAC;AACjC,WAAII,KAAQD,KACVH,EAAW,MAAM,WAAWI,GAAMD,CAAI,EAAE,QAAQ,OAAO,GAAG,EAAE,KAAA,GAGvD,MAAM;AACX,MAAIC,KAAQD,KACVH,EAAW,MAAM,WAAWI,GAAMD,CAAI,EAAE,QAAQ,GAAG;AAAA,IAEvD;AAAA,EACF,GAAG,CAACH,GAAYA,EAAW,OAAOA,EAAW,OAAOF,GAAKL,EAAM,MAAM,CAAC,GAEjEK,IAGH,gBAAAO;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,KAAKV;AAAA,MACL,QAAQE;AAAA,MACR,eAAeH;AAAA,MACf,UAAU,EAAE,cAAcD,EAAA;AAAA,IAAO;AAAA,EAAA,IAPpB;AAUnB;"}
@@ -0,0 +1,9 @@
1
+ import type { CustomObject } from '../../../types/index.js';
2
+ import type { ThreeEvent } from '@react-three/fiber';
3
+ export default function GltfObject(props: {
4
+ object: CustomObject;
5
+ onClick?: (event: ThreeEvent<MouseEvent>) => void;
6
+ static?: boolean;
7
+ physics?: boolean;
8
+ }): import("react").JSX.Element | null;
9
+ //# sourceMappingURL=gltf-object.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gltf-object.d.ts","sourceRoot":"","sources":["../../../../space/objects/model-object/gltf-object.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAsDpD,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,KAAK,EAAE;IACxC,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,KAAK,IAAI,CAAA;IACjD,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,sCAiDA"}
@@ -0,0 +1,66 @@
1
+ import { jsx as f } from "react/jsx-runtime";
2
+ import { useGLTF as b, useAnimations as h, Clone as l } from "@react-three/drei";
3
+ import { useRef as y, useEffect as g, useMemo as p } from "react";
4
+ import { Mesh as j } from "three";
5
+ import { BvhPhysicsBody as A } from "@react-three/viverse";
6
+ const O = (c) => {
7
+ const e = [];
8
+ if (c.traverse((s) => {
9
+ s instanceof j && e.push(s);
10
+ }), e.length === 0) return { isCompatible: !0 };
11
+ const m = Object.keys(e[0].geometry.attributes).sort();
12
+ for (let s = 0; s < e.length; s++) {
13
+ const i = e[s], o = Object.keys(i.geometry.attributes).sort();
14
+ if (JSON.stringify(m) !== JSON.stringify(o))
15
+ return {
16
+ isCompatible: !1
17
+ // reason: `Mesh [${mesh.name}] 属性不一致。期望: [${referenceAttrs}], 实际: [${currentAttrs}]`
18
+ };
19
+ const t = i.geometry;
20
+ if (t.morphAttributes && Object.keys(t.morphAttributes).length > 0) {
21
+ const r = t.attributes.position.count;
22
+ for (const a in t.morphAttributes)
23
+ if (t.morphAttributes[a].some(
24
+ (n) => n.count !== r
25
+ ))
26
+ return { isCompatible: !1 };
27
+ }
28
+ }
29
+ return { isCompatible: !0 };
30
+ };
31
+ function D(c) {
32
+ const { object: e, onClick: m, physics: s } = c, i = y(null), o = b(e.model?.url || ""), t = h(o?.animations, i);
33
+ g(() => {
34
+ if (c.static || !o || !t)
35
+ return;
36
+ const u = i.current, n = t.clips?.[0];
37
+ return n && u && t.mixer.clipAction(n, u).reset().fadeIn(0.2).play(), () => {
38
+ n && u && t.mixer.clipAction(n, u).fadeOut(0.2);
39
+ };
40
+ }, [t, t.clips, t.mixer, o, c.static]);
41
+ const r = p(() => o.scene ? o.scene.clone() : null, [o.scene]), a = p(
42
+ () => r ? O(r).isCompatible : !1,
43
+ [r]
44
+ );
45
+ return r ? s && a ? /* @__PURE__ */ f(A, { children: /* @__PURE__ */ f(
46
+ l,
47
+ {
48
+ ref: i,
49
+ object: r,
50
+ onPointerDown: m,
51
+ userData: { customObject: e }
52
+ }
53
+ ) }) : /* @__PURE__ */ f(
54
+ l,
55
+ {
56
+ ref: i,
57
+ object: r,
58
+ onPointerDown: m,
59
+ userData: { customObject: e }
60
+ }
61
+ ) : null;
62
+ }
63
+ export {
64
+ D as default
65
+ };
66
+ //# sourceMappingURL=gltf-object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gltf-object.js","sources":["../../../../space/objects/model-object/gltf-object.tsx"],"sourcesContent":["import type { CustomObject } from '../../../types'\nimport type { ThreeEvent } from '@react-three/fiber'\nimport { Clone, useAnimations, useGLTF } from '@react-three/drei'\nimport { useEffect, useRef, useMemo } from 'react'\nimport type { Group } from 'three'\nimport { Mesh, type Object3D, type BufferAttribute } from 'three'\nimport { BvhPhysicsBody } from '@react-three/viverse'\n\n/**\n * 判断模型是否符合 BvhPhysicsBody 的合并要求\n * @returns { isCompatible: boolean, reason?: string }\n */\nconst validateForBvh = (scene: Group | Object3D) => {\n const meshes: Mesh[] = []\n scene.traverse((child) => {\n if (child instanceof Mesh) meshes.push(child)\n })\n\n if (meshes.length === 0) return { isCompatible: true }\n\n // 1. 获取第一个 Mesh 的属性列表作为基准\n const referenceAttrs = Object.keys(meshes[0].geometry.attributes).sort()\n\n for (let i = 0; i < meshes.length; i++) {\n const mesh = meshes[i]\n const currentAttrs = Object.keys(mesh.geometry.attributes).sort()\n\n // 2. 检查基础属性种类是否完全一致\n if (JSON.stringify(referenceAttrs) !== JSON.stringify(currentAttrs)) {\n return {\n isCompatible: false\n // reason: `Mesh [${mesh.name}] 属性不一致。期望: [${referenceAttrs}], 实际: [${currentAttrs}]`\n }\n }\n\n // 3. 检查 Morph Targets 是否合法\n const geom = mesh.geometry\n if (geom.morphAttributes && Object.keys(geom.morphAttributes).length > 0) {\n const baseCount = geom.attributes.position.count\n for (const key in geom.morphAttributes) {\n // @ts-expect-error: Three.js morphAttributes lacks a string index signature\n const hasMismatch = geom.morphAttributes[key].some(\n (attr: BufferAttribute) => attr.count !== baseCount\n )\n if (hasMismatch) {\n // reason: `Mesh [${mesh.name}] 的 MorphTarget 顶点数不匹配`\n return { isCompatible: false }\n }\n }\n }\n }\n\n return { isCompatible: true }\n}\n\nexport default function GltfObject(props: {\n object: CustomObject\n onClick?: (event: ThreeEvent<MouseEvent>) => void\n static?: boolean\n physics?: boolean\n}) {\n const { object, onClick, physics } = props\n const group = useRef<Group>(null)\n const gltf = useGLTF(object.model?.url || '')\n const animations = useAnimations(gltf?.animations, group)\n\n useEffect(() => {\n if (props.static || !gltf || !animations) {\n return\n }\n\n const root = group.current\n const clip = animations.clips?.[0]\n if (clip && root) {\n animations.mixer.clipAction(clip, root).reset().fadeIn(0.2).play()\n }\n\n return () => {\n if (clip && root) {\n animations.mixer.clipAction(clip, root).fadeOut(0.2)\n }\n }\n }, [animations, animations.clips, animations.mixer, gltf, props.static])\n\n const simplifiedScene = useMemo(() => (gltf.scene ? gltf.scene.clone() : null), [gltf.scene])\n const supportPhysics = useMemo(\n () => (simplifiedScene ? validateForBvh(simplifiedScene).isCompatible : false),\n [simplifiedScene]\n )\n\n if (!simplifiedScene) return null\n\n return physics && supportPhysics ? (\n <BvhPhysicsBody>\n <Clone\n ref={group}\n object={simplifiedScene}\n onPointerDown={onClick}\n userData={{ customObject: object }}\n ></Clone>\n </BvhPhysicsBody>\n ) : (\n <Clone\n ref={group}\n object={simplifiedScene}\n onPointerDown={onClick}\n userData={{ customObject: object }}\n ></Clone>\n )\n}\n"],"names":["validateForBvh","scene","meshes","child","Mesh","referenceAttrs","i","mesh","currentAttrs","geom","baseCount","key","attr","GltfObject","props","object","onClick","physics","group","useRef","gltf","useGLTF","animations","useAnimations","useEffect","root","clip","simplifiedScene","useMemo","supportPhysics","jsx","BvhPhysicsBody","Clone"],"mappings":";;;;;AAYA,MAAMA,IAAiB,CAACC,MAA4B;AAClD,QAAMC,IAAiB,CAAA;AAKvB,MAJAD,EAAM,SAAS,CAACE,MAAU;AACxB,IAAIA,aAAiBC,KAAMF,EAAO,KAAKC,CAAK;AAAA,EAC9C,CAAC,GAEGD,EAAO,WAAW,EAAG,QAAO,EAAE,cAAc,GAAA;AAGhD,QAAMG,IAAiB,OAAO,KAAKH,EAAO,CAAC,EAAE,SAAS,UAAU,EAAE,KAAA;AAElE,WAASI,IAAI,GAAGA,IAAIJ,EAAO,QAAQI,KAAK;AACtC,UAAMC,IAAOL,EAAOI,CAAC,GACfE,IAAe,OAAO,KAAKD,EAAK,SAAS,UAAU,EAAE,KAAA;AAG3D,QAAI,KAAK,UAAUF,CAAc,MAAM,KAAK,UAAUG,CAAY;AAChE,aAAO;AAAA,QACL,cAAc;AAAA;AAAA,MAAA;AAMlB,UAAMC,IAAOF,EAAK;AAClB,QAAIE,EAAK,mBAAmB,OAAO,KAAKA,EAAK,eAAe,EAAE,SAAS,GAAG;AACxE,YAAMC,IAAYD,EAAK,WAAW,SAAS;AAC3C,iBAAWE,KAAOF,EAAK;AAKrB,YAHoBA,EAAK,gBAAgBE,CAAG,EAAE;AAAA,UAC5C,CAACC,MAA0BA,EAAK,UAAUF;AAAA,QAAA;AAI1C,iBAAO,EAAE,cAAc,GAAA;AAAA,IAG7B;AAAA,EACF;AAEA,SAAO,EAAE,cAAc,GAAA;AACzB;AAEA,SAAwBG,EAAWC,GAKhC;AACD,QAAM,EAAE,QAAAC,GAAQ,SAAAC,GAAS,SAAAC,EAAA,IAAYH,GAC/BI,IAAQC,EAAc,IAAI,GAC1BC,IAAOC,EAAQN,EAAO,OAAO,OAAO,EAAE,GACtCO,IAAaC,EAAcH,GAAM,YAAYF,CAAK;AAExD,EAAAM,EAAU,MAAM;AACd,QAAIV,EAAM,UAAU,CAACM,KAAQ,CAACE;AAC5B;AAGF,UAAMG,IAAOP,EAAM,SACbQ,IAAOJ,EAAW,QAAQ,CAAC;AACjC,WAAII,KAAQD,KACVH,EAAW,MAAM,WAAWI,GAAMD,CAAI,EAAE,QAAQ,OAAO,GAAG,EAAE,KAAA,GAGvD,MAAM;AACX,MAAIC,KAAQD,KACVH,EAAW,MAAM,WAAWI,GAAMD,CAAI,EAAE,QAAQ,GAAG;AAAA,IAEvD;AAAA,EACF,GAAG,CAACH,GAAYA,EAAW,OAAOA,EAAW,OAAOF,GAAMN,EAAM,MAAM,CAAC;AAEvE,QAAMa,IAAkBC,EAAQ,MAAOR,EAAK,QAAQA,EAAK,MAAM,MAAA,IAAU,MAAO,CAACA,EAAK,KAAK,CAAC,GACtFS,IAAiBD;AAAA,IACrB,MAAOD,IAAkB3B,EAAe2B,CAAe,EAAE,eAAe;AAAA,IACxE,CAACA,CAAe;AAAA,EAAA;AAGlB,SAAKA,IAEEV,KAAWY,IAChB,gBAAAC,EAACC,GAAA,EACC,UAAA,gBAAAD;AAAA,IAACE;AAAA,IAAA;AAAA,MACC,KAAKd;AAAA,MACL,QAAQS;AAAA,MACR,eAAeX;AAAA,MACf,UAAU,EAAE,cAAcD,EAAA;AAAA,IAAO;AAAA,EAAA,GAErC,IAEA,gBAAAe;AAAA,IAACE;AAAA,IAAA;AAAA,MACC,KAAKd;AAAA,MACL,QAAQS;AAAA,MACR,eAAeX;AAAA,MACf,UAAU,EAAE,cAAcD,EAAA;AAAA,IAAO;AAAA,EAAA,IAhBR;AAmB/B;"}
@@ -0,0 +1,9 @@
1
+ import type { CustomObject } from '../../../types/index.js';
2
+ import type { ThreeEvent } from '@react-three/fiber';
3
+ export default function ModelObject(props: {
4
+ object: CustomObject;
5
+ physics?: boolean;
6
+ static?: boolean;
7
+ onClick?: (event: ThreeEvent<MouseEvent>) => void;
8
+ }): import("react").JSX.Element | null;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../space/objects/model-object/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAGlD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAGpD,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,KAAK,EAAE;IACzC,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,KAAK,IAAI,CAAA;CAClD,sCAoBA"}
@@ -0,0 +1,12 @@
1
+ import { jsx as e } from "react/jsx-runtime";
2
+ import o from "./gltf-object.js";
3
+ import r from "./fbx-object.js";
4
+ import { BvhPhysicsBody as n } from "@react-three/viverse";
5
+ function d(i) {
6
+ const { object: t, physics: c, onClick: l } = i;
7
+ return t.model?.url ? t.model.url.endsWith(".gltf") || t.model.url.endsWith(".glb") ? /* @__PURE__ */ e(o, { object: t, onClick: l, static: i.static }) : t.model.url.endsWith(".fbx") ? c ? /* @__PURE__ */ e(n, { children: /* @__PURE__ */ e(r, { object: t, onClick: l, static: i.static }) }) : /* @__PURE__ */ e(r, { object: t, onClick: l, static: i.static }) : null : null;
8
+ }
9
+ export {
10
+ d as default
11
+ };
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../space/objects/model-object/index.tsx"],"sourcesContent":["import type { CustomObject } from '../../../types'\nimport GltfObject from './gltf-object'\nimport FbxObject from './fbx-object'\nimport type { ThreeEvent } from '@react-three/fiber'\nimport { BvhPhysicsBody } from '@react-three/viverse'\n\nexport default function ModelObject(props: {\n object: CustomObject\n physics?: boolean\n static?: boolean\n onClick?: (event: ThreeEvent<MouseEvent>) => void\n}) {\n const { object, physics, onClick } = props\n\n if (!object.model?.url) return null\n\n if (object.model.url.endsWith('.gltf') || object.model.url.endsWith('.glb')) {\n return <GltfObject object={object} onClick={onClick} static={props.static} />\n }\n\n if (object.model.url.endsWith('.fbx')) {\n return physics ? (\n <BvhPhysicsBody>\n <FbxObject object={object} onClick={onClick} static={props.static} />\n </BvhPhysicsBody>\n ) : (\n <FbxObject object={object} onClick={onClick} static={props.static} />\n )\n }\n\n return null\n}\n"],"names":["ModelObject","props","object","physics","onClick","GltfObject","jsx","BvhPhysicsBody","FbxObject"],"mappings":";;;;AAMA,SAAwBA,EAAYC,GAKjC;AACD,QAAM,EAAE,QAAAC,GAAQ,SAAAC,GAAS,SAAAC,EAAA,IAAYH;AAErC,SAAKC,EAAO,OAAO,MAEfA,EAAO,MAAM,IAAI,SAAS,OAAO,KAAKA,EAAO,MAAM,IAAI,SAAS,MAAM,sBAChEG,GAAA,EAAW,QAAAH,GAAgB,SAAAE,GAAkB,QAAQH,EAAM,QAAQ,IAGzEC,EAAO,MAAM,IAAI,SAAS,MAAM,IAC3BC,IACL,gBAAAG,EAACC,GAAA,EACC,4BAACC,GAAA,EAAU,QAAAN,GAAgB,SAAAE,GAAkB,QAAQH,EAAM,OAAA,CAAQ,EAAA,CACrE,IAEA,gBAAAK,EAACE,GAAA,EAAU,QAAAN,GAAgB,SAAAE,GAAkB,QAAQH,EAAM,QAAQ,IAIhE,OAhBwB;AAiBjC;"}
@@ -0,0 +1,9 @@
1
+ import type { CustomObject } from '../../../types/index.js';
2
+ import type { ThreeEvent } from '@react-three/fiber';
3
+ export default function SplatObject(props: {
4
+ object: CustomObject;
5
+ onClick?: (event: ThreeEvent<MouseEvent>) => void;
6
+ static?: boolean;
7
+ ref?: undefined;
8
+ }): import("react").JSX.Element | null;
9
+ //# sourceMappingURL=splat-object.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"splat-object.d.ts","sourceRoot":"","sources":["../../../../space/objects/model-object/splat-object.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAKpD,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,KAAK,EAAE;IACzC,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,KAAK,IAAI,CAAA;IACjD,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,SAAS,CAAA;CAChB,sCAcA"}
@@ -0,0 +1,19 @@
1
+ import { jsx as e } from "react/jsx-runtime";
2
+ import l from "../../splats/spark/robust-splat-mesh.js";
3
+ const u = [1, 0, 0, 0];
4
+ function a(r) {
5
+ const { object: t, onClick: n } = r, o = t?.model?.url;
6
+ return o ? /* @__PURE__ */ e(
7
+ l,
8
+ {
9
+ url: o,
10
+ quaternion: u,
11
+ onPointerDown: n,
12
+ userData: { customObject: t }
13
+ }
14
+ ) : null;
15
+ }
16
+ export {
17
+ a as default
18
+ };
19
+ //# sourceMappingURL=splat-object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"splat-object.js","sources":["../../../../space/objects/model-object/splat-object.tsx"],"sourcesContent":["import type { CustomObject } from '../../../types'\nimport type { ThreeEvent } from '@react-three/fiber'\nimport RobustSplatMesh from '../../splats/spark/robust-splat-mesh'\n\nconst INIT_QUATERNION: [number, number, number, number] = [1, 0, 0, 0]\n\nexport default function SplatObject(props: {\n object: CustomObject\n onClick?: (event: ThreeEvent<MouseEvent>) => void\n static?: boolean\n ref?: undefined\n}) {\n const { object, onClick } = props\n const splatUrl = object?.model?.url\n\n if (!splatUrl) return null\n\n return (\n <RobustSplatMesh\n url={splatUrl}\n quaternion={INIT_QUATERNION}\n onPointerDown={onClick}\n userData={{ customObject: object }}\n />\n )\n}\n"],"names":["INIT_QUATERNION","SplatObject","props","object","onClick","splatUrl","jsx","RobustSplatMesh"],"mappings":";;AAIA,MAAMA,IAAoD,CAAC,GAAG,GAAG,GAAG,CAAC;AAErE,SAAwBC,EAAYC,GAKjC;AACD,QAAM,EAAE,QAAAC,GAAQ,SAAAC,EAAA,IAAYF,GACtBG,IAAWF,GAAQ,OAAO;AAEhC,SAAKE,IAGH,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,KAAKF;AAAA,MACL,YAAYL;AAAA,MACZ,eAAeI;AAAA,MACf,UAAU,EAAE,cAAcD,EAAA;AAAA,IAAO;AAAA,EAAA,IAPf;AAUxB;"}
@@ -0,0 +1,5 @@
1
+ import type { CustomObject } from '../../../../types/index.js';
2
+ export default function WindowComponent({ object }: {
3
+ object: CustomObject;
4
+ }): import("react").JSX.Element | null;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../space/objects/object-components/windows/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGrD,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,sCA6B3E"}
@@ -0,0 +1,20 @@
1
+ import { jsx as r, jsxs as c } from "react/jsx-runtime";
2
+ import { useCallback as m } from "react";
3
+ import { BvhPhysicsSensor as l } from "@react-three/viverse";
4
+ import { useCaveEventBus as h, useCaveWorldStore as u } from "../../../../core/context/cave-world-context.js";
5
+ function C({ object: e }) {
6
+ const t = h(), s = u((n) => n.setActiveObject), o = e.components?.Window?.contents, i = Array.isArray(o) && o.length > 0, a = m(
7
+ (n) => {
8
+ n ? (s(e), t.emit("object:enter", { object: e })) : t.emit("object:leave", { object: e });
9
+ },
10
+ [t, e, s]
11
+ );
12
+ return i ? /* @__PURE__ */ r(l, { onIntersectedChanged: a, children: /* @__PURE__ */ c("mesh", { children: [
13
+ /* @__PURE__ */ r("boxGeometry", {}),
14
+ /* @__PURE__ */ r("meshBasicMaterial", { transparent: !0, depthWrite: !1, opacity: 0 })
15
+ ] }) }) : null;
16
+ }
17
+ export {
18
+ C as default
19
+ };
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../../space/objects/object-components/windows/index.tsx"],"sourcesContent":["import { useCallback } from 'react'\nimport { BvhPhysicsSensor } from '@react-three/viverse'\nimport type { CustomObject } from '../../../../types'\nimport { useCaveEventBus, useCaveWorldStore } from '../../../../core'\n\nexport default function WindowComponent({ object }: { object: CustomObject }) {\n const eventBus = useCaveEventBus()\n const setActiveObject = useCaveWorldStore((s) => s.setActiveObject)\n\n const contents = object.components?.Window?.contents\n const hasContent = Array.isArray(contents) && contents.length > 0\n\n const handleProximityChange = useCallback(\n (intersected: boolean) => {\n if (intersected) {\n setActiveObject(object)\n eventBus.emit('object:enter', { object })\n } else {\n eventBus.emit('object:leave', { object })\n }\n },\n [eventBus, object, setActiveObject]\n )\n\n if (!hasContent) return null\n\n return (\n <BvhPhysicsSensor onIntersectedChanged={handleProximityChange}>\n <mesh>\n <boxGeometry />\n <meshBasicMaterial transparent depthWrite={false} opacity={0} />\n </mesh>\n </BvhPhysicsSensor>\n )\n}\n"],"names":["WindowComponent","object","eventBus","useCaveEventBus","setActiveObject","useCaveWorldStore","s","contents","hasContent","handleProximityChange","useCallback","intersected","jsx","BvhPhysicsSensor"],"mappings":";;;;AAKA,SAAwBA,EAAgB,EAAE,QAAAC,KAAoC;AAC5E,QAAMC,IAAWC,EAAA,GACXC,IAAkBC,EAAkB,CAACC,MAAMA,EAAE,eAAe,GAE5DC,IAAWN,EAAO,YAAY,QAAQ,UACtCO,IAAa,MAAM,QAAQD,CAAQ,KAAKA,EAAS,SAAS,GAE1DE,IAAwBC;AAAA,IAC5B,CAACC,MAAyB;AACxB,MAAIA,KACFP,EAAgBH,CAAM,GACtBC,EAAS,KAAK,gBAAgB,EAAE,QAAAD,EAAA,CAAQ,KAExCC,EAAS,KAAK,gBAAgB,EAAE,QAAAD,EAAA,CAAQ;AAAA,IAE5C;AAAA,IACA,CAACC,GAAUD,GAAQG,CAAe;AAAA,EAAA;AAGpC,SAAKI,IAGH,gBAAAI,EAACC,GAAA,EAAiB,sBAAsBJ,GACtC,4BAAC,QAAA,EACC,UAAA;AAAA,IAAA,gBAAAG,EAAC,eAAA,EAAY;AAAA,sBACZ,qBAAA,EAAkB,aAAW,IAAC,YAAY,IAAO,SAAS,EAAA,CAAG;AAAA,EAAA,EAAA,CAChE,EAAA,CACF,IARsB;AAU1B;"}
@@ -0,0 +1,7 @@
1
+ import type { CustomObject } from '../../types/index.js';
2
+ import type { ThreeEvent } from '@react-three/fiber';
3
+ export default function PlaceholderObject(props: {
4
+ object: CustomObject;
5
+ onClick?: (event: ThreeEvent<MouseEvent>) => void;
6
+ }): import("react").JSX.Element;
7
+ //# sourceMappingURL=placeholder-object.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"placeholder-object.d.ts","sourceRoot":"","sources":["../../../space/objects/placeholder-object.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,KAAK,EAAE;IAC/C,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,KAAK,IAAI,CAAA;CAClD,+BAQA"}
@@ -0,0 +1,12 @@
1
+ import { jsxs as s, jsx as e } from "react/jsx-runtime";
2
+ function a(r) {
3
+ const { object: t, onClick: o } = r;
4
+ return /* @__PURE__ */ s("mesh", { onClick: o, userData: { customObject: t }, children: [
5
+ /* @__PURE__ */ e("boxGeometry", { args: [1, 1, 1] }),
6
+ /* @__PURE__ */ e("meshBasicMaterial", { color: "red", visible: !0 })
7
+ ] });
8
+ }
9
+ export {
10
+ a as default
11
+ };
12
+ //# sourceMappingURL=placeholder-object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"placeholder-object.js","sources":["../../../space/objects/placeholder-object.tsx"],"sourcesContent":["import type { CustomObject } from '../../types'\nimport type { ThreeEvent } from '@react-three/fiber'\n\nexport default function PlaceholderObject(props: {\n object: CustomObject\n onClick?: (event: ThreeEvent<MouseEvent>) => void\n}) {\n const { object, onClick } = props\n return (\n <mesh onClick={onClick} userData={{ customObject: object }}>\n <boxGeometry args={[1, 1, 1]} />\n <meshBasicMaterial color=\"red\" visible={true} />\n </mesh>\n )\n}\n"],"names":["PlaceholderObject","props","object","onClick","jsx"],"mappings":";AAGA,SAAwBA,EAAkBC,GAGvC;AACD,QAAM,EAAE,QAAAC,GAAQ,SAAAC,EAAA,IAAYF;AAC5B,2BACG,QAAA,EAAK,SAAAE,GAAkB,UAAU,EAAE,cAAcD,KAChD,UAAA;AAAA,IAAA,gBAAAE,EAAC,iBAAY,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG;AAAA,IAC9B,gBAAAA,EAAC,qBAAA,EAAkB,OAAM,OAAM,SAAS,GAAA,CAAM;AAAA,EAAA,GAChD;AAEJ;"}
@@ -0,0 +1,7 @@
1
+ import type { CustomObject } from '../../types/index.js';
2
+ import type { ThreeEvent } from '@react-three/fiber';
3
+ export default function PoiObject(props: {
4
+ object: CustomObject;
5
+ onClick?: (event: ThreeEvent<MouseEvent>) => void;
6
+ }): import("react").JSX.Element;
7
+ //# sourceMappingURL=poi-object.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poi-object.d.ts","sourceRoot":"","sources":["../../../space/objects/poi-object.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAIpD,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,KAAK,EAAE;IACvC,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,KAAK,IAAI,CAAA;CAClD,+BAiCA"}
@@ -0,0 +1,38 @@
1
+ import { jsxs as r, Fragment as i, jsx as t } from "react/jsx-runtime";
2
+ import { Billboard as n, Text as l } from "@react-three/drei";
3
+ import { useCaveWorldMessages as m } from "../../core/context/cave-world-context.js";
4
+ function f(s) {
5
+ const { object: e, onClick: o } = s, a = m(), c = e?.text?.content || a.poi.defaultLabel;
6
+ return /* @__PURE__ */ r(i, { children: [
7
+ /* @__PURE__ */ t("mesh", { visible: !1, children: /* @__PURE__ */ t("circleGeometry", { args: [e?.radius || 3, 32] }) }),
8
+ /* @__PURE__ */ r(n, { children: [
9
+ /* @__PURE__ */ r("mesh", { castShadow: !0, receiveShadow: !0, onClick: o, userData: { customObject: e }, children: [
10
+ /* @__PURE__ */ t("circleGeometry", { args: [0.2, 32] }),
11
+ /* @__PURE__ */ t(
12
+ "meshStandardMaterial",
13
+ {
14
+ color: e.text?.color,
15
+ transparent: !0,
16
+ opacity: 1,
17
+ roughness: 0.5,
18
+ metalness: 0.3
19
+ }
20
+ )
21
+ ] }),
22
+ /* @__PURE__ */ t(
23
+ l,
24
+ {
25
+ onClick: o,
26
+ fontSize: e?.text?.fontSize || 0.2,
27
+ userData: { customObject: e },
28
+ position: [0, -0.2 - 0.1 - 0.05, 0],
29
+ children: c
30
+ }
31
+ )
32
+ ] })
33
+ ] });
34
+ }
35
+ export {
36
+ f as default
37
+ };
38
+ //# sourceMappingURL=poi-object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poi-object.js","sources":["../../../space/objects/poi-object.tsx"],"sourcesContent":["import type { CustomObject } from '../../types'\nimport type { ThreeEvent } from '@react-three/fiber'\nimport { Billboard, Text as DreiText } from '@react-three/drei'\nimport { useCaveWorldMessages } from '../../core'\n\nexport default function PoiObject(props: {\n object: CustomObject\n onClick?: (event: ThreeEvent<MouseEvent>) => void\n}) {\n const { object, onClick } = props\n const messages = useCaveWorldMessages()\n const content = object?.text?.content || messages.poi.defaultLabel\n\n return (\n <>\n <mesh visible={false}>\n <circleGeometry args={[object?.radius || 3, 32]} />\n </mesh>\n\n <Billboard>\n <mesh castShadow receiveShadow onClick={onClick} userData={{ customObject: object }}>\n <circleGeometry args={[0.2, 32]} />\n <meshStandardMaterial\n color={object.text?.color}\n transparent\n opacity={1}\n roughness={0.5}\n metalness={0.3}\n />\n </mesh>\n <DreiText\n onClick={onClick}\n fontSize={object?.text?.fontSize || 0.2}\n userData={{ customObject: object }}\n position={[0, -0.2 - 0.1 - 0.05, 0]}\n >\n {content}\n </DreiText>\n </Billboard>\n </>\n )\n}\n"],"names":["PoiObject","props","object","onClick","messages","useCaveWorldMessages","content","jsxs","Fragment","jsx","Billboard","DreiText"],"mappings":";;;AAKA,SAAwBA,EAAUC,GAG/B;AACD,QAAM,EAAE,QAAAC,GAAQ,SAAAC,EAAA,IAAYF,GACtBG,IAAWC,EAAA,GACXC,IAAUJ,GAAQ,MAAM,WAAWE,EAAS,IAAI;AAEtD,SACE,gBAAAG,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAC,EAAC,QAAA,EAAK,SAAS,IACb,UAAA,gBAAAA,EAAC,kBAAA,EAAe,MAAM,CAACP,GAAQ,UAAU,GAAG,EAAE,EAAA,CAAG,GACnD;AAAA,sBAECQ,GAAA,EACC,UAAA;AAAA,MAAA,gBAAAH,EAAC,QAAA,EAAK,YAAU,IAAC,eAAa,IAAC,SAAAJ,GAAkB,UAAU,EAAE,cAAcD,EAAA,GACzE,UAAA;AAAA,QAAA,gBAAAO,EAAC,kBAAA,EAAe,MAAM,CAAC,KAAK,EAAE,GAAG;AAAA,QACjC,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAOP,EAAO,MAAM;AAAA,YACpB,aAAW;AAAA,YACX,SAAS;AAAA,YACT,WAAW;AAAA,YACX,WAAW;AAAA,UAAA;AAAA,QAAA;AAAA,MACb,GACF;AAAA,MACA,gBAAAO;AAAA,QAACE;AAAAA,QAAA;AAAA,UACC,SAAAR;AAAA,UACA,UAAUD,GAAQ,MAAM,YAAY;AAAA,UACpC,UAAU,EAAE,cAAcA,EAAA;AAAA,UAC1B,UAAU,CAAC,GAAG,OAAO,MAAM,MAAM,CAAC;AAAA,UAEjC,UAAAI;AAAA,QAAA;AAAA,MAAA;AAAA,IACH,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;"}
@@ -0,0 +1,7 @@
1
+ import type { CustomObject } from '../../types/index.js';
2
+ import type { ThreeEvent } from '@react-three/fiber';
3
+ export default function PortalObject(props: {
4
+ object: CustomObject;
5
+ onClick?: (event: ThreeEvent<MouseEvent>) => void;
6
+ }): import("react").JSX.Element;
7
+ //# sourceMappingURL=portal-object.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal-object.d.ts","sourceRoot":"","sources":["../../../space/objects/portal-object.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAiFpD,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,KAAK,EAAE;IAC1C,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,KAAK,IAAI,CAAA;CAClD,+BAsBA"}
@@ -0,0 +1,84 @@
1
+ import { jsx as o, jsxs as a } from "react/jsx-runtime";
2
+ import { useCallback as d, useRef as l } from "react";
3
+ import { BvhPhysicsSensor as c } from "@react-three/viverse";
4
+ import { useFrame as h } from "@react-three/fiber";
5
+ import { Text as m } from "@react-three/drei";
6
+ import { ShaderMaterial as u, DoubleSide as v } from "three";
7
+ import { useCaveEventBus as f } from "../../core/context/cave-world-context.js";
8
+ const p = new u({
9
+ uniforms: {},
10
+ vertexShader: `
11
+ varying vec2 vUv;
12
+ void main() {
13
+ vUv = uv;
14
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
15
+ }
16
+ `,
17
+ fragmentShader: `
18
+ varying vec2 vUv;
19
+ void main() {
20
+ vec2 center = vec2(0.5, 0.5);
21
+ float dist = distance(vUv, center);
22
+ float borderWidth = 0.02;
23
+ float radius = 0.5;
24
+ if (dist > radius - borderWidth) {
25
+ gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
26
+ } else {
27
+ vec3 topBlue = vec3(0.290, 0.600, 0.886);
28
+ vec3 bottomLightBlue = vec3(0.867, 0.902, 0.961);
29
+ float gradientFactor = vUv.y;
30
+ vec3 baseColor = mix(bottomLightBlue, topBlue, gradientFactor);
31
+ float shadowWidth = 0.05;
32
+ float shadowStart = radius - borderWidth - shadowWidth;
33
+ float shadowEnd = radius - borderWidth;
34
+ float shadowIntensity = 0.0;
35
+ if (dist > shadowStart) {
36
+ shadowIntensity = smoothstep(shadowStart, shadowEnd, dist);
37
+ shadowIntensity *= 0.15;
38
+ }
39
+ vec3 finalColor = baseColor * (1.0 - shadowIntensity);
40
+ gl_FragColor = vec4(finalColor, 1.0);
41
+ }
42
+ }
43
+ `,
44
+ side: v
45
+ });
46
+ function g(t, e = 10) {
47
+ return t ? t.length <= e ? t : t.substring(0, e) + "..." : "";
48
+ }
49
+ function b({ text: t }) {
50
+ const e = l(null), i = t ? g(t, 10) : "";
51
+ return h((r) => {
52
+ e.current?.lookAt(r.camera.position);
53
+ }), /* @__PURE__ */ a("group", { ref: e, children: [
54
+ /* @__PURE__ */ a("mesh", { position: [0, 0, 0.01], children: [
55
+ /* @__PURE__ */ o("circleGeometry", { args: [1, 128] }),
56
+ /* @__PURE__ */ o("primitive", { object: p, attach: "material" })
57
+ ] }),
58
+ i && /* @__PURE__ */ o(
59
+ m,
60
+ {
61
+ position: [0, 0, 0.02],
62
+ fontSize: 0.3,
63
+ color: "#333333",
64
+ anchorX: "center",
65
+ anchorY: "middle",
66
+ maxWidth: 1.5,
67
+ children: i
68
+ }
69
+ )
70
+ ] });
71
+ }
72
+ function W(t) {
73
+ const { object: e, onClick: i } = t, r = f(), n = d(
74
+ (s) => {
75
+ s ? r.emit("object:enter", { object: e }) : r.emit("object:leave", { object: e });
76
+ },
77
+ [r, e]
78
+ );
79
+ return /* @__PURE__ */ o(c, { onIntersectedChanged: n, children: /* @__PURE__ */ o("group", { onClick: i, userData: { customObject: e }, children: /* @__PURE__ */ o(b, { text: e.portal?.url || e.portal?.internalScene?.name }) }) });
80
+ }
81
+ export {
82
+ W as default
83
+ };
84
+ //# sourceMappingURL=portal-object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal-object.js","sources":["../../../space/objects/portal-object.tsx"],"sourcesContent":["import { useRef, useCallback } from 'react'\nimport { BvhPhysicsSensor } from '@react-three/viverse'\nimport type { CustomObject } from '../../types'\nimport type { ThreeEvent } from '@react-three/fiber'\nimport { useFrame } from '@react-three/fiber'\nimport { Text } from '@react-three/drei'\nimport type { Group } from 'three'\nimport { DoubleSide, ShaderMaterial } from 'three'\nimport { useCaveEventBus } from '../../core'\n\nconst portalGradientMaterial = new ShaderMaterial({\n uniforms: {},\n vertexShader: `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `,\n fragmentShader: `\n varying vec2 vUv;\n void main() {\n vec2 center = vec2(0.5, 0.5);\n float dist = distance(vUv, center);\n float borderWidth = 0.02;\n float radius = 0.5;\n if (dist > radius - borderWidth) {\n gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\n } else {\n vec3 topBlue = vec3(0.290, 0.600, 0.886);\n vec3 bottomLightBlue = vec3(0.867, 0.902, 0.961);\n float gradientFactor = vUv.y;\n vec3 baseColor = mix(bottomLightBlue, topBlue, gradientFactor);\n float shadowWidth = 0.05;\n float shadowStart = radius - borderWidth - shadowWidth;\n float shadowEnd = radius - borderWidth;\n float shadowIntensity = 0.0;\n if (dist > shadowStart) {\n shadowIntensity = smoothstep(shadowStart, shadowEnd, dist);\n shadowIntensity *= 0.15;\n }\n vec3 finalColor = baseColor * (1.0 - shadowIntensity);\n gl_FragColor = vec4(finalColor, 1.0);\n }\n }\n `,\n side: DoubleSide\n})\n\nfunction truncateText(text: string, maxLength: number = 10): string {\n if (!text) return ''\n return text.length <= maxLength ? text : text.substring(0, maxLength) + '...'\n}\n\nfunction PortalMarker({ text }: { text?: string }) {\n const groupRef = useRef<Group>(null)\n const displayText = text ? truncateText(text, 10) : ''\n\n useFrame((state) => {\n groupRef.current?.lookAt(state.camera.position)\n })\n\n return (\n <group ref={groupRef}>\n <mesh position={[0, 0, 0.01]}>\n <circleGeometry args={[1, 128]} />\n <primitive object={portalGradientMaterial} attach=\"material\" />\n </mesh>\n {displayText && (\n <Text\n position={[0, 0, 0.02]}\n fontSize={0.3}\n color=\"#333333\"\n anchorX=\"center\"\n anchorY=\"middle\"\n maxWidth={1.5}\n >\n {displayText}\n </Text>\n )}\n </group>\n )\n}\n\nexport default function PortalObject(props: {\n object: CustomObject\n onClick?: (event: ThreeEvent<MouseEvent>) => void\n}) {\n const { object, onClick } = props\n const eventBus = useCaveEventBus()\n\n const handleProximityChange = useCallback(\n (intersected: boolean) => {\n if (intersected) {\n eventBus.emit('object:enter', { object })\n } else {\n eventBus.emit('object:leave', { object })\n }\n },\n [eventBus, object]\n )\n\n return (\n <BvhPhysicsSensor onIntersectedChanged={handleProximityChange}>\n <group onClick={onClick} userData={{ customObject: object }}>\n <PortalMarker text={object.portal?.url || object.portal?.internalScene?.name} />\n </group>\n </BvhPhysicsSensor>\n )\n}\n"],"names":["portalGradientMaterial","ShaderMaterial","DoubleSide","truncateText","text","maxLength","PortalMarker","groupRef","useRef","displayText","useFrame","state","jsxs","jsx","Text","PortalObject","props","object","onClick","eventBus","useCaveEventBus","handleProximityChange","useCallback","intersected","BvhPhysicsSensor"],"mappings":";;;;;;;AAUA,MAAMA,IAAyB,IAAIC,EAAe;AAAA,EAChD,UAAU,CAAA;AAAA,EACV,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOd,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BhB,MAAMC;AACR,CAAC;AAED,SAASC,EAAaC,GAAcC,IAAoB,IAAY;AAClE,SAAKD,IACEA,EAAK,UAAUC,IAAYD,IAAOA,EAAK,UAAU,GAAGC,CAAS,IAAI,QADtD;AAEpB;AAEA,SAASC,EAAa,EAAE,MAAAF,KAA2B;AACjD,QAAMG,IAAWC,EAAc,IAAI,GAC7BC,IAAcL,IAAOD,EAAaC,GAAM,EAAE,IAAI;AAEpD,SAAAM,EAAS,CAACC,MAAU;AAClB,IAAAJ,EAAS,SAAS,OAAOI,EAAM,OAAO,QAAQ;AAAA,EAChD,CAAC,GAGC,gBAAAC,EAAC,SAAA,EAAM,KAAKL,GACV,UAAA;AAAA,IAAA,gBAAAK,EAAC,UAAK,UAAU,CAAC,GAAG,GAAG,IAAI,GACzB,UAAA;AAAA,MAAA,gBAAAC,EAAC,kBAAA,EAAe,MAAM,CAAC,GAAG,GAAG,GAAG;AAAA,MAChC,gBAAAA,EAAC,aAAA,EAAU,QAAQb,GAAwB,QAAO,WAAA,CAAW;AAAA,IAAA,GAC/D;AAAA,IACCS,KACC,gBAAAI;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,UAAU,CAAC,GAAG,GAAG,IAAI;AAAA,QACrB,UAAU;AAAA,QACV,OAAM;AAAA,QACN,SAAQ;AAAA,QACR,SAAQ;AAAA,QACR,UAAU;AAAA,QAET,UAAAL;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GAEJ;AAEJ;AAEA,SAAwBM,EAAaC,GAGlC;AACD,QAAM,EAAE,QAAAC,GAAQ,SAAAC,EAAA,IAAYF,GACtBG,IAAWC,EAAA,GAEXC,IAAwBC;AAAA,IAC5B,CAACC,MAAyB;AACxB,MAAIA,IACFJ,EAAS,KAAK,gBAAgB,EAAE,QAAAF,EAAA,CAAQ,IAExCE,EAAS,KAAK,gBAAgB,EAAE,QAAAF,EAAA,CAAQ;AAAA,IAE5C;AAAA,IACA,CAACE,GAAUF,CAAM;AAAA,EAAA;AAGnB,SACE,gBAAAJ,EAACW,KAAiB,sBAAsBH,GACtC,4BAAC,SAAA,EAAM,SAAAH,GAAkB,UAAU,EAAE,cAAcD,EAAA,GACjD,UAAA,gBAAAJ,EAACP,GAAA,EAAa,MAAMW,EAAO,QAAQ,OAAOA,EAAO,QAAQ,eAAe,KAAA,CAAM,EAAA,CAChF,EAAA,CACF;AAEJ;"}
@@ -0,0 +1,7 @@
1
+ import type { ThreeEvent } from '@react-three/fiber';
2
+ import type { CustomObject } from '../../types/index.js';
3
+ export default function VideoObject(props: {
4
+ object: CustomObject;
5
+ onClick?: (event: ThreeEvent<MouseEvent>) => void;
6
+ }): import("react").JSX.Element;
7
+ //# sourceMappingURL=video-object.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-object.d.ts","sourceRoot":"","sources":["../../../space/objects/video-object.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AA0C/C,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,KAAK,EAAE;IACzC,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,KAAK,IAAI,CAAA;CAClD,+BAQA"}
@@ -0,0 +1,32 @@
1
+ import { jsx as t, jsxs as a } from "react/jsx-runtime";
2
+ import { useEffect as u } from "react";
3
+ import { DoubleSide as s } from "three";
4
+ import { useVideoTexture as c } from "@react-three/drei";
5
+ function n(o) {
6
+ const { object: e, onClick: i } = o, r = c(e.video?.url || "", {
7
+ muted: e.video?.muted ?? !0,
8
+ autoplay: e.video?.autoplay ?? !0,
9
+ loop: e.video?.loop ?? !0,
10
+ controls: e.video?.controls ?? !1
11
+ });
12
+ return u(() => () => {
13
+ r.source.data?.pause(), r.dispose();
14
+ }, [r]), /* @__PURE__ */ a("mesh", { onClick: i, userData: { customObject: e }, children: [
15
+ /* @__PURE__ */ t("planeGeometry", { args: [1.6, 0.9] }),
16
+ /* @__PURE__ */ t("meshBasicMaterial", { map: r, toneMapped: !1, side: s })
17
+ ] });
18
+ }
19
+ function d(o) {
20
+ const { object: e, onClick: i } = o;
21
+ return /* @__PURE__ */ a("mesh", { castShadow: !0, receiveShadow: !0, userData: { customObject: e }, onClick: i, children: [
22
+ /* @__PURE__ */ t("planeGeometry", { args: [1, 1] }),
23
+ /* @__PURE__ */ t("meshBasicMaterial", { color: "#333", side: s })
24
+ ] });
25
+ }
26
+ function b(o) {
27
+ return o.object.video?.url?.match(/\.(mp4|webm|ogg)$/i) ? /* @__PURE__ */ t(n, { ...o }) : /* @__PURE__ */ t(d, { ...o });
28
+ }
29
+ export {
30
+ b as default
31
+ };
32
+ //# sourceMappingURL=video-object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-object.js","sources":["../../../space/objects/video-object.tsx"],"sourcesContent":["import { useEffect } from 'react'\nimport { DoubleSide } from 'three'\nimport type { ThreeEvent } from '@react-three/fiber'\nimport { useVideoTexture } from '@react-three/drei'\nimport type { CustomObject } from '../../types'\n\nfunction VideoElement(props: {\n object: CustomObject\n onClick?: (event: ThreeEvent<MouseEvent>) => void\n}) {\n const { object, onClick } = props\n const videoTexture = useVideoTexture(object.video?.url || '', {\n muted: object.video?.muted ?? true,\n autoplay: object.video?.autoplay ?? true,\n loop: object.video?.loop ?? true,\n controls: object.video?.controls ?? false\n })\n\n useEffect(() => {\n return () => {\n videoTexture.source.data?.pause()\n videoTexture.dispose()\n }\n }, [videoTexture])\n\n return (\n <mesh onClick={onClick} userData={{ customObject: object }}>\n <planeGeometry args={[1.6, 0.9]} />\n <meshBasicMaterial map={videoTexture} toneMapped={false} side={DoubleSide} />\n </mesh>\n )\n}\n\nfunction FallbackElement(props: {\n object: CustomObject\n onClick?: (event: ThreeEvent<MouseEvent>) => void\n}) {\n const { object, onClick } = props\n return (\n <mesh castShadow receiveShadow userData={{ customObject: object }} onClick={onClick}>\n <planeGeometry args={[1, 1]} />\n <meshBasicMaterial color=\"#333\" side={DoubleSide} />\n </mesh>\n )\n}\n\nexport default function VideoObject(props: {\n object: CustomObject\n onClick?: (event: ThreeEvent<MouseEvent>) => void\n}) {\n const isVideo = props.object.video?.url?.match(/\\.(mp4|webm|ogg)$/i)\n\n if (!isVideo) {\n return <FallbackElement {...props} />\n }\n\n return <VideoElement {...props} />\n}\n"],"names":["VideoElement","props","object","onClick","videoTexture","useVideoTexture","useEffect","jsx","DoubleSide","FallbackElement","jsxs","VideoObject"],"mappings":";;;;AAMA,SAASA,EAAaC,GAGnB;AACD,QAAM,EAAE,QAAAC,GAAQ,SAAAC,EAAA,IAAYF,GACtBG,IAAeC,EAAgBH,EAAO,OAAO,OAAO,IAAI;AAAA,IAC5D,OAAOA,EAAO,OAAO,SAAS;AAAA,IAC9B,UAAUA,EAAO,OAAO,YAAY;AAAA,IACpC,MAAMA,EAAO,OAAO,QAAQ;AAAA,IAC5B,UAAUA,EAAO,OAAO,YAAY;AAAA,EAAA,CACrC;AAED,SAAAI,EAAU,MACD,MAAM;AACX,IAAAF,EAAa,OAAO,MAAM,MAAA,GAC1BA,EAAa,QAAA;AAAA,EACf,GACC,CAACA,CAAY,CAAC,qBAGd,QAAA,EAAK,SAAAD,GAAkB,UAAU,EAAE,cAAcD,KAChD,UAAA;AAAA,IAAA,gBAAAK,EAAC,iBAAA,EAAc,MAAM,CAAC,KAAK,GAAG,GAAG;AAAA,sBAChC,qBAAA,EAAkB,KAAKH,GAAc,YAAY,IAAO,MAAMI,EAAA,CAAY;AAAA,EAAA,GAC7E;AAEJ;AAEA,SAASC,EAAgBR,GAGtB;AACD,QAAM,EAAE,QAAAC,GAAQ,SAAAC,EAAA,IAAYF;AAC5B,SACE,gBAAAS,EAAC,QAAA,EAAK,YAAU,IAAC,eAAa,IAAC,UAAU,EAAE,cAAcR,EAAA,GAAU,SAAAC,GACjE,UAAA;AAAA,IAAA,gBAAAI,EAAC,iBAAA,EAAc,MAAM,CAAC,GAAG,CAAC,GAAG;AAAA,IAC7B,gBAAAA,EAAC,qBAAA,EAAkB,OAAM,QAAO,MAAMC,EAAA,CAAY;AAAA,EAAA,GACpD;AAEJ;AAEA,SAAwBG,EAAYV,GAGjC;AAGD,SAFgBA,EAAM,OAAO,OAAO,KAAK,MAAM,oBAAoB,IAM5D,gBAAAM,EAACP,GAAA,EAAc,GAAGC,EAAA,CAAO,IAHvB,gBAAAM,EAACE,GAAA,EAAiB,GAAGR,EAAA,CAAO;AAIvC;"}
@@ -0,0 +1,10 @@
1
+ import type { PolygonBoundaryDef } from '../types/index.js';
2
+ /** Single merged collider mesh — mount inside `<BvhPhysicsBody>`. */
3
+ export declare function PolygonBoundaryColliders({ boundary }: {
4
+ boundary: PolygonBoundaryDef;
5
+ }): import("react").JSX.Element | null;
6
+ export declare function PolygonBoundaryFence({ boundary, active }: {
7
+ boundary: PolygonBoundaryDef;
8
+ active: boolean;
9
+ }): import("react").JSX.Element | null;
10
+ //# sourceMappingURL=polygon-boundary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polygon-boundary.d.ts","sourceRoot":"","sources":["../../space/polygon-boundary.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAkJlD,qEAAqE;AACrE,wBAAgB,wBAAwB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,kBAAkB,CAAA;CAAE,sCAoBtF;AAED,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,MAAM,EACP,EAAE;IACD,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,MAAM,EAAE,OAAO,CAAA;CAChB,sCA2KA"}