diff --git a/public/index.html b/public/index.html index 8f27a1d1c50d5bc58ca4660ef47265633e929ad6..d2a51e9b5cacf0e211073a8ceb706cdd792ca0bc 100644 --- a/public/index.html +++ b/public/index.html @@ -43,7 +43,7 @@ #add-menu { overflow-y: auto; - + } #menu-bar, @@ -192,13 +192,13 @@ height: 200px; z-index: 20; overflow-y: auto; - padding: 20px; + padding: 20px 0; border-radius: 8px; } #dynamic-menu input[type="range"] { - width: calc(100% - 20px); - margin: 10px 0; + width: 90%; + margin: 10px auto; background: #3a3a3a; border-radius: 5px; } @@ -232,7 +232,7 @@ flex-direction: column; align-items: flex-start; "> - <div id="debug-console" style=" + <div id="debug-console" style=" width: 100%; max-height: 200px; overflow-y: auto; @@ -241,7 +241,7 @@ padding: 5px; display: none; "></div> - <button id="debug-toggle-btn" style=" + <button id="debug-toggle-btn" style=" background: rgba(0, 0, 0, 0.7); color: #00ff00; font-size: 14px; @@ -326,10 +326,12 @@ </div> </div> - <div id="map-window" class="menu-placeholder" style="display: none; flex-direction: column; width: 100vw; height: 100vh;"> + <div id="map-window" class="menu-placeholder" + style="display: none; flex-direction: column; width: 100vw; height: 100vh;"> <div id="map-container" style="z-index: 1500; flex: 15; width: 100%; height: 100%;"></div> - <div class="menu-item" onclick="showMenu('menu-bar')" style="cursor: pointer; flex: 1; align-items: center; justify-content: center;"> - <img src="previewImages/back-icon.png" alt="Zurück" style="width: 30px; height: 30px;" /> + <div class="menu-item" onclick="showMenu('menu-bar')" + style="cursor: pointer; flex: 1; align-items: center; justify-content: center;"> + <img src="previewImages/back-icon.png" alt="Zurück" style="width: 30px; height: 30px;" /> </div> </div> @@ -356,43 +358,57 @@ name: "Bench", image: "previewImages/bench.PNG", file: "https://transfer.hft-stuttgart.de/gitlab/geovistoogsi/ar/-/raw/master/public/assets/models/bench_model/scene.gltf", - scale: { x: 0.1, y: 0.1, z: 0.1 } + scale: { x: 0.1, y: 0.1, z: 0.1 }, + minScale: 0.05, // 50% der aktuellen Größe + maxScale: 0.5 // 500% der aktuellen Größe }, trashbin: { name: "Trash bin", image: "previewImages/trash_can.PNG", file: "https://transfer.hft-stuttgart.de/gitlab/geovistoogsi/ar/-/raw/master/public/assets/models/trash_model/scene.gltf", - scale: { x: 0.04, y: 0.04, z: 0.04 } - }, + scale: { x: 0.04, y: 0.04, z: 0.04 }, + minScale: 0.02, // 50% der aktuellen Größe + maxScale: 0.2 // 500% der aktuellen Größe + }, telephone_box: { name: "Telephone Box", image: "previewImages/telephone_box.PNG", file: "https://transfer.hft-stuttgart.de/gitlab/geovistoogsi/ar/-/raw/master/public/assets/models/telephone_box_model/scene.gltf", - scale: { x: 0.04, y: 0.04, z: 0.04 } + scale: { x: 0.04, y: 0.04, z: 0.04 }, + minScale: 0.02, + maxScale: 0.2 }, fire_hydrant_model: { name: "Fire Hydrant", image: "previewImages/hydrant.PNG", file: "https://transfer.hft-stuttgart.de/gitlab/geovistoogsi/ar/-/raw/master/public/assets/models/fire_hydrant_model/scene.gltf", - scale: { x: 0.04, y: 0.04, z: 0.04 } + scale: { x: 0.04, y: 0.04, z: 0.04 }, + minScale: 0.02, + maxScale: 0.2 }, statue: { name: "Statue", image: "previewImages/statue.PNG", file: "https://transfer.hft-stuttgart.de/gitlab/geovistoogsi/ar/-/raw/master/public/assets/models/statue_model/scene.gltf", - scale: { x: 0.04, y: 0.04, z: 0.04 } + scale: { x: 0.04, y: 0.04, z: 0.04 }, + minScale: 0.02, + maxScale: 0.2 }, fountain: { name: "Fountain", image: "previewImages/fountain.PNG", file: "https://transfer.hft-stuttgart.de/gitlab/geovistoogsi/ar/-/raw/master/public/assets/models/fountain_model/scene.gltf", - scale: { x: 0.001, y: 0.001, z: 0.001 } + scale: { x: 0.001, y: 0.001, z: 0.001 }, + minScale: 0.0005, // 50% der aktuellen Größe + maxScale: 0.005 // 500% der aktuellen Größe }, lantern: { name: "Lantern", image: "previewImages/lantern.jpg", file: "https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Assets/refs/heads/main/Models/Lantern/glTF/Lantern.gltf", - scale: { x: 0.1, y: 0.1, z: 0.1 } + scale: { x: 0.1, y: 0.1, z: 0.1 }, + minScale: 0.05, + maxScale: 0.5 } }; @@ -570,72 +586,79 @@ } function calculateBoundingBox(object) { - const box = new THREE.Box3().setFromObject(object); - const size = new THREE.Vector3(); - box.getSize(size); - return size; -} - - -function calculateMaxScale(object) { - const boundingBox = calculateBoundingBox(object); - const viewportWidth = window.innerWidth; - const viewportHeight = window.innerHeight; - - // Berechne die maximal mögliche Skalierung, um im Viewport zu bleiben - const scaleWidth = viewportWidth / boundingBox.x; - const scaleHeight = viewportHeight / boundingBox.y; - - // Wähle den kleineren Wert und reduziere ihn leicht, um sicherzugehen, dass das Objekt nicht über den Rand hinausgeht - const safeScaleFactor = 0.95; // Puffer, um sicherzustellen, dass es nicht zu groß wird - - return Math.min(scaleWidth, scaleHeight) * safeScaleFactor; -} - + const box = new THREE.Box3().setFromObject(object); + const size = new THREE.Vector3(); + box.getSize(size); + return size; + } -function openScaleMenu() { - if (!selectedPlacedModel) { - showInfoDialog("Kein Modell ausgewählt. Bitte wählen Sie ein Modell aus, bevor Sie es bearbeiten."); - return; - } + function calculateMaxScale(object) { + const boundingBox = calculateBoundingBox(object); + const viewportWidth = window.innerWidth; + const viewportHeight = window.innerHeight; - // Berechne die maximale Skalierung für das spezifische Objekt - const maxScale = calculateMaxScale(selectedPlacedModel); + // Berechne die maximal mögliche Skalierung, um im Viewport zu bleiben + const scaleWidth = viewportWidth / boundingBox.x; + const scaleHeight = viewportHeight / boundingBox.y; - // Aktuelle Skalierung des Modells bestimmen - const currentScale = selectedPlacedModel.scale.x; + // Wähle den kleineren Wert und reduziere ihn leicht, um sicherzugehen, dass das Objekt nicht über den Rand hinausgeht + const safeScaleFactor = 0.95; // Puffer, um sicherzustellen, dass es nicht zu groß wird - const dynamicMenu = document.getElementById("dynamic-menu"); - dynamicMenu.style.display = "flex"; - dynamicMenu.innerHTML = ` - <h3>Skalierung anpassen</h3> - <label>Größe: <span id="scale-value">${currentScale.toFixed(2)}</span><input type="range" min="0.01" max="${maxScale.toFixed(2)}" step="0.0001" value="${currentScale}" onchange="updateScale(this.value)"></label> - <button onclick="closeDynamicMenu()">Zurück</button> - `; -} + return Math.min(scaleWidth, scaleHeight) * safeScaleFactor; + } - -/** - * + /** + function openScaleMenu() { + if (!selectedPlacedModel) { + showInfoDialog("Kein Modell ausgewählt. Bitte wählen Sie ein Modell aus, bevor Sie es bearbeiten."); + return; + } + + // Berechne die maximale Skalierung für das spezifische Objekt + const maxScale = calculateMaxScale(selectedPlacedModel); + + // Aktuelle Skalierung des Modells bestimmen + const currentScale = selectedPlacedModel.scale.x; + + const dynamicMenu = document.getElementById("dynamic-menu"); + dynamicMenu.style.display = "flex"; + dynamicMenu.innerHTML = ` + <h3>Skalierung anpassen</h3> + <label>Größe: <span id="scale-value">${currentScale.toFixed(2)}</span><input type="range" min="0.01" max="${maxScale.toFixed(2)}" step="0.0001" value="${currentScale}" onchange="updateScale(this.value)"></label> + <button onclick="closeDynamicMenu()">Zurück</button> + `; + } + + + + + * */ function openScaleMenu() { if (!selectedPlacedModel) { showInfoDialog("Kein Modell ausgewählt. Bitte wählen Sie ein Modell aus, bevor Sie es bearbeiten."); return; } + // Berechne die maximale Skalierung für das spezifische Objekt + // const maxScale = calculateMaxScale(selectedPlacedModel); + // Aktuelle Skalierung des Modells bestimmen const currentScale = selectedPlacedModel.scale.x; + const minScale = selectedPlacedModel.minScale; + const maxScale = selectedPlacedModel.maxScale; + const step = (maxScale - minScale) / 100; // Dynamische Schrittgröße basierend auf Grenzen const dynamicMenu = document.getElementById("dynamic-menu"); dynamicMenu.style.display = "flex"; dynamicMenu.innerHTML = ` <h3>Skalierung anpassen</h3> - <label>Größe: <span id="scale-value">${currentScale.toFixed(2)}</span><input type="range" min="0.01" max="3" step="0.001" value="${currentScale}" onchange="updateScale(this.value)"></label> + <label>Größe: <span id="scale-value">${currentScale.toFixed(2)}</span> + <input type="range" min="${minScale}" max="${maxScale}" step="${step}" value="${currentScale}" onchange="updateScale(this.value)"></label> <button onclick="closeDynamicMenu()">Zurück</button> `; - }*/ + } function updateScale(value) { if (selectedPlacedModel) {