Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
HFT-informatics-weekend
AR - Urban Planner
Commits
98fab318
Commit
98fab318
authored
Oct 12, 2025
by
hftroesch
Browse files
dynamic resource adder
parent
d2a0c033
Changes
6
Hide whitespace changes
Inline
Side-by-side
webxr-cube/public/fantasy/fountain
-round-detail
.glb
→
webxr-cube/public/fantasy/fountain.glb
View file @
98fab318
File moved
webxr-cube/public/fantasy/windmill.glb
deleted
100644 → 0
View file @
d2a0c033
File deleted
webxr-cube/public/food/burger
-cheese-double
.glb
→
webxr-cube/public/food/burger.glb
View file @
98fab318
File moved
webxr-cube/public/food/pizza
-
box.glb
→
webxr-cube/public/food/pizzabox.glb
View file @
98fab318
File moved
webxr-cube/src/components/XRRenderer.tsx
View file @
98fab318
...
@@ -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
,
ModelType
Map
}
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
>
);
);
...
...
webxr-cube/src/model/ModelType.ts
View file @
98fab318
// @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`
;
}
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment