wip
1
packages/frontend/assets/room/object-thumbs/README.md
Normal file
@@ -0,0 +1 @@
|
||||
これらのサムネイルはdev buildでRoomのカタログダイアログを表示し家具を選択した状態でブラウザのコンソールで`takeScreenshot();`を叩くと生成・ダウンロードできます
|
||||
BIN
packages/frontend/assets/room/object-thumbs/a4-case.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
packages/frontend/assets/room/object-thumbs/aircon.png
Normal file
|
After Width: | Height: | Size: 9.8 KiB |
BIN
packages/frontend/assets/room/object-thumbs/all-in-one-pc.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 23 KiB |
BIN
packages/frontend/assets/room/object-thumbs/banknote.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
packages/frontend/assets/room/object-thumbs/beam-lamp.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
packages/frontend/assets/room/object-thumbs/bed.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
packages/frontend/assets/room/object-thumbs/blind.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
packages/frontend/assets/room/object-thumbs/books.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
packages/frontend/assets/room/object-thumbs/box-wall-shelf.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
packages/frontend/assets/room/object-thumbs/cactus-s.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
packages/frontend/assets/room/object-thumbs/cardboard-box.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 12 KiB |
BIN
packages/frontend/assets/room/object-thumbs/chair.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
packages/frontend/assets/room/object-thumbs/coffee-cup.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
packages/frontend/assets/room/object-thumbs/color-box.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
packages/frontend/assets/room/object-thumbs/cup-noodle.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
packages/frontend/assets/room/object-thumbs/custard-pudding.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
packages/frontend/assets/room/object-thumbs/desk.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
packages/frontend/assets/room/object-thumbs/desktop-pc.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
packages/frontend/assets/room/object-thumbs/dj-mixer.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
packages/frontend/assets/room/object-thumbs/dj-player.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
packages/frontend/assets/room/object-thumbs/duct-tape.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
packages/frontend/assets/room/object-thumbs/empty-bento.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
packages/frontend/assets/room/object-thumbs/energy-drink.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
packages/frontend/assets/room/object-thumbs/envelope.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
packages/frontend/assets/room/object-thumbs/facial-tissue.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
packages/frontend/assets/room/object-thumbs/hanging-t-shirt.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
packages/frontend/assets/room/object-thumbs/icosahedron.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 18 KiB |
BIN
packages/frontend/assets/room/object-thumbs/iron-frame-table.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
packages/frontend/assets/room/object-thumbs/keyboard.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
packages/frontend/assets/room/object-thumbs/laptop-pc.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
packages/frontend/assets/room/object-thumbs/lava-lamp.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
packages/frontend/assets/room/object-thumbs/letter-case.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
packages/frontend/assets/room/object-thumbs/mi-objet.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 18 KiB |
BIN
packages/frontend/assets/room/object-thumbs/mi-plate.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
packages/frontend/assets/room/object-thumbs/milk.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
packages/frontend/assets/room/object-thumbs/mixer.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
packages/frontend/assets/room/object-thumbs/monitor-speaker.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
packages/frontend/assets/room/object-thumbs/monitor.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
packages/frontend/assets/room/object-thumbs/monstera.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
packages/frontend/assets/room/object-thumbs/mug.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
packages/frontend/assets/room/object-thumbs/newtons-cradle.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
packages/frontend/assets/room/object-thumbs/pachira.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
packages/frontend/assets/room/object-thumbs/pet-bottle.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
packages/frontend/assets/room/object-thumbs/piano.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
packages/frontend/assets/room/object-thumbs/picture-frame.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
packages/frontend/assets/room/object-thumbs/pizza.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
packages/frontend/assets/room/object-thumbs/plant.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
packages/frontend/assets/room/object-thumbs/poster.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
packages/frontend/assets/room/object-thumbs/power-strip.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
packages/frontend/assets/room/object-thumbs/radiometer.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
packages/frontend/assets/room/object-thumbs/random-books.png
Normal file
|
After Width: | Height: | Size: 53 KiB |
BIN
packages/frontend/assets/room/object-thumbs/round-rug.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
packages/frontend/assets/room/object-thumbs/router.png
Normal file
|
After Width: | Height: | Size: 9.7 KiB |
BIN
packages/frontend/assets/room/object-thumbs/siphon.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
packages/frontend/assets/room/object-thumbs/snakeplant.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
packages/frontend/assets/room/object-thumbs/speaker-stand.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
packages/frontend/assets/room/object-thumbs/speaker.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
packages/frontend/assets/room/object-thumbs/sprayer.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
packages/frontend/assets/room/object-thumbs/steel-rack.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 16 KiB |
BIN
packages/frontend/assets/room/object-thumbs/tabletop-flag.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 8.9 KiB |
|
After Width: | Height: | Size: 26 KiB |
BIN
packages/frontend/assets/room/object-thumbs/tapestry.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
packages/frontend/assets/room/object-thumbs/tetrapod.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 52 KiB |
BIN
packages/frontend/assets/room/object-thumbs/used-tissue.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
packages/frontend/assets/room/object-thumbs/wall-canvas.png
Normal file
|
After Width: | Height: | Size: 5.7 KiB |
BIN
packages/frontend/assets/room/object-thumbs/wall-clock.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 13 KiB |
BIN
packages/frontend/assets/room/object-thumbs/wall-mirror.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
packages/frontend/assets/room/object-thumbs/wall-shelf.png
Normal file
|
After Width: | Height: | Size: 5.7 KiB |
|
After Width: | Height: | Size: 7.3 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 15 KiB |
@@ -17,18 +17,20 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||
<template #header><i class="ti ti-box"></i> カタログ</template>
|
||||
|
||||
<div :class="$style.root">
|
||||
<div :class="$style.container">
|
||||
<div :class="$style.menu">
|
||||
<div
|
||||
v-for="def in OBJECT_DEFS"
|
||||
:key="def.id"
|
||||
:class="[$style.catalogItem, { [$style.selected]: selectedId === def.id }]"
|
||||
@click="selectedId = def.id"
|
||||
>
|
||||
<div>{{ def.name }}</div>
|
||||
</div>
|
||||
<div :class="$style.catalogItems">
|
||||
<div
|
||||
v-for="def in OBJECT_DEFS"
|
||||
:key="def.id"
|
||||
:class="[$style.catalogItem, { [$style.selected]: selectedId === def.id }]"
|
||||
@click="selectedId = def.id"
|
||||
>
|
||||
<img :class="$style.catalogItemThumbnail" :src="`/client-assets/room/object-thumbs/${camelToKebab(def.id)}.png`"/>
|
||||
<div :class="$style.catalogItemName">{{ def.name }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-show="selectedId != null" :class="$style.preview" class="_panel">
|
||||
<canvas ref="canvas" :class="$style.canvas"></canvas>
|
||||
<button :class="$style.unselectButton" @click="selectedId = null">x</button>
|
||||
</div>
|
||||
</div>
|
||||
</MkModalWindow>
|
||||
@@ -41,6 +43,7 @@ import MkModalWindow from '@/components/MkModalWindow.vue';
|
||||
import * as os from '@/os.js';
|
||||
import { OBJECT_DEFS } from '@/world/room/object-defs.js';
|
||||
import { createRoomObjectPreviewEngine, RoomObjectPreviewEngine } from '@/world/room/previewEngine.js';
|
||||
import { camelToKebab } from '@/world/utility.js';
|
||||
|
||||
const emit = defineEmits<{
|
||||
(ev: 'ok', id: string): void;
|
||||
@@ -86,15 +89,14 @@ async function cancel() {
|
||||
.root {
|
||||
container-type: inline-size;
|
||||
height: 100%;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.container {
|
||||
height: 100%;
|
||||
.catalogItems {
|
||||
display: grid;
|
||||
grid-template-columns: 400px 1fr;
|
||||
}
|
||||
|
||||
.menu {
|
||||
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
|
||||
grid-gap: 12px;
|
||||
height: 100%;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
|
||||
@@ -109,9 +111,33 @@ async function cancel() {
|
||||
background-color: var(--MI_THEME-accentedBg);
|
||||
}
|
||||
|
||||
.catalogItemThumbnail {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.catalogItemName {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.preview {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.canvas {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.unselectButton {
|
||||
position: absolute;
|
||||
top: 8px;
|
||||
right: 8px;
|
||||
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -30,6 +30,7 @@ export class RoomObjectPreviewEngine {
|
||||
private camera: BABYLON.ArcRotateCamera;
|
||||
private objectMesh: BABYLON.Mesh | null = null;
|
||||
private objectInstance: RoomObjectInstance<any> | null = null;
|
||||
private objectType: string | null = null;
|
||||
private envMapIndoor: BABYLON.CubeTexture;
|
||||
private roomLight: BABYLON.SpotLight;
|
||||
private zGridPreviewPlane: BABYLON.Mesh;
|
||||
@@ -86,6 +87,42 @@ export class RoomObjectPreviewEngine {
|
||||
this.zGridPreviewPlane = BABYLON.MeshBuilder.CreatePlane('zGridPreviewPlane', { width: cm(1000), height: cm(1000) }, this.scene);
|
||||
this.zGridPreviewPlane.material = gridMaterial;
|
||||
this.zGridPreviewPlane.rotation = new BABYLON.Vector3(Math.PI / 2, 0, 0);
|
||||
|
||||
if (_DEV_) {
|
||||
window.takeScreenshot = () => {
|
||||
const def = getObjectDef(this.objectType);
|
||||
|
||||
const boundingInfo = getMeshesBoundingBox(this.objectMesh!.getChildMeshes().filter(m => m.isEnabled() && m.isVisible));
|
||||
|
||||
const camera = new BABYLON.ArcRotateCamera('camera', Math.PI / 4, Math.PI / 2.5, cm(300), new BABYLON.Vector3(0, cm(90), 0), this.scene);
|
||||
camera.inputs.clear();
|
||||
camera.minZ = cm(1);
|
||||
camera.maxZ = cm(100000);
|
||||
camera.mode = BABYLON.Camera.ORTHOGRAPHIC_CAMERA;
|
||||
camera.setTarget(boundingInfo.center);
|
||||
if (def.placement === 'wall' || def.placement === 'side') {
|
||||
} else if (def.placement === 'ceiling' || def.placement === 'bottom') {
|
||||
camera.beta = Math.PI / 1.75;
|
||||
} else {
|
||||
}
|
||||
|
||||
// zoom to fit
|
||||
const size = boundingInfo.extendSize;
|
||||
const distance = Math.max(size.x, size.y, size.z) * 3;
|
||||
camera.orthoTop = (distance / 2);
|
||||
camera.orthoBottom = -(distance / 2);
|
||||
camera.orthoLeft = -(distance / 2);
|
||||
camera.orthoRight = (distance / 2);
|
||||
|
||||
this.scene.activeCamera = camera;
|
||||
|
||||
this.zGridPreviewPlane.isVisible = false;
|
||||
|
||||
window.setTimeout(() => {
|
||||
BABYLON.Tools.CreateScreenshotUsingRenderTarget(this.engine, camera, { width: 256, height: 256 }, undefined, undefined, undefined, true, `${camelToKebab(this.objectType!)}.png`);
|
||||
}, 100);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public async init() {
|
||||
@@ -276,6 +313,7 @@ export class RoomObjectPreviewEngine {
|
||||
|
||||
model.bakeMesh();
|
||||
|
||||
this.objectType = args.type;
|
||||
this.objectInstance = objectInstance;
|
||||
this.objectMesh = root;
|
||||
}
|
||||
|
||||