Commit 98fab318 authored by hftroesch's avatar hftroesch
Browse files

dynamic resource adder

parent d2a0c033
...@@ -10,7 +10,7 @@ import {ARBottomBar} from "./ARBottomBar"; ...@@ -10,7 +10,7 @@ import {ARBottomBar} from "./ARBottomBar";
import {RoomEnvironment} from "three/examples/jsm/environments/RoomEnvironment"; import {RoomEnvironment} from "three/examples/jsm/environments/RoomEnvironment";
import {addLightToScene, createCamera, createPlacementRing, createRenderer, setSceneBackground} from "./Setup.ts"; import {addLightToScene, createCamera, createPlacementRing, createRenderer, setSceneBackground} from "./Setup.ts";
import {ModelType} from "../model/ModelType.ts"; // bottom UI for selecting objects import {ModelEmojiMap, ModelName, ModelTypeMap} from "../model/ModelType.ts"; // bottom UI for selecting objects
function createARButton(renderer: WebGLRenderer, overlayRef: React.RefObject<HTMLDivElement>) { function createARButton(renderer: WebGLRenderer, overlayRef: React.RefObject<HTMLDivElement>) {
...@@ -136,23 +136,17 @@ export const XRRenderer: React.FC = () => { ...@@ -136,23 +136,17 @@ export const XRRenderer: React.FC = () => {
let objectToAdd; let objectToAdd;
// Choose what object to add based on selection // Choose what object to add based on selection
if (name === ModelType.CUBE) { if (name === ModelName.CUBE) {
objectToAdd = new Cube(position); objectToAdd = new Cube(position);
} else if (name === ModelType.WATERMILL) { } else {
objectToAdd = new GLTFModel("/fantasy/watermill.glb", position, "/fantasy/colormap.png"); objectToAdd = new GLTFModel(`/${ModelTypeMap[name as ModelName]}/${name}.glb`, position, `/${ModelTypeMap[name as ModelName]}/colormap.png`)
} else if (name === ModelType.TREE) { }
objectToAdd = new GLTFModel("/fantasy/tree.glb", position, "/fantasy/colormap.png");
} else if (name === ModelType.CROISSANT) {
objectToAdd = new GLTFModel("/food/croissant.glb", position, "/food/colormap.png");
} else {
objectToAdd = new Cube(position); // fallback
}
const audio = new Audio('/sounds/cash.mp3'); const audio = new Audio('/sounds/cash.mp3');
audio.play(); audio.play();
// Add the object to the scene (via manager) // Add the object to the scene (via manager)
blockManager.addObject(objectToAdd); blockManager.addObject(objectToAdd);
}; };
// Expose function globally for debugging in browser console // Expose function globally for debugging in browser console
...@@ -218,6 +212,15 @@ export const XRRenderer: React.FC = () => { ...@@ -218,6 +212,15 @@ export const XRRenderer: React.FC = () => {
(window as any).addSelectedObject?.(name); // add object immediately (window as any).addSelectedObject?.(name); // add object immediately
}; };
const items = [];
for (const key in ModelName) {
items.push({
name: ModelName[key as keyof typeof ModelName],
emoji: ModelEmojiMap[key as keyof typeof ModelEmojiMap],
});
}
// --- 🔸 Render layout --- // --- 🔸 Render layout ---
return ( return (
<div style={{ width: "100vw", height: "100vh", position: "relative" }}> <div style={{ width: "100vw", height: "100vh", position: "relative" }}>
...@@ -251,17 +254,24 @@ export const XRRenderer: React.FC = () => { ...@@ -251,17 +254,24 @@ export const XRRenderer: React.FC = () => {
</button> </button>
{/* Bottom bar appears only during active AR session */} {/* Bottom bar appears only during active AR session */}
{isSessionActive && ( {/*{isSessionActive && (*/}
<ARBottomBar {/* <ARBottomBar*/}
objectOptions={[ {/* objectOptions={[*/}
{ name: ModelType.CUBE, emoji: "🧊" }, {/* { name: ModelType.CUBE, emoji: "🧊" },*/}
{ name: ModelType.WATERMILL, emoji: "🌊" }, {/* { name: ModelType.WATERMILL, emoji: "🌊" },*/}
{ name: ModelType.TREE ,emoji: "🌳" }, {/* { name: ModelType.TREE ,emoji: "🌳" },*/}
{ name: ModelType.CROISSANT, emoji: "🥐" }, {/* { name: ModelType.CROISSANT, emoji: "🥐" },*/}
]} {/* ]}*/}
onSelect={handleSelect} {/* onSelect={handleSelect}*/}
/> {/* />*/}
)} {/*)}*/}
{isSessionActive && (
<ARBottomBar
objectOptions={items}
onSelect={handleSelect}
/>
)}
</div> </div>
</div> </div>
); );
......
// @ts-ignore
export enum ModelType { export enum ModelType {
FANTASY = 'fantasy',
FOOD = 'food',
GENERIC = ""
}
// @ts-ignore
export enum ModelName {
CUBE = 'Cube', CUBE = 'Cube',
FOUNTAIN = "Fountain", FOUNTAIN = 'Fountain',
TREE = "Tree", TREE = 'Tree',
WATERMILL = "Watermill", WATERMILL = 'Watermill',
WHEEL = "Wheel", WHEEL = 'Wheel',
WINDMILL = "Windmill", BREAD = 'Bread',
BREAD = "Bread", BURGER = 'Burger',
BURGER = "Burger", CROISSANT = 'Croissant',
CROISSANT = "Croissant", PIZZA_BOX = 'Pizza Box',
PIZZA_BOX = "Pizza Box",
} }
export const ModelEmojiMap: Record<ModelName, string> = {
[ModelName.CUBE]: '🧊',
[ModelName.FOUNTAIN]: '⛲',
[ModelName.TREE]: '🌳',
[ModelName.WATERMILL]: '💧',
[ModelName.WHEEL]: '🛞',
[ModelName.BREAD]: '🍞',
[ModelName.BURGER]: '🍔',
[ModelName.CROISSANT]: '🥐',
[ModelName.PIZZA_BOX]: '🍕',
};
export const ModelTypeMap: Record<ModelName, ModelType> = {
[ModelName.CUBE]: ModelType.GENERIC,
[ModelName.FOUNTAIN]: ModelType.FANTASY,
[ModelName.TREE]: ModelType.FANTASY,
[ModelName.WATERMILL]: ModelType.FANTASY,
[ModelName.WHEEL]: ModelType.FANTASY,
[ModelName.BREAD]: ModelType.FOOD,
[ModelName.BURGER]: ModelType.FOOD,
[ModelName.CROISSANT]: ModelType.FOOD,
[ModelName.PIZZA_BOX]: ModelType.FOOD,
};
export function getModelPath(name: ModelName): string {
const type = ModelTypeMap[name];
const fileName = name.toLowerCase();
return `/${type}/${fileName}.glb`;
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment