refactor XR controller handling in design mode

This commit is contained in:
2026-04-18 15:23:49 +03:00
parent 99ba537c66
commit c611cb6439
11 changed files with 78 additions and 65 deletions
+37 -5
View File
@@ -148,6 +148,7 @@ export default {
value: s.data.id
}))
window.addEventListener('resize', this.resize);
engine.addEventListener('controller', this.onController);
},
async unmounted(){
@@ -249,14 +250,45 @@ export default {
}));
},
onController(event){
engine.transformControls.getRaycaster().setFromXRController(event.data.target);
switch (event.data.type) {
case 'selectstart':
engine.transformControls.pointerDown(null);
break;
case 'selectend':
engine.transformControls.pointerUp(null);
break;
case 'move':
engine.transformControls.pointerHover(null);
engine.transformControls.pointerMove(null);
break;
case 'select':
this.intersect();
break;
}
},
targetClick(e){
if (performance.now() - this.pointerDownTime < 200){
let intersects = engine.intersect(e, this.$refs.target, this.flatObjects.map(o=>o.value.__o), true);
if (intersects.length){
this.selectObject(intersects[0].object.__pn_id)
}else{
engine.transformControls.detach();
let mouse = engine.getMouseVector(e, this.$refs.target);
engine.transformControls.getRaycaster().setFromCamera(mouse, engine.camera);
this.intersect()
}
},
intersect(){
let objects = this.flatObjects.map(o=>o.value.__o).filter(o => o.visible);
let intersects = engine.transformControls.getRaycaster().intersectObjects(objects, true);
intersects.forEach(o => {
while (o.object && !objects.includes(o.object)) {
o.object = o.object.parent;
}
})
if (intersects.length){
this.selectObject(intersects[0].object.__pn_id)
}else{
engine.transformControls.detach();
}
},
-1
View File
@@ -53,7 +53,6 @@ export default {
resize(){
let r = this.$refs.target;
this.debug('resizing', r.clientWidth, r.clientHeight, r)
engine.resize(r.clientWidth, r.clientHeight);
},
+1 -2
View File
@@ -40,7 +40,7 @@ export default {
xr: true,
gizmo: false,
stats: true,
depthSense: this.store.prefs.xr.depthSense,
//depthSense: this.store.prefs.xr.depthSense,
mode: 'GamePreview'
});
manager = await new GameManager(engine, this.id);
@@ -75,7 +75,6 @@ export default {
},
resize(){
let r = this.$refs.target;
this.debug('resizing', r.clientWidth, r.clientHeight, r)
engine.resize(r.clientWidth, r.clientHeight);
},