diff --git a/src/bit-systems/scale-when-grabbed-system.ts b/src/bit-systems/scale-when-grabbed-system.ts new file mode 100644 index 0000000000..3806f9f90f --- /dev/null +++ b/src/bit-systems/scale-when-grabbed-system.ts @@ -0,0 +1,22 @@ +import { defineQuery, entityExists, hasComponent } from "bitecs"; +import { HubsWorld } from "../app"; +import { Held, HeldRemoteLeft, HeldRemoteRight } from "../bit-components"; +import { UserInputSystem } from "aframe"; +import { paths } from "../systems/userinput/paths"; + +const heldQuery = defineQuery([Held]); +export function scaleWhenGrabbedSystem(world: HubsWorld, userInput: UserInputSystem) { + heldQuery(world).forEach(eid => { + let deltaScale: number = 0; + if (hasComponent(world, HeldRemoteRight, eid)) { + deltaScale = userInput.get(paths.actions.cursor.right.scaleGrabbedGrabbable); + } + if (hasComponent(world, HeldRemoteLeft, eid)) { + deltaScale = userInput.get(paths.actions.cursor.left.scaleGrabbedGrabbable); + } + if (!deltaScale) return; + const obj = world.eid2obj.get(eid)!; + obj.scale.addScalar(deltaScale).clampScalar(0.1, 100); + obj.matrixNeedsUpdate = true; + }); +} diff --git a/src/systems/hubs-systems.ts b/src/systems/hubs-systems.ts index 45a1e1d82e..96a6e8c86f 100644 --- a/src/systems/hubs-systems.ts +++ b/src/systems/hubs-systems.ts @@ -92,6 +92,7 @@ import { linkedVideoSystem } from "../bit-systems/linked-video-system"; import { linkedPDFSystem } from "../bit-systems/linked-pdf-system"; import { inspectSystem } from "../bit-systems/inspect-system"; import { snapMediaSystem } from "../bit-systems/snap-media-system"; +import { scaleWhenGrabbedSystem } from "../bit-systems/scale-when-grabbed-system"; declare global { interface Window { @@ -286,6 +287,7 @@ export function mainTick(xrFrame: XRFrame, renderer: WebGLRenderer, scene: Scene linkedVideoSystem(world); linkedPDFSystem(world); inspectSystem(world, hubsSystems.cameraSystem); + scaleWhenGrabbedSystem(world, aframeSystems.userinput); objectMenuTransformSystem(world);