mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-24 12:09:51 +02:00
feat: track turning
This commit is contained in:
1 parent
9306773b5b
commit
b3ecb1e9b9
2 files changed
+43
-10
No files matched your search
@@ -1,6 +1,6 @@
|
|||||||
import { ThreeEvent, useThree } from '@react-three/fiber';
|
import { ThreeEvent, useThree } from '@react-three/fiber';
|
||||||
import { ReactNode, forwardRef, useImperativeHandle, useRef } from 'react';
|
import { ReactNode, forwardRef, useImperativeHandle, useRef } from 'react';
|
||||||
import { Group, Mesh, Object3D } from 'three';
|
import { Group, Mesh, MeshStandardMaterial, Object3D, Vector2 } from 'three';
|
||||||
import { resolveJsxTree } from '../../../../../core/blitzkrieg/resolveJsxTree';
|
import { resolveJsxTree } from '../../../../../core/blitzkrieg/resolveJsxTree';
|
||||||
import { normalizeAnglePI } from '../../../../../core/math/normalizeAngle180';
|
import { normalizeAnglePI } from '../../../../../core/math/normalizeAngle180';
|
||||||
|
|
||||||
@@ -10,10 +10,15 @@ interface HullContainerProps {
|
|||||||
objects: Object3D[];
|
objects: Object3D[];
|
||||||
onYawStart: () => void;
|
onYawStart: () => void;
|
||||||
onYawEnd: (yaw: number) => void;
|
onYawEnd: (yaw: number) => void;
|
||||||
|
onTrackStart: () => void;
|
||||||
|
onTrackEnd: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const HullContainer = forwardRef<Group, HullContainerProps>(
|
export const HullContainer = forwardRef<Group, HullContainerProps>(
|
||||||
({ children, yaw, objects, onYawStart, onYawEnd }, ref) => {
|
(
|
||||||
|
{ children, yaw, objects, onYawStart, onYawEnd, onTrackEnd, onTrackStart },
|
||||||
|
ref,
|
||||||
|
) => {
|
||||||
const canvas = useThree((state) => state.gl.domElement);
|
const canvas = useThree((state) => state.gl.domElement);
|
||||||
const hullContainer = useRef<Group>(null);
|
const hullContainer = useRef<Group>(null);
|
||||||
|
|
||||||
@@ -31,13 +36,19 @@ export const HullContainer = forwardRef<Group, HullContainerProps>(
|
|||||||
function handlePointerDown(event: ThreeEvent<PointerEvent>) {
|
function handlePointerDown(event: ThreeEvent<PointerEvent>) {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
draftHullYaw = yaw;
|
if (isHull) {
|
||||||
|
draftHullYaw = yaw;
|
||||||
|
|
||||||
onYawStart();
|
onYawStart();
|
||||||
window.addEventListener('pointermove', handlePointerMove);
|
window.addEventListener('pointermove', handlePointerMoveHull);
|
||||||
window.addEventListener('pointerup', handlePointerUp);
|
window.addEventListener('pointerup', handlePointerUpHull);
|
||||||
|
} else if (isTrack) {
|
||||||
|
onTrackStart();
|
||||||
|
window.addEventListener('pointermove', handlePointerMoveTrack);
|
||||||
|
window.addEventListener('pointerup', handlePointerUpTrack);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
function handlePointerMove(event: PointerEvent) {
|
function handlePointerMoveHull(event: PointerEvent) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
|
||||||
draftHullYaw += event.movementX * ((2 * Math.PI) / canvas.width);
|
draftHullYaw += event.movementX * ((2 * Math.PI) / canvas.width);
|
||||||
@@ -46,10 +57,30 @@ export const HullContainer = forwardRef<Group, HullContainerProps>(
|
|||||||
hullContainer.current.rotation.z = draftHullYaw;
|
hullContainer.current.rotation.z = draftHullYaw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function handlePointerUp() {
|
function handlePointerUpHull() {
|
||||||
onYawEnd(normalizeAnglePI(draftHullYaw));
|
onYawEnd(normalizeAnglePI(draftHullYaw));
|
||||||
window.removeEventListener('pointermove', handlePointerMove);
|
window.removeEventListener('pointermove', handlePointerMoveHull);
|
||||||
window.removeEventListener('pointerup', handlePointerUp);
|
window.removeEventListener('pointerup', handlePointerUpHull);
|
||||||
|
}
|
||||||
|
function handlePointerMoveTrack(event: PointerEvent) {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
const mesh = object as Mesh;
|
||||||
|
const material = mesh.material as MeshStandardMaterial;
|
||||||
|
const offset = new Vector2(
|
||||||
|
0,
|
||||||
|
-event.movementY * (6 / canvas.height) +
|
||||||
|
event.movementX * (6 / canvas.width),
|
||||||
|
);
|
||||||
|
|
||||||
|
material.map?.offset.add(offset);
|
||||||
|
material.roughnessMap?.offset.add(offset);
|
||||||
|
material.normalMap?.offset.add(offset);
|
||||||
|
}
|
||||||
|
function handlePointerUpTrack() {
|
||||||
|
onTrackEnd();
|
||||||
|
window.removeEventListener('pointermove', handlePointerMoveTrack);
|
||||||
|
window.removeEventListener('pointerup', handlePointerUpTrack);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isVisible) return null;
|
if (!isVisible) return null;
|
||||||
|
|||||||
@@ -146,6 +146,8 @@ export default function Page({ params }: { params: { id: string } }) {
|
|||||||
setControlsEnabled(true);
|
setControlsEnabled(true);
|
||||||
setHullYaw(yaw);
|
setHullYaw(yaw);
|
||||||
}}
|
}}
|
||||||
|
onTrackStart={() => setControlsEnabled(false)}
|
||||||
|
onTrackEnd={() => setControlsEnabled(true)}
|
||||||
>
|
>
|
||||||
<TurretContainer
|
<TurretContainer
|
||||||
gunOrigin={gunOrigin}
|
gunOrigin={gunOrigin}
|
||||||
|
|||||||
Reference in new issue
Block a user