@xrift/world-components 0.26.1 → 0.28.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 (101) hide show
  1. package/dist/components/Portal/__tests__/utils.test.d.ts +2 -0
  2. package/dist/components/Portal/__tests__/utils.test.d.ts.map +1 -0
  3. package/dist/components/Portal/__tests__/utils.test.js +56 -0
  4. package/dist/components/Portal/__tests__/utils.test.js.map +1 -0
  5. package/dist/components/Portal/components/PortalGlow/index.d.ts +7 -0
  6. package/dist/components/Portal/components/PortalGlow/index.d.ts.map +1 -0
  7. package/dist/components/Portal/components/PortalGlow/index.js +64 -0
  8. package/dist/components/Portal/components/PortalGlow/index.js.map +1 -0
  9. package/dist/components/Portal/components/PortalParticles/index.d.ts +9 -0
  10. package/dist/components/Portal/components/PortalParticles/index.d.ts.map +1 -0
  11. package/dist/components/Portal/components/PortalParticles/index.js +110 -0
  12. package/dist/components/Portal/components/PortalParticles/index.js.map +1 -0
  13. package/dist/components/Portal/components/PortalPedestal/index.d.ts +6 -0
  14. package/dist/components/Portal/components/PortalPedestal/index.d.ts.map +1 -0
  15. package/dist/components/Portal/components/PortalPedestal/index.js +57 -0
  16. package/dist/components/Portal/components/PortalPedestal/index.js.map +1 -0
  17. package/dist/components/Portal/components/PortalThumbnail/index.d.ts +7 -0
  18. package/dist/components/Portal/components/PortalThumbnail/index.d.ts.map +1 -0
  19. package/dist/components/Portal/components/PortalThumbnail/index.js +130 -0
  20. package/dist/components/Portal/components/PortalThumbnail/index.js.map +1 -0
  21. package/dist/components/Portal/components/PortalVortex/index.d.ts +10 -0
  22. package/dist/components/Portal/components/PortalVortex/index.d.ts.map +1 -0
  23. package/dist/components/Portal/components/PortalVortex/index.js +41 -0
  24. package/dist/components/Portal/components/PortalVortex/index.js.map +1 -0
  25. package/dist/components/Portal/constants.d.ts +11 -0
  26. package/dist/components/Portal/constants.d.ts.map +1 -0
  27. package/dist/components/Portal/constants.js +10 -0
  28. package/dist/components/Portal/constants.js.map +1 -0
  29. package/dist/components/Portal/hooks.d.ts +10 -0
  30. package/dist/components/Portal/hooks.d.ts.map +1 -0
  31. package/dist/components/Portal/hooks.js +13 -0
  32. package/dist/components/Portal/hooks.js.map +1 -0
  33. package/dist/components/Portal/index.d.ts +4 -0
  34. package/dist/components/Portal/index.d.ts.map +1 -0
  35. package/dist/components/Portal/index.js +22 -0
  36. package/dist/components/Portal/index.js.map +1 -0
  37. package/dist/components/Portal/shaders/noise.d.ts +2 -0
  38. package/dist/components/Portal/shaders/noise.d.ts.map +1 -0
  39. package/dist/components/Portal/shaders/noise.js +82 -0
  40. package/dist/components/Portal/shaders/noise.js.map +1 -0
  41. package/dist/components/Portal/shaders/portalFragment.d.ts +2 -0
  42. package/dist/components/Portal/shaders/portalFragment.d.ts.map +1 -0
  43. package/dist/components/Portal/shaders/portalFragment.js +45 -0
  44. package/dist/components/Portal/shaders/portalFragment.js.map +1 -0
  45. package/dist/components/Portal/shaders/portalVertex.d.ts +2 -0
  46. package/dist/components/Portal/shaders/portalVertex.d.ts.map +1 -0
  47. package/dist/components/Portal/shaders/portalVertex.js +11 -0
  48. package/dist/components/Portal/shaders/portalVertex.js.map +1 -0
  49. package/dist/components/Portal/types.d.ts +21 -0
  50. package/dist/components/Portal/types.d.ts.map +1 -0
  51. package/dist/components/Portal/types.js +2 -0
  52. package/dist/components/Portal/types.js.map +1 -0
  53. package/dist/components/Portal/utils.d.ts +11 -0
  54. package/dist/components/Portal/utils.d.ts.map +1 -0
  55. package/dist/components/Portal/utils.js +31 -0
  56. package/dist/components/Portal/utils.js.map +1 -0
  57. package/dist/contexts/ConfirmContext.d.ts +35 -0
  58. package/dist/contexts/ConfirmContext.d.ts.map +1 -0
  59. package/dist/contexts/ConfirmContext.js +32 -0
  60. package/dist/contexts/ConfirmContext.js.map +1 -0
  61. package/dist/contexts/InstanceContext.d.ts +48 -0
  62. package/dist/contexts/InstanceContext.d.ts.map +1 -0
  63. package/dist/contexts/InstanceContext.js +55 -0
  64. package/dist/contexts/InstanceContext.js.map +1 -0
  65. package/dist/contexts/InstanceInfoContext.d.ts +39 -0
  66. package/dist/contexts/InstanceInfoContext.d.ts.map +1 -0
  67. package/dist/contexts/InstanceInfoContext.js +42 -0
  68. package/dist/contexts/InstanceInfoContext.js.map +1 -0
  69. package/dist/contexts/PortalContext.d.ts +39 -0
  70. package/dist/contexts/PortalContext.d.ts.map +1 -0
  71. package/dist/contexts/PortalContext.js +42 -0
  72. package/dist/contexts/PortalContext.js.map +1 -0
  73. package/dist/contexts/WorldContext.d.ts +46 -0
  74. package/dist/contexts/WorldContext.d.ts.map +1 -0
  75. package/dist/contexts/WorldContext.js +45 -0
  76. package/dist/contexts/WorldContext.js.map +1 -0
  77. package/dist/contexts/XRiftContext.d.ts +19 -1
  78. package/dist/contexts/XRiftContext.d.ts.map +1 -1
  79. package/dist/contexts/XRiftContext.js +11 -2
  80. package/dist/contexts/XRiftContext.js.map +1 -1
  81. package/dist/hooks/useConfirm.d.ts +19 -0
  82. package/dist/hooks/useConfirm.d.ts.map +1 -0
  83. package/dist/hooks/useConfirm.js +24 -0
  84. package/dist/hooks/useConfirm.js.map +1 -0
  85. package/dist/hooks/useInstance.d.ts +18 -0
  86. package/dist/hooks/useInstance.d.ts.map +1 -0
  87. package/dist/hooks/useInstance.js +54 -0
  88. package/dist/hooks/useInstance.js.map +1 -0
  89. package/dist/hooks/usePortalNavigation.d.ts +10 -0
  90. package/dist/hooks/usePortalNavigation.d.ts.map +1 -0
  91. package/dist/hooks/usePortalNavigation.js +46 -0
  92. package/dist/hooks/usePortalNavigation.js.map +1 -0
  93. package/dist/hooks/useWorld.d.ts +14 -0
  94. package/dist/hooks/useWorld.d.ts.map +1 -0
  95. package/dist/hooks/useWorld.js +31 -0
  96. package/dist/hooks/useWorld.js.map +1 -0
  97. package/dist/index.d.ts +7 -0
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +7 -0
  100. package/dist/index.js.map +1 -1
  101. package/package.json +1 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../../../../src/components/Portal/__tests__/utils.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,56 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { generateParticlePositions, generateParticleVelocities } from '../utils';
3
+ describe('generateParticlePositions', () => {
4
+ it('正しい長さのFloat32Arrayを返す', () => {
5
+ const result = generateParticlePositions(80, 1.0, 1.3);
6
+ expect(result).toBeInstanceOf(Float32Array);
7
+ expect(result.length).toBe(80 * 3);
8
+ });
9
+ it('パーティクル数0で空の配列を返す', () => {
10
+ const result = generateParticlePositions(0, 1.0, 1.3);
11
+ expect(result.length).toBe(0);
12
+ });
13
+ it('各パーティクルのXY座標が半径内に収まる', () => {
14
+ const radius = 1.0;
15
+ const aspectRatio = 1.3;
16
+ const result = generateParticlePositions(100, radius, aspectRatio);
17
+ for (let i = 0; i < 100; i++) {
18
+ const x = result[i * 3];
19
+ const y = result[i * 3 + 1];
20
+ expect(Math.abs(x)).toBeLessThanOrEqual(radius);
21
+ expect(Math.abs(y)).toBeLessThanOrEqual(radius * aspectRatio);
22
+ }
23
+ });
24
+ it('Z座標が-0.1〜0.1の範囲内に収まる', () => {
25
+ const result = generateParticlePositions(100, 1.0, 1.3);
26
+ for (let i = 0; i < 100; i++) {
27
+ const z = result[i * 3 + 2];
28
+ expect(z).toBeGreaterThanOrEqual(-0.1);
29
+ expect(z).toBeLessThanOrEqual(0.1);
30
+ }
31
+ });
32
+ });
33
+ describe('generateParticleVelocities', () => {
34
+ it('正しい長さのFloat32Arrayを返す', () => {
35
+ const result = generateParticleVelocities(80);
36
+ expect(result).toBeInstanceOf(Float32Array);
37
+ expect(result.length).toBe(80 * 2);
38
+ });
39
+ it('角速度が0.5〜2.0の範囲内', () => {
40
+ const result = generateParticleVelocities(100);
41
+ for (let i = 0; i < 100; i++) {
42
+ const angularSpeed = result[i * 2];
43
+ expect(angularSpeed).toBeGreaterThanOrEqual(0.5);
44
+ expect(angularSpeed).toBeLessThanOrEqual(2.0);
45
+ }
46
+ });
47
+ it('初期位相が0〜2πの範囲内', () => {
48
+ const result = generateParticleVelocities(100);
49
+ for (let i = 0; i < 100; i++) {
50
+ const phase = result[i * 2 + 1];
51
+ expect(phase).toBeGreaterThanOrEqual(0);
52
+ expect(phase).toBeLessThanOrEqual(Math.PI * 2);
53
+ }
54
+ });
55
+ });
56
+ //# sourceMappingURL=utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../../../src/components/Portal/__tests__/utils.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ interface Props {
2
+ color: string;
3
+ intensity: number;
4
+ }
5
+ export declare const PortalGlow: ({ color, intensity }: Props) => import("react/jsx-runtime").JSX.Element;
6
+ export {};
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/Portal/components/PortalGlow/index.tsx"],"names":[],"mappings":"AAIA,UAAU,KAAK;IACb,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;CAClB;AA2CD,eAAO,MAAM,UAAU,GAAI,sBAAsB,KAAK,4CAqCrD,CAAA"}
@@ -0,0 +1,64 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useFrame } from '@react-three/fiber';
3
+ import { useEffect, useRef } from 'react';
4
+ import { AdditiveBlending, Color, DoubleSide } from 'three';
5
+ const glowVertexShader = /* glsl */ `
6
+ varying vec2 vUv;
7
+ void main() {
8
+ vUv = uv;
9
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
10
+ }
11
+ `;
12
+ const glowFragmentShader = /* glsl */ `
13
+ uniform float uTime;
14
+ uniform vec3 uColor;
15
+ uniform float uIntensity;
16
+ varying vec2 vUv;
17
+
18
+ void main() {
19
+ vec2 centered = (vUv - 0.5) * 2.0;
20
+ float dist = length(centered);
21
+
22
+ // 円形のソフトグロー
23
+ float glow = exp(-dist * dist * 5.0);
24
+
25
+ // ふわふわ脈動
26
+ float pulse = sin(uTime * 1.5) * 0.08 + 0.92;
27
+ float pulse2 = sin(uTime * 2.7 + 1.0) * 0.05 + 0.95;
28
+
29
+ float brightness = glow * pulse * pulse2 * uIntensity * 5.0;
30
+ vec3 finalColor = uColor * brightness;
31
+
32
+ float alpha = glow * pulse * 1.2;
33
+ if (alpha < 0.01) discard;
34
+
35
+ gl_FragColor = vec4(finalColor, alpha);
36
+ }
37
+ `;
38
+ const INITIAL_UNIFORMS = {
39
+ uTime: { value: 0 },
40
+ uColor: { value: [0.6, 0.33, 1.0] },
41
+ uIntensity: { value: 1.5 },
42
+ };
43
+ export const PortalGlow = ({ color, intensity }) => {
44
+ const materialRef = useRef(null);
45
+ const geometryRef = useRef(null);
46
+ useFrame((_, delta) => {
47
+ if (!materialRef.current)
48
+ return;
49
+ materialRef.current.uniforms.uTime.value += delta;
50
+ const c = new Color(color);
51
+ materialRef.current.uniforms.uColor.value = [c.r, c.g, c.b];
52
+ materialRef.current.uniforms.uIntensity.value = intensity;
53
+ });
54
+ useEffect(() => {
55
+ const material = materialRef.current;
56
+ const geometry = geometryRef.current;
57
+ return () => {
58
+ material?.dispose();
59
+ geometry?.dispose();
60
+ };
61
+ }, []);
62
+ return (_jsxs("mesh", { rotation: [-Math.PI / 2, 0, 0], position: [0, 0.16, 0], children: [_jsx("planeGeometry", { ref: geometryRef, args: [2, 2] }), _jsx("shaderMaterial", { ref: materialRef, vertexShader: glowVertexShader, fragmentShader: glowFragmentShader, uniforms: INITIAL_UNIFORMS, transparent: true, blending: AdditiveBlending, depthWrite: false, side: DoubleSide })] }));
63
+ };
64
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/components/Portal/components/PortalGlow/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,UAAU,EAA2C,MAAM,OAAO,CAAA;AAOpG,MAAM,gBAAgB,GAAG,UAAU,CAAC;;;;;;CAMnC,CAAA;AAED,MAAM,kBAAkB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;CAyBrC,CAAA;AAED,MAAM,gBAAgB,GAAG;IACvB,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;IACnB,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAA6B,EAAE;IAC/D,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;CAC3B,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAS,EAAE,EAAE;IACxD,MAAM,WAAW,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAA;IAChD,MAAM,WAAW,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAA;IAE/C,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;QACpB,IAAI,CAAC,WAAW,CAAC,OAAO;YAAE,OAAM;QAChC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAA;QAEjD,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,CAAA;QAC1B,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAC3D,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,GAAG,SAAS,CAAA;IAC3D,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAA;QACpC,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAA;QACpC,OAAO,GAAG,EAAE;YACV,QAAQ,EAAE,OAAO,EAAE,CAAA;YACnB,QAAQ,EAAE,OAAO,EAAE,CAAA;QACrB,CAAC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,CACL,gBAAM,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,aAC1D,wBAAe,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAI,EACjD,yBACE,GAAG,EAAE,WAAW,EAChB,YAAY,EAAE,gBAAgB,EAC9B,cAAc,EAAE,kBAAkB,EAClC,QAAQ,EAAE,gBAAgB,EAC1B,WAAW,QACX,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,KAAK,EACjB,IAAI,EAAE,UAAU,GAChB,IACG,CACR,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,9 @@
1
+ interface Props {
2
+ particleCount: number;
3
+ color: string;
4
+ portalRadius: number;
5
+ rotationSpeed: number;
6
+ }
7
+ export declare const PortalParticles: ({ particleCount, color, portalRadius, rotationSpeed }: Props) => import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/Portal/components/PortalParticles/index.tsx"],"names":[],"mappings":"AAIA,UAAU,KAAK;IACb,aAAa,EAAE,MAAM,CAAA;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;CACtB;AAuDD,eAAO,MAAM,eAAe,GAAI,uDAAuD,KAAK,4CAmG3F,CAAA"}
@@ -0,0 +1,110 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useFrame } from '@react-three/fiber';
3
+ import { useEffect, useMemo, useRef } from 'react';
4
+ import { AdditiveBlending, Color } from 'three';
5
+ const particleVertexShader = /* glsl */ `
6
+ attribute float aOpacity;
7
+ varying float vOpacity;
8
+
9
+ void main() {
10
+ vOpacity = aOpacity;
11
+ vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);
12
+ gl_PointSize = 30.0 / -mvPosition.z;
13
+ gl_Position = projectionMatrix * mvPosition;
14
+ }
15
+ `;
16
+ const particleFragmentShader = /* glsl */ `
17
+ uniform vec3 uColor;
18
+ varying float vOpacity;
19
+
20
+ void main() {
21
+ // 円形のポイント
22
+ float dist = length(gl_PointCoord - vec2(0.5));
23
+ if (dist > 0.5) discard;
24
+ float soft = 1.0 - smoothstep(0.3, 0.5, dist);
25
+ gl_FragColor = vec4(uColor, soft * vOpacity);
26
+ }
27
+ `;
28
+ const INITIAL_UNIFORMS = {
29
+ uColor: { value: [0.73, 0.53, 1.0] },
30
+ };
31
+ const initParticles = (count, radius) => {
32
+ const positions = new Float32Array(count * 3);
33
+ const opacities = new Float32Array(count);
34
+ const speeds = new Float32Array(count);
35
+ for (let i = 0; i < count; i++) {
36
+ const angle = Math.random() * Math.PI * 2;
37
+ const dist = radius * (0.3 + Math.random() * 0.7);
38
+ const height = Math.random() * 0.8 + 0.2;
39
+ positions[i * 3] = Math.cos(angle) * dist;
40
+ positions[i * 3 + 1] = height;
41
+ positions[i * 3 + 2] = Math.sin(angle) * dist;
42
+ opacities[i] = 0.0;
43
+ speeds[i] = 0.3 + Math.random() * 0.7;
44
+ }
45
+ return { positions, opacities, speeds };
46
+ };
47
+ const MAX_HEIGHT = 1.0;
48
+ const FADE_START = 0.7;
49
+ export const PortalParticles = ({ particleCount, color, portalRadius, rotationSpeed }) => {
50
+ const pointsRef = useRef(null);
51
+ const geometryRef = useRef(null);
52
+ const materialRef = useRef(null);
53
+ const timeRef = useRef(0);
54
+ const { positions, opacities, speeds } = useMemo(() => initParticles(particleCount, portalRadius), [particleCount, portalRadius]);
55
+ useFrame((_, delta) => {
56
+ if (!geometryRef.current || !materialRef.current)
57
+ return;
58
+ timeRef.current += delta;
59
+ const c = new Color(color);
60
+ materialRef.current.uniforms.uColor.value = [c.r, c.g, c.b];
61
+ const posAttr = geometryRef.current.getAttribute('position');
62
+ const posArray = posAttr.array;
63
+ const opacityAttr = geometryRef.current.getAttribute('aOpacity');
64
+ const opacityArray = opacityAttr.array;
65
+ for (let i = 0; i < particleCount; i++) {
66
+ const x = posArray[i * 3];
67
+ let y = posArray[i * 3 + 1];
68
+ const z = posArray[i * 3 + 2];
69
+ const angle = Math.atan2(z, x);
70
+ const dist = Math.sqrt(x * x + z * z);
71
+ const angularSpeed = speeds[i] * rotationSpeed * (2.0 + 1.5 / (dist + 0.1));
72
+ const newAngle = angle + angularSpeed * delta;
73
+ const shrinkRate = 0.25 * speeds[i];
74
+ const fallRate = 0.35 * speeds[i];
75
+ let newDist = dist - shrinkRate * delta;
76
+ y -= fallRate * delta;
77
+ // 高さに応じたフェードイン(上=透明、下=不透明)
78
+ const normalizedHeight = Math.min(Math.max((MAX_HEIGHT - y) / (MAX_HEIGHT - 0.15), 0), 1);
79
+ opacityArray[i] = normalizedHeight < FADE_START
80
+ ? normalizedHeight / FADE_START * 0.8
81
+ : 0.8;
82
+ if (newDist < 0.05 || y < 0.15) {
83
+ const resetAngle = Math.random() * Math.PI * 2;
84
+ newDist = portalRadius * (0.5 + Math.random() * 0.5);
85
+ y = 0.5 + Math.random() * 0.5;
86
+ opacityArray[i] = 0.0;
87
+ posArray[i * 3] = Math.cos(resetAngle) * newDist;
88
+ posArray[i * 3 + 1] = y;
89
+ posArray[i * 3 + 2] = Math.sin(resetAngle) * newDist;
90
+ }
91
+ else {
92
+ posArray[i * 3] = Math.cos(newAngle) * newDist;
93
+ posArray[i * 3 + 1] = y;
94
+ posArray[i * 3 + 2] = Math.sin(newAngle) * newDist;
95
+ }
96
+ }
97
+ posAttr.needsUpdate = true;
98
+ opacityAttr.needsUpdate = true;
99
+ });
100
+ useEffect(() => {
101
+ const geometry = geometryRef.current;
102
+ const material = materialRef.current;
103
+ return () => {
104
+ geometry?.dispose();
105
+ material?.dispose();
106
+ };
107
+ }, []);
108
+ return (_jsxs("points", { ref: pointsRef, children: [_jsxs("bufferGeometry", { ref: geometryRef, children: [_jsx("bufferAttribute", { attach: "attributes-position", args: [positions, 3], count: particleCount }), _jsx("bufferAttribute", { attach: "attributes-aOpacity", args: [opacities, 1], count: particleCount })] }), _jsx("shaderMaterial", { ref: materialRef, vertexShader: particleVertexShader, fragmentShader: particleFragmentShader, uniforms: INITIAL_UNIFORMS, transparent: true, blending: AdditiveBlending, depthWrite: false })] }));
109
+ };
110
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/components/Portal/components/PortalParticles/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface Props {
2
+ onEnter?: () => void;
3
+ }
4
+ export declare const PortalPedestal: ({ onEnter }: Props) => import("react/jsx-runtime").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/Portal/components/PortalPedestal/index.tsx"],"names":[],"mappings":"AAgDA,UAAU,KAAK;IACb,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB;AAED,eAAO,MAAM,cAAc,GAAI,aAAa,KAAK,4CAkChD,CAAA"}
@@ -0,0 +1,57 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { CuboidCollider, RigidBody } from '@react-three/rapier';
3
+ import { useEffect, useRef } from 'react';
4
+ import { DoubleSide } from 'three';
5
+ import { simplexNoise3D } from '../../shaders/noise';
6
+ const PEDESTAL_HEIGHT = 0.15;
7
+ const BOTTOM_RADIUS = 1.4;
8
+ const TOP_RADIUS = 1.25;
9
+ const vertexShader = /* glsl */ `
10
+ varying vec3 vPosition;
11
+ varying vec3 vNormal;
12
+
13
+ void main() {
14
+ vPosition = position;
15
+ vNormal = normalize(normalMatrix * normal);
16
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
17
+ }
18
+ `;
19
+ const fragmentShader = /* glsl */ `
20
+ ${simplexNoise3D}
21
+
22
+ varying vec3 vPosition;
23
+ varying vec3 vNormal;
24
+
25
+ void main() {
26
+ // 3Dノイズで石のまだら模様
27
+ float n1 = snoise(vPosition * 1.5) * 0.04;
28
+ float n2 = snoise(vPosition * 4.0) * 0.02;
29
+ float noise = n1 + n2;
30
+
31
+ // ベースの灰色にノイズを加える
32
+ vec3 baseColor = vec3(0.2, 0.2, 0.2);
33
+ vec3 stoneColor = baseColor + vec3(noise);
34
+
35
+ // 簡易ライティング(上からの光)
36
+ float light = dot(vNormal, vec3(0.0, 1.0, 0.0)) * 0.3 + 0.7;
37
+
38
+ gl_FragColor = vec4(stoneColor * light, 1.0);
39
+ }
40
+ `;
41
+ const INITIAL_UNIFORMS = {};
42
+ const SENSOR_HALF_WIDTH = TOP_RADIUS * 0.6;
43
+ const SENSOR_HALF_HEIGHT = 0.8;
44
+ export const PortalPedestal = ({ onEnter }) => {
45
+ const materialRef = useRef(null);
46
+ const geometryRef = useRef(null);
47
+ useEffect(() => {
48
+ const material = materialRef.current;
49
+ const geometry = geometryRef.current;
50
+ return () => {
51
+ material?.dispose();
52
+ geometry?.dispose();
53
+ };
54
+ }, []);
55
+ return (_jsxs(RigidBody, { type: "fixed", colliders: "trimesh", children: [_jsxs("mesh", { position: [0, PEDESTAL_HEIGHT / 2, 0], rotation: [0, Math.PI / 4, 0], children: [_jsx("cylinderGeometry", { ref: geometryRef, args: [TOP_RADIUS, BOTTOM_RADIUS, PEDESTAL_HEIGHT, 4] }), _jsx("shaderMaterial", { ref: materialRef, vertexShader: vertexShader, fragmentShader: fragmentShader, uniforms: INITIAL_UNIFORMS, side: DoubleSide })] }), _jsx(CuboidCollider, { args: [SENSOR_HALF_WIDTH, SENSOR_HALF_HEIGHT, SENSOR_HALF_WIDTH], position: [0, PEDESTAL_HEIGHT + SENSOR_HALF_HEIGHT, 0], sensor: true, onIntersectionEnter: onEnter })] }));
56
+ };
57
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/components/Portal/components/PortalPedestal/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAAyB,UAAU,EAAuB,MAAM,OAAO,CAAA;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD,MAAM,eAAe,GAAG,IAAI,CAAA;AAC5B,MAAM,aAAa,GAAG,GAAG,CAAA;AACzB,MAAM,UAAU,GAAG,IAAI,CAAA;AAEvB,MAAM,YAAY,GAAG,UAAU,CAAC;;;;;;;;;CAS/B,CAAA;AAED,MAAM,cAAc,GAAG,UAAU,CAAC;EAChC,cAAc;;;;;;;;;;;;;;;;;;;;CAoBf,CAAA;AAED,MAAM,gBAAgB,GAAG,EAAE,CAAA;AAE3B,MAAM,iBAAiB,GAAG,UAAU,GAAG,GAAG,CAAA;AAC1C,MAAM,kBAAkB,GAAG,GAAG,CAAA;AAM9B,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAAE,OAAO,EAAS,EAAE,EAAE;IACnD,MAAM,WAAW,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAA;IAChD,MAAM,WAAW,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAA;IAElD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAA;QACpC,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAA;QACpC,OAAO,GAAG,EAAE;YACV,QAAQ,EAAE,OAAO,EAAE,CAAA;YACnB,QAAQ,EAAE,OAAO,EAAE,CAAA;QACrB,CAAC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,CACL,MAAC,SAAS,IAAC,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,SAAS,aACzC,gBAAM,QAAQ,EAAE,CAAC,CAAC,EAAE,eAAe,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,aACxE,2BAAkB,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,CAAC,CAAC,GAAI,EAC7F,yBACE,GAAG,EAAE,WAAW,EAChB,YAAY,EAAE,YAAY,EAC1B,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,EAAE,UAAU,GAChB,IACG,EAEP,KAAC,cAAc,IACb,IAAI,EAAE,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,EAChE,QAAQ,EAAE,CAAC,CAAC,EAAE,eAAe,GAAG,kBAAkB,EAAE,CAAC,CAAC,EACtD,MAAM,QACN,mBAAmB,EAAE,OAAO,GAC5B,IACQ,CACb,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,7 @@
1
+ interface Props {
2
+ thumbnailUrl?: string;
3
+ portalRadius: number;
4
+ }
5
+ export declare const PortalThumbnail: ({ thumbnailUrl, portalRadius }: Props) => import("react/jsx-runtime").JSX.Element | null;
6
+ export {};
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/Portal/components/PortalThumbnail/index.tsx"],"names":[],"mappings":"AAKA,UAAU,KAAK;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;CACrB;AAmED,eAAO,MAAM,eAAe,GAAI,gCAAgC,KAAK,mDAuFpE,CAAA"}
@@ -0,0 +1,130 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useFrame } from '@react-three/fiber';
3
+ import { useEffect, useRef, useState } from 'react';
4
+ import { DataTexture, TextureLoader } from 'three';
5
+ import { simplexNoise3D } from '../../shaders/noise';
6
+ const vertexShader = /* glsl */ `
7
+ varying vec2 vUv;
8
+ void main() {
9
+ vUv = uv;
10
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
11
+ }
12
+ `;
13
+ const fragmentShader = /* glsl */ `
14
+ ${simplexNoise3D}
15
+
16
+ uniform sampler2D uTexture;
17
+ uniform vec3 uGlowColor;
18
+ uniform float uTime;
19
+ varying vec2 vUv;
20
+ void main() {
21
+ vec2 center = vUv - 0.5;
22
+ float dist = length(center);
23
+ float angle = atan(center.y, center.x);
24
+
25
+ // ノイズで縁をグネグネさせる(0.42基準で余白を確保)
26
+ float noise = snoise(vec3(cos(angle) * 1.0, sin(angle) * 1.0, uTime * 0.5)) * 0.04;
27
+ float edge = 0.42 + noise;
28
+
29
+ // 外側グロー領域(縁の外にはみ出す光)
30
+ float glowWidth = 0.06;
31
+ if (dist > edge + glowWidth) discard;
32
+
33
+ if (dist > edge) {
34
+ // 縁の外側: 紫グローのみ
35
+ float outerGlow = 1.0 - smoothstep(edge, edge + glowWidth, dist);
36
+ gl_FragColor = vec4(uGlowColor, outerGlow * 0.6);
37
+ return;
38
+ }
39
+
40
+ // UVを円の範囲に合わせてスケーリング
41
+ float scale = 0.42 / 0.5;
42
+ vec2 scaledUv = (vUv - 0.5) / scale + 0.5;
43
+ vec4 texColor = texture2D(uTexture, scaledUv);
44
+
45
+ // 縁に近いほどグローを強くする
46
+ float edgeStart = edge - 0.12;
47
+ float glowStrength = smoothstep(edgeStart, edge, dist);
48
+ vec3 color = mix(texColor.rgb, uGlowColor, glowStrength * 0.7);
49
+
50
+ float alpha = texColor.a + glowStrength * 0.5;
51
+
52
+ gl_FragColor = vec4(color + uGlowColor * glowStrength * 0.3, alpha);
53
+ }
54
+ `;
55
+ /** サムネイルがない場合の黒プレースホルダー */
56
+ const createBlackTexture = () => {
57
+ const data = new Uint8Array([0, 0, 0, 255]);
58
+ const tex = new DataTexture(data, 1, 1);
59
+ tex.needsUpdate = true;
60
+ return tex;
61
+ };
62
+ const INITIAL_UNIFORMS = {
63
+ uTexture: { value: null },
64
+ uGlowColor: { value: [0.6, 0.33, 1.0] },
65
+ uTime: { value: 0 },
66
+ };
67
+ export const PortalThumbnail = ({ thumbnailUrl, portalRadius }) => {
68
+ const [texture, setTexture] = useState(null);
69
+ const meshRef = useRef(null);
70
+ const geometryRef = useRef(null);
71
+ const materialRef = useRef(null);
72
+ useEffect(() => {
73
+ if (!thumbnailUrl) {
74
+ const black = createBlackTexture();
75
+ setTexture(black);
76
+ return () => {
77
+ black.dispose();
78
+ setTexture(null);
79
+ };
80
+ }
81
+ const loader = new TextureLoader();
82
+ loader.setCrossOrigin('anonymous');
83
+ let cancelled = false;
84
+ loader.load(thumbnailUrl, (loaded) => {
85
+ if (cancelled)
86
+ return;
87
+ setTexture(loaded);
88
+ }, undefined, (err) => {
89
+ console.error('PortalThumbnail: texture load failed', err);
90
+ if (!cancelled) {
91
+ const black = createBlackTexture();
92
+ setTexture(black);
93
+ }
94
+ });
95
+ return () => {
96
+ cancelled = true;
97
+ setTexture((prev) => {
98
+ prev?.dispose();
99
+ return null;
100
+ });
101
+ };
102
+ }, [thumbnailUrl]);
103
+ useEffect(() => {
104
+ if (!materialRef.current || !texture)
105
+ return;
106
+ materialRef.current.uniforms.uTexture.value = texture;
107
+ }, [texture]);
108
+ useEffect(() => {
109
+ const geometry = geometryRef.current;
110
+ const material = materialRef.current;
111
+ return () => {
112
+ geometry?.dispose();
113
+ material?.dispose();
114
+ };
115
+ }, []);
116
+ const baseY = portalRadius * 0.15 + 0.15 + portalRadius * 0.7;
117
+ useFrame(({ clock }) => {
118
+ if (!meshRef.current)
119
+ return;
120
+ meshRef.current.position.y = baseY + Math.sin(clock.getElapsedTime()) * 0.05;
121
+ if (materialRef.current) {
122
+ materialRef.current.uniforms.uTime.value = clock.getElapsedTime();
123
+ }
124
+ });
125
+ const size = portalRadius * (2 / 3) * 2;
126
+ if (!texture)
127
+ return null;
128
+ return (_jsx("group", { ref: meshRef, position: [0, baseY, 0], children: _jsxs("mesh", { children: [_jsx("planeGeometry", { ref: geometryRef, args: [size, size] }), _jsx("shaderMaterial", { ref: materialRef, vertexShader: vertexShader, fragmentShader: fragmentShader, uniforms: INITIAL_UNIFORMS, transparent: true })] }) }));
129
+ };
130
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/components/Portal/components/PortalThumbnail/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ interface Props {
2
+ color: string;
3
+ secondaryColor: string;
4
+ intensity: number;
5
+ rotationSpeed: number;
6
+ portalRadius: number;
7
+ }
8
+ export declare const PortalVortex: ({ color, secondaryColor, intensity, rotationSpeed, portalRadius }: Props) => import("react/jsx-runtime").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/Portal/components/PortalVortex/index.tsx"],"names":[],"mappings":"AAMA,UAAU,KAAK;IACb,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;CACrB;AAYD,eAAO,MAAM,YAAY,GAAI,mEAAmE,KAAK,4CAgDpG,CAAA"}
@@ -0,0 +1,41 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useFrame } from '@react-three/fiber';
3
+ import { useEffect, useRef } from 'react';
4
+ import { AdditiveBlending, Color, DoubleSide } from 'three';
5
+ import { portalFragmentShader } from '../../shaders/portalFragment';
6
+ import { portalVertexShader } from '../../shaders/portalVertex';
7
+ const INITIAL_UNIFORMS = {
8
+ uTime: { value: 0 },
9
+ uColor: { value: [0.6, 0.33, 1.0] },
10
+ uSecondaryColor: { value: [0.73, 0.53, 1.0] },
11
+ uIntensity: { value: 1.5 },
12
+ };
13
+ const CONE_SEGMENTS = 24;
14
+ const CONE_HEIGHT_SEGMENTS = 12;
15
+ export const PortalVortex = ({ color, secondaryColor, intensity, rotationSpeed, portalRadius }) => {
16
+ const meshRef = useRef(null);
17
+ const materialRef = useRef(null);
18
+ const geometryRef = useRef(null);
19
+ useFrame((_, delta) => {
20
+ if (!materialRef.current || !meshRef.current)
21
+ return;
22
+ materialRef.current.uniforms.uTime.value += delta;
23
+ const mainColor = new Color(color);
24
+ const subColor = new Color(secondaryColor);
25
+ materialRef.current.uniforms.uColor.value = [mainColor.r, mainColor.g, mainColor.b];
26
+ materialRef.current.uniforms.uSecondaryColor.value = [subColor.r, subColor.g, subColor.b];
27
+ materialRef.current.uniforms.uIntensity.value = intensity;
28
+ meshRef.current.rotation.y += rotationSpeed * delta;
29
+ });
30
+ useEffect(() => {
31
+ const material = materialRef.current;
32
+ const geometry = geometryRef.current;
33
+ return () => {
34
+ material?.dispose();
35
+ geometry?.dispose();
36
+ };
37
+ }, []);
38
+ const height = portalRadius * 0.15;
39
+ return (_jsxs("mesh", { ref: meshRef, rotation: [Math.PI, 0, 0], position: [0, height / 2 + 0.15, 0], children: [_jsx("coneGeometry", { ref: geometryRef, args: [portalRadius, height, CONE_SEGMENTS, CONE_HEIGHT_SEGMENTS, true] }), _jsx("shaderMaterial", { ref: materialRef, vertexShader: portalVertexShader, fragmentShader: portalFragmentShader, uniforms: INITIAL_UNIFORMS, transparent: true, blending: AdditiveBlending, depthWrite: false, side: DoubleSide })] }));
40
+ };
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/components/Portal/components/PortalVortex/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Vector3Tuple } from 'three';
2
+ export declare const PORTAL_DEFAULTS: {
3
+ readonly position: Vector3Tuple;
4
+ readonly rotation: Vector3Tuple;
5
+ readonly color: "#9955ff";
6
+ readonly secondaryColor: "#bb88ff";
7
+ readonly intensity: 1.5;
8
+ readonly rotationSpeed: 0.5;
9
+ readonly portalRadius: 0.9;
10
+ };
11
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/components/Portal/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAA;AAEzC,eAAO,MAAM,eAAe;uBACH,YAAY;uBACZ,YAAY;;;;;;CAM3B,CAAA"}
@@ -0,0 +1,10 @@
1
+ export const PORTAL_DEFAULTS = {
2
+ position: [0, 0, 0],
3
+ rotation: [0, 0, 0],
4
+ color: '#9955ff',
5
+ secondaryColor: '#bb88ff',
6
+ intensity: 1.5,
7
+ rotationSpeed: 0.5,
8
+ portalRadius: 0.9,
9
+ };
10
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/components/Portal/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAiB;IACnC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAiB;IACnC,KAAK,EAAE,SAAS;IAChB,cAAc,EAAE,SAAS;IACzB,SAAS,EAAE,GAAG;IACd,aAAa,EAAE,GAAG;IAClB,YAAY,EAAE,GAAG;CACT,CAAA"}
@@ -0,0 +1,10 @@
1
+ import type { Props } from './types';
2
+ /**
3
+ * Propsにデフォルト値を適用して返す
4
+ */
5
+ export declare const usePortalProps: (props: Props) => {
6
+ instanceId: string;
7
+ position: import("three").Vector3Tuple;
8
+ rotation: import("three").Vector3Tuple;
9
+ };
10
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/components/Portal/hooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,KAAK;;;;CAY1C,CAAA"}