@xrift/world-components 0.22.1 → 0.23.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 (37) hide show
  1. package/dist/components/DevEnvironment/components/CenterRaycaster.d.ts +6 -0
  2. package/dist/components/DevEnvironment/components/CenterRaycaster.d.ts.map +1 -0
  3. package/dist/components/DevEnvironment/components/CenterRaycaster.js +43 -0
  4. package/dist/components/DevEnvironment/components/CenterRaycaster.js.map +1 -0
  5. package/dist/components/DevEnvironment/components/ControlsHelp.d.ts +2 -0
  6. package/dist/components/DevEnvironment/components/ControlsHelp.d.ts.map +1 -0
  7. package/dist/components/DevEnvironment/components/ControlsHelp.js +32 -0
  8. package/dist/components/DevEnvironment/components/ControlsHelp.js.map +1 -0
  9. package/dist/components/DevEnvironment/components/Crosshair.d.ts +6 -0
  10. package/dist/components/DevEnvironment/components/Crosshair.d.ts.map +1 -0
  11. package/dist/components/DevEnvironment/components/Crosshair.js +41 -0
  12. package/dist/components/DevEnvironment/components/Crosshair.js.map +1 -0
  13. package/dist/components/DevEnvironment/components/PhysicsPlayer.d.ts +9 -0
  14. package/dist/components/DevEnvironment/components/PhysicsPlayer.d.ts.map +1 -0
  15. package/dist/components/DevEnvironment/components/PhysicsPlayer.js +133 -0
  16. package/dist/components/DevEnvironment/components/PhysicsPlayer.js.map +1 -0
  17. package/dist/components/DevEnvironment/components/PointerLockStatus.d.ts +6 -0
  18. package/dist/components/DevEnvironment/components/PointerLockStatus.d.ts.map +1 -0
  19. package/dist/components/DevEnvironment/components/PointerLockStatus.js +50 -0
  20. package/dist/components/DevEnvironment/components/PointerLockStatus.js.map +1 -0
  21. package/dist/components/DevEnvironment/constants.d.ts +21 -0
  22. package/dist/components/DevEnvironment/constants.d.ts.map +1 -0
  23. package/dist/components/DevEnvironment/constants.js +21 -0
  24. package/dist/components/DevEnvironment/constants.js.map +1 -0
  25. package/dist/components/DevEnvironment/index.d.ts +4 -0
  26. package/dist/components/DevEnvironment/index.d.ts.map +1 -0
  27. package/dist/components/DevEnvironment/index.js +42 -0
  28. package/dist/components/DevEnvironment/index.js.map +1 -0
  29. package/dist/components/DevEnvironment/types.d.ts +26 -0
  30. package/dist/components/DevEnvironment/types.d.ts.map +1 -0
  31. package/dist/components/DevEnvironment/types.js +2 -0
  32. package/dist/components/DevEnvironment/types.js.map +1 -0
  33. package/dist/index.d.ts +2 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +1 -0
  36. package/dist/index.js.map +1 -1
  37. package/package.json +6 -1
@@ -0,0 +1,6 @@
1
+ interface Props {
2
+ onHitChange: (hit: boolean) => void;
3
+ }
4
+ export declare function CenterRaycaster({ onHitChange }: Props): null;
5
+ export {};
6
+ //# sourceMappingURL=CenterRaycaster.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CenterRaycaster.d.ts","sourceRoot":"","sources":["../../../../src/components/DevEnvironment/components/CenterRaycaster.tsx"],"names":[],"mappings":"AAMA,UAAU,KAAK;IACb,WAAW,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAA;CACpC;AAID,wBAAgB,eAAe,CAAC,EAAE,WAAW,EAAE,EAAE,KAAK,QA2CrD"}
@@ -0,0 +1,43 @@
1
+ import { useEffect, useRef } from 'react';
2
+ import { useFrame, useThree } from '@react-three/fiber';
3
+ import { Raycaster, Vector2 } from 'three';
4
+ import { LAYERS } from '../../../constants/layers';
5
+ const NDC_CENTER = new Vector2(0, 0);
6
+ export function CenterRaycaster({ onHitChange }) {
7
+ const { camera, scene } = useThree();
8
+ const raycasterRef = useRef(new Raycaster());
9
+ const currentHitRef = useRef(null);
10
+ const wasHitRef = useRef(false);
11
+ useEffect(() => {
12
+ const handleClick = () => {
13
+ let node = currentHitRef.current;
14
+ while (node) {
15
+ const userData = node.userData;
16
+ if (typeof userData.onInteract === 'function') {
17
+ userData.onInteract(userData.id ?? '');
18
+ return;
19
+ }
20
+ node = node.parent;
21
+ }
22
+ };
23
+ window.addEventListener('mousedown', handleClick);
24
+ return () => {
25
+ window.removeEventListener('mousedown', handleClick);
26
+ };
27
+ }, []);
28
+ useFrame(() => {
29
+ const raycaster = raycasterRef.current;
30
+ raycaster.far = 3.5;
31
+ raycaster.layers.set(LAYERS.INTERACTABLE);
32
+ raycaster.setFromCamera(NDC_CENTER, camera);
33
+ const hits = raycaster.intersectObjects(scene.children, true);
34
+ currentHitRef.current = hits.length > 0 ? hits[0].object : null;
35
+ const isHit = currentHitRef.current !== null;
36
+ if (isHit !== wasHitRef.current) {
37
+ wasHitRef.current = isHit;
38
+ onHitChange(isHit);
39
+ }
40
+ });
41
+ return null;
42
+ }
43
+ //# sourceMappingURL=CenterRaycaster.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CenterRaycaster.js","sourceRoot":"","sources":["../../../../src/components/DevEnvironment/components/CenterRaycaster.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAE1C,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAMlD,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAEpC,MAAM,UAAU,eAAe,CAAC,EAAE,WAAW,EAAS;IACpD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,CAAA;IACpC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC,CAAA;IAC5C,MAAM,aAAa,GAAG,MAAM,CAAkB,IAAI,CAAC,CAAA;IACnD,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAE/B,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,WAAW,GAAG,GAAG,EAAE;YACvB,IAAI,IAAI,GAAG,aAAa,CAAC,OAAO,CAAA;YAChC,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,QAGrB,CAAA;gBACD,IAAI,OAAO,QAAQ,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;oBAC9C,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;oBACtC,OAAM;gBACR,CAAC;gBACD,IAAI,GAAG,IAAI,CAAC,MAAM,CAAA;YACpB,CAAC;QACH,CAAC,CAAA;QACD,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;QACjD,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;QACtD,CAAC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,QAAQ,CAAC,GAAG,EAAE;QACZ,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAA;QACtC,SAAS,CAAC,GAAG,GAAG,GAAG,CAAA;QACnB,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;QACzC,SAAS,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;QAC3C,MAAM,IAAI,GAAG,SAAS,CAAC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAC7D,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;QAE/D,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,KAAK,IAAI,CAAA;QAC5C,IAAI,KAAK,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC;YAChC,SAAS,CAAC,OAAO,GAAG,KAAK,CAAA;YACzB,WAAW,CAAC,KAAK,CAAC,CAAA;QACpB,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function ControlsHelp(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ControlsHelp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ControlsHelp.d.ts","sourceRoot":"","sources":["../../../../src/components/DevEnvironment/components/ControlsHelp.tsx"],"names":[],"mappings":"AAgCA,wBAAgB,YAAY,4CAkB3B"}
@@ -0,0 +1,32 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ const containerStyle = {
3
+ position: 'absolute',
4
+ bottom: 16,
5
+ left: 16,
6
+ padding: '10px 14px',
7
+ background: 'rgba(0, 0, 0, 0.55)',
8
+ color: '#fff',
9
+ borderRadius: 8,
10
+ fontSize: 12,
11
+ lineHeight: 1.7,
12
+ pointerEvents: 'none',
13
+ userSelect: 'none',
14
+ fontFamily: 'system-ui, sans-serif',
15
+ backdropFilter: 'blur(4px)',
16
+ };
17
+ const kbdStyle = {
18
+ display: 'inline-block',
19
+ padding: '1px 5px',
20
+ background: 'rgba(255, 255, 255, 0.15)',
21
+ borderRadius: 3,
22
+ fontSize: 11,
23
+ fontFamily: 'inherit',
24
+ marginRight: 2,
25
+ };
26
+ function Kbd({ children }) {
27
+ return _jsx("kbd", { style: kbdStyle, children: children });
28
+ }
29
+ export function ControlsHelp() {
30
+ return (_jsxs("div", { style: containerStyle, children: [_jsxs("div", { children: [_jsx(Kbd, { children: "Click" }), " \u30ED\u30C3\u30AF\u958B\u59CB / \u30A4\u30F3\u30BF\u30E9\u30AF\u30C8"] }), _jsxs("div", { children: [_jsx(Kbd, { children: "W" }), _jsx(Kbd, { children: "A" }), _jsx(Kbd, { children: "S" }), _jsx(Kbd, { children: "D" }), " \u79FB\u52D5"] }), _jsxs("div", { children: [_jsx(Kbd, { children: "Space" }), _jsx(Kbd, { children: "E" }), " \u30B8\u30E3\u30F3\u30D7"] })] }));
31
+ }
32
+ //# sourceMappingURL=ControlsHelp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ControlsHelp.js","sourceRoot":"","sources":["../../../../src/components/DevEnvironment/components/ControlsHelp.tsx"],"names":[],"mappings":";AAEA,MAAM,cAAc,GAAkB;IACpC,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,WAAW;IACpB,UAAU,EAAE,qBAAqB;IACjC,KAAK,EAAE,MAAM;IACb,YAAY,EAAE,CAAC;IACf,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,GAAG;IACf,aAAa,EAAE,MAAM;IACrB,UAAU,EAAE,MAAM;IAClB,UAAU,EAAE,uBAAuB;IACnC,cAAc,EAAE,WAAW;CAC5B,CAAA;AAED,MAAM,QAAQ,GAAkB;IAC9B,OAAO,EAAE,cAAc;IACvB,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,2BAA2B;IACvC,YAAY,EAAE,CAAC;IACf,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,SAAS;IACrB,WAAW,EAAE,CAAC;CACf,CAAA;AAED,SAAS,GAAG,CAAC,EAAE,QAAQ,EAA2B;IAChD,OAAO,cAAK,KAAK,EAAE,QAAQ,YAAG,QAAQ,GAAO,CAAA;AAC/C,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,CACL,eAAK,KAAK,EAAE,cAAc,aACxB,0BACE,KAAC,GAAG,wBAAY,8EACZ,EACN,0BACE,KAAC,GAAG,oBAAQ,EACZ,KAAC,GAAG,oBAAQ,EACZ,KAAC,GAAG,oBAAQ,EACZ,KAAC,GAAG,oBAAQ,qBACR,EACN,0BACE,KAAC,GAAG,wBAAY,EAChB,KAAC,GAAG,oBAAQ,iCACR,IACF,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ interface Props {
2
+ active: boolean;
3
+ }
4
+ export declare function Crosshair({ active }: Props): import("react/jsx-runtime").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=Crosshair.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Crosshair.d.ts","sourceRoot":"","sources":["../../../../src/components/DevEnvironment/components/Crosshair.tsx"],"names":[],"mappings":"AAQA,UAAU,KAAK;IACb,MAAM,EAAE,OAAO,CAAA;CAChB;AAoBD,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,2CAgC1C"}
@@ -0,0 +1,41 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { CROSSHAIR_SIZE, CROSSHAIR_THICKNESS, CROSSHAIR_ACTIVE_THICKNESS, HIGHLIGHT_COLOR, } from '../constants';
3
+ const containerStyle = {
4
+ position: 'absolute',
5
+ top: '50%',
6
+ left: '50%',
7
+ transform: 'translate(-50%, -50%)',
8
+ pointerEvents: 'none',
9
+ zIndex: 100,
10
+ width: CROSSHAIR_SIZE,
11
+ height: CROSSHAIR_SIZE,
12
+ };
13
+ const lineBase = {
14
+ position: 'absolute',
15
+ backgroundColor: 'rgba(255, 255, 255, 0.1)',
16
+ transition: 'background-color 0.2s ease, width 0.15s ease, height 0.15s ease, box-shadow 0.2s ease',
17
+ };
18
+ export function Crosshair({ active }) {
19
+ const color = active ? HIGHLIGHT_COLOR : 'rgba(255, 255, 255, 0.1)';
20
+ const shadow = active ? `0 0 8px ${HIGHLIGHT_COLOR}` : 'none';
21
+ return (_jsxs("div", { style: containerStyle, children: [_jsx("div", { style: {
22
+ ...lineBase,
23
+ top: '50%',
24
+ left: 0,
25
+ width: '100%',
26
+ height: active ? CROSSHAIR_ACTIVE_THICKNESS : CROSSHAIR_THICKNESS,
27
+ transform: 'translateY(-50%)',
28
+ backgroundColor: color,
29
+ boxShadow: shadow,
30
+ } }), _jsx("div", { style: {
31
+ ...lineBase,
32
+ top: 0,
33
+ left: '50%',
34
+ width: active ? CROSSHAIR_ACTIVE_THICKNESS : CROSSHAIR_THICKNESS,
35
+ height: '100%',
36
+ transform: 'translateX(-50%)',
37
+ backgroundColor: color,
38
+ boxShadow: shadow,
39
+ } })] }));
40
+ }
41
+ //# sourceMappingURL=Crosshair.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Crosshair.js","sourceRoot":"","sources":["../../../../src/components/DevEnvironment/components/Crosshair.tsx"],"names":[],"mappings":";AACA,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,cAAc,CAAA;AAMrB,MAAM,cAAc,GAAkB;IACpC,QAAQ,EAAE,UAAU;IACpB,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,KAAK;IACX,SAAS,EAAE,uBAAuB;IAClC,aAAa,EAAE,MAAM;IACrB,MAAM,EAAE,GAAG;IACX,KAAK,EAAE,cAAc;IACrB,MAAM,EAAE,cAAc;CACvB,CAAA;AAED,MAAM,QAAQ,GAAkB;IAC9B,QAAQ,EAAE,UAAU;IACpB,eAAe,EAAE,0BAA0B;IAC3C,UAAU,EACR,uFAAuF;CAC1F,CAAA;AAED,MAAM,UAAU,SAAS,CAAC,EAAE,MAAM,EAAS;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,0BAA0B,CAAA;IACnE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,eAAe,EAAE,CAAC,CAAC,CAAC,MAAM,CAAA;IAE7D,OAAO,CACL,eAAK,KAAK,EAAE,cAAc,aACxB,cACE,KAAK,EAAE;oBACL,GAAG,QAAQ;oBACX,GAAG,EAAE,KAAK;oBACV,IAAI,EAAE,CAAC;oBACP,KAAK,EAAE,MAAM;oBACb,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,mBAAmB;oBACjE,SAAS,EAAE,kBAAkB;oBAC7B,eAAe,EAAE,KAAK;oBACtB,SAAS,EAAE,MAAM;iBAClB,GACD,EACF,cACE,KAAK,EAAE;oBACL,GAAG,QAAQ;oBACX,GAAG,EAAE,CAAC;oBACN,IAAI,EAAE,KAAK;oBACX,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,mBAAmB;oBAChE,MAAM,EAAE,MAAM;oBACd,SAAS,EAAE,kBAAkB;oBAC7B,eAAe,EAAE,KAAK;oBACtB,SAAS,EAAE,MAAM;iBAClB,GACD,IACE,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ interface Props {
2
+ moveSpeed: number;
3
+ spawnPosition: [number, number, number];
4
+ respawnThreshold: number;
5
+ allowInfiniteJump: boolean;
6
+ }
7
+ export declare function PhysicsPlayer({ moveSpeed, spawnPosition, respawnThreshold, allowInfiniteJump, }: Props): import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=PhysicsPlayer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhysicsPlayer.d.ts","sourceRoot":"","sources":["../../../../src/components/DevEnvironment/components/PhysicsPlayer.tsx"],"names":[],"mappings":"AAmBA,UAAU,KAAK;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACvC,gBAAgB,EAAE,MAAM,CAAA;IACxB,iBAAiB,EAAE,OAAO,CAAA;CAC3B;AAID,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,iBAAiB,GAClB,EAAE,KAAK,2CAsLP"}
@@ -0,0 +1,133 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect, useRef } from 'react';
3
+ import { useFrame, useThree } from '@react-three/fiber';
4
+ import { CapsuleCollider, CuboidCollider, RigidBody, } from '@react-three/rapier';
5
+ import { Vector3 } from 'three';
6
+ import { LAYERS } from '../../../constants/layers';
7
+ import { PLAYER_HALF_HEIGHT, PLAYER_RADIUS, JUMP_VELOCITY, LINEAR_DAMPING, CAMERA_Y_OFFSET, } from '../constants';
8
+ const DUMMY_AVATAR_HEIGHT = 1.5;
9
+ export function PhysicsPlayer({ moveSpeed, spawnPosition, respawnThreshold, allowInfiniteJump, }) {
10
+ const rigidBodyRef = useRef(null);
11
+ const avatarGroupRef = useRef(null);
12
+ const headRef = useRef(null);
13
+ const pressedKeysRef = useRef(new Set());
14
+ const isGroundedRef = useRef(false);
15
+ const prevSpaceRef = useRef(false);
16
+ const forwardRef = useRef(new Vector3());
17
+ const rightRef = useRef(new Vector3());
18
+ const { camera } = useThree();
19
+ // アバターを三人称レイヤーに設定(一人称カメラには映らない)
20
+ useEffect(() => {
21
+ avatarGroupRef.current?.traverse((obj) => {
22
+ obj.layers.set(LAYERS.THIRD_PERSON_ONLY);
23
+ });
24
+ }, []);
25
+ useEffect(() => {
26
+ const shouldHandle = (event) => {
27
+ if (event.isComposing)
28
+ return false;
29
+ const target = event.target;
30
+ if (target.tagName === 'INPUT' ||
31
+ target.tagName === 'TEXTAREA' ||
32
+ target.isContentEditable)
33
+ return false;
34
+ return true;
35
+ };
36
+ const handleKeyDown = (event) => {
37
+ if (!shouldHandle(event))
38
+ return;
39
+ const code = event.code;
40
+ if (!pressedKeysRef.current.has(code)) {
41
+ pressedKeysRef.current.add(code);
42
+ }
43
+ if (event.key) {
44
+ pressedKeysRef.current.add(event.key);
45
+ }
46
+ event.preventDefault();
47
+ event.stopPropagation();
48
+ event.stopImmediatePropagation();
49
+ };
50
+ const handleKeyUp = (event) => {
51
+ if (!shouldHandle(event))
52
+ return;
53
+ pressedKeysRef.current.delete(event.code);
54
+ if (event.key) {
55
+ pressedKeysRef.current.delete(event.key);
56
+ }
57
+ event.preventDefault();
58
+ event.stopPropagation();
59
+ event.stopImmediatePropagation();
60
+ };
61
+ const options = { passive: false, capture: true };
62
+ window.addEventListener('keydown', handleKeyDown, options);
63
+ window.addEventListener('keyup', handleKeyUp, options);
64
+ return () => {
65
+ window.removeEventListener('keydown', handleKeyDown, options);
66
+ window.removeEventListener('keyup', handleKeyUp, options);
67
+ };
68
+ }, []);
69
+ useFrame(() => {
70
+ const rb = rigidBodyRef.current;
71
+ if (!rb)
72
+ return;
73
+ const keys = pressedKeysRef.current;
74
+ // --- 移動ベクトル算出 ---
75
+ const fwd = (keys.has('KeyW') || keys.has('w') || keys.has('ArrowUp') ? 1 : 0) +
76
+ (keys.has('KeyS') || keys.has('s') || keys.has('ArrowDown') ? -1 : 0);
77
+ const strafe = (keys.has('KeyD') || keys.has('d') || keys.has('ArrowRight') ? 1 : 0) +
78
+ (keys.has('KeyA') || keys.has('a') || keys.has('ArrowLeft') ? -1 : 0);
79
+ camera.getWorldDirection(forwardRef.current);
80
+ forwardRef.current.y = 0;
81
+ forwardRef.current.normalize();
82
+ rightRef.current.crossVectors(forwardRef.current, camera.up).normalize();
83
+ let moveX = forwardRef.current.x * fwd + rightRef.current.x * strafe;
84
+ let moveZ = forwardRef.current.z * fwd + rightRef.current.z * strafe;
85
+ const len = Math.sqrt(moveX * moveX + moveZ * moveZ);
86
+ if (len > 0) {
87
+ moveX = (moveX / len) * moveSpeed;
88
+ moveZ = (moveZ / len) * moveSpeed;
89
+ }
90
+ // --- ジャンプ ---
91
+ const currentVel = rb.linvel();
92
+ const spacePressed = keys.has('Space') || keys.has(' ') || keys.has('KeyE') || keys.has('e');
93
+ let vy = currentVel.y;
94
+ if (allowInfiniteJump) {
95
+ if (spacePressed) {
96
+ vy = JUMP_VELOCITY;
97
+ }
98
+ }
99
+ else {
100
+ const spaceEdge = spacePressed && !prevSpaceRef.current;
101
+ if (spaceEdge && isGroundedRef.current) {
102
+ vy = JUMP_VELOCITY;
103
+ }
104
+ }
105
+ prevSpaceRef.current = spacePressed;
106
+ rb.setLinvel({ x: moveX, y: vy, z: moveZ }, true);
107
+ // --- カメラ位置同期 ---
108
+ const pos = rb.translation();
109
+ camera.position.set(pos.x, pos.y + CAMERA_Y_OFFSET, pos.z);
110
+ // --- DummyAvatar 位置同期 ---
111
+ if (avatarGroupRef.current) {
112
+ avatarGroupRef.current.position.set(pos.x, pos.y + CAMERA_Y_OFFSET, pos.z);
113
+ camera.getWorldDirection(forwardRef.current);
114
+ const yaw = -Math.atan2(forwardRef.current.x, -forwardRef.current.z);
115
+ const pitch = Math.asin(forwardRef.current.y);
116
+ avatarGroupRef.current.rotation.set(0, yaw, 0);
117
+ if (headRef.current) {
118
+ headRef.current.rotation.set(pitch, 0, 0);
119
+ }
120
+ }
121
+ // --- リスポーン ---
122
+ if (pos.y < respawnThreshold) {
123
+ rb.setTranslation({ x: spawnPosition[0], y: spawnPosition[1], z: spawnPosition[2] }, true);
124
+ rb.setLinvel({ x: 0, y: 0, z: 0 }, true);
125
+ }
126
+ });
127
+ return (_jsxs(_Fragment, { children: [_jsxs(RigidBody, { ref: rigidBodyRef, type: "dynamic", position: spawnPosition, lockRotations: true, friction: 0, restitution: 0, linearDamping: LINEAR_DAMPING, enabledRotations: [false, false, false], children: [_jsx(CapsuleCollider, { args: [PLAYER_HALF_HEIGHT, PLAYER_RADIUS] }), _jsx(CuboidCollider, { args: [PLAYER_RADIUS * 0.9, 0.05, PLAYER_RADIUS * 0.9], position: [0, -(PLAYER_HALF_HEIGHT + PLAYER_RADIUS), 0], sensor: true, onIntersectionEnter: () => {
128
+ isGroundedRef.current = true;
129
+ }, onIntersectionExit: () => {
130
+ isGroundedRef.current = false;
131
+ } })] }), _jsxs("group", { ref: avatarGroupRef, children: [_jsxs("mesh", { castShadow: true, ref: headRef, children: [_jsx("boxGeometry", { args: [0.2, 0.1, 0.2] }), _jsx("meshLambertMaterial", { color: "#ffcccc" })] }), _jsxs("mesh", { castShadow: true, position: [0, -DUMMY_AVATAR_HEIGHT * 0.55, 0], children: [_jsx("boxGeometry", { args: [0.3, DUMMY_AVATAR_HEIGHT, 0.1] }), _jsx("meshLambertMaterial", { color: "#ccffcc" })] })] })] }));
132
+ }
133
+ //# sourceMappingURL=PhysicsPlayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhysicsPlayer.js","sourceRoot":"","sources":["../../../../src/components/DevEnvironment/components/PhysicsPlayer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface Props {
2
+ isLocked: boolean;
3
+ }
4
+ export declare function PointerLockStatus({ isLocked }: Props): import("react/jsx-runtime").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=PointerLockStatus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PointerLockStatus.d.ts","sourceRoot":"","sources":["../../../../src/components/DevEnvironment/components/PointerLockStatus.tsx"],"names":[],"mappings":"AAEA,UAAU,KAAK;IACb,QAAQ,EAAE,OAAO,CAAA;CAClB;AAiDD,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,2CAwBpD"}
@@ -0,0 +1,50 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ const containerStyle = {
3
+ position: 'absolute',
4
+ top: 20,
5
+ left: '50%',
6
+ transform: 'translateX(-50%)',
7
+ zIndex: 1001,
8
+ pointerEvents: 'none',
9
+ };
10
+ const statusBase = {
11
+ display: 'flex',
12
+ alignItems: 'center',
13
+ gap: 8,
14
+ padding: '8px 12px',
15
+ borderRadius: 6,
16
+ fontSize: 12,
17
+ border: '1px solid rgba(255, 255, 255, 0.1)',
18
+ transition: 'all 0.3s ease',
19
+ whiteSpace: 'nowrap',
20
+ fontFamily: 'system-ui, sans-serif',
21
+ fontWeight: 500,
22
+ };
23
+ const kbdStyle = {
24
+ display: 'inline-block',
25
+ padding: '2px 6px',
26
+ background: 'rgba(255, 255, 255, 0.1)',
27
+ border: '1px solid rgba(255, 255, 255, 0.2)',
28
+ borderRadius: 3,
29
+ fontFamily: 'monospace',
30
+ fontSize: 11,
31
+ fontWeight: 'bold',
32
+ margin: '0 2px',
33
+ };
34
+ const lockedStyle = {
35
+ background: 'rgba(34, 197, 94, 0.25)',
36
+ color: '#22c55e',
37
+ borderColor: 'rgba(34, 197, 94, 0.3)',
38
+ };
39
+ const unlockedStyle = {
40
+ background: 'rgba(249, 115, 22, 0.25)',
41
+ color: '#f97316',
42
+ borderColor: 'rgba(249, 115, 22, 0.3)',
43
+ };
44
+ export function PointerLockStatus({ isLocked }) {
45
+ return (_jsx("div", { style: containerStyle, children: _jsxs("div", { style: {
46
+ ...statusBase,
47
+ ...(isLocked ? lockedStyle : unlockedStyle),
48
+ }, children: [_jsx("span", { style: { fontSize: 14 }, children: isLocked ? '\u{1F512}' : '\u{1F5B1}\uFE0F' }), _jsx("span", { children: isLocked ? (_jsxs(_Fragment, { children: ["\u30DE\u30A6\u30B9\u30ED\u30C3\u30AF\u4E2D - ", _jsx("kbd", { style: kbdStyle, children: "ESC" }), "\u3067\u89E3\u9664"] })) : ('画面をクリックしてマウスロック開始') })] }) }));
49
+ }
50
+ //# sourceMappingURL=PointerLockStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PointerLockStatus.js","sourceRoot":"","sources":["../../../../src/components/DevEnvironment/components/PointerLockStatus.tsx"],"names":[],"mappings":";AAMA,MAAM,cAAc,GAAkB;IACpC,QAAQ,EAAE,UAAU;IACpB,GAAG,EAAE,EAAE;IACP,IAAI,EAAE,KAAK;IACX,SAAS,EAAE,kBAAkB;IAC7B,MAAM,EAAE,IAAI;IACZ,aAAa,EAAE,MAAM;CACtB,CAAA;AAED,MAAM,UAAU,GAAkB;IAChC,OAAO,EAAE,MAAM;IACf,UAAU,EAAE,QAAQ;IACpB,GAAG,EAAE,CAAC;IACN,OAAO,EAAE,UAAU;IACnB,YAAY,EAAE,CAAC;IACf,QAAQ,EAAE,EAAE;IACZ,MAAM,EAAE,oCAAoC;IAC5C,UAAU,EAAE,eAAe;IAC3B,UAAU,EAAE,QAAQ;IACpB,UAAU,EAAE,uBAAuB;IACnC,UAAU,EAAE,GAAG;CAChB,CAAA;AAED,MAAM,QAAQ,GAAkB;IAC9B,OAAO,EAAE,cAAc;IACvB,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,0BAA0B;IACtC,MAAM,EAAE,oCAAoC;IAC5C,YAAY,EAAE,CAAC;IACf,UAAU,EAAE,WAAW;IACvB,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE,OAAO;CAChB,CAAA;AAED,MAAM,WAAW,GAAkB;IACjC,UAAU,EAAE,yBAAyB;IACrC,KAAK,EAAE,SAAS;IAChB,WAAW,EAAE,wBAAwB;CACtC,CAAA;AAED,MAAM,aAAa,GAAkB;IACnC,UAAU,EAAE,0BAA0B;IACtC,KAAK,EAAE,SAAS;IAChB,WAAW,EAAE,yBAAyB;CACvC,CAAA;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAE,QAAQ,EAAS;IACnD,OAAO,CACL,cAAK,KAAK,EAAE,cAAc,YACxB,eACE,KAAK,EAAE;gBACL,GAAG,UAAU;gBACb,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC;aAC5C,aAED,eAAM,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,YAC1B,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB,GACtC,EACP,yBACG,QAAQ,CAAC,CAAC,CAAC,CACV,+EACY,cAAK,KAAK,EAAE,QAAQ,oBAAW,0BACxC,CACJ,CAAC,CAAC,CAAC,CACF,mBAAmB,CACpB,GACI,IACH,GACF,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * 物理定数(xrift-frontend 準拠)
3
+ */
4
+ export declare const PLAYER_HALF_HEIGHT = 0.4;
5
+ export declare const PLAYER_RADIUS = 0.4;
6
+ export declare const MOVE_SPEED = 5;
7
+ export declare const JUMP_VELOCITY = 4.5;
8
+ export declare const LINEAR_DAMPING = 0.2;
9
+ export declare const CAMERA_Y_OFFSET = 0.64;
10
+ export declare const RESPAWN_Y_THRESHOLD = -10;
11
+ export declare const DEFAULT_SPAWN_POSITION: [number, number, number];
12
+ export declare const DEFAULT_GRAVITY = 9.81;
13
+ export declare const DEFAULT_ALLOW_INFINITE_JUMP = true;
14
+ /**
15
+ * クロスヘアスタイル定数
16
+ */
17
+ export declare const CROSSHAIR_SIZE = 20;
18
+ export declare const CROSSHAIR_THICKNESS = 2;
19
+ export declare const CROSSHAIR_ACTIVE_THICKNESS = 3;
20
+ export declare const HIGHLIGHT_COLOR = "#4dabf7";
21
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/components/DevEnvironment/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,kBAAkB,MAAM,CAAA;AACrC,eAAO,MAAM,aAAa,MAAM,CAAA;AAChC,eAAO,MAAM,UAAU,IAAM,CAAA;AAC7B,eAAO,MAAM,aAAa,MAAM,CAAA;AAChC,eAAO,MAAM,cAAc,MAAM,CAAA;AACjC,eAAO,MAAM,eAAe,OAAO,CAAA;AACnC,eAAO,MAAM,mBAAmB,MAAM,CAAA;AACtC,eAAO,MAAM,sBAAsB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAqB,CAAA;AACjF,eAAO,MAAM,eAAe,OAAO,CAAA;AACnC,eAAO,MAAM,2BAA2B,OAAO,CAAA;AAE/C;;GAEG;AACH,eAAO,MAAM,cAAc,KAAK,CAAA;AAChC,eAAO,MAAM,mBAAmB,IAAI,CAAA;AACpC,eAAO,MAAM,0BAA0B,IAAI,CAAA;AAC3C,eAAO,MAAM,eAAe,YAAY,CAAA"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * 物理定数(xrift-frontend 準拠)
3
+ */
4
+ export const PLAYER_HALF_HEIGHT = 0.4;
5
+ export const PLAYER_RADIUS = 0.4;
6
+ export const MOVE_SPEED = 5.0;
7
+ export const JUMP_VELOCITY = 4.5;
8
+ export const LINEAR_DAMPING = 0.2;
9
+ export const CAMERA_Y_OFFSET = 0.64;
10
+ export const RESPAWN_Y_THRESHOLD = -10;
11
+ export const DEFAULT_SPAWN_POSITION = [0.11, 1.6, 7.59];
12
+ export const DEFAULT_GRAVITY = 9.81;
13
+ export const DEFAULT_ALLOW_INFINITE_JUMP = true;
14
+ /**
15
+ * クロスヘアスタイル定数
16
+ */
17
+ export const CROSSHAIR_SIZE = 20;
18
+ export const CROSSHAIR_THICKNESS = 2;
19
+ export const CROSSHAIR_ACTIVE_THICKNESS = 3;
20
+ export const HIGHLIGHT_COLOR = '#4dabf7';
21
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/components/DevEnvironment/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAA;AACrC,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAA;AAChC,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,CAAA;AAC7B,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAA;AAChC,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAA;AACjC,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAA;AACnC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAAE,CAAA;AACtC,MAAM,CAAC,MAAM,sBAAsB,GAA6B,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;AACjF,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAA;AACnC,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAA;AAE/C;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAA;AAChC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAA;AACpC,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAA;AAC3C,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { Props } from './types';
2
+ export type DevEnvironmentProps = Props;
3
+ export declare function DevEnvironment({ children, camera, moveSpeed, shadows, spawnPosition, respawnThreshold, physicsConfig, }: Props): import("react/jsx-runtime").JSX.Element;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/DevEnvironment/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAcpC,MAAM,MAAM,mBAAmB,GAAG,KAAK,CAAA;AAQvC,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,MAAM,EACN,SAAsB,EACtB,OAAc,EACd,aAAsC,EACtC,gBAAsC,EACtC,aAAa,GACd,EAAE,KAAK,2CAmDP"}
@@ -0,0 +1,42 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useState } from 'react';
3
+ import { Canvas } from '@react-three/fiber';
4
+ import { PointerLockControls } from '@react-three/drei';
5
+ import { Physics } from '@react-three/rapier';
6
+ import { PCFShadowMap } from 'three';
7
+ import { DEFAULT_SPAWN_POSITION, DEFAULT_GRAVITY, DEFAULT_ALLOW_INFINITE_JUMP, MOVE_SPEED, RESPAWN_Y_THRESHOLD, } from './constants';
8
+ import { PhysicsPlayer } from './components/PhysicsPlayer';
9
+ import { CenterRaycaster } from './components/CenterRaycaster';
10
+ import { Crosshair } from './components/Crosshair';
11
+ import { PointerLockStatus } from './components/PointerLockStatus';
12
+ import { ControlsHelp } from './components/ControlsHelp';
13
+ const containerStyle = {
14
+ width: '100vw',
15
+ height: '100vh',
16
+ position: 'relative',
17
+ };
18
+ export function DevEnvironment({ children, camera, moveSpeed = MOVE_SPEED, shadows = true, spawnPosition = DEFAULT_SPAWN_POSITION, respawnThreshold = RESPAWN_Y_THRESHOLD, physicsConfig, }) {
19
+ const [isHit, setIsHit] = useState(false);
20
+ const [isPointerLocked, setIsPointerLocked] = useState(false);
21
+ const handleHitChange = useCallback((hit) => setIsHit(hit), []);
22
+ const gravity = physicsConfig?.gravity ?? DEFAULT_GRAVITY;
23
+ const allowInfiniteJump = physicsConfig?.allowInfiniteJump ?? DEFAULT_ALLOW_INFINITE_JUMP;
24
+ const cameraPosition = camera?.position ?? spawnPosition;
25
+ const cameraFov = camera?.fov ?? 50;
26
+ useEffect(() => {
27
+ const handleChange = () => {
28
+ setIsPointerLocked(document.pointerLockElement !== null);
29
+ };
30
+ document.addEventListener('pointerlockchange', handleChange);
31
+ return () => {
32
+ document.removeEventListener('pointerlockchange', handleChange);
33
+ };
34
+ }, []);
35
+ return (_jsxs("div", { style: containerStyle, children: [_jsxs(Canvas, { shadows: shadows ? { type: PCFShadowMap } : false, camera: {
36
+ position: cameraPosition,
37
+ fov: cameraFov,
38
+ near: 0.01,
39
+ far: 1000,
40
+ }, gl: { preserveDrawingBuffer: true }, children: [_jsx(PointerLockControls, {}), _jsx(CenterRaycaster, { onHitChange: handleHitChange }), _jsxs(Physics, { gravity: [0, -gravity, 0], timeStep: "vary", children: [_jsx(PhysicsPlayer, { moveSpeed: moveSpeed, spawnPosition: spawnPosition, respawnThreshold: respawnThreshold, allowInfiniteJump: allowInfiniteJump }), children] })] }), _jsx(Crosshair, { active: isHit }), _jsx(PointerLockStatus, { isLocked: isPointerLocked }), _jsx(ControlsHelp, {})] }));
41
+ }
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/DevEnvironment/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAA;AAEpC,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,2BAA2B,EAC3B,UAAU,EACV,mBAAmB,GACpB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAIxD,MAAM,cAAc,GAAwB;IAC1C,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,OAAO;IACf,QAAQ,EAAE,UAAU;CACrB,CAAA;AAED,MAAM,UAAU,cAAc,CAAC,EAC7B,QAAQ,EACR,MAAM,EACN,SAAS,GAAG,UAAU,EACtB,OAAO,GAAG,IAAI,EACd,aAAa,GAAG,sBAAsB,EACtC,gBAAgB,GAAG,mBAAmB,EACtC,aAAa,GACP;IACN,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACzC,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC7D,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,GAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAA;IAExE,MAAM,OAAO,GAAG,aAAa,EAAE,OAAO,IAAI,eAAe,CAAA;IACzD,MAAM,iBAAiB,GACrB,aAAa,EAAE,iBAAiB,IAAI,2BAA2B,CAAA;IAEjE,MAAM,cAAc,GAAG,MAAM,EAAE,QAAQ,IAAI,aAAa,CAAA;IACxD,MAAM,SAAS,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,CAAA;IAEnC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,YAAY,GAAG,GAAG,EAAE;YACxB,kBAAkB,CAAC,QAAQ,CAAC,kBAAkB,KAAK,IAAI,CAAC,CAAA;QAC1D,CAAC,CAAA;QACD,QAAQ,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAA;QAC5D,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAA;QACjE,CAAC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,CACL,eAAK,KAAK,EAAE,cAAc,aACxB,MAAC,MAAM,IACL,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,EACjD,MAAM,EAAE;oBACN,QAAQ,EAAE,cAAc;oBACxB,GAAG,EAAE,SAAS;oBACd,IAAI,EAAE,IAAI;oBACV,GAAG,EAAE,IAAI;iBACV,EACD,EAAE,EAAE,EAAE,qBAAqB,EAAE,IAAI,EAAE,aAEnC,KAAC,mBAAmB,KAAG,EACvB,KAAC,eAAe,IAAC,WAAW,EAAE,eAAe,GAAI,EACjD,MAAC,OAAO,IAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAC,MAAM,aACjD,KAAC,aAAa,IACZ,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,gBAAgB,EAClC,iBAAiB,EAAE,iBAAiB,GACpC,EACD,QAAQ,IACD,IACH,EACT,KAAC,SAAS,IAAC,MAAM,EAAE,KAAK,GAAI,EAC5B,KAAC,iBAAiB,IAAC,QAAQ,EAAE,eAAe,GAAI,EAChD,KAAC,YAAY,KAAG,IACZ,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface PhysicsConfig {
3
+ /** 重力加速度(デフォルト: 9.81) */
4
+ gravity?: number;
5
+ /** 無限ジャンプを許可するか(デフォルト: true) */
6
+ allowInfiniteJump?: boolean;
7
+ }
8
+ export interface Props {
9
+ children: ReactNode;
10
+ /** カメラ設定 */
11
+ camera?: {
12
+ position?: [number, number, number];
13
+ fov?: number;
14
+ };
15
+ /** 移動速度(デフォルト: 5.0) */
16
+ moveSpeed?: number;
17
+ /** シャドウを有効にするか(デフォルト: true) */
18
+ shadows?: boolean;
19
+ /** スポーン位置(デフォルト: [0.11, 1.6, 7.59]) */
20
+ spawnPosition?: [number, number, number];
21
+ /** リスポーンの高さ閾値(デフォルト: -10) */
22
+ respawnThreshold?: number;
23
+ /** 物理設定 */
24
+ physicsConfig?: PhysicsConfig;
25
+ }
26
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/DevEnvironment/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,MAAM,WAAW,aAAa;IAC5B,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gCAAgC;IAChC,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAC5B;AAED,MAAM,WAAW,KAAK;IACpB,QAAQ,EAAE,SAAS,CAAA;IACnB,YAAY;IACZ,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9D,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,uCAAuC;IACvC,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACxC,6BAA6B;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,WAAW;IACX,aAAa,CAAC,EAAE,aAAa,CAAA;CAC9B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/components/DevEnvironment/types.ts"],"names":[],"mappings":""}
package/dist/index.d.ts CHANGED
@@ -15,6 +15,8 @@ export { SpawnPoint, type SpawnPointProps, } from './components/SpawnPoint';
15
15
  export { TextInput, type TextInputProps, } from './components/TextInput';
16
16
  export { TagBoard, type TagBoardProps, type Tag, } from './components/TagBoard';
17
17
  export { Video180Sphere, type Video180SphereProps, } from './components/Video180Sphere';
18
+ export { DevEnvironment, type DevEnvironmentProps, } from './components/DevEnvironment';
19
+ export { type PhysicsConfig } from './components/DevEnvironment/types';
18
20
  export { useInstanceState } from './hooks/useInstanceState';
19
21
  export { useSpawnPoint } from './hooks/useSpawnPoint';
20
22
  export { useWebAudioVolume } from './hooks/useWebAudioVolume';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,KAAK,iBAAiB,GACvB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,KAAK,yBAAyB,GAC/B,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,uBAAuB,GAC7B,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,KAAK,UAAU,IAAI,cAAc,EACjC,KAAK,sBAAsB,GAC5B,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,KAAK,IAAI,EACT,KAAK,iBAAiB,GACvB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oCAAoC,EACpC,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,GACtB,MAAM,6BAA6B,CAAA;AAGpC,OAAO,EACL,YAAY,EACZ,KAAK,iBAAiB,GACvB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EACL,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,UAAU,GAChB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAE7E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAE9D,OAAO,EACL,kBAAkB,EAClB,KAAK,uBAAuB,GAC7B,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,UAAU,EACV,KAAK,eAAe,GACrB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,SAAS,EACT,KAAK,cAAc,GACpB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EACL,QAAQ,EACR,KAAK,aAAa,EAClB,KAAK,GAAG,GACT,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,GACzB,MAAM,6BAA6B,CAAA;AAGpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAG7D,OAAO,EAAE,MAAM,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAG7E,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,KAAK,iBAAiB,GACvB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,KAAK,yBAAyB,GAC/B,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,uBAAuB,GAC7B,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,KAAK,UAAU,IAAI,cAAc,EACjC,KAAK,sBAAsB,GAC5B,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,KAAK,IAAI,EACT,KAAK,iBAAiB,GACvB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oCAAoC,EACpC,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,GACtB,MAAM,6BAA6B,CAAA;AAGpC,OAAO,EACL,YAAY,EACZ,KAAK,iBAAiB,GACvB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EACL,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,UAAU,GAChB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAE7E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAE9D,OAAO,EACL,kBAAkB,EAClB,KAAK,uBAAuB,GAC7B,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,UAAU,EACV,KAAK,eAAe,GACrB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,SAAS,EACT,KAAK,cAAc,GACpB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EACL,QAAQ,EACR,KAAK,aAAa,EAClB,KAAK,GAAG,GACT,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,GACzB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,GACzB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,mCAAmC,CAAA;AAGtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAG7D,OAAO,EAAE,MAAM,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAG7E,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,kBAAkB,CAAA"}
package/dist/index.js CHANGED
@@ -17,6 +17,7 @@ export { SpawnPoint, } from './components/SpawnPoint';
17
17
  export { TextInput, } from './components/TextInput';
18
18
  export { TagBoard, } from './components/TagBoard';
19
19
  export { Video180Sphere, } from './components/Video180Sphere';
20
+ export { DevEnvironment, } from './components/DevEnvironment';
20
21
  // Hooks
21
22
  export { useInstanceState } from './hooks/useInstanceState';
22
23
  export { useSpawnPoint } from './hooks/useSpawnPoint';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,GAET,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,oBAAoB,EACpB,uBAAuB,GAExB,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,GAEtB,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,GAGrB,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,GAGT,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oCAAoC,GAGrC,MAAM,6BAA6B,CAAA;AAEpC,aAAa;AACb,OAAO,EACL,YAAY,GAEb,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EACL,WAAW,GAGZ,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,WAAW,EAAyB,MAAM,0BAA0B,CAAA;AAE7E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAE9D,OAAO,EACL,kBAAkB,GAEnB,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,UAAU,GAEX,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,SAAS,GAEV,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EACL,QAAQ,GAGT,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACL,cAAc,GAEf,MAAM,6BAA6B,CAAA;AAEpC,QAAQ;AACR,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAE7D,YAAY;AACZ,OAAO,EAAE,MAAM,EAAoC,MAAM,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,GAET,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,oBAAoB,EACpB,uBAAuB,GAExB,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,GAEtB,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,GAGrB,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,GAGT,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oCAAoC,GAGrC,MAAM,6BAA6B,CAAA;AAEpC,aAAa;AACb,OAAO,EACL,YAAY,GAEb,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EACL,WAAW,GAGZ,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,WAAW,EAAyB,MAAM,0BAA0B,CAAA;AAE7E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAE9D,OAAO,EACL,kBAAkB,GAEnB,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,UAAU,GAEX,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,SAAS,GAEV,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EACL,QAAQ,GAGT,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACL,cAAc,GAEf,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,cAAc,GAEf,MAAM,6BAA6B,CAAA;AAIpC,QAAQ;AACR,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAE7D,YAAY;AACZ,OAAO,EAAE,MAAM,EAAoC,MAAM,oBAAoB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xrift/world-components",
3
- "version": "0.22.1",
3
+ "version": "0.23.0",
4
4
  "description": "Shared components and utilities for Xrift worlds",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -33,11 +33,15 @@
33
33
  "peerDependencies": {
34
34
  "@react-three/drei": "^10.0.0",
35
35
  "@react-three/fiber": "^9.0.0",
36
+ "@react-three/rapier": "^1.0.0",
36
37
  "hls.js": "^1.5.0",
37
38
  "react": "^18.0.0 || ^19.0.0",
38
39
  "three": ">=0.176.0"
39
40
  },
40
41
  "peerDependenciesMeta": {
42
+ "@react-three/rapier": {
43
+ "optional": true
44
+ },
41
45
  "hls.js": {
42
46
  "optional": true
43
47
  }
@@ -45,6 +49,7 @@
45
49
  "devDependencies": {
46
50
  "@react-three/drei": "^10.7.6",
47
51
  "@react-three/fiber": "^9.4.0",
52
+ "@react-three/rapier": "^2.2.0",
48
53
  "@types/react": "^18.3.12",
49
54
  "@types/three": "^0.181.0",
50
55
  "jsdom": "^28.0.0",