@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.
- package/CHANGELOG.md +25 -0
- package/LICENSE +21 -0
- package/README.md +189 -0
- package/dist/core/connector-label/readiness.d.ts +11 -0
- package/dist/core/connector-label/readiness.d.ts.map +1 -0
- package/dist/core/connector-label/readiness.js +31 -0
- package/dist/core/connector-label/readiness.js.map +1 -0
- package/dist/core/connector-label/types.d.ts +64 -0
- package/dist/core/connector-label/types.d.ts.map +1 -0
- package/dist/core/connector-label/types.js +47 -0
- package/dist/core/connector-label/types.js.map +1 -0
- package/dist/core/context/cave-world-context.d.ts +96 -0
- package/dist/core/context/cave-world-context.d.ts.map +1 -0
- package/dist/core/context/cave-world-context.js +100 -0
- package/dist/core/context/cave-world-context.js.map +1 -0
- package/dist/core/errors.d.ts +34 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +17 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/events/event-bus.d.ts +122 -0
- package/dist/core/events/event-bus.d.ts.map +1 -0
- package/dist/core/events/event-bus.js +62 -0
- package/dist/core/events/event-bus.js.map +1 -0
- package/dist/core/hooks/use-cave-event.d.ts +13 -0
- package/dist/core/hooks/use-cave-event.d.ts.map +1 -0
- package/dist/core/hooks/use-cave-event.js +12 -0
- package/dist/core/hooks/use-cave-event.js.map +1 -0
- package/dist/core/i18n/messages.d.ts +82 -0
- package/dist/core/i18n/messages.d.ts.map +1 -0
- package/dist/core/i18n/messages.js +131 -0
- package/dist/core/i18n/messages.js.map +1 -0
- package/dist/core/index.d.ts +11 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +47 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logging/logger.d.ts +29 -0
- package/dist/core/logging/logger.d.ts.map +1 -0
- package/dist/core/logging/logger.js +47 -0
- package/dist/core/logging/logger.js.map +1 -0
- package/dist/core/registry/component-registry.d.ts +41 -0
- package/dist/core/registry/component-registry.d.ts.map +1 -0
- package/dist/core/registry/component-registry.js +34 -0
- package/dist/core/registry/component-registry.js.map +1 -0
- package/dist/core/registry/object-registry.d.ts +38 -0
- package/dist/core/registry/object-registry.d.ts.map +1 -0
- package/dist/core/registry/object-registry.js +32 -0
- package/dist/core/registry/object-registry.js.map +1 -0
- package/dist/explore/cave-explore.d.ts +85 -0
- package/dist/explore/cave-explore.d.ts.map +1 -0
- package/dist/explore/cave-explore.js +204 -0
- package/dist/explore/cave-explore.js.map +1 -0
- package/dist/explore/cave-orbit-viewer.d.ts +76 -0
- package/dist/explore/cave-orbit-viewer.d.ts.map +1 -0
- package/dist/explore/cave-orbit-viewer.js +123 -0
- package/dist/explore/cave-orbit-viewer.js.map +1 -0
- package/dist/explore/characters/character-configs.d.ts +38 -0
- package/dist/explore/characters/character-configs.d.ts.map +1 -0
- package/dist/explore/characters/character-configs.js +45 -0
- package/dist/explore/characters/character-configs.js.map +1 -0
- package/dist/explore/characters/character-controls.d.ts +44 -0
- package/dist/explore/characters/character-controls.d.ts.map +1 -0
- package/dist/explore/characters/character-pose.d.ts +19 -0
- package/dist/explore/characters/character-pose.d.ts.map +1 -0
- package/dist/explore/characters/character-pose.js +13 -0
- package/dist/explore/characters/character-pose.js.map +1 -0
- package/dist/explore/characters/local-character-model.d.ts +53 -0
- package/dist/explore/characters/local-character-model.d.ts.map +1 -0
- package/dist/explore/characters/local-character-model.js +36 -0
- package/dist/explore/characters/local-character-model.js.map +1 -0
- package/dist/explore/characters/mixamo-style-bone-map.d.ts +9 -0
- package/dist/explore/characters/mixamo-style-bone-map.d.ts.map +1 -0
- package/dist/explore/characters/mixamo-style-bone-map.js +28 -0
- package/dist/explore/characters/mixamo-style-bone-map.js.map +1 -0
- package/dist/explore/characters/remote-character-controller.d.ts +38 -0
- package/dist/explore/characters/remote-character-controller.d.ts.map +1 -0
- package/dist/explore/characters/remote-character-controller.js +135 -0
- package/dist/explore/characters/remote-character-controller.js.map +1 -0
- package/dist/explore/characters/remote-character.d.ts +19 -0
- package/dist/explore/characters/remote-character.d.ts.map +1 -0
- package/dist/explore/characters/remote-character.js +63 -0
- package/dist/explore/characters/remote-character.js.map +1 -0
- package/dist/explore/connected-spaces-renderer.d.ts +16 -0
- package/dist/explore/connected-spaces-renderer.d.ts.map +1 -0
- package/dist/explore/connected-spaces-renderer.js +103 -0
- package/dist/explore/connected-spaces-renderer.js.map +1 -0
- package/dist/explore/hooks/use-action-shortcuts.d.ts +16 -0
- package/dist/explore/hooks/use-action-shortcuts.d.ts.map +1 -0
- package/dist/explore/hooks/use-action-shortcuts.js +23 -0
- package/dist/explore/hooks/use-action-shortcuts.js.map +1 -0
- package/dist/explore/hooks/use-active-space-notify.d.ts +11 -0
- package/dist/explore/hooks/use-active-space-notify.d.ts.map +1 -0
- package/dist/explore/hooks/use-active-space-notify.js +17 -0
- package/dist/explore/hooks/use-active-space-notify.js.map +1 -0
- package/dist/explore/hooks/use-character-sync.d.ts +46 -0
- package/dist/explore/hooks/use-character-sync.d.ts.map +1 -0
- package/dist/explore/hooks/use-character-sync.js +72 -0
- package/dist/explore/hooks/use-character-sync.js.map +1 -0
- package/dist/explore/hooks/use-connector-preloader.d.ts +20 -0
- package/dist/explore/hooks/use-connector-preloader.d.ts.map +1 -0
- package/dist/explore/hooks/use-connector-preloader.js +78 -0
- package/dist/explore/hooks/use-connector-preloader.js.map +1 -0
- package/dist/explore/hooks/use-connector-transitions.d.ts +31 -0
- package/dist/explore/hooks/use-connector-transitions.d.ts.map +1 -0
- package/dist/explore/hooks/use-connector-transitions.js +63 -0
- package/dist/explore/hooks/use-connector-transitions.js.map +1 -0
- package/dist/explore/hooks/use-explore-actions.d.ts +17 -0
- package/dist/explore/hooks/use-explore-actions.d.ts.map +1 -0
- package/dist/explore/hooks/use-explore-actions.js +134 -0
- package/dist/explore/hooks/use-explore-actions.js.map +1 -0
- package/dist/explore/hooks/use-load-error-notify.d.ts +11 -0
- package/dist/explore/hooks/use-load-error-notify.d.ts.map +1 -0
- package/dist/explore/hooks/use-load-error-notify.js +18 -0
- package/dist/explore/hooks/use-load-error-notify.js.map +1 -0
- package/dist/explore/hooks/use-primary-space-loader.d.ts +24 -0
- package/dist/explore/hooks/use-primary-space-loader.d.ts.map +1 -0
- package/dist/explore/hooks/use-primary-space-loader.js +29 -0
- package/dist/explore/hooks/use-primary-space-loader.js.map +1 -0
- package/dist/explore/index.d.ts +37 -0
- package/dist/explore/index.d.ts.map +1 -0
- package/dist/explore/index.js +107 -0
- package/dist/explore/index.js.map +1 -0
- package/dist/explore/loaders/cave-loader.d.ts +58 -0
- package/dist/explore/loaders/cave-loader.d.ts.map +1 -0
- package/dist/explore/loaders/cave-loader.js +79 -0
- package/dist/explore/loaders/cave-loader.js.map +1 -0
- package/dist/explore/math/space-transforms.d.ts +49 -0
- package/dist/explore/math/space-transforms.d.ts.map +1 -0
- package/dist/explore/math/space-transforms.js +54 -0
- package/dist/explore/math/space-transforms.js.map +1 -0
- package/dist/explore/overlays/action-bubble.d.ts +8 -0
- package/dist/explore/overlays/action-bubble.d.ts.map +1 -0
- package/dist/explore/overlays/action-bubble.js +18 -0
- package/dist/explore/overlays/action-bubble.js.map +1 -0
- package/dist/explore/overlays/action-panel.d.ts +12 -0
- package/dist/explore/overlays/action-panel.d.ts.map +1 -0
- package/dist/explore/overlays/action-panel.js +69 -0
- package/dist/explore/overlays/action-panel.js.map +1 -0
- package/dist/explore/overlays/connector-label-beacon.d.ts +11 -0
- package/dist/explore/overlays/connector-label-beacon.d.ts.map +1 -0
- package/dist/explore/overlays/connector-label-beacon.js +38 -0
- package/dist/explore/overlays/connector-label-beacon.js.map +1 -0
- package/dist/explore/overlays/connector-label-tag-shell.d.ts +16 -0
- package/dist/explore/overlays/connector-label-tag-shell.d.ts.map +1 -0
- package/dist/explore/overlays/connector-label-tag-shell.js +18 -0
- package/dist/explore/overlays/connector-label-tag-shell.js.map +1 -0
- package/dist/explore/overlays/detail-window.d.ts +9 -0
- package/dist/explore/overlays/detail-window.d.ts.map +1 -0
- package/dist/explore/overlays/detail-window.js +92 -0
- package/dist/explore/overlays/detail-window.js.map +1 -0
- package/dist/explore/overlays/explore-helper.d.ts +44 -0
- package/dist/explore/overlays/explore-helper.d.ts.map +1 -0
- package/dist/explore/overlays/explore-helper.js +57 -0
- package/dist/explore/overlays/explore-helper.js.map +1 -0
- package/dist/explore/overlays/icons.d.ts +16 -0
- package/dist/explore/overlays/icons.d.ts.map +1 -0
- package/dist/explore/overlays/icons.js +34 -0
- package/dist/explore/overlays/icons.js.map +1 -0
- package/dist/explore/overlays/space-load-error-overlay.d.ts +27 -0
- package/dist/explore/overlays/space-load-error-overlay.d.ts.map +1 -0
- package/dist/explore/overlays/space-load-error-overlay.js +24 -0
- package/dist/explore/overlays/space-load-error-overlay.js.map +1 -0
- package/dist/explore/services/websocket.service.d.ts +180 -0
- package/dist/explore/services/websocket.service.d.ts.map +1 -0
- package/dist/explore/services/websocket.service.js +187 -0
- package/dist/explore/services/websocket.service.js.map +1 -0
- package/dist/explore/simple-character.d.ts +46 -0
- package/dist/explore/simple-character.d.ts.map +1 -0
- package/dist/explore/simple-character.js +119 -0
- package/dist/explore/simple-character.js.map +1 -0
- package/dist/explore/stores/action-prompt.store.d.ts +27 -0
- package/dist/explore/stores/action-prompt.store.d.ts.map +1 -0
- package/dist/explore/stores/action-prompt.store.js +14 -0
- package/dist/explore/stores/action-prompt.store.js.map +1 -0
- package/dist/explore/stores/cave-explore.store.d.ts +77 -0
- package/dist/explore/stores/cave-explore.store.d.ts.map +1 -0
- package/dist/explore/stores/cave-explore.store.js +66 -0
- package/dist/explore/stores/cave-explore.store.js.map +1 -0
- package/dist/explore/stores/explore-context.d.ts +35 -0
- package/dist/explore/stores/explore-context.d.ts.map +1 -0
- package/dist/explore/stores/explore-context.js +43 -0
- package/dist/explore/stores/explore-context.js.map +1 -0
- package/dist/explore/styles/cave-world-css.d.ts +10 -0
- package/dist/explore/styles/cave-world-css.d.ts.map +1 -0
- package/dist/explore/styles/cave-world-css.js +935 -0
- package/dist/explore/styles/cave-world-css.js.map +1 -0
- package/dist/explore/styles/inject.d.ts +32 -0
- package/dist/explore/styles/inject.d.ts.map +1 -0
- package/dist/explore/styles/inject.js +40 -0
- package/dist/explore/styles/inject.js.map +1 -0
- package/dist/explore/utils/schedule-idle.d.ts +12 -0
- package/dist/explore/utils/schedule-idle.d.ts.map +1 -0
- package/dist/explore/utils/schedule-idle.js +16 -0
- package/dist/explore/utils/schedule-idle.js.map +1 -0
- package/dist/explore/viewer-shared.d.ts +56 -0
- package/dist/explore/viewer-shared.d.ts.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +78 -0
- package/dist/index.js.map +1 -0
- package/dist/space/cave-base-layer.d.ts +42 -0
- package/dist/space/cave-base-layer.d.ts.map +1 -0
- package/dist/space/cave-base-layer.js +221 -0
- package/dist/space/cave-base-layer.js.map +1 -0
- package/dist/space/cave-custom-layer.d.ts +12 -0
- package/dist/space/cave-custom-layer.d.ts.map +1 -0
- package/dist/space/cave-custom-layer.js +17 -0
- package/dist/space/cave-custom-layer.js.map +1 -0
- package/dist/space/cave-env.d.ts +6 -0
- package/dist/space/cave-env.d.ts.map +1 -0
- package/dist/space/cave-env.js +23 -0
- package/dist/space/cave-env.js.map +1 -0
- package/dist/space/cave-space.d.ts +46 -0
- package/dist/space/cave-space.d.ts.map +1 -0
- package/dist/space/cave-space.js +37 -0
- package/dist/space/cave-space.js.map +1 -0
- package/dist/space/connector-label-host.d.ts +21 -0
- package/dist/space/connector-label-host.d.ts.map +1 -0
- package/dist/space/connector-label-host.js +65 -0
- package/dist/space/connector-label-host.js.map +1 -0
- package/dist/space/index.d.ts +18 -0
- package/dist/space/index.d.ts.map +1 -0
- package/dist/space/index.js +47 -0
- package/dist/space/index.js.map +1 -0
- package/dist/space/objects/builtin-registrar.d.ts +17 -0
- package/dist/space/objects/builtin-registrar.d.ts.map +1 -0
- package/dist/space/objects/builtin-registrar.js +19 -0
- package/dist/space/objects/builtin-registrar.js.map +1 -0
- package/dist/space/objects/custom-object.d.ts +9 -0
- package/dist/space/objects/custom-object.d.ts.map +1 -0
- package/dist/space/objects/custom-object.js +56 -0
- package/dist/space/objects/custom-object.js.map +1 -0
- package/dist/space/objects/image-object.d.ts +7 -0
- package/dist/space/objects/image-object.d.ts.map +1 -0
- package/dist/space/objects/image-object.js +14 -0
- package/dist/space/objects/image-object.js.map +1 -0
- package/dist/space/objects/model-object/fbx-object.d.ts +8 -0
- package/dist/space/objects/model-object/fbx-object.d.ts.map +1 -0
- package/dist/space/objects/model-object/fbx-object.js +26 -0
- package/dist/space/objects/model-object/fbx-object.js.map +1 -0
- package/dist/space/objects/model-object/gltf-object.d.ts +9 -0
- package/dist/space/objects/model-object/gltf-object.d.ts.map +1 -0
- package/dist/space/objects/model-object/gltf-object.js +66 -0
- package/dist/space/objects/model-object/gltf-object.js.map +1 -0
- package/dist/space/objects/model-object/index.d.ts +9 -0
- package/dist/space/objects/model-object/index.d.ts.map +1 -0
- package/dist/space/objects/model-object/index.js +12 -0
- package/dist/space/objects/model-object/index.js.map +1 -0
- package/dist/space/objects/model-object/splat-object.d.ts +9 -0
- package/dist/space/objects/model-object/splat-object.d.ts.map +1 -0
- package/dist/space/objects/model-object/splat-object.js +19 -0
- package/dist/space/objects/model-object/splat-object.js.map +1 -0
- package/dist/space/objects/object-components/windows/index.d.ts +5 -0
- package/dist/space/objects/object-components/windows/index.d.ts.map +1 -0
- package/dist/space/objects/object-components/windows/index.js +20 -0
- package/dist/space/objects/object-components/windows/index.js.map +1 -0
- package/dist/space/objects/placeholder-object.d.ts +7 -0
- package/dist/space/objects/placeholder-object.d.ts.map +1 -0
- package/dist/space/objects/placeholder-object.js +12 -0
- package/dist/space/objects/placeholder-object.js.map +1 -0
- package/dist/space/objects/poi-object.d.ts +7 -0
- package/dist/space/objects/poi-object.d.ts.map +1 -0
- package/dist/space/objects/poi-object.js +38 -0
- package/dist/space/objects/poi-object.js.map +1 -0
- package/dist/space/objects/portal-object.d.ts +7 -0
- package/dist/space/objects/portal-object.d.ts.map +1 -0
- package/dist/space/objects/portal-object.js +84 -0
- package/dist/space/objects/portal-object.js.map +1 -0
- package/dist/space/objects/video-object.d.ts +7 -0
- package/dist/space/objects/video-object.d.ts.map +1 -0
- package/dist/space/objects/video-object.js +32 -0
- package/dist/space/objects/video-object.js.map +1 -0
- package/dist/space/polygon-boundary.d.ts +10 -0
- package/dist/space/polygon-boundary.d.ts.map +1 -0
- package/dist/space/polygon-boundary.js +205 -0
- package/dist/space/polygon-boundary.js.map +1 -0
- package/dist/space/splats/spark/robust-splat-mesh.d.ts +59 -0
- package/dist/space/splats/spark/robust-splat-mesh.d.ts.map +1 -0
- package/dist/space/splats/spark/robust-splat-mesh.js +105 -0
- package/dist/space/splats/spark/robust-splat-mesh.js.map +1 -0
- package/dist/space/splats/spark/splat-mesh.d.ts +5 -0
- package/dist/space/splats/spark/splat-mesh.d.ts.map +1 -0
- package/dist/space/splats/spark/splat-mesh.js +7 -0
- package/dist/space/splats/spark/splat-mesh.js.map +1 -0
- package/dist/space/splats/spark/splat-spread-reveal.d.ts +14 -0
- package/dist/space/splats/spark/splat-spread-reveal.d.ts.map +1 -0
- package/dist/space/splats/spark/splat-spread-reveal.js +45 -0
- package/dist/space/splats/spark/splat-spread-reveal.js.map +1 -0
- package/dist/space/utils/cave-world-player.d.ts +3 -0
- package/dist/space/utils/cave-world-player.d.ts.map +1 -0
- package/dist/space/utils/cave-world-player.js +5 -0
- package/dist/space/utils/cave-world-player.js.map +1 -0
- package/dist/space/utils/configure-canvas.d.ts +20 -0
- package/dist/space/utils/configure-canvas.d.ts.map +1 -0
- package/dist/space/utils/configure-canvas.js +12 -0
- package/dist/space/utils/configure-canvas.js.map +1 -0
- package/dist/space/utils/polygon-boundary-geometry.d.ts +8 -0
- package/dist/space/utils/polygon-boundary-geometry.d.ts.map +1 -0
- package/dist/space/utils/polygon-boundary-geometry.js +20 -0
- package/dist/space/utils/polygon-boundary-geometry.js.map +1 -0
- package/dist/space/utils/polygon-boundary-segments.d.ts +50 -0
- package/dist/space/utils/polygon-boundary-segments.d.ts.map +1 -0
- package/dist/space/utils/polygon-boundary-segments.js +64 -0
- package/dist/space/utils/polygon-boundary-segments.js.map +1 -0
- package/dist/space/utils/rotation-compat.d.ts +4 -0
- package/dist/space/utils/rotation-compat.d.ts.map +1 -0
- package/dist/space/utils/rotation-compat.js +9 -0
- package/dist/space/utils/rotation-compat.js.map +1 -0
- package/dist/space/utils/select-splat-level.d.ts +52 -0
- package/dist/space/utils/select-splat-level.d.ts.map +1 -0
- package/dist/space/utils/select-splat-level.js +43 -0
- package/dist/space/utils/select-splat-level.js.map +1 -0
- package/dist/space/utils/spark-performance.d.ts +10 -0
- package/dist/space/utils/spark-performance.d.ts.map +1 -0
- package/dist/space/utils/spark-performance.js +10 -0
- package/dist/space/utils/spark-performance.js.map +1 -0
- package/dist/space/utils/splat-collider-helper.d.ts +5 -0
- package/dist/space/utils/splat-collider-helper.d.ts.map +1 -0
- package/dist/space/utils/splat-collider-helper.js +162 -0
- package/dist/space/utils/splat-collider-helper.js.map +1 -0
- package/dist/space/utils/touch-primary-device.d.ts +16 -0
- package/dist/space/utils/touch-primary-device.d.ts.map +1 -0
- package/dist/space/utils/touch-primary-device.js +52 -0
- package/dist/space/utils/touch-primary-device.js.map +1 -0
- package/dist/space/utils/use-visibility-frameloop.d.ts +20 -0
- package/dist/space/utils/use-visibility-frameloop.d.ts.map +1 -0
- package/dist/space/utils/use-visibility-frameloop.js +18 -0
- package/dist/space/utils/use-visibility-frameloop.js.map +1 -0
- package/dist/styles.css +930 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/space-types.d.ts +404 -0
- package/dist/types/space-types.d.ts.map +1 -0
- package/doc/API.md +617 -0
- package/doc/ARCHITECTURE.md +264 -0
- package/doc/multiplayer-protocol.md +757 -0
- package/doc/scene-json-structure.md +567 -0
- package/package.json +131 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cave-explore.js","sources":["../../explore/cave-explore.tsx"],"sourcesContent":["import {\n forwardRef,\n Suspense,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState\n} from 'react'\nimport { Canvas } from '@react-three/fiber'\nimport { BvhPhysicsWorld } from '@react-three/viverse'\nimport {\n CaveWorldProvider,\n createLogger,\n type ConnectorLabelMode,\n type ConnectorLabelRenderer\n} from '../core'\nimport {\n configureCaveCanvasDomElement,\n configureSparkWebGLRenderer,\n getSparkCanvasDpr,\n REVEAL_ON_ENTER_DEFAULT_ENABLED,\n useVisibilityFrameloop\n} from '../space'\nimport type { CaveSpace as CaveSpaceConfig } from '../types'\nimport { applyCharacterPose } from './characters/character-pose'\nimport type { CharacterControlsConfig } from './characters/character-controls'\nimport type { LocalCharacterModelProp } from './characters/local-character-model'\nimport ConnectedSpacesRenderer from './connected-spaces-renderer'\nimport { useActionShortcuts } from './hooks/use-action-shortcuts'\nimport { useActiveSpaceNotify } from './hooks/use-active-space-notify'\nimport { useConnectorPreloader, preloadSpaceAssets } from './hooks/use-connector-preloader'\nimport { useConnectorTransitions } from './hooks/use-connector-transitions'\nimport { useExploreActions, type PortalNavigateHandler } from './hooks/use-explore-actions'\nimport { useLoadErrorNotify } from './hooks/use-load-error-notify'\nimport { usePrimarySpaceLoader } from './hooks/use-primary-space-loader'\nimport { DefaultCaveSpaceLoader } from './loaders/cave-loader'\nimport ActionBubble from './overlays/action-bubble'\nimport ActionPanel from './overlays/action-panel'\nimport ConnectorLabelBeacon from './overlays/connector-label-beacon'\nimport DetailWindow from './overlays/detail-window'\nimport ExploreHelper, {\n type ExploreHelperConfig,\n type ExploreHelperRenderer\n} from './overlays/explore-helper'\nimport SpaceLoadErrorOverlay from './overlays/space-load-error-overlay'\nimport ExploreSimpleCharacter, {\n type ExploreSimpleCharacterRoot,\n type MultiplayerRuntimeConfig\n} from './simple-character'\nimport {\n CaveExploreProvider,\n useActionPromptStore,\n useCaveExploreStore\n} from './stores/explore-context'\nimport { computeSpawnPose, matrixFromM16 } from './math/space-transforms'\nimport { useCaveWorldStyles } from './styles/inject'\nimport type { CaveViewerBaseProps, ActiveSpaceChangeHandler } from './viewer-shared'\n\nconst CAMERA_DEFAULTS = { fov: 65, near: 0.1, far: 3000 } as const\nconst GL_DEFAULTS = { antialias: false } as const\nconst multiplayerLogger = createLogger('explore:multiplayer')\n\n/**\n * Enable multiplayer with an explicit config object, or pass `true` only when\n * you also supply `url` via a follow-up object — bare `true` is rejected.\n */\nexport type MultiplayerProp = boolean | MultiplayerRuntimeConfig\n\nfunction resolveMultiplayer(\n prop: MultiplayerProp | undefined\n): MultiplayerRuntimeConfig | undefined {\n if (!prop) return undefined\n const config = prop === true ? ({} as Partial<MultiplayerRuntimeConfig>) : prop\n if (!config.url) {\n multiplayerLogger.warn(\n 'multiplayer requires an explicit `url` (e.g. multiplayer={{ url: \"wss://…\" }}). ' +\n 'Bare `true` or a config without `url` is ignored. ' +\n 'Import DEFAULT_WEBSOCKET_URL only if you intentionally use the CaveGiant demo backend.'\n )\n return undefined\n }\n if (!config.avatars) {\n multiplayerLogger.warn(\n 'multiplayer.avatars was omitted — remote players will not resolve against the CaveGiant CDN. ' +\n 'Pass your own catalog, or import BUILTIN_AVATARS for the demo assets.'\n )\n }\n return {\n url: config.url,\n avatarId: config.avatarId,\n avatars: config.avatars,\n maxRemoteCharacters: config.maxRemoteCharacters\n }\n}\n\n/** Imperative handle exposed through `ref` on `CaveExplore`. */\nexport interface CaveExploreHandle {\n /** Local player's root object, or `null` before the scene mounts. */\n getCharacter(): ExploreSimpleCharacterRoot | null\n /** Space the player is currently in. */\n getActiveSpaceId(): string | undefined\n /**\n * Move the local player. Coordinates are base-layer-local in the active\n * space, matching `spawnPoint` / connector conventions; `yaw = 0` faces +Z.\n */\n teleport(pose: { position: [number, number, number]; yaw?: number }): void\n}\n\nexport interface CaveExploreProps extends CaveViewerBaseProps {\n /**\n * Fired with the id (and loaded config) of the scene the player is currently\n * in — once for the initial scene and again after every seamless / portal\n * transition. Use it to keep scene-scoped UI in sync during cross-scene\n * travel; read the scene name from `space.metadata.name`.\n */\n onActiveSpaceChange?: ActiveSpaceChangeHandler\n\n /**\n * Multiplayer character sync. Requires an explicit `url`. Pass `avatars`\n * (or `BUILTIN_AVATARS`) for remote meshes — omitting it does not fall back\n * to the CaveGiant CDN.\n * @default false\n */\n multiplayer?: MultiplayerProp\n\n /**\n * Third-person local player mesh. Omit for the viverse mannequin; pass a\n * config with `url` (+ `boneMap` for non-VRM rigs) for a custom GLB/VRM.\n * First-person always hides the body.\n *\n * Must be a stable reference (module constant or `useMemo`) — a new object\n * each render re-loads the GLB and resets locomotion state.\n */\n localCharacterModel?: LocalCharacterModelProp\n /** Locomotion speeds and input bindings for the local player. */\n characterControls?: CharacterControlsConfig\n\n /** Global default for connector wayfinding labels. @default 'auto' */\n connectorLabel?: ConnectorLabelMode\n /** Replace the built-in connector label visuals. */\n renderConnectorLabel?: ConnectorLabelRenderer\n\n /** Configure the first-run controls hint, or `false` to disable it. */\n exploreHelper?: ExploreHelperConfig | false\n /** Replace the first-run controls hint UI. */\n renderExploreHelper?: ExploreHelperRenderer\n\n /**\n * Handle activation of `portal` objects (in-app routes, deep links). Return\n * `true` if handled; otherwise the SDK opens absolute `http(s)` URLs only.\n */\n onPortalNavigate?: PortalNavigateHandler\n}\n\nfunction CaveExploreInner({\n props,\n handleRef\n}: {\n props: CaveExploreProps\n handleRef: React.Ref<CaveExploreHandle>\n}) {\n const {\n spaceId,\n caveSpaceLoader = DefaultCaveSpaceLoader,\n onSpaceInitialized,\n onActiveSpaceChange,\n multiplayer,\n localCharacterModel,\n characterControls,\n revealOnEnter,\n injectStyles,\n exploreHelper,\n renderExploreHelper,\n renderDetailWindow,\n onPortalNavigate,\n onLoadError,\n onLoadErrorExit,\n renderLoadError,\n children\n } = props\n\n const exploreStore = useCaveExploreStore()\n const actionPromptStore = useActionPromptStore()\n\n const [spaceInited, setSpaceInited] = useState(false)\n const characterRef = useRef<ExploreSimpleCharacterRoot>(null)\n const appliedSpawnRef = useRef<string | undefined>(undefined)\n\n useCaveWorldStyles(injectStyles ?? true)\n\n const handleReset = useCallback(() => {\n setSpaceInited(false)\n appliedSpawnRef.current = undefined\n actionPromptStore.getState().clearActions()\n exploreStore.getState().setActiveConnector(undefined)\n }, [actionPromptStore, exploreStore])\n\n const handlePrimaryLoaded = useCallback(\n (loadedId: string, space: CaveSpaceConfig) => {\n preloadSpaceAssets(space)\n // Register the primary alongside its preloaded neighbors so the renderer,\n // preloader, and transition handler treat every space identically — which\n // is what enables seamless back-traversal (A → B → A).\n const store = exploreStore.getState()\n store.setConnectedSpace(loadedId, space)\n store.setActiveSpaceId(loadedId)\n },\n [exploreStore]\n )\n\n usePrimarySpaceLoader({\n spaceId,\n loader: caveSpaceLoader,\n onLoaded: handlePrimaryLoaded,\n onReset: handleReset\n })\n\n useActiveSpaceNotify(onActiveSpaceChange)\n useLoadErrorNotify(onLoadError)\n useConnectorPreloader(caveSpaceLoader, spaceId, spaceInited)\n useConnectorTransitions(spaceId, characterRef)\n useExploreActions(onPortalNavigate)\n useActionShortcuts()\n\n const onPrimaryInitialized = useCallback(() => {\n setSpaceInited(true)\n onSpaceInitialized?.()\n }, [onSpaceInitialized])\n\n useEffect(() => {\n const store = exploreStore\n const prompts = actionPromptStore\n return () => {\n prompts.getState().clearActions()\n store.getState().clearConnectedSpaces()\n }\n }, [exploreStore, actionPromptStore])\n\n const teleport = useCallback(\n (pose: { position: [number, number, number]; yaw?: number }) => {\n const character = characterRef.current\n if (!character) return\n const state = exploreStore.getState()\n const activeId = state.activeSpaceId\n const space = activeId ? state.connectedSpaces[activeId] : undefined\n if (!space) return\n\n const { position, quaternion } = computeSpawnPose(\n { position: pose.position, yaw: pose.yaw ?? 0 },\n space.baseLayer.transform,\n activeId ? matrixFromM16(state.spaceTransforms[activeId]) : undefined\n )\n applyCharacterPose(character, position, quaternion)\n },\n [exploreStore]\n )\n\n useImperativeHandle(\n handleRef,\n () => ({\n getCharacter: () => characterRef.current,\n getActiveSpaceId: () => exploreStore.getState().activeSpaceId,\n teleport\n }),\n [exploreStore, teleport]\n )\n\n // Apply `baseLayer.spawnPoint` once, when the primary scene first becomes\n // ready. Scene transitions must not re-run it (hence the applied guard).\n useEffect(() => {\n if (!spaceInited || !spaceId || !characterRef.current) return\n if (appliedSpawnRef.current === spaceId) return\n appliedSpawnRef.current = spaceId\n\n const state = exploreStore.getState()\n const space = state.connectedSpaces[spaceId]\n const spawn = space?.baseLayer?.spawnPoint\n if (!spawn) return\n\n const { position, quaternion } = computeSpawnPose(\n spawn,\n space.baseLayer.transform,\n matrixFromM16(state.spaceTransforms[spaceId])\n )\n applyCharacterPose(characterRef.current, position, quaternion)\n }, [spaceInited, spaceId, exploreStore])\n\n // Stop the render loop while the page is hidden (tab switch / app background\n // / lock screen) so the GPU does zero splat work — the main heat driver.\n const frameloop = useVisibilityFrameloop()\n const dpr = getSparkCanvasDpr()\n\n const resolvedMultiplayer = useMemo(() => resolveMultiplayer(multiplayer), [multiplayer])\n\n const handleCanvasPointerDown = useCallback((event: React.PointerEvent) => {\n // Desktop look controls need pointer lock; right-click releases it so the\n // user can reach browser UI again.\n if (event.button === 2) {\n document.exitPointerLock()\n return\n }\n if (\n event.pointerType === 'mouse' &&\n event.button === 0 &&\n event.target instanceof HTMLCanvasElement\n ) {\n event.target.requestPointerLock()\n }\n }, [])\n\n return (\n <div className=\"cw-root\">\n <Canvas\n dpr={dpr}\n frameloop={frameloop}\n gl={GL_DEFAULTS}\n camera={CAMERA_DEFAULTS}\n onCreated={({ gl }) => {\n configureSparkWebGLRenderer(gl)\n configureCaveCanvasDomElement(gl.domElement)\n }}\n onPointerDown={handleCanvasPointerDown}\n >\n <Suspense fallback={null}>\n <BvhPhysicsWorld>\n <ConnectedSpacesRenderer\n primarySpaceId={spaceId}\n revealOnEnter={revealOnEnter ?? REVEAL_ON_ENTER_DEFAULT_ENABLED}\n connectorLabels\n onPrimaryInitialized={onPrimaryInitialized}\n />\n {/* Own boundary: viverse loads the avatar and each animation clip\n through a separate `suspend()` call, so mounting the character is\n a chain of suspensions. Sharing a boundary with the scenes would\n tear down (and re-download) every splat mesh on each link. */}\n <Suspense fallback={null}>\n <ExploreSimpleCharacter\n ref={characterRef}\n spaceInited={spaceInited}\n spaceId={spaceId}\n multiplayer={resolvedMultiplayer}\n localCharacterModel={localCharacterModel}\n characterControls={characterControls}\n />\n </Suspense>\n <ActionBubble />\n <Suspense fallback={null}>{children}</Suspense>\n </BvhPhysicsWorld>\n </Suspense>\n </Canvas>\n\n {renderDetailWindow ? renderDetailWindow() : <DetailWindow />}\n <ActionPanel />\n {exploreHelper === false ? null : (\n <ExploreHelper config={exploreHelper} render={renderExploreHelper} />\n )}\n <SpaceLoadErrorOverlay onExit={onLoadErrorExit} render={renderLoadError} />\n </div>\n )\n}\n\n/**\n * Full first/third-person virtual tour: canvas, physics, character controls,\n * cross-scene travel, and the built-in interaction overlays.\n *\n * The container must have a definite width and height — the viewer fills it.\n *\n * @example\n * ```tsx\n * <div style={{ width: '100vw', height: '100vh' }}>\n * <CaveExplore spaceId=\"my-space\" />\n * </div>\n * ```\n */\nconst CaveExplore = forwardRef<CaveExploreHandle, CaveExploreProps>(\n function CaveExplore(props, ref) {\n return (\n <CaveWorldProvider\n eventBus={props.eventBus}\n objectRegistry={props.objectRegistry}\n componentRegistry={props.componentRegistry}\n messages={props.messages}\n connectorLabel={props.connectorLabel ?? 'auto'}\n connectorLabelRenderer={props.renderConnectorLabel ?? ConnectorLabelBeacon}\n >\n <CaveExploreProvider>\n <CaveExploreInner props={props} handleRef={ref} />\n </CaveExploreProvider>\n </CaveWorldProvider>\n )\n }\n)\n\nexport default CaveExplore\n\n/** Re-exported so `ref` consumers don't need a deep import. */\nexport type { ExploreSimpleCharacterRoot }\n"],"names":["CAMERA_DEFAULTS","GL_DEFAULTS","multiplayerLogger","createLogger","resolveMultiplayer","prop","config","CaveExploreInner","props","handleRef","spaceId","caveSpaceLoader","DefaultCaveSpaceLoader","onSpaceInitialized","onActiveSpaceChange","multiplayer","localCharacterModel","characterControls","revealOnEnter","injectStyles","exploreHelper","renderExploreHelper","renderDetailWindow","onPortalNavigate","onLoadError","onLoadErrorExit","renderLoadError","children","exploreStore","useCaveExploreStore","actionPromptStore","useActionPromptStore","spaceInited","setSpaceInited","useState","characterRef","useRef","appliedSpawnRef","useCaveWorldStyles","handleReset","useCallback","handlePrimaryLoaded","loadedId","space","preloadSpaceAssets","store","usePrimarySpaceLoader","useActiveSpaceNotify","useLoadErrorNotify","useConnectorPreloader","useConnectorTransitions","useExploreActions","useActionShortcuts","onPrimaryInitialized","useEffect","prompts","teleport","pose","character","state","activeId","position","quaternion","computeSpawnPose","matrixFromM16","applyCharacterPose","useImperativeHandle","spawn","frameloop","useVisibilityFrameloop","dpr","getSparkCanvasDpr","resolvedMultiplayer","useMemo","handleCanvasPointerDown","event","jsxs","jsx","Canvas","gl","configureSparkWebGLRenderer","configureCaveCanvasDomElement","Suspense","BvhPhysicsWorld","ConnectedSpacesRenderer","REVEAL_ON_ENTER_DEFAULT_ENABLED","ExploreSimpleCharacter","ActionBubble","DetailWindow","ActionPanel","ExploreHelper","SpaceLoadErrorOverlay","CaveExplore","forwardRef","ref","CaveWorldProvider","ConnectorLabelBeacon","CaveExploreProvider"],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { type ComponentRef } from 'react';
|
|
2
|
+
import { OrbitControls } from '@react-three/drei';
|
|
3
|
+
import type { Camera } from 'three';
|
|
4
|
+
import type { CaveSpace as CaveSpaceConfig, Vector3 } from '../types/index.js';
|
|
5
|
+
import type { CaveViewerBaseProps } from './viewer-shared.js';
|
|
6
|
+
type OrbitControlsImpl = ComponentRef<typeof OrbitControls>;
|
|
7
|
+
export interface OrbitCameraConfig {
|
|
8
|
+
/** Initial camera position in world space. */
|
|
9
|
+
position: Vector3;
|
|
10
|
+
/** Point the camera looks at, and the orbit pivot. */
|
|
11
|
+
target?: Vector3;
|
|
12
|
+
/** Vertical field of view in degrees. */
|
|
13
|
+
fov?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface OrbitControlsConfig {
|
|
16
|
+
minPolarAngle?: number;
|
|
17
|
+
maxPolarAngle?: number;
|
|
18
|
+
minDistance?: number;
|
|
19
|
+
maxDistance?: number;
|
|
20
|
+
/** @default false — damping adds inertia that fights precise framing. */
|
|
21
|
+
enableDamping?: boolean;
|
|
22
|
+
rotateSpeed?: number;
|
|
23
|
+
enablePan?: boolean;
|
|
24
|
+
enableZoom?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/** Handle passed to `onSpaceInitialized` for imperative camera work. */
|
|
27
|
+
export interface OrbitViewerReadyApi {
|
|
28
|
+
camera: Camera;
|
|
29
|
+
controls: OrbitControlsImpl | null;
|
|
30
|
+
space: CaveSpaceConfig;
|
|
31
|
+
}
|
|
32
|
+
export interface CaveOrbitViewerProps extends Omit<CaveViewerBaseProps, 'onSpaceInitialized'> {
|
|
33
|
+
/**
|
|
34
|
+
* Adjust the loaded scene before it renders — typically to override
|
|
35
|
+
* `baseLayer.transform` so an off-axis capture sits level under the orbit
|
|
36
|
+
* camera. Must return a new object; mutating the input breaks memoisation.
|
|
37
|
+
*/
|
|
38
|
+
transformSpace?: (space: CaveSpaceConfig) => CaveSpaceConfig;
|
|
39
|
+
/** Initial camera framing. Applied once the base layer is ready. */
|
|
40
|
+
camera?: OrbitCameraConfig;
|
|
41
|
+
/** Orbit limits. */
|
|
42
|
+
orbit?: OrbitControlsConfig;
|
|
43
|
+
/** Show connector wayfinding labels. @default false */
|
|
44
|
+
connectorLabels?: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Fired when the base layer is ready, with the camera and controls so you can
|
|
47
|
+
* apply per-scene framing the SDK can't know about.
|
|
48
|
+
*/
|
|
49
|
+
onSpaceInitialized?: (api: OrbitViewerReadyApi) => void;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Orbit-camera scene viewer — a bird's-eye "look at the whole place" mode with
|
|
53
|
+
* no avatar, physics-driven locomotion, or cross-scene travel.
|
|
54
|
+
*
|
|
55
|
+
* Use it for overview pages and scene pickers. Per-scene framing comes from the
|
|
56
|
+
* `camera` / `orbit` props (or imperatively via `onSpaceInitialized`), and 3D
|
|
57
|
+
* labels go in `children` as drei `<Html>` nodes.
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```tsx
|
|
61
|
+
* <CaveOrbitViewer
|
|
62
|
+
* spaceId={id}
|
|
63
|
+
* camera={{ position: [0, 3.4, -2.1], target: [0, 0, 0] }}
|
|
64
|
+
* orbit={{ maxPolarAngle: Math.PI / 3 }}
|
|
65
|
+
* >
|
|
66
|
+
* {tags.map((tag) => (
|
|
67
|
+
* <Html key={tag.id} position={tag.position} center>
|
|
68
|
+
* <MyTag label={tag.label} />
|
|
69
|
+
* </Html>
|
|
70
|
+
* ))}
|
|
71
|
+
* </CaveOrbitViewer>
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
export default function CaveOrbitViewer(props: CaveOrbitViewerProps): import("react").JSX.Element;
|
|
75
|
+
export {};
|
|
76
|
+
//# sourceMappingURL=cave-orbit-viewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cave-orbit-viewer.d.ts","sourceRoot":"","sources":["../../explore/cave-orbit-viewer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqD,KAAK,YAAY,EAAE,MAAM,OAAO,CAAA;AAC5F,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAGjD,OAAO,KAAK,EAAE,MAAM,EAAyC,MAAM,OAAO,CAAA;AAU1E,OAAO,KAAK,EAAE,SAAS,IAAI,eAAe,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAQrE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAE1D,KAAK,iBAAiB,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,CAAA;AAY3D,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,QAAQ,EAAE,OAAO,CAAA;IACjB,sDAAsD;IACtD,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,yEAAyE;IACzE,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,wEAAwE;AACxE,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAA;IAClC,KAAK,EAAE,eAAe,CAAA;CACvB;AAED,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAAC,mBAAmB,EAAE,oBAAoB,CAAC;IAC3F;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,eAAe,CAAA;IAC5D,oEAAoE;IACpE,MAAM,CAAC,EAAE,iBAAiB,CAAA;IAC1B,oBAAoB;IACpB,KAAK,CAAC,EAAE,mBAAmB,CAAA;IAC3B,uDAAuD;IACvD,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,mBAAmB,KAAK,IAAI,CAAA;CACxD;AAiID;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,KAAK,EAAE,oBAAoB,+BAWlE"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { jsx as o, jsxs as C } from "react/jsx-runtime";
|
|
2
|
+
import { useRef as i, useMemo as w, useEffect as N, useCallback as z, Suspense as p } from "react";
|
|
3
|
+
import { OrbitControls as B } from "@react-three/drei";
|
|
4
|
+
import { Canvas as V } from "@react-three/fiber";
|
|
5
|
+
import { BvhPhysicsWorld as F } from "@react-three/viverse";
|
|
6
|
+
import { CaveWorldProvider as T } from "../core/context/cave-world-context.js";
|
|
7
|
+
import G from "../space/cave-space.js";
|
|
8
|
+
import { REVEAL_ON_ENTER_DEFAULT_ENABLED as M } from "../space/splats/spark/splat-spread-reveal.js";
|
|
9
|
+
import { useVisibilityFrameloop as U } from "../space/utils/use-visibility-frameloop.js";
|
|
10
|
+
import { getSparkCanvasDpr as Z } from "../space/utils/spark-performance.js";
|
|
11
|
+
import { configureSparkWebGLRenderer as q, configureCaveCanvasDomElement as H } from "../space/utils/configure-canvas.js";
|
|
12
|
+
import { preloadSpaceAssets as J } from "./hooks/use-connector-preloader.js";
|
|
13
|
+
import { useLoadErrorNotify as K } from "./hooks/use-load-error-notify.js";
|
|
14
|
+
import { usePrimarySpaceLoader as Q } from "./hooks/use-primary-space-loader.js";
|
|
15
|
+
import { DefaultCaveSpaceLoader as X } from "./loaders/cave-loader.js";
|
|
16
|
+
import Y from "./overlays/detail-window.js";
|
|
17
|
+
import $ from "./overlays/space-load-error-overlay.js";
|
|
18
|
+
import { useCaveWorldStyles as ee } from "./styles/inject.js";
|
|
19
|
+
const re = { antialias: !1 };
|
|
20
|
+
function oe(a, c) {
|
|
21
|
+
J(c);
|
|
22
|
+
}
|
|
23
|
+
function ae(a) {
|
|
24
|
+
const {
|
|
25
|
+
spaceId: c,
|
|
26
|
+
caveSpaceLoader: D = X,
|
|
27
|
+
transformSpace: m,
|
|
28
|
+
camera: n,
|
|
29
|
+
orbit: e,
|
|
30
|
+
connectorLabels: R = !1,
|
|
31
|
+
revealOnEnter: y,
|
|
32
|
+
injectStyles: P,
|
|
33
|
+
onSpaceInitialized: f,
|
|
34
|
+
renderDetailWindow: u,
|
|
35
|
+
onLoadError: h,
|
|
36
|
+
onLoadErrorExit: x,
|
|
37
|
+
renderLoadError: A,
|
|
38
|
+
children: k
|
|
39
|
+
} = a, v = i(null), g = i(null);
|
|
40
|
+
ee(P ?? !0), K(h);
|
|
41
|
+
const { space: l } = Q({
|
|
42
|
+
spaceId: c,
|
|
43
|
+
loader: D,
|
|
44
|
+
onLoaded: oe
|
|
45
|
+
}), d = w(
|
|
46
|
+
() => l && m ? m(l) : l,
|
|
47
|
+
[l, m]
|
|
48
|
+
), b = i(n), O = i(e), E = i(f);
|
|
49
|
+
N(() => {
|
|
50
|
+
b.current = n, O.current = e, E.current = f;
|
|
51
|
+
}, [n, e, f]);
|
|
52
|
+
const I = z(() => {
|
|
53
|
+
const r = v.current, s = g.current, S = d;
|
|
54
|
+
if (!r || !S) return;
|
|
55
|
+
const t = b.current;
|
|
56
|
+
if (t) {
|
|
57
|
+
r.position.set(...t.position);
|
|
58
|
+
const L = t.target ?? [0, 0, 0];
|
|
59
|
+
r.lookAt(...L), s && (s.target.set(...L), s.update()), t.fov != null && "fov" in r && (r.fov = t.fov), r.updateProjectionMatrix();
|
|
60
|
+
}
|
|
61
|
+
E.current?.({ camera: r, controls: s, space: S });
|
|
62
|
+
}, [d]), j = U(), W = Z(), _ = n?.position ?? [0, 10, 10];
|
|
63
|
+
return /* @__PURE__ */ C("div", { className: "cw-root", children: [
|
|
64
|
+
/* @__PURE__ */ o(
|
|
65
|
+
V,
|
|
66
|
+
{
|
|
67
|
+
dpr: W,
|
|
68
|
+
frameloop: j,
|
|
69
|
+
gl: re,
|
|
70
|
+
camera: { position: _, fov: n?.fov },
|
|
71
|
+
onCreated: (r) => {
|
|
72
|
+
v.current = r.camera, q(r.gl), H(r.gl.domElement);
|
|
73
|
+
},
|
|
74
|
+
children: /* @__PURE__ */ C(p, { fallback: null, children: [
|
|
75
|
+
/* @__PURE__ */ o(F, { children: /* @__PURE__ */ o(p, { fallback: null, children: /* @__PURE__ */ o(
|
|
76
|
+
G,
|
|
77
|
+
{
|
|
78
|
+
space: d,
|
|
79
|
+
spaceId: c,
|
|
80
|
+
connectorLabels: R,
|
|
81
|
+
revealOnEnter: y ?? M,
|
|
82
|
+
onInitialized: I
|
|
83
|
+
}
|
|
84
|
+
) }) }),
|
|
85
|
+
/* @__PURE__ */ o(
|
|
86
|
+
B,
|
|
87
|
+
{
|
|
88
|
+
makeDefault: !0,
|
|
89
|
+
ref: g,
|
|
90
|
+
enableDamping: e?.enableDamping ?? !1,
|
|
91
|
+
rotateSpeed: e?.rotateSpeed ?? 0.8,
|
|
92
|
+
minPolarAngle: e?.minPolarAngle,
|
|
93
|
+
maxPolarAngle: e?.maxPolarAngle,
|
|
94
|
+
minDistance: e?.minDistance,
|
|
95
|
+
maxDistance: e?.maxDistance,
|
|
96
|
+
enablePan: e?.enablePan,
|
|
97
|
+
enableZoom: e?.enableZoom
|
|
98
|
+
}
|
|
99
|
+
),
|
|
100
|
+
/* @__PURE__ */ o(p, { fallback: null, children: k })
|
|
101
|
+
] })
|
|
102
|
+
}
|
|
103
|
+
),
|
|
104
|
+
u ? u() : /* @__PURE__ */ o(Y, {}),
|
|
105
|
+
/* @__PURE__ */ o($, { onExit: x, render: A })
|
|
106
|
+
] });
|
|
107
|
+
}
|
|
108
|
+
function De(a) {
|
|
109
|
+
return /* @__PURE__ */ o(
|
|
110
|
+
T,
|
|
111
|
+
{
|
|
112
|
+
eventBus: a.eventBus,
|
|
113
|
+
objectRegistry: a.objectRegistry,
|
|
114
|
+
componentRegistry: a.componentRegistry,
|
|
115
|
+
messages: a.messages,
|
|
116
|
+
children: /* @__PURE__ */ o(ae, { ...a })
|
|
117
|
+
}
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
export {
|
|
121
|
+
De as default
|
|
122
|
+
};
|
|
123
|
+
//# sourceMappingURL=cave-orbit-viewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cave-orbit-viewer.js","sources":["../../explore/cave-orbit-viewer.tsx"],"sourcesContent":["import { Suspense, useCallback, useEffect, useMemo, useRef, type ComponentRef } from 'react'\nimport { OrbitControls } from '@react-three/drei'\nimport { Canvas } from '@react-three/fiber'\nimport { BvhPhysicsWorld } from '@react-three/viverse'\nimport type { Camera, OrthographicCamera, PerspectiveCamera } from 'three'\nimport { CaveWorldProvider } from '../core'\nimport {\n CaveSpace,\n configureCaveCanvasDomElement,\n configureSparkWebGLRenderer,\n getSparkCanvasDpr,\n REVEAL_ON_ENTER_DEFAULT_ENABLED,\n useVisibilityFrameloop\n} from '../space'\nimport type { CaveSpace as CaveSpaceConfig, Vector3 } from '../types'\nimport { preloadSpaceAssets } from './hooks/use-connector-preloader'\nimport { useLoadErrorNotify } from './hooks/use-load-error-notify'\nimport { usePrimarySpaceLoader } from './hooks/use-primary-space-loader'\nimport { DefaultCaveSpaceLoader } from './loaders/cave-loader'\nimport DetailWindow from './overlays/detail-window'\nimport SpaceLoadErrorOverlay from './overlays/space-load-error-overlay'\nimport { useCaveWorldStyles } from './styles/inject'\nimport type { CaveViewerBaseProps } from './viewer-shared'\n\ntype OrbitControlsImpl = ComponentRef<typeof OrbitControls>\n\nconst GL_DEFAULTS = { antialias: false } as const\n\n/**\n * Start collider downloads as soon as the scene JSON lands, so they run\n * alongside the splat instead of suspending after the base layer mounts.\n */\nfunction preloadOnLoaded(_spaceId: string, space: CaveSpaceConfig): void {\n preloadSpaceAssets(space)\n}\n\nexport interface OrbitCameraConfig {\n /** Initial camera position in world space. */\n position: Vector3\n /** Point the camera looks at, and the orbit pivot. */\n target?: Vector3\n /** Vertical field of view in degrees. */\n fov?: number\n}\n\nexport interface OrbitControlsConfig {\n minPolarAngle?: number\n maxPolarAngle?: number\n minDistance?: number\n maxDistance?: number\n /** @default false — damping adds inertia that fights precise framing. */\n enableDamping?: boolean\n rotateSpeed?: number\n enablePan?: boolean\n enableZoom?: boolean\n}\n\n/** Handle passed to `onSpaceInitialized` for imperative camera work. */\nexport interface OrbitViewerReadyApi {\n camera: Camera\n controls: OrbitControlsImpl | null\n space: CaveSpaceConfig\n}\n\nexport interface CaveOrbitViewerProps extends Omit<CaveViewerBaseProps, 'onSpaceInitialized'> {\n /**\n * Adjust the loaded scene before it renders — typically to override\n * `baseLayer.transform` so an off-axis capture sits level under the orbit\n * camera. Must return a new object; mutating the input breaks memoisation.\n */\n transformSpace?: (space: CaveSpaceConfig) => CaveSpaceConfig\n /** Initial camera framing. Applied once the base layer is ready. */\n camera?: OrbitCameraConfig\n /** Orbit limits. */\n orbit?: OrbitControlsConfig\n /** Show connector wayfinding labels. @default false */\n connectorLabels?: boolean\n /**\n * Fired when the base layer is ready, with the camera and controls so you can\n * apply per-scene framing the SDK can't know about.\n */\n onSpaceInitialized?: (api: OrbitViewerReadyApi) => void\n}\n\nfunction CaveOrbitViewerInner(props: CaveOrbitViewerProps) {\n const {\n spaceId,\n caveSpaceLoader = DefaultCaveSpaceLoader,\n transformSpace,\n camera: cameraConfig,\n orbit,\n connectorLabels = false,\n revealOnEnter,\n injectStyles,\n onSpaceInitialized,\n renderDetailWindow,\n onLoadError,\n onLoadErrorExit,\n renderLoadError,\n children\n } = props\n\n const cameraRef = useRef<Camera | null>(null)\n const controlsRef = useRef<OrbitControlsImpl>(null)\n\n useCaveWorldStyles(injectStyles ?? true)\n useLoadErrorNotify(onLoadError)\n\n const { space: loadedSpace } = usePrimarySpaceLoader({\n spaceId,\n loader: caveSpaceLoader,\n onLoaded: preloadOnLoaded\n })\n\n const space = useMemo(\n () => (loadedSpace && transformSpace ? transformSpace(loadedSpace) : loadedSpace),\n [loadedSpace, transformSpace]\n )\n\n // Read the latest framing config from refs so changing it doesn't remount the\n // canvas; it is only consulted at initialization time.\n const cameraConfigRef = useRef(cameraConfig)\n const orbitRef = useRef(orbit)\n const onInitializedRef = useRef(onSpaceInitialized)\n useEffect(() => {\n cameraConfigRef.current = cameraConfig\n orbitRef.current = orbit\n onInitializedRef.current = onSpaceInitialized\n }, [cameraConfig, orbit, onSpaceInitialized])\n\n const handleInitialized = useCallback(() => {\n const camera = cameraRef.current\n const controls = controlsRef.current\n const currentSpace = space\n if (!camera || !currentSpace) return\n\n const framing = cameraConfigRef.current\n if (framing) {\n camera.position.set(...framing.position)\n const target = framing.target ?? [0, 0, 0]\n camera.lookAt(...target)\n if (controls) {\n controls.target.set(...target)\n controls.update()\n }\n if (framing.fov != null && 'fov' in camera) {\n ;(camera as PerspectiveCamera).fov = framing.fov\n }\n ;(camera as PerspectiveCamera | OrthographicCamera).updateProjectionMatrix()\n }\n\n onInitializedRef.current?.({ camera, controls, space: currentSpace })\n }, [space])\n\n const frameloop = useVisibilityFrameloop()\n const dpr = getSparkCanvasDpr()\n\n const initialCameraPosition = cameraConfig?.position ?? [0, 10, 10]\n\n return (\n <div className=\"cw-root\">\n <Canvas\n dpr={dpr}\n frameloop={frameloop}\n gl={GL_DEFAULTS}\n camera={{ position: initialCameraPosition, fov: cameraConfig?.fov }}\n onCreated={(state) => {\n cameraRef.current = state.camera\n configureSparkWebGLRenderer(state.gl)\n configureCaveCanvasDomElement(state.gl.domElement)\n }}\n >\n <Suspense fallback={null}>\n <BvhPhysicsWorld>\n {/* Own boundary: a suspending sibling (a host label, an object still\n streaming) must not unmount the splat mesh — spark re-downloads\n the whole asset when its mesh is rebuilt. */}\n <Suspense fallback={null}>\n <CaveSpace\n space={space}\n spaceId={spaceId}\n connectorLabels={connectorLabels}\n revealOnEnter={revealOnEnter ?? REVEAL_ON_ENTER_DEFAULT_ENABLED}\n onInitialized={handleInitialized}\n />\n </Suspense>\n </BvhPhysicsWorld>\n\n <OrbitControls\n makeDefault\n ref={controlsRef}\n enableDamping={orbit?.enableDamping ?? false}\n rotateSpeed={orbit?.rotateSpeed ?? 0.8}\n minPolarAngle={orbit?.minPolarAngle}\n maxPolarAngle={orbit?.maxPolarAngle}\n minDistance={orbit?.minDistance}\n maxDistance={orbit?.maxDistance}\n enablePan={orbit?.enablePan}\n enableZoom={orbit?.enableZoom}\n />\n\n <Suspense fallback={null}>{children}</Suspense>\n </Suspense>\n </Canvas>\n\n {renderDetailWindow ? renderDetailWindow() : <DetailWindow />}\n <SpaceLoadErrorOverlay onExit={onLoadErrorExit} render={renderLoadError} />\n </div>\n )\n}\n\n/**\n * Orbit-camera scene viewer — a bird's-eye \"look at the whole place\" mode with\n * no avatar, physics-driven locomotion, or cross-scene travel.\n *\n * Use it for overview pages and scene pickers. Per-scene framing comes from the\n * `camera` / `orbit` props (or imperatively via `onSpaceInitialized`), and 3D\n * labels go in `children` as drei `<Html>` nodes.\n *\n * @example\n * ```tsx\n * <CaveOrbitViewer\n * spaceId={id}\n * camera={{ position: [0, 3.4, -2.1], target: [0, 0, 0] }}\n * orbit={{ maxPolarAngle: Math.PI / 3 }}\n * >\n * {tags.map((tag) => (\n * <Html key={tag.id} position={tag.position} center>\n * <MyTag label={tag.label} />\n * </Html>\n * ))}\n * </CaveOrbitViewer>\n * ```\n */\nexport default function CaveOrbitViewer(props: CaveOrbitViewerProps) {\n return (\n <CaveWorldProvider\n eventBus={props.eventBus}\n objectRegistry={props.objectRegistry}\n componentRegistry={props.componentRegistry}\n messages={props.messages}\n >\n <CaveOrbitViewerInner {...props} />\n </CaveWorldProvider>\n )\n}\n"],"names":["GL_DEFAULTS","preloadOnLoaded","_spaceId","space","preloadSpaceAssets","CaveOrbitViewerInner","props","spaceId","caveSpaceLoader","DefaultCaveSpaceLoader","transformSpace","cameraConfig","orbit","connectorLabels","revealOnEnter","injectStyles","onSpaceInitialized","renderDetailWindow","onLoadError","onLoadErrorExit","renderLoadError","children","cameraRef","useRef","controlsRef","useCaveWorldStyles","useLoadErrorNotify","loadedSpace","usePrimarySpaceLoader","useMemo","cameraConfigRef","orbitRef","onInitializedRef","useEffect","handleInitialized","useCallback","camera","controls","currentSpace","framing","target","frameloop","useVisibilityFrameloop","dpr","getSparkCanvasDpr","initialCameraPosition","jsxs","jsx","Canvas","state","configureSparkWebGLRenderer","configureCaveCanvasDomElement","Suspense","BvhPhysicsWorld","CaveSpace","REVEAL_ON_ENTER_DEFAULT_ENABLED","OrbitControls","DetailWindow","SpaceLoadErrorOverlay","CaveOrbitViewer","CaveWorldProvider"],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Quaternion as QuaternionType, Vector3 as Vector3Type } from '../../types/index.js';
|
|
2
|
+
/** Id of the avatar used when a remote player reports none. */
|
|
3
|
+
export declare const DEFAULT_AVATAR_ID = "avatar-default";
|
|
4
|
+
/** Animation clips every avatar must provide. */
|
|
5
|
+
export declare const SUPPORTED_ANIMATION_NAMES: readonly ["idle", "walk", "run", "jumpDown", "jumpUp", "jumpForward"];
|
|
6
|
+
export type AnimationName = (typeof SUPPORTED_ANIMATION_NAMES)[number];
|
|
7
|
+
export interface AvatarAssetRef {
|
|
8
|
+
type: string;
|
|
9
|
+
url: string;
|
|
10
|
+
}
|
|
11
|
+
/** A remote-player avatar: one skinned mesh plus one clip per animation. */
|
|
12
|
+
export interface AvatarConfig {
|
|
13
|
+
id: string;
|
|
14
|
+
name: string;
|
|
15
|
+
model: AvatarAssetRef;
|
|
16
|
+
animations: Record<string, AvatarAssetRef> & Record<AnimationName, AvatarAssetRef>;
|
|
17
|
+
defaultScale?: Vector3Type;
|
|
18
|
+
defaultPosition?: Vector3Type;
|
|
19
|
+
defaultRotation?: QuaternionType;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Built-in avatar hosted on CaveGiant's public CDN.
|
|
23
|
+
*
|
|
24
|
+
* Opt in via `multiplayer.avatars={ ...BUILTIN_AVATARS }` (or pass
|
|
25
|
+
* `DEFAULT_AVATAR` in your catalog). The SDK no longer loads these assets
|
|
26
|
+
* unless the host supplies them.
|
|
27
|
+
*/
|
|
28
|
+
export declare const DEFAULT_AVATAR: AvatarConfig;
|
|
29
|
+
/** Avatar catalog used when `multiplayer.avatars` is omitted. */
|
|
30
|
+
export declare const BUILTIN_AVATARS: Record<string, AvatarConfig>;
|
|
31
|
+
/**
|
|
32
|
+
* Resolve an avatar id against a catalog, falling back to the built-in avatar.
|
|
33
|
+
*
|
|
34
|
+
* @param avatars host-supplied catalog; defaults to {@link BUILTIN_AVATARS}.
|
|
35
|
+
*/
|
|
36
|
+
export declare function getAvatarConfig(avatarId: string, avatars?: Record<string, AvatarConfig>): AvatarConfig | null;
|
|
37
|
+
export declare function getAvailableAvatarIds(avatars?: Record<string, AvatarConfig>): string[];
|
|
38
|
+
//# sourceMappingURL=character-configs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"character-configs.d.ts","sourceRoot":"","sources":["../../../explore/characters/character-configs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,IAAI,cAAc,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,aAAa,CAAA;AAEvF,+DAA+D;AAC/D,eAAO,MAAM,iBAAiB,mBAAmB,CAAA;AAEjD,iDAAiD;AACjD,eAAO,MAAM,yBAAyB,uEAO5B,CAAA;AAEV,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEtE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,4EAA4E;AAC5E,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,cAAc,CAAA;IACrB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC,CAAA;IAClF,YAAY,CAAC,EAAE,WAAW,CAAA;IAC1B,eAAe,CAAC,EAAE,WAAW,CAAA;IAC7B,eAAe,CAAC,EAAE,cAAc,CAAA;CACjC;AAQD;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,EAAE,YAgB5B,CAAA;AAED,iEAAiE;AACjE,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAExD,CAAA;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAmB,GACtD,YAAY,GAAG,IAAI,CAErB;AAED,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAmB,GACtD,MAAM,EAAE,CAEV"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
const n = "avatar-default", A = [
|
|
2
|
+
"idle",
|
|
3
|
+
"walk",
|
|
4
|
+
"run",
|
|
5
|
+
"jumpDown",
|
|
6
|
+
"jumpUp",
|
|
7
|
+
"jumpForward"
|
|
8
|
+
], t = "https://static-website.cavegiant.com/mb-space/avatar/sys/default";
|
|
9
|
+
function a(l) {
|
|
10
|
+
return { type: "glb", url: l };
|
|
11
|
+
}
|
|
12
|
+
const e = {
|
|
13
|
+
id: n,
|
|
14
|
+
name: "Default",
|
|
15
|
+
model: a(`${t}/model.glb`),
|
|
16
|
+
animations: {
|
|
17
|
+
idle: a(`${t}/idle.glb`),
|
|
18
|
+
walk: a(`${t}/walk.glb`),
|
|
19
|
+
run: a(`${t}/run.glb`),
|
|
20
|
+
jumpDown: a(`${t}/jump-down.glb`),
|
|
21
|
+
jumpUp: a(`${t}/jump-up.glb`),
|
|
22
|
+
jumpForward: a(`${t}/jump-forward.glb`),
|
|
23
|
+
jumpLoop: a(`${t}/jump-loop.glb`)
|
|
24
|
+
},
|
|
25
|
+
defaultScale: [1, 1, 1],
|
|
26
|
+
defaultPosition: [0, 0, 0],
|
|
27
|
+
defaultRotation: [0, 0, 0, 1]
|
|
28
|
+
}, u = {
|
|
29
|
+
[n]: e
|
|
30
|
+
};
|
|
31
|
+
function p(l, o = u) {
|
|
32
|
+
return o[l] ?? o[n] ?? null;
|
|
33
|
+
}
|
|
34
|
+
function r(l = u) {
|
|
35
|
+
return Object.keys(l);
|
|
36
|
+
}
|
|
37
|
+
export {
|
|
38
|
+
u as BUILTIN_AVATARS,
|
|
39
|
+
e as DEFAULT_AVATAR,
|
|
40
|
+
n as DEFAULT_AVATAR_ID,
|
|
41
|
+
A as SUPPORTED_ANIMATION_NAMES,
|
|
42
|
+
r as getAvailableAvatarIds,
|
|
43
|
+
p as getAvatarConfig
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=character-configs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"character-configs.js","sources":["../../../explore/characters/character-configs.ts"],"sourcesContent":["import type { Quaternion as QuaternionType, Vector3 as Vector3Type } from '../../types'\n\n/** Id of the avatar used when a remote player reports none. */\nexport const DEFAULT_AVATAR_ID = 'avatar-default'\n\n/** Animation clips every avatar must provide. */\nexport const SUPPORTED_ANIMATION_NAMES = [\n 'idle',\n 'walk',\n 'run',\n 'jumpDown',\n 'jumpUp',\n 'jumpForward'\n] as const\n\nexport type AnimationName = (typeof SUPPORTED_ANIMATION_NAMES)[number]\n\nexport interface AvatarAssetRef {\n type: string\n url: string\n}\n\n/** A remote-player avatar: one skinned mesh plus one clip per animation. */\nexport interface AvatarConfig {\n id: string\n name: string\n model: AvatarAssetRef\n animations: Record<string, AvatarAssetRef> & Record<AnimationName, AvatarAssetRef>\n defaultScale?: Vector3Type\n defaultPosition?: Vector3Type\n defaultRotation?: QuaternionType\n}\n\nconst DEFAULT_AVATAR_BASE_URL = 'https://static-website.cavegiant.com/mb-space/avatar/sys/default'\n\nfunction glb(url: string): AvatarAssetRef {\n return { type: 'glb', url }\n}\n\n/**\n * Built-in avatar hosted on CaveGiant's public CDN.\n *\n * Opt in via `multiplayer.avatars={ ...BUILTIN_AVATARS }` (or pass\n * `DEFAULT_AVATAR` in your catalog). The SDK no longer loads these assets\n * unless the host supplies them.\n */\nexport const DEFAULT_AVATAR: AvatarConfig = {\n id: DEFAULT_AVATAR_ID,\n name: 'Default',\n model: glb(`${DEFAULT_AVATAR_BASE_URL}/model.glb`),\n animations: {\n idle: glb(`${DEFAULT_AVATAR_BASE_URL}/idle.glb`),\n walk: glb(`${DEFAULT_AVATAR_BASE_URL}/walk.glb`),\n run: glb(`${DEFAULT_AVATAR_BASE_URL}/run.glb`),\n jumpDown: glb(`${DEFAULT_AVATAR_BASE_URL}/jump-down.glb`),\n jumpUp: glb(`${DEFAULT_AVATAR_BASE_URL}/jump-up.glb`),\n jumpForward: glb(`${DEFAULT_AVATAR_BASE_URL}/jump-forward.glb`),\n jumpLoop: glb(`${DEFAULT_AVATAR_BASE_URL}/jump-loop.glb`)\n },\n defaultScale: [1, 1, 1],\n defaultPosition: [0, 0, 0],\n defaultRotation: [0, 0, 0, 1]\n}\n\n/** Avatar catalog used when `multiplayer.avatars` is omitted. */\nexport const BUILTIN_AVATARS: Record<string, AvatarConfig> = {\n [DEFAULT_AVATAR_ID]: DEFAULT_AVATAR\n}\n\n/**\n * Resolve an avatar id against a catalog, falling back to the built-in avatar.\n *\n * @param avatars host-supplied catalog; defaults to {@link BUILTIN_AVATARS}.\n */\nexport function getAvatarConfig(\n avatarId: string,\n avatars: Record<string, AvatarConfig> = BUILTIN_AVATARS\n): AvatarConfig | null {\n return avatars[avatarId] ?? avatars[DEFAULT_AVATAR_ID] ?? null\n}\n\nexport function getAvailableAvatarIds(\n avatars: Record<string, AvatarConfig> = BUILTIN_AVATARS\n): string[] {\n return Object.keys(avatars)\n}\n"],"names":["DEFAULT_AVATAR_ID","SUPPORTED_ANIMATION_NAMES","DEFAULT_AVATAR_BASE_URL","glb","url","DEFAULT_AVATAR","BUILTIN_AVATARS","getAvatarConfig","avatarId","avatars","getAvailableAvatarIds"],"mappings":"AAGO,MAAMA,IAAoB,kBAGpBC,IAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAoBMC,IAA0B;AAEhC,SAASC,EAAIC,GAA6B;AACxC,SAAO,EAAE,MAAM,OAAO,KAAAA,EAAA;AACxB;AASO,MAAMC,IAA+B;AAAA,EAC1C,IAAIL;AAAA,EACJ,MAAM;AAAA,EACN,OAAOG,EAAI,GAAGD,CAAuB,YAAY;AAAA,EACjD,YAAY;AAAA,IACV,MAAMC,EAAI,GAAGD,CAAuB,WAAW;AAAA,IAC/C,MAAMC,EAAI,GAAGD,CAAuB,WAAW;AAAA,IAC/C,KAAKC,EAAI,GAAGD,CAAuB,UAAU;AAAA,IAC7C,UAAUC,EAAI,GAAGD,CAAuB,gBAAgB;AAAA,IACxD,QAAQC,EAAI,GAAGD,CAAuB,cAAc;AAAA,IACpD,aAAaC,EAAI,GAAGD,CAAuB,mBAAmB;AAAA,IAC9D,UAAUC,EAAI,GAAGD,CAAuB,gBAAgB;AAAA,EAAA;AAAA,EAE1D,cAAc,CAAC,GAAG,GAAG,CAAC;AAAA,EACtB,iBAAiB,CAAC,GAAG,GAAG,CAAC;AAAA,EACzB,iBAAiB,CAAC,GAAG,GAAG,GAAG,CAAC;AAC9B,GAGaI,IAAgD;AAAA,EAC3D,CAACN,CAAiB,GAAGK;AACvB;AAOO,SAASE,EACdC,GACAC,IAAwCH,GACnB;AACrB,SAAOG,EAAQD,CAAQ,KAAKC,EAAQT,CAAiB,KAAK;AAC5D;AAEO,SAASU,EACdD,IAAwCH,GAC9B;AACV,SAAO,OAAO,KAAKG,CAAO;AAC5B;"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optional local-player input / locomotion overrides for `ExploreSimpleCharacter`.
|
|
3
|
+
* Host apps supply concrete bindings (e.g. mobile speed selector) without baking
|
|
4
|
+
* product UI into the generic @cave-world package.
|
|
5
|
+
*/
|
|
6
|
+
/** Matches viverse `SimpleCharacter` action binding constructor shape. */
|
|
7
|
+
export type CharacterActionBindingClass = new (domElement: HTMLElement, abortSignal: AbortSignal) => unknown;
|
|
8
|
+
export type CharacterMovementOptions = {
|
|
9
|
+
jump?: boolean | {
|
|
10
|
+
delay?: number;
|
|
11
|
+
bufferTime?: number;
|
|
12
|
+
speed?: number;
|
|
13
|
+
};
|
|
14
|
+
walk?: boolean | {
|
|
15
|
+
speed?: number;
|
|
16
|
+
};
|
|
17
|
+
run?: boolean | {
|
|
18
|
+
speed?: number;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
/** Subset of viverse `SimpleCharacterActionBindingOptions`. */
|
|
22
|
+
export type CharacterActionBindingOptions = {
|
|
23
|
+
screenJoystickRunDistancePx?: number;
|
|
24
|
+
screenJoystickDeadZonePx?: number;
|
|
25
|
+
pointerCaptureRotationSpeed?: number;
|
|
26
|
+
pointerCaptureZoomSpeed?: number;
|
|
27
|
+
pointerLockRotationSpeed?: number;
|
|
28
|
+
pointerLockZoomSpeed?: number;
|
|
29
|
+
keyboardRequiresPointerLock?: boolean;
|
|
30
|
+
keyboardMoveForwardKeys?: string[];
|
|
31
|
+
keyboardMoveBackwardKeys?: string[];
|
|
32
|
+
keyboardMoveLeftKeys?: string[];
|
|
33
|
+
keyboardMoveRightKeys?: string[];
|
|
34
|
+
keyboardRunKeys?: string[];
|
|
35
|
+
keyboardJumpKeys?: string[];
|
|
36
|
+
};
|
|
37
|
+
export type CharacterControlsConfig = {
|
|
38
|
+
/** Mutable object recommended — speed tiers can update `.walk.speed` in place. */
|
|
39
|
+
movement?: CharacterMovementOptions;
|
|
40
|
+
mobileActionBindings?: CharacterActionBindingClass[];
|
|
41
|
+
desktopActionBindings?: CharacterActionBindingClass[];
|
|
42
|
+
actionBindingOptions?: CharacterActionBindingOptions;
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=character-controls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"character-controls.d.ts","sourceRoot":"","sources":["../../../explore/characters/character-controls.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,0EAA0E;AAC1E,MAAM,MAAM,2BAA2B,GAAG,KACxC,UAAU,EAAE,WAAW,EACvB,WAAW,EAAE,WAAW,KACrB,OAAO,CAAA;AAEZ,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,CAAC,EAAE,OAAO,GAAG;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACxE,IAAI,CAAC,EAAE,OAAO,GAAG;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACnC,GAAG,CAAC,EAAE,OAAO,GAAG;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACnC,CAAA;AAED,+DAA+D;AAC/D,MAAM,MAAM,6BAA6B,GAAG;IAC1C,2BAA2B,CAAC,EAAE,MAAM,CAAA;IACpC,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,2BAA2B,CAAC,EAAE,MAAM,CAAA;IACpC,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,2BAA2B,CAAC,EAAE,OAAO,CAAA;IACrC,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAA;IAClC,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAA;IACnC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC/B,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAA;IAChC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,kFAAkF;IAClF,QAAQ,CAAC,EAAE,wBAAwB,CAAA;IACnC,oBAAoB,CAAC,EAAE,2BAA2B,EAAE,CAAA;IACpD,qBAAqB,CAAC,EAAE,2BAA2B,EAAE,CAAA;IACrD,oBAAoB,CAAC,EAAE,6BAA6B,CAAA;CACrD,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type Quaternion, type Vector3 } from 'three';
|
|
2
|
+
import type { ExploreSimpleCharacterRoot } from '../simple-character.js';
|
|
3
|
+
/**
|
|
4
|
+
* Teleport the local character to a world-space pose.
|
|
5
|
+
*
|
|
6
|
+
* Position is written to the character Group directly (its parent is an
|
|
7
|
+
* identity group, so this is effectively world space). Orientation *must* go
|
|
8
|
+
* through the viverse `CharacterCameraBehavior.rotationYaw` — writing the
|
|
9
|
+
* Group's own quaternion has no effect, because viverse derives both input
|
|
10
|
+
* direction (`updateSimpleCharacterVelocity`) and model yaw
|
|
11
|
+
* (`updateSimpleCharacterRotation`) from `state.camera`, which the camera
|
|
12
|
+
* behavior overwrites from `rotationYaw` every frame. See `simple-character.tsx`
|
|
13
|
+
* for the behavior bridge that exposes it.
|
|
14
|
+
*
|
|
15
|
+
* Pitch is deliberately left untouched so a teleport doesn't snap the user's
|
|
16
|
+
* vertical look angle.
|
|
17
|
+
*/
|
|
18
|
+
export declare function applyCharacterPose(character: ExploreSimpleCharacterRoot, position: Vector3, quaternion: Quaternion): void;
|
|
19
|
+
//# sourceMappingURL=character-pose.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"character-pose.d.ts","sourceRoot":"","sources":["../../../explore/characters/character-pose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,UAAU,EAAE,KAAK,OAAO,EAAE,MAAM,OAAO,CAAA;AAC5D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAA;AAYrE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,0BAA0B,EACrC,QAAQ,EAAE,OAAO,EACjB,UAAU,EAAE,UAAU,GACrB,IAAI,CAUN"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Euler as n } from "three";
|
|
2
|
+
const i = Math.PI;
|
|
3
|
+
function p(o, r, a) {
|
|
4
|
+
o.position.copy(r);
|
|
5
|
+
const t = o.viverseCameraBehavior;
|
|
6
|
+
if (!t) return;
|
|
7
|
+
const e = new n().setFromQuaternion(a, "YXZ").y;
|
|
8
|
+
t.rotationYaw = e + i;
|
|
9
|
+
}
|
|
10
|
+
export {
|
|
11
|
+
p as applyCharacterPose
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=character-pose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"character-pose.js","sources":["../../../explore/characters/character-pose.ts"],"sourcesContent":["import { Euler, type Quaternion, type Vector3 } from 'three'\nimport type { ExploreSimpleCharacterRoot } from '../simple-character'\n\n/**\n * Yaw offset between the scene-data convention and viverse's camera yaw.\n *\n * Scene data (`SpawnPoint.yaw`, `ConnectorDef.transform.rotation`) treats +Z as\n * an object's forward, so `yaw = 0` means facing +Z. viverse's `rotationYaw` is\n * the camera's Y rotation and a Three.js camera looks down its local −Z. The\n * two conventions are therefore exactly π apart.\n */\nconst DATA_TO_CAMERA_YAW_OFFSET = Math.PI\n\n/**\n * Teleport the local character to a world-space pose.\n *\n * Position is written to the character Group directly (its parent is an\n * identity group, so this is effectively world space). Orientation *must* go\n * through the viverse `CharacterCameraBehavior.rotationYaw` — writing the\n * Group's own quaternion has no effect, because viverse derives both input\n * direction (`updateSimpleCharacterVelocity`) and model yaw\n * (`updateSimpleCharacterRotation`) from `state.camera`, which the camera\n * behavior overwrites from `rotationYaw` every frame. See `simple-character.tsx`\n * for the behavior bridge that exposes it.\n *\n * Pitch is deliberately left untouched so a teleport doesn't snap the user's\n * vertical look angle.\n */\nexport function applyCharacterPose(\n character: ExploreSimpleCharacterRoot,\n position: Vector3,\n quaternion: Quaternion\n): void {\n character.position.copy(position)\n\n const behavior = character.viverseCameraBehavior\n if (!behavior) return\n\n // Decompose with YXZ so the Y component is the actual screen yaw, independent\n // of any pitch/roll that leaked in from the parent space's matrix.\n const dataYaw = new Euler().setFromQuaternion(quaternion, 'YXZ').y\n behavior.rotationYaw = dataYaw + DATA_TO_CAMERA_YAW_OFFSET\n}\n"],"names":["DATA_TO_CAMERA_YAW_OFFSET","applyCharacterPose","character","position","quaternion","behavior","dataYaw","Euler"],"mappings":";AAWA,MAAMA,IAA4B,KAAK;AAiBhC,SAASC,EACdC,GACAC,GACAC,GACM;AACN,EAAAF,EAAU,SAAS,KAAKC,CAAQ;AAEhC,QAAME,IAAWH,EAAU;AAC3B,MAAI,CAACG,EAAU;AAIf,QAAMC,IAAU,IAAIC,EAAA,EAAQ,kBAAkBH,GAAY,KAAK,EAAE;AACjE,EAAAC,EAAS,cAAcC,IAAUN;AACnC;"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { BvhCharacterPhysicsOptions, VRMHumanBoneName } from '@react-three/viverse';
|
|
2
|
+
import type { Quaternion } from 'three';
|
|
3
|
+
/** viverse `BvhCharacterPhysics` defaults before cave-world size scaling. */
|
|
4
|
+
export declare const VIVERSE_DEFAULT_CAPSULE_RADIUS = 0.3;
|
|
5
|
+
export declare const VIVERSE_DEFAULT_CAPSULE_HEIGHT = 1.7;
|
|
6
|
+
/** Local player visual + capsule size relative to viverse defaults. */
|
|
7
|
+
export declare const LOCAL_CHARACTER_SIZE_SCALE = 0.8;
|
|
8
|
+
export type { VRMHumanBoneName };
|
|
9
|
+
/**
|
|
10
|
+
* GLTF/VRM mesh loaded by viverse `<SimpleCharacter>` in third-person view.
|
|
11
|
+
* Non-VRM joint names must be listed in `boneMap` (see viverse custom-models tutorial).
|
|
12
|
+
*/
|
|
13
|
+
export type LocalCharacterModelConfig = {
|
|
14
|
+
type?: 'gltf' | 'vrm';
|
|
15
|
+
url: string;
|
|
16
|
+
boneMap?: Record<string, VRMHumanBoneName>;
|
|
17
|
+
boneRotationOffset?: Quaternion;
|
|
18
|
+
castShadow?: boolean;
|
|
19
|
+
receiveShadow?: boolean;
|
|
20
|
+
useDraco?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* When true, a logged-in `<Viverse>` context may override `url` with the account VRM.
|
|
23
|
+
* @default false
|
|
24
|
+
*/
|
|
25
|
+
useViverseAvatar?: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* `<SimpleCharacter scale={…}>`, also scales the physics capsule.
|
|
28
|
+
* @default {@link LOCAL_CHARACTER_SIZE_SCALE}
|
|
29
|
+
*/
|
|
30
|
+
scale?: number;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* - `true` (default when omitted): viverse built-in mannequin in third-person.
|
|
34
|
+
* - `false`: no visible body mesh in third-person (first-person always hides the mesh).
|
|
35
|
+
* - `LocalCharacterModelConfig`: custom GLB/VRM from `url`.
|
|
36
|
+
*
|
|
37
|
+
* **Performance:** pass a stable reference (module constant or `useMemo`). Do not
|
|
38
|
+
* inline `createLocalCharacterModelConfig(...)` in JSX on every render.
|
|
39
|
+
*/
|
|
40
|
+
export type LocalCharacterModelProp = LocalCharacterModelConfig | boolean;
|
|
41
|
+
/** @deprecated Prefer {@link LOCAL_CHARACTER_SIZE_SCALE}. */
|
|
42
|
+
export declare const DEFAULT_LOCAL_CHARACTER_SCALE = 0.8;
|
|
43
|
+
/** Build a config once (module scope or `useMemo`); reuse the same object for `CaveExplore`. */
|
|
44
|
+
export declare function createLocalCharacterModelConfig(url: string, options?: Omit<LocalCharacterModelConfig, 'url'>): LocalCharacterModelConfig;
|
|
45
|
+
/** Options passed to viverse `<SimpleCharacter model={…}>`. */
|
|
46
|
+
export type ResolvedSimpleCharacterModel = LocalCharacterModelConfig | boolean | false;
|
|
47
|
+
export declare function resolveSimpleCharacterModel(config: LocalCharacterModelProp | undefined, viewMode: 'first-person' | 'third-person'): ResolvedSimpleCharacterModel;
|
|
48
|
+
export declare function resolveLocalCharacterScale(config: LocalCharacterModelProp | undefined): number;
|
|
49
|
+
export declare function resolveLocalCharacterPhysics(scale: number, options: {
|
|
50
|
+
gravity: number;
|
|
51
|
+
}): Exclude<BvhCharacterPhysicsOptions, boolean>;
|
|
52
|
+
export declare function resolveUseViverseAvatar(config: LocalCharacterModelProp | undefined): boolean;
|
|
53
|
+
//# sourceMappingURL=local-character-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-character-model.d.ts","sourceRoot":"","sources":["../../../explore/characters/local-character-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACxF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAEvC,6EAA6E;AAC7E,eAAO,MAAM,8BAA8B,MAAM,CAAA;AACjD,eAAO,MAAM,8BAA8B,MAAM,CAAA;AAEjD,uEAAuE;AACvE,eAAO,MAAM,0BAA0B,MAAM,CAAA;AAE7C,YAAY,EAAE,gBAAgB,EAAE,CAAA;AAEhC;;;GAGG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;IAC1C,kBAAkB,CAAC,EAAE,UAAU,CAAA;IAC/B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,uBAAuB,GAAG,yBAAyB,GAAG,OAAO,CAAA;AAEzE,6DAA6D;AAC7D,eAAO,MAAM,6BAA6B,MAA6B,CAAA;AAEvE,gGAAgG;AAChG,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,IAAI,CAAC,yBAAyB,EAAE,KAAK,CAAM,GACnD,yBAAyB,CAE3B;AAED,+DAA+D;AAC/D,MAAM,MAAM,4BAA4B,GAAG,yBAAyB,GAAG,OAAO,GAAG,KAAK,CAAA;AAEtF,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,uBAAuB,GAAG,SAAS,EAC3C,QAAQ,EAAE,cAAc,GAAG,cAAc,GACxC,4BAA4B,CAM9B;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,uBAAuB,GAAG,SAAS,GAAG,MAAM,CAK9F;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAC3B,OAAO,CAAC,0BAA0B,EAAE,OAAO,CAAC,CAM9C;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,uBAAuB,GAAG,SAAS,GAAG,OAAO,CAK5F"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const A = 0.3, E = 1.7, l = 0.8, u = 0.8;
|
|
2
|
+
function _(e, r = {}) {
|
|
3
|
+
return { type: "gltf", ...r, url: e };
|
|
4
|
+
}
|
|
5
|
+
function C(e, r) {
|
|
6
|
+
if (r === "first-person") return !1;
|
|
7
|
+
if (e === void 0) return !0;
|
|
8
|
+
if (e === !0 || e === !1) return e;
|
|
9
|
+
const { scale: a, useViverseAvatar: s, ...t } = e;
|
|
10
|
+
return t;
|
|
11
|
+
}
|
|
12
|
+
function L(e) {
|
|
13
|
+
return e != null && typeof e == "object" && e.scale != null ? e.scale : 0.8;
|
|
14
|
+
}
|
|
15
|
+
function n(e, r) {
|
|
16
|
+
return {
|
|
17
|
+
gravity: r.gravity,
|
|
18
|
+
capsuleRadius: 0.3 * e,
|
|
19
|
+
capsuleHeight: 1.7 * e
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function o(e) {
|
|
23
|
+
return e != null && typeof e == "object" ? e.useViverseAvatar ?? !1 : !1;
|
|
24
|
+
}
|
|
25
|
+
export {
|
|
26
|
+
u as DEFAULT_LOCAL_CHARACTER_SCALE,
|
|
27
|
+
l as LOCAL_CHARACTER_SIZE_SCALE,
|
|
28
|
+
E as VIVERSE_DEFAULT_CAPSULE_HEIGHT,
|
|
29
|
+
A as VIVERSE_DEFAULT_CAPSULE_RADIUS,
|
|
30
|
+
_ as createLocalCharacterModelConfig,
|
|
31
|
+
n as resolveLocalCharacterPhysics,
|
|
32
|
+
L as resolveLocalCharacterScale,
|
|
33
|
+
C as resolveSimpleCharacterModel,
|
|
34
|
+
o as resolveUseViverseAvatar
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=local-character-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-character-model.js","sources":["../../../explore/characters/local-character-model.ts"],"sourcesContent":["import type { BvhCharacterPhysicsOptions, VRMHumanBoneName } from '@react-three/viverse'\nimport type { Quaternion } from 'three'\n\n/** viverse `BvhCharacterPhysics` defaults before cave-world size scaling. */\nexport const VIVERSE_DEFAULT_CAPSULE_RADIUS = 0.3\nexport const VIVERSE_DEFAULT_CAPSULE_HEIGHT = 1.7\n\n/** Local player visual + capsule size relative to viverse defaults. */\nexport const LOCAL_CHARACTER_SIZE_SCALE = 0.8\n\nexport type { VRMHumanBoneName }\n\n/**\n * GLTF/VRM mesh loaded by viverse `<SimpleCharacter>` in third-person view.\n * Non-VRM joint names must be listed in `boneMap` (see viverse custom-models tutorial).\n */\nexport type LocalCharacterModelConfig = {\n type?: 'gltf' | 'vrm'\n url: string\n boneMap?: Record<string, VRMHumanBoneName>\n boneRotationOffset?: Quaternion\n castShadow?: boolean\n receiveShadow?: boolean\n useDraco?: boolean\n /**\n * When true, a logged-in `<Viverse>` context may override `url` with the account VRM.\n * @default false\n */\n useViverseAvatar?: boolean\n /**\n * `<SimpleCharacter scale={…}>`, also scales the physics capsule.\n * @default {@link LOCAL_CHARACTER_SIZE_SCALE}\n */\n scale?: number\n}\n\n/**\n * - `true` (default when omitted): viverse built-in mannequin in third-person.\n * - `false`: no visible body mesh in third-person (first-person always hides the mesh).\n * - `LocalCharacterModelConfig`: custom GLB/VRM from `url`.\n *\n * **Performance:** pass a stable reference (module constant or `useMemo`). Do not\n * inline `createLocalCharacterModelConfig(...)` in JSX on every render.\n */\nexport type LocalCharacterModelProp = LocalCharacterModelConfig | boolean\n\n/** @deprecated Prefer {@link LOCAL_CHARACTER_SIZE_SCALE}. */\nexport const DEFAULT_LOCAL_CHARACTER_SCALE = LOCAL_CHARACTER_SIZE_SCALE\n\n/** Build a config once (module scope or `useMemo`); reuse the same object for `CaveExplore`. */\nexport function createLocalCharacterModelConfig(\n url: string,\n options: Omit<LocalCharacterModelConfig, 'url'> = {}\n): LocalCharacterModelConfig {\n return { type: 'gltf', ...options, url }\n}\n\n/** Options passed to viverse `<SimpleCharacter model={…}>`. */\nexport type ResolvedSimpleCharacterModel = LocalCharacterModelConfig | boolean | false\n\nexport function resolveSimpleCharacterModel(\n config: LocalCharacterModelProp | undefined,\n viewMode: 'first-person' | 'third-person'\n): ResolvedSimpleCharacterModel {\n if (viewMode === 'first-person') return false\n if (config === undefined) return true\n if (config === true || config === false) return config\n const { scale: _scale, useViverseAvatar: _useViverseAvatar, ...model } = config\n return model\n}\n\nexport function resolveLocalCharacterScale(config: LocalCharacterModelProp | undefined): number {\n if (config != null && typeof config === 'object' && config.scale != null) {\n return config.scale\n }\n return LOCAL_CHARACTER_SIZE_SCALE\n}\n\nexport function resolveLocalCharacterPhysics(\n scale: number,\n options: { gravity: number }\n): Exclude<BvhCharacterPhysicsOptions, boolean> {\n return {\n gravity: options.gravity,\n capsuleRadius: VIVERSE_DEFAULT_CAPSULE_RADIUS * scale,\n capsuleHeight: VIVERSE_DEFAULT_CAPSULE_HEIGHT * scale\n }\n}\n\nexport function resolveUseViverseAvatar(config: LocalCharacterModelProp | undefined): boolean {\n if (config != null && typeof config === 'object') {\n return config.useViverseAvatar ?? false\n }\n return false\n}\n"],"names":["VIVERSE_DEFAULT_CAPSULE_RADIUS","VIVERSE_DEFAULT_CAPSULE_HEIGHT","LOCAL_CHARACTER_SIZE_SCALE","DEFAULT_LOCAL_CHARACTER_SCALE","createLocalCharacterModelConfig","url","options","resolveSimpleCharacterModel","config","viewMode","_scale","_useViverseAvatar","model","resolveLocalCharacterScale","resolveLocalCharacterPhysics","scale","resolveUseViverseAvatar"],"mappings":"AAIO,MAAMA,IAAiC,KACjCC,IAAiC,KAGjCC,IAA6B,KAuC7BC,IAAgC;AAGtC,SAASC,EACdC,GACAC,IAAkD,IACvB;AAC3B,SAAO,EAAE,MAAM,QAAQ,GAAGA,GAAS,KAAAD,EAAA;AACrC;AAKO,SAASE,EACdC,GACAC,GAC8B;AAC9B,MAAIA,MAAa,eAAgB,QAAO;AACxC,MAAID,MAAW,OAAW,QAAO;AACjC,MAAIA,MAAW,MAAQA,MAAW,GAAO,QAAOA;AAChD,QAAM,EAAE,OAAOE,GAAQ,kBAAkBC,GAAmB,GAAGC,MAAUJ;AACzE,SAAOI;AACT;AAEO,SAASC,EAA2BL,GAAqD;AAC9F,SAAIA,KAAU,QAAQ,OAAOA,KAAW,YAAYA,EAAO,SAAS,OAC3DA,EAAO,QAET;AACT;AAEO,SAASM,EACdC,GACAT,GAC8C;AAC9C,SAAO;AAAA,IACL,SAASA,EAAQ;AAAA,IACjB,eAAe,MAAiCS;AAAA,IAChD,eAAe,MAAiCA;AAAA,EAAA;AAEpD;AAEO,SAASC,EAAwBR,GAAsD;AAC5F,SAAIA,KAAU,QAAQ,OAAOA,KAAW,WAC/BA,EAAO,oBAAoB,KAE7B;AACT;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { VRMHumanBoneName } from '@react-three/viverse';
|
|
2
|
+
/**
|
|
3
|
+
* Mixamo-style joint names without the `mixamorig` prefix, mapped to VRM 1.0 humanoid
|
|
4
|
+
* names for `@react-three/viverse` retargeting.
|
|
5
|
+
*
|
|
6
|
+
* Typical extras on rigs (leave unmapped): `head_end`, `headfront`, finger bones if absent.
|
|
7
|
+
*/
|
|
8
|
+
export declare const MIXAMO_STYLE_BONE_MAP: Record<string, VRMHumanBoneName>;
|
|
9
|
+
//# sourceMappingURL=mixamo-style-bone-map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mixamo-style-bone-map.d.ts","sourceRoot":"","sources":["../../../explore/characters/mixamo-style-bone-map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAE5D;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAuBlE,CAAA"}
|