mirror of
https://github.com/misskey-dev/misskey.git
synced 2026-05-20 15:15:37 +02:00
wip
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 118 KiB |
Binary file not shown.
BIN
packages/frontend/assets/room/objects/wall-shelf/wall-shelf.glb
Normal file
BIN
packages/frontend/assets/room/objects/wall-shelf/wall-shelf.glb
Normal file
Binary file not shown.
@@ -33,6 +33,9 @@ SPDX-License-Identifier: AGPL-3.0-only
|
|||||||
<div v-if="s.type === 'color'">
|
<div v-if="s.type === 'color'">
|
||||||
<MkInput :modelValue="getHex(engine.selected.value.objectState.options[k])" type="color" @update:modelValue="v => { const c = getRgb(v); if (c != null) engine.updateObjectOption(engine.selected.value.objectId, k, c); }"></MkInput>
|
<MkInput :modelValue="getHex(engine.selected.value.objectState.options[k])" type="color" @update:modelValue="v => { const c = getRgb(v); if (c != null) engine.updateObjectOption(engine.selected.value.objectId, k, c); }"></MkInput>
|
||||||
</div>
|
</div>
|
||||||
|
<div v-else-if="s.type === 'enum'">
|
||||||
|
<MkSelect :items="s.enum.map(e => ({ label: e, value: e }))" :modelValue="engine.selected.value.objectState.options[k]" @update:modelValue="v => engine.updateObjectOption(engine.selected.value.objectId, k, v)"></MkSelect>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -602,5 +605,7 @@ definePage(() => ({
|
|||||||
right: 16px;
|
right: 16px;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
padding: 16px;
|
padding: 16px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
width: 300px;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import { registerBuiltInLoaders } from '@babylonjs/loaders/dynamic';
|
|||||||
import { BoundingBoxRenderer } from '@babylonjs/core/Rendering/boundingBoxRenderer';
|
import { BoundingBoxRenderer } from '@babylonjs/core/Rendering/boundingBoxRenderer';
|
||||||
import { GridMaterial } from '@babylonjs/materials';
|
import { GridMaterial } from '@babylonjs/materials';
|
||||||
import { ShowInspector } from '@babylonjs/inspector';
|
import { ShowInspector } from '@babylonjs/inspector';
|
||||||
import { reactive, ref, shallowRef, watch } from 'vue';
|
import { reactive, ref, shallowRef, triggerRef, watch } from 'vue';
|
||||||
import { genId } from '../id.js';
|
import { genId } from '../id.js';
|
||||||
import { getObjectDef } from './object-defs.js';
|
import { getObjectDef } from './object-defs.js';
|
||||||
import { HorizontalCameraKeyboardMoveInput } from './utility.js';
|
import { HorizontalCameraKeyboardMoveInput } from './utility.js';
|
||||||
@@ -78,16 +78,16 @@ type ColorOptionSchema = {
|
|||||||
label: string;
|
label: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
type SelectOptionSchema = {
|
type EnumOptionSchema = {
|
||||||
type: 'select';
|
type: 'enum';
|
||||||
label: string;
|
label: string;
|
||||||
enum: string[];
|
enum: string[];
|
||||||
};
|
};
|
||||||
|
|
||||||
type OptionsSchema = Record<string, NumberOptionSchema | ColorOptionSchema | SelectOptionSchema>;
|
type OptionsSchema = Record<string, NumberOptionSchema | ColorOptionSchema | EnumOptionSchema>;
|
||||||
|
|
||||||
type GetOptionsSchemaValues<T extends OptionsSchema> = {
|
type GetOptionsSchemaValues<T extends OptionsSchema> = {
|
||||||
[K in keyof T]: T[K] extends NumberOptionSchema ? number : T[K] extends ColorOptionSchema ? [number, number, number] : T[K] extends SelectOptionSchema ? T[K]['enum'][number] : never;
|
[K in keyof T]: T[K] extends NumberOptionSchema ? number : T[K] extends ColorOptionSchema ? [number, number, number] : T[K] extends EnumOptionSchema ? T[K]['enum'][number] : never;
|
||||||
};
|
};
|
||||||
|
|
||||||
type ObjectDef<OpSc extends OptionsSchema = OptionsSchema> = {
|
type ObjectDef<OpSc extends OptionsSchema = OptionsSchema> = {
|
||||||
@@ -1213,6 +1213,10 @@ export class RoomEngine {
|
|||||||
const obji = this.objectInstances.get(objectId);
|
const obji = this.objectInstances.get(objectId);
|
||||||
if (obji == null) return;
|
if (obji == null) return;
|
||||||
obji.onOptionsUpdated?.([key, value]);
|
obji.onOptionsUpdated?.([key, value]);
|
||||||
|
|
||||||
|
if (this.selected.value?.objectId === objectId) {
|
||||||
|
triggerRef(this.selected);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public resize() {
|
public resize() {
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ import { tabletopCalendar } from './objects/tabletopCalendar.js';
|
|||||||
import { tabletopDigitalClock } from './objects/tabletopDigitalClock.js';
|
import { tabletopDigitalClock } from './objects/tabletopDigitalClock.js';
|
||||||
import { tv } from './objects/tv.js';
|
import { tv } from './objects/tv.js';
|
||||||
import { wallClock } from './objects/wallClock.js';
|
import { wallClock } from './objects/wallClock.js';
|
||||||
|
import { wallShelf } from './objects/wallShelf.js';
|
||||||
import { woodSoundAbsorbingPanel } from './objects/woodSoundAbsorbingPanel.js';
|
import { woodSoundAbsorbingPanel } from './objects/woodSoundAbsorbingPanel.js';
|
||||||
|
|
||||||
export const OBJECT_DEFS = [
|
export const OBJECT_DEFS = [
|
||||||
@@ -78,6 +79,7 @@ export const OBJECT_DEFS = [
|
|||||||
tabletopDigitalClock,
|
tabletopDigitalClock,
|
||||||
tv,
|
tv,
|
||||||
wallClock,
|
wallClock,
|
||||||
|
wallShelf,
|
||||||
woodSoundAbsorbingPanel,
|
woodSoundAbsorbingPanel,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ export const tabletopDigitalClock = defineObject({
|
|||||||
options: {
|
options: {
|
||||||
schema: {
|
schema: {
|
||||||
bodyStyle: {
|
bodyStyle: {
|
||||||
type: 'select',
|
type: 'enum',
|
||||||
label: 'Body Style',
|
label: 'Body Style',
|
||||||
enum: ['color', 'wood'],
|
enum: ['color', 'wood'],
|
||||||
},
|
},
|
||||||
@@ -37,7 +37,7 @@ export const tabletopDigitalClock = defineObject({
|
|||||||
const [r, g, b] = options.bodyColor;
|
const [r, g, b] = options.bodyColor;
|
||||||
bodyMaterial.albedoColor = new BABYLON.Color3(r, g, b);
|
bodyMaterial.albedoColor = new BABYLON.Color3(r, g, b);
|
||||||
} else {
|
} else {
|
||||||
bodyMaterial.albedoTexture = room.scene.getTextureByName('tabletop_digital_clock_wood');
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
76
packages/frontend/src/utility/room/objects/wallShelf.ts
Normal file
76
packages/frontend/src/utility/room/objects/wallShelf.ts
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
import * as BABYLON from '@babylonjs/core';
|
||||||
|
import { defineObject } from '../engine.js';
|
||||||
|
|
||||||
|
export const wallShelf = defineObject({
|
||||||
|
id: 'wallShelf',
|
||||||
|
name: 'Wall Shelf',
|
||||||
|
options: {
|
||||||
|
schema: {
|
||||||
|
style: {
|
||||||
|
type: 'enum',
|
||||||
|
label: 'Style',
|
||||||
|
enum: ['A', 'B'],
|
||||||
|
},
|
||||||
|
boardStyle: {
|
||||||
|
type: 'enum',
|
||||||
|
label: 'Board style',
|
||||||
|
enum: ['color', 'wood'],
|
||||||
|
},
|
||||||
|
boardColor: {
|
||||||
|
type: 'color',
|
||||||
|
label: 'Board color',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
default: {
|
||||||
|
style: 'A',
|
||||||
|
boardStyle: 'wood',
|
||||||
|
boardColor: [1, 1, 1],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
placement: 'side',
|
||||||
|
createInstance: ({ room, options, root }) => {
|
||||||
|
const applyStyle = () => {
|
||||||
|
const aMeshes = root.getChildMeshes().filter(m => m.name.includes('__X_VARIATION_A__'));
|
||||||
|
const bMeshes = root.getChildMeshes().filter(m => m.name.includes('__X_VARIATION_B__'));
|
||||||
|
|
||||||
|
for (const m of aMeshes) {
|
||||||
|
(m as BABYLON.Mesh).setEnabled(options.style === 'A');
|
||||||
|
}
|
||||||
|
for (const m of bMeshes) {
|
||||||
|
(m as BABYLON.Mesh).setEnabled(options.style === 'B');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
applyStyle();
|
||||||
|
|
||||||
|
const bodyMesh = root.getChildMeshes().find(m => m.name.includes('__X_BOARD__')) as BABYLON.Mesh;
|
||||||
|
const bodyMaterial = bodyMesh.material as BABYLON.PBRMaterial;
|
||||||
|
const bodyTexture = bodyMaterial.albedoTexture as BABYLON.Texture;
|
||||||
|
|
||||||
|
const applyBoardColor = () => {
|
||||||
|
const [r, g, b] = options.boardColor;
|
||||||
|
bodyMaterial.albedoColor = new BABYLON.Color3(r, g, b);
|
||||||
|
|
||||||
|
if (options.boardStyle === 'color') {
|
||||||
|
bodyMaterial.albedoTexture = null;
|
||||||
|
} else {
|
||||||
|
bodyMaterial.albedoTexture = bodyTexture;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
applyBoardColor();
|
||||||
|
|
||||||
|
return {
|
||||||
|
onOptionsUpdated: ([k, v]) => {
|
||||||
|
applyStyle();
|
||||||
|
applyBoardColor();
|
||||||
|
},
|
||||||
|
interactions: {},
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user