@xrift/world-components 0.30.1 → 0.30.3
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/dist/components/BillboardY/hooks.d.ts +3 -0
- package/dist/components/BillboardY/hooks.d.ts.map +1 -1
- package/dist/components/BillboardY/hooks.js +36 -16
- package/dist/components/BillboardY/hooks.js.map +1 -1
- package/dist/components/Portal/components/PortalThumbnail/index.d.ts.map +1 -1
- package/dist/components/Portal/components/PortalThumbnail/index.js +16 -0
- package/dist/components/Portal/components/PortalThumbnail/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -3,6 +3,9 @@ import { type Object3D } from 'three';
|
|
|
3
3
|
* Y軸ビルボードフック
|
|
4
4
|
* 対象の Object3D を毎フレームカメラに向けてY軸のみ回転させる
|
|
5
5
|
* 親のワールド回転を考慮し、ローカル回転として正しい値を設定する
|
|
6
|
+
*
|
|
7
|
+
* sentinel Mesh の onBeforeRender を使用することで、
|
|
8
|
+
* Mirror(Reflector)の virtualCamera でも正しい回転が適用される
|
|
6
9
|
*/
|
|
7
10
|
export declare const useBillboardY: <T extends Object3D>() => import("react").RefObject<T>;
|
|
8
11
|
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/components/BillboardY/hooks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/components/BillboardY/hooks.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,QAAQ,EAId,MAAM,OAAO,CAAA;AAed;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,SAAS,QAAQ,mCA6C/C,CAAA"}
|
|
@@ -1,33 +1,53 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { Euler, Quaternion, Vector3 } from 'three';
|
|
1
|
+
import { useEffect, useRef } from 'react';
|
|
2
|
+
import { BoxGeometry, Euler, Mesh, MeshBasicMaterial, Quaternion, Vector3, } from 'three';
|
|
4
3
|
import { getBillboardYRotation } from './utils';
|
|
5
4
|
const _cameraWorldPos = new Vector3();
|
|
6
5
|
const _targetWorldPos = new Vector3();
|
|
7
6
|
const _parentQuat = new Quaternion();
|
|
8
7
|
const _euler = new Euler();
|
|
8
|
+
const SENTINEL_GEOMETRY = new BoxGeometry(0.001, 0.001, 0.001);
|
|
9
|
+
const SENTINEL_MATERIAL = new MeshBasicMaterial({
|
|
10
|
+
colorWrite: false,
|
|
11
|
+
depthWrite: false,
|
|
12
|
+
depthTest: false,
|
|
13
|
+
});
|
|
9
14
|
/**
|
|
10
15
|
* Y軸ビルボードフック
|
|
11
16
|
* 対象の Object3D を毎フレームカメラに向けてY軸のみ回転させる
|
|
12
17
|
* 親のワールド回転を考慮し、ローカル回転として正しい値を設定する
|
|
18
|
+
*
|
|
19
|
+
* sentinel Mesh の onBeforeRender を使用することで、
|
|
20
|
+
* Mirror(Reflector)の virtualCamera でも正しい回転が適用される
|
|
13
21
|
*/
|
|
14
22
|
export const useBillboardY = () => {
|
|
15
23
|
const ref = useRef(null);
|
|
16
|
-
|
|
24
|
+
useEffect(() => {
|
|
17
25
|
if (!ref.current)
|
|
18
26
|
return;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
const target = ref.current;
|
|
28
|
+
const sentinel = new Mesh(SENTINEL_GEOMETRY, SENTINEL_MATERIAL);
|
|
29
|
+
sentinel.frustumCulled = false;
|
|
30
|
+
sentinel.renderOrder = -Infinity;
|
|
31
|
+
sentinel.onBeforeRender = (_renderer, _scene, camera) => {
|
|
32
|
+
camera.getWorldPosition(_cameraWorldPos);
|
|
33
|
+
target.getWorldPosition(_targetWorldPos);
|
|
34
|
+
const worldRotationY = getBillboardYRotation(_cameraWorldPos, _targetWorldPos);
|
|
35
|
+
if (target.parent) {
|
|
36
|
+
target.parent.getWorldQuaternion(_parentQuat);
|
|
37
|
+
_euler.setFromQuaternion(_parentQuat, 'YXZ');
|
|
38
|
+
target.rotation.y = worldRotationY - _euler.y;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
target.rotation.y = worldRotationY;
|
|
42
|
+
}
|
|
43
|
+
target.updateWorldMatrix(false, true);
|
|
44
|
+
};
|
|
45
|
+
target.add(sentinel);
|
|
46
|
+
return () => {
|
|
47
|
+
sentinel.onBeforeRender = () => { };
|
|
48
|
+
target.remove(sentinel);
|
|
49
|
+
};
|
|
50
|
+
}, []);
|
|
31
51
|
return ref;
|
|
32
52
|
};
|
|
33
53
|
//# sourceMappingURL=hooks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/components/BillboardY/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/components/BillboardY/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EACL,WAAW,EACX,KAAK,EACL,IAAI,EACJ,iBAAiB,EAEjB,UAAU,EAEV,OAAO,GACR,MAAM,OAAO,CAAA;AACd,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAE/C,MAAM,eAAe,GAAG,IAAI,OAAO,EAAE,CAAA;AACrC,MAAM,eAAe,GAAG,IAAI,OAAO,EAAE,CAAA;AACrC,MAAM,WAAW,GAAG,IAAI,UAAU,EAAE,CAAA;AACpC,MAAM,MAAM,GAAG,IAAI,KAAK,EAAE,CAAA;AAE1B,MAAM,iBAAiB,GAAG,IAAI,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;AAC9D,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC;IAC9C,UAAU,EAAE,KAAK;IACjB,UAAU,EAAE,KAAK;IACjB,SAAS,EAAE,KAAK;CACjB,CAAC,CAAA;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,GAAuB,EAAE;IACpD,MAAM,GAAG,GAAG,MAAM,CAAI,IAAI,CAAC,CAAA;IAE3B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,GAAG,CAAC,OAAO;YAAE,OAAM;QAExB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAA;QAE1B,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAA;QAC/D,QAAQ,CAAC,aAAa,GAAG,KAAK,CAAA;QAC9B,QAAQ,CAAC,WAAW,GAAG,CAAC,QAAQ,CAAA;QAEhC,QAAQ,CAAC,cAAc,GAAG,CACxB,SAAkB,EAClB,MAAe,EACf,MAAc,EACd,EAAE;YACF,MAAM,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAA;YACxC,MAAM,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAA;YAExC,MAAM,cAAc,GAAG,qBAAqB,CAC1C,eAAe,EACf,eAAe,CAChB,CAAA;YAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAA;gBAC7C,MAAM,CAAC,iBAAiB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;gBAC5C,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,cAAc,GAAG,MAAM,CAAC,CAAC,CAAA;YAC/C,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,cAAc,CAAA;YACpC,CAAC;YAED,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACvC,CAAC,CAAA;QAED,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAEpB,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,cAAc,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;YAClC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QACzB,CAAC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/Portal/components/PortalThumbnail/index.tsx"],"names":[],"mappings":"AAMA,UAAU,KAAK;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;CACrB;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/Portal/components/PortalThumbnail/index.tsx"],"names":[],"mappings":"AAMA,UAAU,KAAK;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;CACrB;AA+ED,eAAO,MAAM,eAAe,GAAI,gCAAgC,KAAK,mDA8FpE,CAAA"}
|
|
@@ -17,6 +17,7 @@ const fragmentShader = /* glsl */ `
|
|
|
17
17
|
uniform sampler2D uTexture;
|
|
18
18
|
uniform vec3 uGlowColor;
|
|
19
19
|
uniform float uTime;
|
|
20
|
+
uniform float uAspect;
|
|
20
21
|
varying vec2 vUv;
|
|
21
22
|
void main() {
|
|
22
23
|
vec2 center = vUv - 0.5;
|
|
@@ -41,6 +42,16 @@ const fragmentShader = /* glsl */ `
|
|
|
41
42
|
// UVを円の範囲に合わせてスケーリング
|
|
42
43
|
float scale = 0.42 / 0.5;
|
|
43
44
|
vec2 scaledUv = (vUv - 0.5) / scale + 0.5;
|
|
45
|
+
|
|
46
|
+
// アスペクト比補正(cover: 円形領域を埋めつつ比率を維持)
|
|
47
|
+
vec2 aspectUv = scaledUv - 0.5;
|
|
48
|
+
if (uAspect > 1.0) {
|
|
49
|
+
aspectUv.x /= uAspect;
|
|
50
|
+
} else {
|
|
51
|
+
aspectUv.y *= uAspect;
|
|
52
|
+
}
|
|
53
|
+
scaledUv = aspectUv + 0.5;
|
|
54
|
+
|
|
44
55
|
vec4 texColor = texture2D(uTexture, scaledUv);
|
|
45
56
|
|
|
46
57
|
// 縁に近いほどグローを強くする
|
|
@@ -64,6 +75,7 @@ const createUniforms = () => ({
|
|
|
64
75
|
uTexture: { value: null },
|
|
65
76
|
uGlowColor: { value: [0.6, 0.33, 1.0] },
|
|
66
77
|
uTime: { value: 0 },
|
|
78
|
+
uAspect: { value: 1.0 },
|
|
67
79
|
});
|
|
68
80
|
export const PortalThumbnail = ({ thumbnailUrl, portalRadius }) => {
|
|
69
81
|
const [uniforms] = useState(createUniforms);
|
|
@@ -106,6 +118,10 @@ export const PortalThumbnail = ({ thumbnailUrl, portalRadius }) => {
|
|
|
106
118
|
if (!materialRef.current || !texture)
|
|
107
119
|
return;
|
|
108
120
|
materialRef.current.uniforms.uTexture.value = texture;
|
|
121
|
+
const image = texture.image;
|
|
122
|
+
if (image?.width && image?.height) {
|
|
123
|
+
materialRef.current.uniforms.uAspect.value = image.width / image.height;
|
|
124
|
+
}
|
|
109
125
|
}, [texture]);
|
|
110
126
|
useEffect(() => {
|
|
111
127
|
const geometry = geometryRef.current;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/components/Portal/components/PortalThumbnail/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACnD,OAAO,EAAE,WAAW,EAAgE,aAAa,EAAE,MAAM,OAAO,CAAA;AAChH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAOpD,MAAM,YAAY,GAAG,UAAU,CAAC;;;;;;CAM/B,CAAA;AAED,MAAM,cAAc,GAAG,UAAU,CAAC;IAC9B,cAAc
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/components/Portal/components/PortalThumbnail/index.tsx"],"names":[],"mappings":"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"}
|