refactor pointerControls, move away from hero to gameEngine
This commit is contained in:
@@ -8,6 +8,7 @@ import { StereoEffect } from 'three/addons/effects/StereoEffect.js';
|
|||||||
// import { MapControls } from 'three/addons/controls/MapControls.js';
|
// import { MapControls } from 'three/addons/controls/MapControls.js';
|
||||||
// import { FirstPersonControls } from 'three/addons/controls/FirstPersonControls.js';
|
// import { FirstPersonControls } from 'three/addons/controls/FirstPersonControls.js';
|
||||||
import { TransformControls } from 'three/addons/controls/TransformControls.js';
|
import { TransformControls } from 'three/addons/controls/TransformControls.js';
|
||||||
|
import { PointerControls } from './PointerControls';
|
||||||
import { ARButton } from 'three/addons/webxr/ARButton.js';
|
import { ARButton } from 'three/addons/webxr/ARButton.js';
|
||||||
import { XRButton } from 'three/addons/webxr/XRButton.js';
|
import { XRButton } from 'three/addons/webxr/XRButton.js';
|
||||||
import { XRControllerModelFactory } from 'three/addons/webxr/XRControllerModelFactory.js';
|
import { XRControllerModelFactory } from 'three/addons/webxr/XRControllerModelFactory.js';
|
||||||
@@ -140,6 +141,8 @@ class GameEngine extends EventManager{
|
|||||||
this.transformControls.addEventListener('dragging-changed', function (event) {
|
this.transformControls.addEventListener('dragging-changed', function (event) {
|
||||||
controls.enabled = !event.value;
|
controls.enabled = !event.value;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.pointerControls = new PointerControls(this.camera, renderer.domElement);
|
||||||
// controls.enableDamping = true;
|
// controls.enableDamping = true;
|
||||||
// controls.screenSpacePanning = true;
|
// controls.screenSpacePanning = true;
|
||||||
|
|
||||||
@@ -150,9 +153,9 @@ class GameEngine extends EventManager{
|
|||||||
function animate(time) {
|
function animate(time) {
|
||||||
let delta = clock.getDelta();
|
let delta = clock.getDelta();
|
||||||
gameEngine.physics?.step();
|
gameEngine.physics?.step();
|
||||||
|
gameEngine.handleXrAction(gameEngine, delta);
|
||||||
gameEngine.hero?.update(delta);
|
gameEngine.hero?.update(delta);
|
||||||
gameEngine.mixers.forEach(m => m.update(delta));
|
gameEngine.mixers.forEach(m => m.update(delta));
|
||||||
gameEngine.handleXrAction(gameEngine, delta)
|
|
||||||
gameEngine.dispatchEvent({type: 'beforeRender'})
|
gameEngine.dispatchEvent({type: 'beforeRender'})
|
||||||
this.motionQueue.update(delta);
|
this.motionQueue.update(delta);
|
||||||
|
|
||||||
@@ -190,7 +193,7 @@ class GameEngine extends EventManager{
|
|||||||
renderer.domElement.addEventListener('wheel', (event) => {
|
renderer.domElement.addEventListener('wheel', (event) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
if (gameEngine.hero){
|
if (gameEngine.hero){
|
||||||
if (!gameEngine.hero.pointerControls.controls.isLocked){
|
if (!gameEngine.pointerControls.controls.isLocked){
|
||||||
gameEngine.hero.cameraZ += event.deltaY / 100;
|
gameEngine.hero.cameraZ += event.deltaY / 100;
|
||||||
}else{
|
}else{
|
||||||
gameEngine.camera.fov += event.deltaY / 100;
|
gameEngine.camera.fov += event.deltaY / 100;
|
||||||
@@ -307,7 +310,9 @@ class GameEngine extends EventManager{
|
|||||||
await this.physics.init();
|
await this.physics.init();
|
||||||
}
|
}
|
||||||
|
|
||||||
handleXrActionGameMode(gameEngine, delta) {}
|
handleXrActionGameMode(gameEngine, delta) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
handleXrActionDesignMode(gameEngine, delta) {
|
handleXrActionDesignMode(gameEngine, delta) {
|
||||||
if (gameEngine.xrController2?.gamepad) {
|
if (gameEngine.xrController2?.gamepad) {
|
||||||
|
|||||||
+5
-20
@@ -1,5 +1,4 @@
|
|||||||
import { AnimationMixer, Vector3 } from 'three';
|
import { AnimationMixer, Vector3 } from 'three';
|
||||||
import { PointerControls } from './PointerControls';
|
|
||||||
import { getBoundingBox, getBoundingBoxSize } from './MeshUtils';
|
import { getBoundingBox, getBoundingBoxSize } from './MeshUtils';
|
||||||
import { QueryFilterFlags } from '@dimforge/rapier3d';
|
import { QueryFilterFlags } from '@dimforge/rapier3d';
|
||||||
|
|
||||||
@@ -15,7 +14,7 @@ class Hero{
|
|||||||
set cameraZ(v){
|
set cameraZ(v){
|
||||||
this.#cameraZ = Math.min(Math.max(v, 1), 12);
|
this.#cameraZ = Math.min(Math.max(v, 1), 12);
|
||||||
if (this.#cameraZ == 1){
|
if (this.#cameraZ == 1){
|
||||||
this.lockControls().then(()=>{
|
this.engine.pointerControls.lock(true).then(()=>{
|
||||||
this.#cameraZ = 0;
|
this.#cameraZ = 0;
|
||||||
}).catch(err=>{
|
}).catch(err=>{
|
||||||
console.log(err);
|
console.log(err);
|
||||||
@@ -41,9 +40,8 @@ class Hero{
|
|||||||
this.animationsMap = {};
|
this.animationsMap = {};
|
||||||
this.source.animations.forEach(a=>{
|
this.source.animations.forEach(a=>{
|
||||||
this.animationsMap[a.name] = this.mixer.clipAction(a);
|
this.animationsMap[a.name] = this.mixer.clipAction(a);
|
||||||
})
|
})
|
||||||
|
|
||||||
this.pointerControls = new PointerControls(engine.camera, this.model, engine.renderer.domElement);
|
|
||||||
engine.hero = this;
|
engine.hero = this;
|
||||||
|
|
||||||
// let bb = this.model.userData.bbox;
|
// let bb = this.model.userData.bbox;
|
||||||
@@ -89,15 +87,9 @@ class Hero{
|
|||||||
this.ready = true;
|
this.ready = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
lockControls(){
|
|
||||||
return this.pointerControls.lock(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
update(delta){
|
update(delta){
|
||||||
if (this.ready && this.engine.physics.started && !this.disableInput && !this.engine.renderer.xr.isPresenting) {
|
if (this.ready && this.engine.physics.started && !this.disableInput && !this.engine.renderer.xr.isPresenting) {
|
||||||
let pc = this.pointerControls;
|
this.updateCharacterControls(delta)
|
||||||
pc.update();
|
|
||||||
this.updateCharacterControls(delta, pc)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,7 +99,7 @@ class Hero{
|
|||||||
}
|
}
|
||||||
|
|
||||||
updateCharacterControls(delta) {
|
updateCharacterControls(delta) {
|
||||||
let pc = this.pointerControls;
|
let pc = this.engine.pointerControls;
|
||||||
if (pc.controls.isLocked && this.model.visible){
|
if (pc.controls.isLocked && this.model.visible){
|
||||||
this.model.visible = false;
|
this.model.visible = false;
|
||||||
this.camera.rotation.reorder('YZX');
|
this.camera.rotation.reorder('YZX');
|
||||||
@@ -118,7 +110,7 @@ class Hero{
|
|||||||
this.camera.fov = 45;
|
this.camera.fov = 45;
|
||||||
this.camera.updateProjectionMatrix();
|
this.camera.updateProjectionMatrix();
|
||||||
}
|
}
|
||||||
let input = this.getInput()
|
let input = pc.input;
|
||||||
|
|
||||||
let play = this.currentAction || 'idle', velocity = this.walkVelocity;
|
let play = this.currentAction || 'idle', velocity = this.walkVelocity;
|
||||||
this.fadeDuration = 0.2;
|
this.fadeDuration = 0.2;
|
||||||
@@ -247,13 +239,6 @@ class Hero{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getInput() {
|
|
||||||
return [
|
|
||||||
this.pointerControls.moveLeft * 1 + this.pointerControls.moveRight * -1,
|
|
||||||
this.pointerControls.moveForward * 1 + this.pointerControls.moveBackward * -1
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
idleReset(){
|
idleReset(){
|
||||||
this.actionStart = -1;
|
this.actionStart = -1;
|
||||||
//this.currentAction = 'idle'
|
//this.currentAction = 'idle'
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { Vector3 } from 'three';
|
|||||||
import { PointerLockControls } from 'three/examples/jsm/Addons.js';
|
import { PointerLockControls } from 'three/examples/jsm/Addons.js';
|
||||||
|
|
||||||
class PointerControls {
|
class PointerControls {
|
||||||
constructor(camera, hero, domElement) {
|
constructor(camera, domElement) {
|
||||||
this.kb = {};
|
this.kb = {};
|
||||||
this.dom = domElement;
|
this.dom = domElement;
|
||||||
|
|
||||||
@@ -14,7 +14,6 @@ class PointerControls {
|
|||||||
this.rvelo = 0;
|
this.rvelo = 0;
|
||||||
|
|
||||||
this.camera = camera;
|
this.camera = camera;
|
||||||
this.hero = hero;
|
|
||||||
this.click = false;
|
this.click = false;
|
||||||
|
|
||||||
this.controls = new PointerLockControls(camera, domElement);
|
this.controls = new PointerLockControls(camera, domElement);
|
||||||
@@ -117,6 +116,13 @@ class PointerControls {
|
|||||||
return this.moving && this.kb.ShiftLeft;
|
return this.moving && this.kb.ShiftLeft;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get input() {
|
||||||
|
return [
|
||||||
|
this.moveLeft * 1 + this.moveRight * -1,
|
||||||
|
this.moveForward * 1 + this.moveBackward * -1
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
async lock(unadjustedMovement = false){
|
async lock(unadjustedMovement = false){
|
||||||
await this.dom.requestPointerLock( {
|
await this.dom.requestPointerLock( {
|
||||||
unadjustedMovement
|
unadjustedMovement
|
||||||
|
|||||||
@@ -306,7 +306,7 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
control(){
|
control(){
|
||||||
engine.hero.lockControls();
|
engine.pointerControls.lock(true);
|
||||||
},
|
},
|
||||||
|
|
||||||
async fullScreen(){
|
async fullScreen(){
|
||||||
|
|||||||
Reference in New Issue
Block a user