1
0
mirror of https://github.com/misskey-dev/misskey.git synced 2026-06-05 09:24:10 +02:00

Update engine.ts

This commit is contained in:
syuilo
2026-02-13 16:44:47 +09:00
parent 3a02ae8b28
commit 82f68f1e93

View File

@@ -435,7 +435,8 @@ export class RoomEngine {
mesh: BABYLON.AbstractMesh; mesh: BABYLON.AbstractMesh;
startOffset: BABYLON.Vector3; startOffset: BABYLON.Vector3;
startRotationY: number; startRotationY: number;
startDistance: number; distance: number;
rotation: number;
ghost: BABYLON.AbstractMesh; ghost: BABYLON.AbstractMesh;
descendantStickyObjectIds: string[]; descendantStickyObjectIds: string[];
isMainLight: boolean; isMainLight: boolean;
@@ -662,6 +663,21 @@ export class RoomEngine {
ev.preventDefault(); ev.preventDefault();
ev.stopPropagation(); ev.stopPropagation();
this.toggleGrab(); this.toggleGrab();
} else if (ev.code === 'KeyR') {
ev.preventDefault();
ev.stopPropagation();
if (this.grabbing != null) {
this.grabbing.rotation += Math.PI / 8;
}
}
});
this.canvas.addEventListener('wheel', (ev) => {
if (this.grabbing != null) {
ev.preventDefault();
ev.stopPropagation();
this.grabbing.distance -= ev.deltaY * 0.025;
if (this.grabbing.distance < 5/*cm*/) this.grabbing.distance = 5/*cm*/;
} }
}); });
@@ -773,9 +789,11 @@ export class RoomEngine {
if (this.grabbing == null) return; if (this.grabbing == null) return;
const grabbing = this.grabbing; const grabbing = this.grabbing;
const placement = OBJECTS[this.def.objects.find(o => o.id === grabbing.objectId)!.type].placement;
const dir = this.camera.getDirection(BABYLON.Axis.Z); const dir = this.camera.getDirection(BABYLON.Axis.Z);
grabbing.ghost.position = this.camera.position.add(dir.scale(grabbing.startDistance)).add(grabbing.startOffset); grabbing.ghost.position = this.camera.position.add(dir.scale(grabbing.distance)).add(grabbing.startOffset);
grabbing.ghost.rotation = new BABYLON.Vector3(0, this.camera.rotation.y + grabbing.startRotationY, 0); grabbing.ghost.rotation = new BABYLON.Vector3(0, this.camera.rotation.y + grabbing.startRotationY + grabbing.rotation, 0);
if (this.enableGridSnapping) { if (this.enableGridSnapping) {
grabbing.ghost.position.x = Math.round(grabbing.ghost.position.x / this.gridSnappingScale) * this.gridSnappingScale; grabbing.ghost.position.x = Math.round(grabbing.ghost.position.x / this.gridSnappingScale) * this.gridSnappingScale;
@@ -794,7 +812,6 @@ export class RoomEngine {
!grabbing.descendantStickyObjectIds.includes(m.metadata?.objectId); !grabbing.descendantStickyObjectIds.includes(m.metadata?.objectId);
}; };
const placement = OBJECTS[this.def.objects.find(o => o.id === grabbing.objectId)!.type].placement;
if (placement === 'side') { if (placement === 'side') {
// 前方に向かってレイを飛ばす // 前方に向かってレイを飛ばす
const ray = new BABYLON.Ray(this.camera.position, dir, 1000/*cm*/); const ray = new BABYLON.Ray(this.camera.position, dir, 1000/*cm*/);
@@ -1004,6 +1021,7 @@ export class RoomEngine {
//this.grabbing.ghost.dispose(false, true); //this.grabbing.ghost.dispose(false, true);
this.grabbing.ghost.dispose(false, false); this.grabbing.ghost.dispose(false, false);
this.grabbing = null; this.grabbing = null;
this.selectObject(null);
sound.playUrl('/client-assets/room/sfx/put.mp3', { sound.playUrl('/client-assets/room/sfx/put.mp3', {
volume: 1, volume: 1,
@@ -1021,7 +1039,7 @@ export class RoomEngine {
for (const om of selectedObject.getChildMeshes()) { for (const om of selectedObject.getChildMeshes()) {
om.renderOutline = false; om.renderOutline = false;
} }
const startDistance = BABYLON.Vector3.Distance(this.camera.position, selectedObject.position); const distance = BABYLON.Vector3.Distance(this.camera.position, selectedObject.position);
const ghost = selectedObject.clone('ghost', null, false)!; const ghost = selectedObject.clone('ghost', null, false)!;
ghost.metadata = { isGhost: true }; ghost.metadata = { isGhost: true };
for (const m of ghost.getChildMeshes()) { for (const m of ghost.getChildMeshes()) {
@@ -1060,9 +1078,10 @@ export class RoomEngine {
this.grabbing = { this.grabbing = {
objectId: selectedObject.metadata.objectId, objectId: selectedObject.metadata.objectId,
mesh: selectedObject, mesh: selectedObject,
startOffset: selectedObject.position.subtract(this.camera.position.add(this.camera.getDirection(BABYLON.Axis.Z).scale(startDistance))), startOffset: selectedObject.position.subtract(this.camera.position.add(this.camera.getDirection(BABYLON.Axis.Z).scale(distance))),
startRotationY: selectedObject.rotation.subtract(this.camera.rotation).y, startRotationY: selectedObject.rotation.subtract(this.camera.rotation).y,
startDistance: startDistance, distance: distance,
rotation: 0,
ghost: ghost, ghost: ghost,
descendantStickyObjectIds, descendantStickyObjectIds,
isMainLight: this.def.objects.find(o => o.id === selectedObject.metadata.objectId)?.isMainLight ?? false, isMainLight: this.def.objects.find(o => o.id === selectedObject.metadata.objectId)?.isMainLight ?? false,