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>
|
<template #header><i class="ti ti-box"></i> カタログ</template>
|
||||||
|
|
||||||
<div :class="$style.root">
|
<div :class="$style.root">
|
||||||
<div :class="$style.container">
|
<div :class="$style.catalogItems">
|
||||||
<div :class="$style.menu">
|
<div
|
||||||
<div
|
v-for="def in OBJECT_DEFS"
|
||||||
v-for="def in OBJECT_DEFS"
|
:key="def.id"
|
||||||
:key="def.id"
|
:class="[$style.catalogItem, { [$style.selected]: selectedId === def.id }]"
|
||||||
:class="[$style.catalogItem, { [$style.selected]: selectedId === def.id }]"
|
@click="selectedId = def.id"
|
||||||
@click="selectedId = def.id"
|
>
|
||||||
>
|
<img :class="$style.catalogItemThumbnail" :src="`/client-assets/room/object-thumbs/${camelToKebab(def.id)}.png`"/>
|
||||||
<div>{{ def.name }}</div>
|
<div :class="$style.catalogItemName">{{ def.name }}</div>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-show="selectedId != null" :class="$style.preview" class="_panel">
|
||||||
<canvas ref="canvas" :class="$style.canvas"></canvas>
|
<canvas ref="canvas" :class="$style.canvas"></canvas>
|
||||||
|
<button :class="$style.unselectButton" @click="selectedId = null">x</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</MkModalWindow>
|
</MkModalWindow>
|
||||||
@@ -41,6 +43,7 @@ import MkModalWindow from '@/components/MkModalWindow.vue';
|
|||||||
import * as os from '@/os.js';
|
import * as os from '@/os.js';
|
||||||
import { OBJECT_DEFS } from '@/world/room/object-defs.js';
|
import { OBJECT_DEFS } from '@/world/room/object-defs.js';
|
||||||
import { createRoomObjectPreviewEngine, RoomObjectPreviewEngine } from '@/world/room/previewEngine.js';
|
import { createRoomObjectPreviewEngine, RoomObjectPreviewEngine } from '@/world/room/previewEngine.js';
|
||||||
|
import { camelToKebab } from '@/world/utility.js';
|
||||||
|
|
||||||
const emit = defineEmits<{
|
const emit = defineEmits<{
|
||||||
(ev: 'ok', id: string): void;
|
(ev: 'ok', id: string): void;
|
||||||
@@ -86,15 +89,14 @@ async function cancel() {
|
|||||||
.root {
|
.root {
|
||||||
container-type: inline-size;
|
container-type: inline-size;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
.container {
|
.catalogItems {
|
||||||
height: 100%;
|
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 400px 1fr;
|
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
|
||||||
}
|
grid-gap: 12px;
|
||||||
|
height: 100%;
|
||||||
.menu {
|
|
||||||
overflow-y: scroll;
|
overflow-y: scroll;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,9 +111,33 @@ async function cancel() {
|
|||||||
background-color: var(--MI_THEME-accentedBg);
|
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 {
|
.canvas {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.unselectButton {
|
||||||
|
position: absolute;
|
||||||
|
top: 8px;
|
||||||
|
right: 8px;
|
||||||
|
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ export class RoomObjectPreviewEngine {
|
|||||||
private camera: BABYLON.ArcRotateCamera;
|
private camera: BABYLON.ArcRotateCamera;
|
||||||
private objectMesh: BABYLON.Mesh | null = null;
|
private objectMesh: BABYLON.Mesh | null = null;
|
||||||
private objectInstance: RoomObjectInstance<any> | null = null;
|
private objectInstance: RoomObjectInstance<any> | null = null;
|
||||||
|
private objectType: string | null = null;
|
||||||
private envMapIndoor: BABYLON.CubeTexture;
|
private envMapIndoor: BABYLON.CubeTexture;
|
||||||
private roomLight: BABYLON.SpotLight;
|
private roomLight: BABYLON.SpotLight;
|
||||||
private zGridPreviewPlane: BABYLON.Mesh;
|
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 = BABYLON.MeshBuilder.CreatePlane('zGridPreviewPlane', { width: cm(1000), height: cm(1000) }, this.scene);
|
||||||
this.zGridPreviewPlane.material = gridMaterial;
|
this.zGridPreviewPlane.material = gridMaterial;
|
||||||
this.zGridPreviewPlane.rotation = new BABYLON.Vector3(Math.PI / 2, 0, 0);
|
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() {
|
public async init() {
|
||||||
@@ -276,6 +313,7 @@ export class RoomObjectPreviewEngine {
|
|||||||
|
|
||||||
model.bakeMesh();
|
model.bakeMesh();
|
||||||
|
|
||||||
|
this.objectType = args.type;
|
||||||
this.objectInstance = objectInstance;
|
this.objectInstance = objectInstance;
|
||||||
this.objectMesh = root;
|
this.objectMesh = root;
|
||||||
}
|
}
|
||||||
|
|||||||