diff --git a/packages/frontend/assets/room/objects/books/a.af b/packages/frontend/assets/room/objects/books/a.af new file mode 100644 index 0000000000..a7cea4256e Binary files /dev/null and b/packages/frontend/assets/room/objects/books/a.af differ diff --git a/packages/frontend/assets/room/objects/books/b.af b/packages/frontend/assets/room/objects/books/b.af new file mode 100644 index 0000000000..c2d97d2c2a Binary files /dev/null and b/packages/frontend/assets/room/objects/books/b.af differ diff --git a/packages/frontend/assets/room/objects/books/books.blend b/packages/frontend/assets/room/objects/books/books.blend index 2d9fb150d1..e7288617dd 100644 Binary files a/packages/frontend/assets/room/objects/books/books.blend and b/packages/frontend/assets/room/objects/books/books.blend differ diff --git a/packages/frontend/assets/room/objects/books/books.glb b/packages/frontend/assets/room/objects/books/books.glb index 7ef2e6cb4e..d1063eac50 100644 Binary files a/packages/frontend/assets/room/objects/books/books.glb and b/packages/frontend/assets/room/objects/books/books.glb differ diff --git a/packages/frontend/assets/room/objects/books/c.af b/packages/frontend/assets/room/objects/books/c.af new file mode 100644 index 0000000000..8d712b6798 Binary files /dev/null and b/packages/frontend/assets/room/objects/books/c.af differ diff --git a/packages/frontend/assets/room/objects/books/d.af b/packages/frontend/assets/room/objects/books/d.af new file mode 100644 index 0000000000..ae6c90cbd8 Binary files /dev/null and b/packages/frontend/assets/room/objects/books/d.af differ diff --git a/packages/frontend/assets/room/objects/books/cover.af b/packages/frontend/assets/room/objects/books/e.af similarity index 61% rename from packages/frontend/assets/room/objects/books/cover.af rename to packages/frontend/assets/room/objects/books/e.af index f27cc21818..3531d79534 100644 Binary files a/packages/frontend/assets/room/objects/books/cover.af and b/packages/frontend/assets/room/objects/books/e.af differ diff --git a/packages/frontend/assets/room/objects/books/textures/a.png b/packages/frontend/assets/room/objects/books/textures/a.png new file mode 100644 index 0000000000..98522750f3 Binary files /dev/null and b/packages/frontend/assets/room/objects/books/textures/a.png differ diff --git a/packages/frontend/assets/room/objects/books/textures/b.png b/packages/frontend/assets/room/objects/books/textures/b.png new file mode 100644 index 0000000000..a4ef19b0fe Binary files /dev/null and b/packages/frontend/assets/room/objects/books/textures/b.png differ diff --git a/packages/frontend/assets/room/objects/books/textures/c.png b/packages/frontend/assets/room/objects/books/textures/c.png new file mode 100644 index 0000000000..0bbb21596f Binary files /dev/null and b/packages/frontend/assets/room/objects/books/textures/c.png differ diff --git a/packages/frontend/assets/room/objects/books/textures/cover.png b/packages/frontend/assets/room/objects/books/textures/cover.png deleted file mode 100644 index a6d318618c..0000000000 Binary files a/packages/frontend/assets/room/objects/books/textures/cover.png and /dev/null differ diff --git a/packages/frontend/assets/room/objects/books/textures/d.png b/packages/frontend/assets/room/objects/books/textures/d.png new file mode 100644 index 0000000000..ff48565132 Binary files /dev/null and b/packages/frontend/assets/room/objects/books/textures/d.png differ diff --git a/packages/frontend/assets/room/objects/books/textures/e.png b/packages/frontend/assets/room/objects/books/textures/e.png new file mode 100644 index 0000000000..eac5d83505 Binary files /dev/null and b/packages/frontend/assets/room/objects/books/textures/e.png differ diff --git a/packages/frontend/src/utility/room/engine.ts b/packages/frontend/src/utility/room/engine.ts index 9c88947b03..53c8ba7346 100644 --- a/packages/frontend/src/utility/room/engine.ts +++ b/packages/frontend/src/utility/room/engine.ts @@ -884,8 +884,16 @@ export class RoomEngine { }, findMaterial: (keyword) => { for (const m of root.getChildMeshes()) { - if (m.material != null && m.material.name.includes(keyword)) { + if (m.material == null) continue; + if (m.material.name.includes(keyword)) { return m.material as BABYLON.PBRMaterial; + } else if ((m.material as BABYLON.MultiMaterial).subMaterials != null) { + for (const sm of (m.material as BABYLON.MultiMaterial).subMaterials) { + if (sm == null) continue; + if (sm.name.includes(keyword)) { + return sm as BABYLON.PBRMaterial; + } + } } } throw new Error(`Material with keyword "${keyword}" not found for object ${args.type} (${args.id})`); diff --git a/packages/frontend/src/utility/room/objects/books.ts b/packages/frontend/src/utility/room/objects/books.ts index 61b49c9095..5ed314f7ee 100644 --- a/packages/frontend/src/utility/room/objects/books.ts +++ b/packages/frontend/src/utility/room/objects/books.ts @@ -3,19 +3,40 @@ * SPDX-License-Identifier: AGPL-3.0-only */ +import * as BABYLON from '@babylonjs/core'; import { defineObject } from '../engine.js'; export const books = defineObject({ id: 'books', name: 'Books', options: { - schema: {}, - default: {}, + schema: { + variation: { + type: 'enum', + label: 'Variation', + enum: ['A', 'B', 'C', 'D', 'E'], + }, + }, + default: { + variation: 'A', + }, }, placement: 'top', mergeMeshes: ['__X_BOOK_1__', '__X_BOOK_2__', '__X_BOOK_3__', '__X_BOOK_4__', '__X_BOOK_5__', '__X_BOOK_6__', '__X_BOOK_7__', '__X_BOOK_8__', '__X_BOOK_9__', '__X_BOOK_10__'], - createInstance: ({ findMesh, root }) => { - console.log(root.getChildMeshes().map((m) => m.name)); + createInstance: ({ room, options, findMesh, findMaterial }) => { + const coverMaterial = findMaterial('__X_COVER__'); + + const applyVariation = () => { + const coverTexture = + options.variation === 'A' ? new BABYLON.Texture('/client-assets/room/objects/books/textures/a.png', room.scene, false, false) : + options.variation === 'B' ? new BABYLON.Texture('/client-assets/room/objects/books/textures/b.png', room.scene, false, false) : + options.variation === 'C' ? new BABYLON.Texture('/client-assets/room/objects/books/textures/c.png', room.scene, false, false) : + options.variation === 'D' ? new BABYLON.Texture('/client-assets/room/objects/books/textures/d.png', room.scene, false, false) : + new BABYLON.Texture('/client-assets/room/objects/books/textures/e.png', room.scene, false, false); + coverMaterial.albedoTexture = coverTexture; + }; + + applyVariation(); const bookMeshes = [ findMesh('__X_BOOK_1__'), @@ -36,6 +57,9 @@ export const books = defineObject({ } return { + onOptionsUpdated: ([k, v]) => { + applyVariation(); + }, interactions: {}, }; },