diff --git a/packages/frontend/src/world/room/object.ts b/packages/frontend/src/world/room/object.ts index 22628932f9..b11cd9b252 100644 --- a/packages/frontend/src/world/room/object.ts +++ b/packages/frontend/src/world/room/object.ts @@ -59,7 +59,10 @@ type ColorOptionSchema = { type EnumOptionSchema = { type: 'enum'; label: string; - enum: string[]; + enum: { + label: string; + value: string | number; + }[]; }; type RangeOptionSchema = { @@ -96,7 +99,7 @@ type GetRawOptionsSchemaValues = { T[K] extends BooleanOptionSchema ? boolean : T[K] extends StringOptionSchema ? string : T[K] extends ColorOptionSchema ? [number, number, number] : - T[K] extends EnumOptionSchema ? T[K]['enum'][number] : + T[K] extends EnumOptionSchema ? T[K]['enum'][number]['value'] : T[K] extends RangeOptionSchema ? number : T[K] extends ImageOptionSchema ? string | null : T[K] extends SeedOptionSchema ? number : @@ -108,7 +111,7 @@ type GetConvertedOptionsSchemaValues = { T[K] extends BooleanOptionSchema ? boolean : T[K] extends StringOptionSchema ? string : T[K] extends ColorOptionSchema ? [number, number, number] : - T[K] extends EnumOptionSchema ? T[K]['enum'][number] : + T[K] extends EnumOptionSchema ? T[K]['enum'][number]['value'] : T[K] extends RangeOptionSchema ? number : T[K] extends ImageOptionSchema ? { url: string; } | null : T[K] extends SeedOptionSchema ? number : @@ -121,12 +124,12 @@ export type SnapshotRenderingHelperWrapper = { fixParticleSystem: (ps: BABYLON.ParticleSystem) => void; }; -export type ObjectDef = { +export type ObjectDef = { id: string; name: string; options: { - schema: OpSc extends undefined ? OptionsSchema : NonNullable; - default: OpSc extends undefined ? RawOptions : GetRawOptionsSchemaValues>; + schema: string extends keyof OpSc ? OptionsSchema : OpSc; + default: string extends keyof OpSc ? RawOptions : GetRawOptionsSchemaValues; }; placement: 'top' | 'side' | 'bottom' | 'wall' | 'ceiling' | 'floor'; hasCollisions?: boolean; @@ -135,7 +138,7 @@ export type ObjectDef = { //groupingMeshes: string[]; // multi-materialなメッシュは複数のメッシュに分割されるが、それだと不便な場合に追加の親メッシュでグルーピングするための指定 isChair?: boolean; treatLoaderResult?: (loaderResult: BABYLON.AssetContainer) => void; - path?: (options: OpSc extends undefined ? ConvertedOptions : Readonly>>) => string; + path?: (options: string extends keyof OpSc ? ConvertedOptions : Readonly>) => string; createInstance: (args: { scene: BABYLON.Scene; // TODO: snapshot renderingの関心を隠蔽した方が綺麗かもしれない @@ -143,7 +146,7 @@ export type ObjectDef = { sr: SnapshotRenderingHelperWrapper; lc: BABYLON.ClusteredLightContainer | null; root: BABYLON.TransformNode; - options: OpSc extends undefined ? ConvertedOptions : Readonly>>; + options: string extends keyof OpSc ? ConvertedOptions : Readonly>; model: ModelManager; id: string; timer: Timer; @@ -151,7 +154,7 @@ export type ObjectDef = { stickyMarkerMeshUpdated?: (mesh: BABYLON.Mesh) => void; sitChair?: () => void; reloadModel: () => void; - }) => RoomObjectInstance>> | Promise>>>; // TODO: createInstanceをasyncにするのではなく、別にreadyみたいなものを返させる + }) => RoomObjectInstance> | Promise>>; // TODO: createInstanceをasyncにするのではなく、別にreadyみたいなものを返させる }; export function defineObject(def: ObjectDef): ObjectDef { diff --git a/packages/frontend/src/world/room/objects/books.ts b/packages/frontend/src/world/room/objects/books.ts index f61ce8fd52..13bd7a7f01 100644 --- a/packages/frontend/src/world/room/objects/books.ts +++ b/packages/frontend/src/world/room/objects/books.ts @@ -15,7 +15,22 @@ export const books = defineObject({ variation: { type: 'enum', label: 'Variation', - enum: ['A', 'B', 'C', 'D', 'E'], + enum: [{ + label: 'A', + value: 'A', + }, { + label: 'B', + value: 'B', + }, { + label: 'C', + value: 'C', + }, { + label: 'D', + value: 'D', + }, { + label: 'E', + value: 'E', + }], }, }, default: { diff --git a/packages/frontend/src/world/room/objects/issyoubin.ts b/packages/frontend/src/world/room/objects/issyoubin.ts index d439622dbb..221011106d 100644 --- a/packages/frontend/src/world/room/objects/issyoubin.ts +++ b/packages/frontend/src/world/room/objects/issyoubin.ts @@ -14,7 +14,13 @@ export const issyoubin = defineObject({ variation: { type: 'enum', label: 'Variation', - enum: ['misuki', 'ai'], + enum: [{ + label: 'Misuki', + value: 'misuki', + }, { + label: 'AI', + value: 'ai', + }], }, }, default: { @@ -54,9 +60,7 @@ export const issyoubin = defineObject({ return { onOptionsUpdated: ([k, v]) => { switch (k) { - case 'variation': - applyVariation(); - break; + case 'variation': applyVariation(); break; } }, interactions: {}, diff --git a/packages/frontend/src/world/room/objects/petBottle.ts b/packages/frontend/src/world/room/objects/petBottle.ts index 24d9572af9..36cc81fa7b 100644 --- a/packages/frontend/src/world/room/objects/petBottle.ts +++ b/packages/frontend/src/world/room/objects/petBottle.ts @@ -14,7 +14,13 @@ export const petBottle = defineObject({ variation: { type: 'enum', label: 'Variation', - enum: ['mineral-water', 'green-tea'], + enum: [{ + label: 'Mineral Water', + value: 'mineral-water', + }, { + label: 'Green Tea', + value: 'green-tea', + }], }, withCap: { type: 'boolean', diff --git a/packages/frontend/src/world/room/objects/randomBooks.ts b/packages/frontend/src/world/room/objects/randomBooks.ts index 2cf481df89..5ca801a327 100644 --- a/packages/frontend/src/world/room/objects/randomBooks.ts +++ b/packages/frontend/src/world/room/objects/randomBooks.ts @@ -20,7 +20,13 @@ export const randomBooks = defineObject({ variation: { type: 'enum', label: 'Variation', - enum: ['mix', 'mix-plain'], + enum: [{ + label: 'Mix', + value: 'mix', + }, { + label: 'Mix (Plain)', + value: 'mix-plain', + }], }, count: { type: 'range', diff --git a/packages/frontend/src/world/room/objects/steelRack.ts b/packages/frontend/src/world/room/objects/steelRack.ts index 8eb87d94d3..c0b0ed5654 100644 --- a/packages/frontend/src/world/room/objects/steelRack.ts +++ b/packages/frontend/src/world/room/objects/steelRack.ts @@ -23,7 +23,13 @@ export const steelRack = defineObject({ widthAndDepthVariation: { type: 'enum', label: 'W x D', - enum: ['60-35', '90-35'], + enum: [{ + label: '60 x 35', + value: '60-35', + }, { + label: '90 x 35', + value: '90-35', + }], }, height: { type: 'range', diff --git a/packages/frontend/src/world/room/objects/tabletopDigitalClock.ts b/packages/frontend/src/world/room/objects/tabletopDigitalClock.ts index 585310643e..b89981c7cd 100644 --- a/packages/frontend/src/world/room/objects/tabletopDigitalClock.ts +++ b/packages/frontend/src/world/room/objects/tabletopDigitalClock.ts @@ -12,11 +12,6 @@ export const tabletopDigitalClock = defineObject({ name: 'Tabletop Digital Clock', options: { schema: { - bodyStyle: { - type: 'enum', - label: 'Body Style', - enum: ['color', 'wood'], - }, bodyColor: { type: 'color', label: 'Body Color', @@ -27,7 +22,6 @@ export const tabletopDigitalClock = defineObject({ }, }, default: { - bodyStyle: 'color', bodyColor: [0.45, 0.8, 0], lcdColor: [1, 1, 1], }, @@ -87,12 +81,8 @@ export const tabletopDigitalClock = defineObject({ const bodyMaterial = bodyMesh.material as BABYLON.PBRMaterial; const applyBodyColor = () => { - if (options.bodyStyle === 'color') { - const [r, g, b] = options.bodyColor; - bodyMaterial.albedoColor = new BABYLON.Color3(r, g, b); - } else { - - } + const [r, g, b] = options.bodyColor; + bodyMaterial.albedoColor = new BABYLON.Color3(r, g, b); }; const applyLcdColor = () => { @@ -127,10 +117,9 @@ export const tabletopDigitalClock = defineObject({ }, 1000); }, onOptionsUpdated: ([k, v]) => { - if (k === 'bodyColor') { - applyBodyColor(); - } else if (k === 'lcdColor') { - applyLcdColor(); + switch (k) { + case 'bodyColor': applyBodyColor(); break; + case 'lcdColor': applyLcdColor(); break; } }, interactions: {}, diff --git a/packages/frontend/src/world/room/objects/wallShelf.ts b/packages/frontend/src/world/room/objects/wallShelf.ts index 9c7465098d..cd9a7823aa 100644 --- a/packages/frontend/src/world/room/objects/wallShelf.ts +++ b/packages/frontend/src/world/room/objects/wallShelf.ts @@ -14,12 +14,30 @@ export const wallShelf = defineObject({ style: { type: 'enum', label: 'Style', - enum: ['A', 'B', 'C', 'D'], + enum: [{ + label: 'A', + value: 'A', + }, { + label: 'B', + value: 'B', + }, { + label: 'C', + value: 'C', + }, { + label: 'D', + value: 'D', + }], }, boardStyle: { type: 'enum', label: 'Board style', - enum: ['color', 'wood'], + enum: [{ + label: 'Wood', + value: 'wood', + }, { + label: 'Color', + value: 'color', + }], }, boardColor: { type: 'color', @@ -77,8 +95,11 @@ export const wallShelf = defineObject({ return { onOptionsUpdated: ([k, v]) => { - applyStyle(); - applyBoardColor(); + switch (k) { + case 'style': applyStyle(); break; + case 'boardStyle': + case 'boardColor': applyBoardColor(); break; + } }, interactions: {}, };