mirror of
https://github.com/misskey-dev/misskey.git
synced 2026-03-21 03:30:42 +00:00
wip
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
packages/frontend/assets/room/sfx/remove.mp3
Normal file
BIN
packages/frontend/assets/room/sfx/remove.mp3
Normal file
Binary file not shown.
@@ -18,6 +18,8 @@ SPDX-License-Identifier: AGPL-3.0-only
|
|||||||
<MkButton v-if="engine.ui.isGrabbing || engine.ui.isGrabbingForInstall" @click="rotate"><i class="ti ti-view-360-arrow"></i> (R)</MkButton>
|
<MkButton v-if="engine.ui.isGrabbing || engine.ui.isGrabbingForInstall" @click="rotate"><i class="ti ti-view-360-arrow"></i> (R)</MkButton>
|
||||||
|
|
||||||
<MkButton :primary="engine.enableGridSnapping.value" @click="showSnappingMenu">Grid Snap: {{ engine.enableGridSnapping.value ? 'on' : 'off' }}</MkButton>
|
<MkButton :primary="engine.enableGridSnapping.value" @click="showSnappingMenu">Grid Snap: {{ engine.enableGridSnapping.value ? 'on' : 'off' }}</MkButton>
|
||||||
|
|
||||||
|
<MkButton v-if="!engine.ui.isGrabbing && engine.selected.value != null" @click="removeSelectedObject"><i class="ti ti-trash"></i> (X)</MkButton>
|
||||||
</template>
|
</template>
|
||||||
<MkButton v-if="engine.isSitting.value" @click="engine.standUp()">降りる (Q)</MkButton>
|
<MkButton v-if="engine.isSitting.value" @click="engine.standUp()">降りる (Q)</MkButton>
|
||||||
<template v-for="interaction in interacions" :key="interaction.id">
|
<template v-for="interaction in interacions" :key="interaction.id">
|
||||||
@@ -559,6 +561,11 @@ function addObject(ev: PointerEvent) {
|
|||||||
})), ev.currentTarget ?? ev.target);
|
})), ev.currentTarget ?? ev.target);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function removeSelectedObject() {
|
||||||
|
engine.value?.removeSelectedObject();
|
||||||
|
canvas.value!.focus();
|
||||||
|
}
|
||||||
|
|
||||||
function getHex(c: [number, number, number]) {
|
function getHex(c: [number, number, number]) {
|
||||||
return `#${c.map(x => Math.round(x * 255).toString(16).padStart(2, '0')).join('')}`;
|
return `#${c.map(x => Math.round(x * 255).toString(16).padStart(2, '0')).join('')}`;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -789,7 +789,13 @@ export class RoomEngine {
|
|||||||
}) {
|
}) {
|
||||||
const def = getObjectDef(args.type);
|
const def = getObjectDef(args.type);
|
||||||
|
|
||||||
const camelToKebab = (str: string) => str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();
|
// ex) hangingTShirt -> hanging-t-shirt
|
||||||
|
const camelToKebab = (s: string) => {
|
||||||
|
return s
|
||||||
|
.replace(/([a-z0-9])([A-Z])/g, '$1-$2')
|
||||||
|
.replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')
|
||||||
|
.toLowerCase();
|
||||||
|
};
|
||||||
|
|
||||||
const root = new BABYLON.Mesh(`object_${args.id}_${args.type}`, this.scene);
|
const root = new BABYLON.Mesh(`object_${args.id}_${args.type}`, this.scene);
|
||||||
|
|
||||||
@@ -1208,6 +1214,23 @@ export class RoomEngine {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public removeSelectedObject() {
|
||||||
|
if (this.selected.value == null) return;
|
||||||
|
|
||||||
|
const objectId = this.selected.value.objectId;
|
||||||
|
|
||||||
|
this.objectMeshs.get(objectId)?.dispose();
|
||||||
|
this.objectMeshs.delete(objectId);
|
||||||
|
this.objectInstances.delete(objectId);
|
||||||
|
this.roomState.installedObjects = this.roomState.installedObjects.filter(o => o.id !== objectId);
|
||||||
|
this.selected.value = null;
|
||||||
|
|
||||||
|
sound.playUrl('/client-assets/room/sfx/remove.mp3', {
|
||||||
|
volume: 1,
|
||||||
|
playbackRate: 1,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public changeGrabbingDistance(delta: number) {
|
public changeGrabbingDistance(delta: number) {
|
||||||
if (this.grabbingCtx == null) return;
|
if (this.grabbingCtx == null) return;
|
||||||
this.grabbingCtx.distance -= delta;
|
this.grabbingCtx.distance -= delta;
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import { colorBox } from './objects/colorBox.js';
|
|||||||
import { cupNoodle } from './objects/cupNoodle.js';
|
import { cupNoodle } from './objects/cupNoodle.js';
|
||||||
import { desk } from './objects/desk.js';
|
import { desk } from './objects/desk.js';
|
||||||
import { ductTape } from './objects/ductTape.js';
|
import { ductTape } from './objects/ductTape.js';
|
||||||
|
import { emptyBento } from './objects/emptyBento.js';
|
||||||
import { energyDrink } from './objects/energyDrink.js';
|
import { energyDrink } from './objects/energyDrink.js';
|
||||||
import { facialTissue } from './objects/facialTissue.js';
|
import { facialTissue } from './objects/facialTissue.js';
|
||||||
import { keyboard } from './objects/keyboard.js';
|
import { keyboard } from './objects/keyboard.js';
|
||||||
@@ -71,6 +72,7 @@ export const OBJECT_DEFS = [
|
|||||||
cupNoodle,
|
cupNoodle,
|
||||||
desk,
|
desk,
|
||||||
ductTape,
|
ductTape,
|
||||||
|
emptyBento,
|
||||||
energyDrink,
|
energyDrink,
|
||||||
facialTissue,
|
facialTissue,
|
||||||
keyboard,
|
keyboard,
|
||||||
|
|||||||
21
packages/frontend/src/utility/room/objects/emptyBento.ts
Normal file
21
packages/frontend/src/utility/room/objects/emptyBento.ts
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { defineObject } from '../engine.js';
|
||||||
|
|
||||||
|
export const emptyBento = defineObject({
|
||||||
|
id: 'emptyBento',
|
||||||
|
name: 'Empty Bento',
|
||||||
|
options: {
|
||||||
|
schema: {},
|
||||||
|
default: {},
|
||||||
|
},
|
||||||
|
placement: 'top',
|
||||||
|
createInstance: () => {
|
||||||
|
return {
|
||||||
|
interactions: {},
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user