This commit is contained in:
@@ -8,7 +8,7 @@ class Clickable {
|
|||||||
|
|
||||||
this.add = function (object, fn, distance) {
|
this.add = function (object, fn, distance) {
|
||||||
objects.push(object);
|
objects.push(object);
|
||||||
object._clickable = { fn, distance: distance || defaultDistance };
|
object._clickable = { fn, distance: (distance || defaultDistance) * engine.scale };
|
||||||
};
|
};
|
||||||
|
|
||||||
this.remove = function (object) {
|
this.remove = function (object) {
|
||||||
@@ -42,7 +42,7 @@ class Clickable {
|
|||||||
return true;
|
return true;
|
||||||
}).forEach(o => {
|
}).forEach(o => {
|
||||||
o.getWorldPosition(v);
|
o.getWorldPosition(v);
|
||||||
if (cv.distanceTo(v) <= o._clickable.distance / engine.scale) {
|
if (cv.distanceTo(v) <= o._clickable.distance) {
|
||||||
const intersects = raycaster.intersectObject(o);
|
const intersects = raycaster.intersectObject(o);
|
||||||
if (intersects[0]) {
|
if (intersects[0]) {
|
||||||
forExecute.push({ o, i: intersects[0] });
|
forExecute.push({ o, i: intersects[0] });
|
||||||
@@ -54,6 +54,10 @@ class Clickable {
|
|||||||
sorted[0].o._clickable.fn(sorted[0].i);
|
sorted[0].o._clickable.fn(sorted[0].i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.trigger = function(o){
|
||||||
|
o._clickable.fn();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+19
-2
@@ -1,5 +1,5 @@
|
|||||||
import {
|
import {
|
||||||
PlaneGeometry, CylinderGeometry, Group, SphereGeometry,
|
Group, PlaneGeometry, CylinderGeometry, SphereGeometry, RingGeometry,
|
||||||
Mesh, MeshStandardMaterial, MeshBasicMaterial, DoubleSide
|
Mesh, MeshStandardMaterial, MeshBasicMaterial, DoubleSide
|
||||||
} from "three";
|
} from "three";
|
||||||
|
|
||||||
@@ -9,6 +9,7 @@ import Utils from "#/app/Utils";
|
|||||||
import { TextObject } from "@/components/InteractiveObjects/TextObject/TextObject";
|
import { TextObject } from "@/components/InteractiveObjects/TextObject/TextObject";
|
||||||
class DashBoard extends EventManager {
|
class DashBoard extends EventManager {
|
||||||
#points = 0;
|
#points = 0;
|
||||||
|
#attached = null;
|
||||||
constructor(engine) {
|
constructor(engine) {
|
||||||
super();
|
super();
|
||||||
let levelProgress;
|
let levelProgress;
|
||||||
@@ -64,8 +65,11 @@ class DashBoard extends EventManager {
|
|||||||
})
|
})
|
||||||
);
|
);
|
||||||
hudPlane.position.z = -0.07 * dashHeight;
|
hudPlane.position.z = -0.07 * dashHeight;
|
||||||
hudPlane.position.y = -0.011 * dashHeight
|
hudPlane.position.y = -0.011 * dashHeight;
|
||||||
hud.add(hudPlane)
|
hud.add(hudPlane)
|
||||||
|
engine.clickable.add(hudPlane, ()=>{
|
||||||
|
engine.clickable.trigger(this.#attached.object)
|
||||||
|
})
|
||||||
|
|
||||||
textPlane = new Mesh(
|
textPlane = new Mesh(
|
||||||
new PlaneGeometry(dashWidth * 0.86, 0.15 * dashHeight),
|
new PlaneGeometry(dashWidth * 0.86, 0.15 * dashHeight),
|
||||||
@@ -116,6 +120,16 @@ class DashBoard extends EventManager {
|
|||||||
dash.translateZ(-dashDistance -0.75/Math.tan(engine.camera.fov/2 * Math.PI/180) * engine.camera.zoom);
|
dash.translateZ(-dashDistance -0.75/Math.tan(engine.camera.fov/2 * Math.PI/180) * engine.camera.zoom);
|
||||||
//})
|
//})
|
||||||
|
|
||||||
|
this.pointer = new Mesh(
|
||||||
|
new RingGeometry(dashHeight * 0.002, dashHeight * 0.005),
|
||||||
|
new MeshBasicMaterial( { color: 0xffff00, depthTest: false } )
|
||||||
|
);
|
||||||
|
this.pointer.visible = false;
|
||||||
|
this.pointer.renderOrder = 1010;
|
||||||
|
const pointerWrapper = new Group();
|
||||||
|
pointerWrapper.add(this.pointer);
|
||||||
|
dash.add(pointerWrapper);
|
||||||
|
|
||||||
this.initScene = function(scene, startBtnCallback){
|
this.initScene = function(scene, startBtnCallback){
|
||||||
this.loading(0,0);
|
this.loading(0,0);
|
||||||
sceneHeader.init(scene, startBtnCallback);
|
sceneHeader.init(scene, startBtnCallback);
|
||||||
@@ -221,6 +235,7 @@ class DashBoard extends EventManager {
|
|||||||
this.cameraFix = engine.hero.cameraZ;
|
this.cameraFix = engine.hero.cameraZ;
|
||||||
engine.hero.cameraZ = 6;
|
engine.hero.cameraZ = 6;
|
||||||
hud.visible = true;
|
hud.visible = true;
|
||||||
|
pointerWrapper.visible = false;
|
||||||
hudPlane.visible = !!opts.plane;
|
hudPlane.visible = !!opts.plane;
|
||||||
if (opts.plane){
|
if (opts.plane){
|
||||||
hudPlane.scale.set(0, .1, 1);
|
hudPlane.scale.set(0, .1, 1);
|
||||||
@@ -247,6 +262,7 @@ class DashBoard extends EventManager {
|
|||||||
}
|
}
|
||||||
hudTarget.attach(object);
|
hudTarget.attach(object);
|
||||||
occupied = true;
|
occupied = true;
|
||||||
|
this.#attached = {object, opts};
|
||||||
|
|
||||||
let result = new Promise((resolve, reject)=>{
|
let result = new Promise((resolve, reject)=>{
|
||||||
engine.motionQueue.add({
|
engine.motionQueue.add({
|
||||||
@@ -277,6 +293,7 @@ class DashBoard extends EventManager {
|
|||||||
|
|
||||||
this.detach = (object, opts = {})=>{
|
this.detach = (object, opts = {})=>{
|
||||||
engine.hero.cameraZ = this.cameraFix;
|
engine.hero.cameraZ = this.cameraFix;
|
||||||
|
pointerWrapper.visible = true;
|
||||||
//console.log('detaching', object)
|
//console.log('detaching', object)
|
||||||
engine.motionQueue.remove(hudAnimation);
|
engine.motionQueue.remove(hudAnimation);
|
||||||
object._hud.parent?.attach(object);
|
object._hud.parent?.attach(object);
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ class Draggable{
|
|||||||
let dragging = null;
|
let dragging = null;
|
||||||
this.add = function(object, dragZone, fn, distance){
|
this.add = function(object, dragZone, fn, distance){
|
||||||
objects.push(object);
|
objects.push(object);
|
||||||
object._draggable = {fn, dragZone, distance: distance || defaultDistance}
|
object._draggable = {fn, dragZone, distance: (distance || defaultDistance) * engine.scale}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.remove = function(object){
|
this.remove = function(object){
|
||||||
@@ -38,7 +38,7 @@ class Draggable{
|
|||||||
return true;
|
return true;
|
||||||
}).forEach(o=>{
|
}).forEach(o=>{
|
||||||
o.getWorldPosition(v);
|
o.getWorldPosition(v);
|
||||||
if (cv.distanceTo(v) <= o._draggable.distance / engine.scale){
|
if (cv.distanceTo(v) <= o._draggable.distance){
|
||||||
const intersects = raycaster.intersectObject(o);
|
const intersects = raycaster.intersectObject(o);
|
||||||
if (intersects[0]) forExecute.push({o, i:intersects[0]})
|
if (intersects[0]) forExecute.push({o, i:intersects[0]})
|
||||||
}
|
}
|
||||||
|
|||||||
+15
-4
@@ -26,6 +26,7 @@ THREE.Cache.enabled = true
|
|||||||
|
|
||||||
const assetPath = '/asset/default/';
|
const assetPath = '/asset/default/';
|
||||||
const defaultLightIntensity = 11;
|
const defaultLightIntensity = 11;
|
||||||
|
const defaultInteractionDistance = 10;
|
||||||
const sceneScale = 1.33;
|
const sceneScale = 1.33;
|
||||||
|
|
||||||
class GameEngine extends EventManager{
|
class GameEngine extends EventManager{
|
||||||
@@ -227,8 +228,8 @@ class GameEngine extends EventManager{
|
|||||||
this.initXr();
|
this.initXr();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.clickable = new Clickable(this, 20);
|
this.clickable = new Clickable(this, defaultInteractionDistance);
|
||||||
this.draggable = new Draggable(this, 20);
|
this.draggable = new Draggable(this, defaultInteractionDistance);
|
||||||
|
|
||||||
await this.initScene();
|
await this.initScene();
|
||||||
|
|
||||||
@@ -545,14 +546,24 @@ class GameEngine extends EventManager{
|
|||||||
}
|
}
|
||||||
|
|
||||||
onClick(mouseEvent, domElement){
|
onClick(mouseEvent, domElement){
|
||||||
let mouse = this.getMouseVector(mouseEvent, domElement);
|
let mouse;
|
||||||
|
if (this.pointerControls.isLocked){
|
||||||
|
mouse = new THREE.Vector3(0,0,0);
|
||||||
|
}else{
|
||||||
|
mouse = this.getMouseVector(mouseEvent, domElement);
|
||||||
|
}
|
||||||
//this.raycaster.setFromCamera(mouse, this.camera);
|
//this.raycaster.setFromCamera(mouse, this.camera);
|
||||||
this.clickable.handleMouse(mouse, mouseEvent);
|
this.clickable.handleMouse(mouse, mouseEvent);
|
||||||
this.hero?.idleReset();
|
this.hero?.idleReset();
|
||||||
}
|
}
|
||||||
|
|
||||||
onPointer(mouseEvent, domElement, type){
|
onPointer(mouseEvent, domElement, type){
|
||||||
let mouse = this.getMouseVector(mouseEvent, domElement);
|
let mouse;
|
||||||
|
if (this.pointerControls.isLocked){
|
||||||
|
mouse = new THREE.Vector3(0,0,0);
|
||||||
|
}else{
|
||||||
|
mouse = this.getMouseVector(mouseEvent, domElement);
|
||||||
|
}
|
||||||
this.draggable?.handleMouse(mouse, type);
|
this.draggable?.handleMouse(mouse, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,9 +28,11 @@ class Hero{
|
|||||||
this.#cameraZ = 0;
|
this.#cameraZ = 0;
|
||||||
this.fpv = true;
|
this.fpv = true;
|
||||||
this.cameraY = this.cameraYBase;
|
this.cameraY = this.cameraYBase;
|
||||||
|
this.engine.dashboard.pointer.visible = true;
|
||||||
this.engine.pointerControls.once('unlock', ()=>{
|
this.engine.pointerControls.once('unlock', ()=>{
|
||||||
this.fpv = false;
|
this.fpv = false;
|
||||||
this.cameraY = this.cameraYBase * 1.5;
|
this.cameraY = this.cameraYBase * 1.5;
|
||||||
|
this.engine.dashboard.pointer.visible = false;
|
||||||
})
|
})
|
||||||
}).catch(err=>{
|
}).catch(err=>{
|
||||||
console.log(err);
|
console.log(err);
|
||||||
|
|||||||
Reference in New Issue
Block a user