feat: Add legacy shaders, model I/O, and project panel functionality
continuous-integration/drone/push Build is passing

- Introduced `legacy-shaders.js` containing vertex and fragment shaders for rendering.
- Implemented `model-io.js` for parsing and encoding GLB files, ensuring compatibility with glTF 2.0.
- Created `project-panel.js` to manage project resources and survey overlays, enhancing user interaction.
- Added `solar.js` for calculating solar positions based on UTC time, latitude, and longitude.
- Developed `three-renderer.js` as a standard backend for Three.js, managing scene rendering and material synchronization.
- Included a new GLB model `dum.glb` for testing and demonstration purposes.
- Established `data_checks.mjs` for validating model data and ensuring integrity of assets.
- Created `prepare_export.py` to facilitate Blender GLB exports, maintaining material and node references.
- Added `vendor_three.py` to download and configure a local version of Three.js for the project.
This commit is contained in:
martin.fencl
2026-10-22 01:04:21 +02:00
parent c5fcd79fe9
commit ba7790daba
85 changed files with 21 additions and 18 deletions
-348
View File
@@ -1,348 +0,0 @@
<!doctype html>
<html lang="cs">
<head>
<meta charset="utf-8">
<meta name="allstav-config-version" content="2025.2">
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
<title>Lo&#269;enice | Model domu / web</title>
<link rel="stylesheet" href="./css/app.css">
<link rel="stylesheet" href="./css/web.css">
<meta name="robots" content="noindex,nofollow">
</head>
<body>
<canvas id="view" aria-label="Interaktivn&#237; trojrozm&#283;rn&#253; model rodinn&#233;ho domu"></canvas>
<svg id="measure" aria-hidden="true"></svg>
<header>
<div class="eyebrow"><span class="dot"></span>RODINN&#221; D&#366;M - Lo&#269;enice</div>
<h1>Model domu / web &ndash; Lo&#269;enice (Novohradsk&#233; podh&#367;&#345;&#237;)</h1>
<div class="sub">Lo&#269;enice &middot; 3D model + simulace slunce</div>
<div class="metrics">
<div class="metric"><strong>15,340 m</strong><small>D&#233;lka</small></div>
<div class="metric"><strong>9,390 m</strong><small>&#352;&#237;&#345;ka</small></div>
<div class="metric"><strong>23&deg;</strong><small>St&#345;echa</small></div>
</div>
</header>
<div class="topright"><button id="standardsToggle" class="btn" type="button" aria-controls="standardsPanel" aria-expanded="false" title="Standardy a vybaveni domu"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><path d="M3 5h14M3 10h14M3 15h14"/><circle cx="7" cy="5" r="2" fill="currentColor"/><circle cx="13" cy="10" r="2" fill="currentColor"/><circle cx="7" cy="15" r="2" fill="currentColor"/></svg><span class="std-toggle-word">Standardy</span></button><button class="btn" id="sunToggle" aria-controls="sunPanel" aria-expanded="false"
title="Ovl&#225;d&#225;n&#237; slunce"><span class="solar-mark">&#9728;</span><span
class="toggle-word">Slunce</span></button><button class="btn icon" id="infoButton"
aria-label="Nastaven&#237; a informace o modelu" title="Nastaven&#237;">&#9881;&#xFE0E;</button><button
class="btn primary" id="saveGlb">St&#225;hnout <span
class="downloadText">model
</span>GLB</button></div>
<div class="panel" id="panel">
<h2>Model podle projektu</h2>
<p>Ot&#225;&#269;ec&#237; exteri&#233;rov&#253; model v metrech. Hlavn&#237; rozm&#283;ry a polohy otvor&#367;
vych&#225;zej&#237; z k&#243;t. Fas&#225;dn&#237; obklad: HardiePlank podle dodan&#233;ho vzorn&#237;ku; ostatn&#237; barevnost z p&#345;ilo&#382;en&#253;ch vizualizac&#237;.</p>
<h3>Parametry</h3>
<div class="row"><span>Ob&#225;lka domu</span><strong>15,340 &times; 9,390 m</strong></div>
<div class="row"><span>H&#345;eben nad podlahou 1. NP</span><strong>5,137 m</strong></div>
<div class="row"><span>Vrchol kom&#237;na</span><strong>5,837 m</strong></div>
<div class="row"><span>Kryt&#225; terasa / navazuj&#237;c&#237; ochoz</span><strong>&minus;0,03 / &minus;0,21
m</strong></div>
<h3>Barevnost</h3>
<div class="swatches"><label>Fas&#225;da<input id="wallColor" type="color" value="#c9c2ad"></label><label>Krytina<input id="roofColor" type="color" value="#414542"></label></div>
<section class="hardie-card" aria-labelledby="hardieTitle">
<div class="hardie-kicker">Fas&#225;dn&#237; obklad &#183; vstup a terasa</div>
<h4 id="hardieTitle">HardiePlank struktura d&#345;eva</h4>
<p class="hardie-spec">James Hardie &#183; vl&#225;knocement<br>Rozm&#283;r v&#253;robku: 3 600 &#215; 180 &#215; 8 mm</p>
<div id="hardiePreview" class="hardie-preview" role="img" aria-label="Orienta&#269;n&#237; n&#225;hled obkladu"></div>
<div class="hardie-preview-caption">ZV&#282;T&#352;EN&#221; DETAIL STRUKTURY &#183; ORIENTA&#268;N&#282;</div>
<div class="hardie-selection" aria-live="polite"><strong id="hardieColorName">O&#345;&#237;&#353;kov&#283; hn&#283;d&#225;</strong><small id="hardieProductCode">5771220 &#183; v&#253;choz&#237;</small></div>
<fieldset class="hardie-palette"><legend>Standardn&#237; barvy podle dodan&#233;ho vzorn&#237;ku</legend><div class="hardie-options"><label class="hardie-option" style="--chip:#ffffff"><input type="radio" name="hardieColor" value="snehove-bila" autocomplete="off"><span class="hardie-chip" aria-hidden="true"></span><span class="hardie-option-name">Sn&#283;hov&#283; b&#237;l&#225;</span><span class="hardie-option-code">5671220</span><span class="hardie-check" aria-hidden="true">&#10003;</span></label><label class="hardie-option" style="--chip:#d0c8bb"><input type="radio" name="hardieColor" value="sterkove-seda" autocomplete="off"><span class="hardie-chip" aria-hidden="true"></span><span class="hardie-option-name">&#352;t&#283;rkov&#283; &#353;ed&#225;</span><span class="hardie-option-code">5751220</span><span class="hardie-check" aria-hidden="true">&#10003;</span></label><label class="hardie-option" style="--chip:#b9c1c3"><input type="radio" name="hardieColor" value="mlhove-seda" autocomplete="off"><span class="hardie-chip" aria-hidden="true"></span><span class="hardie-option-name">Mlhov&#283; &#353;ed&#225;</span><span class="hardie-option-code">5841220</span><span class="hardie-check" aria-hidden="true">&#10003;</span></label><label class="hardie-option" style="--chip:#758896"><input type="radio" name="hardieColor" value="ocelove-seda" autocomplete="off"><span class="hardie-chip" aria-hidden="true"></span><span class="hardie-option-name">Ocelov&#283; &#353;ed&#225;</span><span class="hardie-option-code">5851220</span><span class="hardie-check" aria-hidden="true">&#10003;</span></label><label class="hardie-option selected" style="--chip:#776e65"><input type="radio" name="hardieColor" value="oriskove-hneda" checked autocomplete="off"><span class="hardie-chip" aria-hidden="true"></span><span class="hardie-option-name">O&#345;&#237;&#353;kov&#283; hn&#283;d&#225;</span><span class="hardie-option-code">5771220</span><span class="hardie-check" aria-hidden="true">&#10003;</span></label><label class="hardie-option" style="--chip:#241510"><input type="radio" name="hardieColor" value="espresso" autocomplete="off"><span class="hardie-chip" aria-hidden="true"></span><span class="hardie-option-name">Espresso</span><span class="hardie-option-code">5460122</span><span class="hardie-check" aria-hidden="true">&#10003;</span></label><label class="hardie-option" style="--chip:#4c5053"><input type="radio" name="hardieColor" value="antracitove-seda" autocomplete="off"><span class="hardie-chip" aria-hidden="true"></span><span class="hardie-option-name">Antracitov&#283; &#353;ed&#225;</span><span class="hardie-option-code">5420122</span><span class="hardie-check" aria-hidden="true">&#10003;</span></label></div></fieldset>
<p class="hardie-scope">M&#283;n&#237; se pouze svisl&#253; fas&#225;dn&#237; obklad u vstupu a na terase, v&#269;etn&#283; bo&#269;n&#237;ch st&#283;n. Podlaha a &#269;ela terasy ani schody se nem&#283;n&#237;.</p>
<a class="hardie-link" href="https://www.jameshardie.cz/cz/hardie-plank" target="_blank" rel="noopener noreferrer">HardiePlank na webu James Hardie &#8599;</a>
<div class="hardie-detail-buttons"><button type="button" data-cladding-view="entry">Detail vstupu</button><button type="button" data-cladding-view="terrace">Detail terasy</button></div>
<button class="hardie-structure-button" type="button" data-cladding-view="structure">P&#345;ibl&#237;&#382;it strukturu ve 3D</button>
<details class="hardie-note"><summary>Odst&#237;ny, struktura a p&#345;esnost modelu</summary>
<p>Barvy jsou ode&#269;ten&#233; z va&#353;eho obr&#225;zku vzorn&#237;ku, nikoli z kalibrovan&#253;ch dat v&#253;robce. Odst&#237;n ve sc&#233;n&#283; ovliv&#328;uje simulovan&#233; slunce, st&#237;n i monitor. Shodu s dodan&#253;m v&#253;robkem ov&#283;&#345;te na fyzick&#233;m vzorku.</p>
<img class="hardie-reference" src="./assets/ui/image-1.jpg" alt="Produktov&#225; fotografie struktury d&#345;eva z dodan&#233;ho vzorn&#237;ku">
<p>Ve 3D je dopln&#283;n jemn&#253; simulovan&#253; reli&#233;f inspirovan&#253; touto fotografi&#237;. Nejde o origin&#225;ln&#237; v&#253;robn&#237; texturu nebo 3D sken.</p>
<p>Vodorovn&#233; &#269;len&#283;n&#237;, geometrie a sp&#225;ry jsou zachov&#225;ny z p&#367;vodn&#237;ho modelu. Uveden&#253; rozm&#283;r desky je specifikace v&#253;robku, nikoli ov&#283;&#345;en&#237; klade&#269;sk&#233;ho pl&#225;nu nebo mont&#225;&#382;n&#237;ch detail&#367;.</p>
</details>
</section>
<p style="font-size:10px">Zvolen&#233; barvy a textura fas&#225;dn&#237;ho obkladu se ulo&#382;&#237; i do sta&#382;en&#233;ho GLB.</p>
<p style="font-size:10px"><a
href="https://www.sto.cz/cepcom/cz/documents/download_colour_ranges_1/StoColor_System_2022_CZ.pdf"
target="_blank" rel="noopener">Vzorn&#237;k barev StoColor System (PDF)</a></p>
<h3>Kolm&#233; pohledy</h3>
<select id="elevation">
<option value="">Vyber pohled...</option>
<option value="north">Severn&#237; pohled</option>
<option value="east">V&#253;chodn&#237; pohled</option>
<option value="south">Ji&#382;n&#237; pohled</option>
<option value="west">Z&#225;padn&#237; pohled</option>
</select>
<div class="buttons"><button class="btn" onclick="document.getElementById('saveGlb').click()">St&#225;hnout
model GLB</button></div>
<details class="site-note">
<summary>Okolí, výškopis a přesnost</summary>
<p><b>Tři spodní přepínače jsou nezávislé a při otevření zapnuté.</b> Zapnutí zároveň zaměří příslušný
pohled. Ikona vedle přepínačů zarámuje zapnuté okolí; Vstup, Terasa a Reset vrátí pohled k domu. Vypnutí
poslední vrstvy obnoví předchozí pohled.</p>
<p>Geometrie, měřítko a poloha původního domu, otvorů, střechy, teras a jejich schodů jsou zachované.
Nahrazen je pouze původní schematický terén, štěrk a vstupní zpevněná plocha.</p>
<p>Podklady okolí: C.2 a C.3 (umístění a upravené úrovně), C.4 (celý pozemek), C.5 (komunikace) a „Ločenice
p.č. 3480/37 – polohopis a výškopis“. Výšková nula: <b>591,840 m Bpv</b>. U vstupu <b>−0,480 m</b>, u
horní podesty schodů z parkování <b>+0,390 m</b>, na konci zahradních schodů dle C.3 <b>−1,395 m</b>.
</p>
<p>Povrch kombinuje původní zaměřené body s upravenými úrovněmi C.3. Mezi body je <b>interpolovaný</b>;
navázání okrajů, skladba dlažby a dvě auta jsou vizualizační zjednodušení. Parkovací plocha směrem k
ulici stoupá; není zobrazena jako jediná vodorovná deska.</p>
<p><b>Rozdíl v podkladech:</b> projekt uvádí výměru <b>1 010 m²</b>, obrys převzatý z vektorové kresby PDF v
měřítku domu vychází přibližně <b>988 m²</b> (o 2,2 % méně). Obrys není uměle zvětšen na deklarovanou
výměru. Přesnou hranici je nutné ověřit ze souřadnic nebo DWG; tato vizualizace není podklad pro
vytyčení ani zemní práce.</p>
<p>Výpočet slunce a převod světových stran do os modelu jsou zachované. Původní azimut severního štítu
<b>351,5°</b> a přibližná poloha obce nejsou tímto geodeticky ověřeny.
</p>
<p>PNG zachycuje právě viditelné vrstvy. GLB exportuje scénu s právě zapnutým okolím a zvolenými barvami;
ovládání slunce zůstává jen v HTML.</p>
</details>
<h3>Úpravy modelu</h3>
<p>Doplněn rohový sloup kryté terasy podle jižního a východního pohledu D.1.1.2.3.1. Průřez 200 × 200 mm a odsazení od hrany jsou odečtené orientačně z kresby, nikoli staticky ověřené. Vinotéka je u stěny a nad celou kuchyní pokračuje vysoký strop obýváku.</p>
<h3>Rozsah a omezen&#237;</h3>
<p class="note">Pracovn&#237; vizualiza&#269;n&#237; model, nikoli BIM nebo podklad pro stavbu. S volitelnou orientační vrstvou interiéru, bez skrytých konstrukcí. Terén okolí je doplněn podle C.3 a výškopisu; mezi body je
interpolovaný. Hranice jsou převzaté graficky z PDF, nikoli ze souřadnic pro vytyčení.</p>
<p>Profily oken, ta&#353;ky, oplechov&#225;n&#237;, technick&#233; vybaven&#237; a spoje jsou
zjednodu&#353;en&#233;. Z&#225;bradl&#237; je kovov&#233; podle pohled&#367; a technick&#233; zpr&#225;vy. V
p&#345;&#237;pad&#283; rozd&#237;lu maj&#237; v&#253;kresy p&#345;ednost p&#345;ed vizualizacemi.</p>
<h3>Pou&#382;it&#233; podklady</h3>
<p style="font-size:10px">D.1.1.2.1.1 P&#367;dorys 1NP<br>D.1.1.2.1.3 P&#367;dorys st&#345;echy<br>D.1.1.2.3.1
Pohledy<br>D.1.1.2.2.1&ndash;3 &#344;ezy A&ndash;A, B&ndash;B, C&ndash;C<br>D.1.1.1 Technick&#225;
zpr&#225;va<br>Obr&#225;zky 6_1.jpeg a 6_2.jpeg</p>
<div class="buttons"><button class="btn" id="savePng">Ulo&#382;it pohled PNG</button><button class="btn"
id="resetColors">P&#367;vodn&#237; barvy</button></div>
<div class="status"><span class="dot"></span>Samostatn&#253; soubor &middot; funguje bez internetu &middot;
verze 05 · sloup terasy, vinotéka a vysoký strop</div>
</div>
<div id="direction"><span class="tag">AKTU&#193;LN&#205; POHLED</span><span id="directionText">Terasa /
jihov&#253;chod</span></div>
<div class="bottom">
<nav class="toolbar" aria-label="Ovl&#225;d&#225;n&#237; modelu"><button class="tool"
data-preset="entry">Vstup</button><button class="tool"
data-preset="terrace">Terasa</button><button class="tool" data-preset="top">Shora</button><span
class="divider"></span><button class="tool" id="terrainButton"
title="Zobrazit nebo skr&#253;t ter&#233;n">Ter&#233;n</button><button class="tool"
id="measureButton">K&#243;ty</button><button class="tool optional active"
id="rotateButton">Ot&#225;&#269;en&#237;</button><span class="divider"></span><button class="tool"
id="resetView" title="Obnovit v&#253;choz&#237; pohled">Reset</button></nav>
<div class="site-controls" role="group" aria-label="Volitelné okolí domu; výchozí stav zapnuto">
<label class="site-switch" title="Komunikace a navazující terén mezi ulicí a domem"><input type="checkbox"
id="siteRoad" autocomplete="off" checked><span>Cesta a přístup</span></label>
<label class="site-switch" title="Celá zahrada a graficky převzatá hranice parcely"><input type="checkbox"
id="siteParcel" autocomplete="off" checked><span>Celý pozemek</span></label>
<label class="site-switch" title="Parkovací plocha, napojení a schody; dvě orientační auta"><input
type="checkbox" id="siteParking" autocomplete="off" checked><span>Parkování</span></label>
<button id="siteFit" class="site-fit" type="button" title="Zarámovat zapnuté okolí"
aria-label="Zarámovat zapnuté okolí"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1.5" aria-hidden="true">
<path d="M9 4H4v5M15 4h5v5M20 15v5h-5M9 20H4v-5" />
<rect x="9" y="9" width="6" height="6" rx="1" />
</svg></button>
</div>
<div id="siteMeta" hidden aria-live="polite"></div>
<div class="help">Ta&#382;en&#237;m ot&#225;&#269;ej &nbsp;&middot;&nbsp; Kole&#269;kem p&#345;ibli&#382;
&nbsp;&middot;&nbsp; Prav&#253;m tla&#269;&#237;tkem posu&#328;</div>
</div>
<div class="compass"><svg viewBox="0 0 84 84">
<circle cx="42" cy="42" r="27" fill="none" stroke="#bec8b7" />
<g id="compassGroup">
<line x1="42" y1="13" x2="42" y2="71" />
<line x1="13" y1="42" x2="71" y2="42" />
<path id="northArrow" d="M42 18 L37 32 L42 29 L47 32 Z" /><text x="42" y="8"
text-anchor="middle">S</text><text x="42" y="81" text-anchor="middle">J</text><text x="3" y="45"
text-anchor="middle">Z</text><text x="80" y="45" text-anchor="middle">V</text>
</g>
</svg></div>
<svg id="sunOverlay" aria-hidden="true"></svg>
<div id="sunStamp"><span>SLUNCE NAD DOMEM</span><br><strong id="sceneTime">21. 6. 2026 · 10:00</strong></div>
<section id="sunPanel" aria-label="Simulace slunce">
<div class="sun-panel-head">
<div>
<div class="sun-kicker">STUDIE OSVĚTLENÍ</div>
<h2>Slunce a stíny</h2>
</div><button class="close-panel" id="sunClose" aria-label="Skrýt panel slunce">×</button>
</div>
<div class="sun-date-row"><label class="sun-field">Datum<input id="sunDate" type="date" min="2000-01-01"
max="2100-12-31" value="2026-06-21"></label><label class="sun-field">Místní čas<input id="sunClock"
type="text" inputmode="numeric" value="10:00" maxlength="5" placeholder="HH:MM"
aria-label="Místní čas ve formátu HH:MM"></label></div>
<div class="sun-seasons" aria-label="Typické dny roku"><button data-season="03-20">Jaro</button><button
data-season="06-21" class="active">Léto</button><button data-season="09-23">Podzim</button><button
data-season="12-21">Zima</button></div>
<div class="sun-status-line"><span id="dayState">Slunce nad obzorem</span><span id="zoneLabel">SELČ ·
UTC+2</span></div>
<svg id="sunGraph" class="sun-graph" viewBox="0 0 304 86" role="img"
aria-label="Výška slunce během dne. Kliknutím změníš čas."></svg>
<label class="sr-only" for="sunTime"
style="position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)">Posun času</label>
<input class="sun-scrub" id="sunTime" type="range" min="0" max="1439" value="600" step="1"
aria-valuetext="10:00">
<div class="sun-ticks">
<span>00:00</span><span>06:00</span><span>12:00</span><span>18:00</span><span>24:00</span>
</div>
<div class="sun-play-row"><button id="sunPlay" type="button">▶ Přehrát den</button><select id="sunSpeed"
aria-label="Rychlost simulace">
<option value="15">15 min / s</option>
<option value="30" selected>30 min / s</option>
<option value="60">60 min / s</option>
</select><button id="sunNow" title="Aktuální datum a čas v Praze">Teď</button></div>
<div id="solarMessage" role="status"></div>
<div class="sun-readouts">
<div class="sun-stat">Výška nad obzorem<strong id="sunElevation">—</strong><small>Střed slunečního
kotouče</small></div>
<div class="sun-stat">Azimut slunce<strong id="sunAzimuth">—</strong><small id="sunDirection">Od severu po
směru hodin</small></div>
</div>
<div class="sun-events"><span>Východ <b id="sunRise">—</b></span><span>Poledne <b
id="sunNoon">—</b></span><span>Západ <b id="sunSet">—</b></span></div>
<div class="sun-options"><label><input type="checkbox" id="sunShadows" checked>Vržené stíny</label><label><input
type="checkbox" id="sunPath">Dráha ve 3D</label></div>
<p class="sun-hint" id="pathHint">Posouvej čas a sleduj, kam dopadá slunce na terasu a fasády. Natočení pohledu
polohu slunce nemění.</p>
<button class="sun-export" id="sunSavePng">Uložit obrázek s datem a časem</button>
<details class="sun-advanced">
<summary>Poloha a orientace domu</summary>
<div class="fields"><label class="sun-field">Zeměpisná šířka (° N)<input id="sunLat" type="number" min="-89"
max="89" step="0.0001" value="48.8242"></label><label class="sun-field">Zeměpisná délka (°
E)<input id="sunLon" type="number" min="-180" max="180" step="0.0001" value="14.5275"></label><label
class="sun-field full-row">Azimut severního štítu domu (°, od severu)<input id="houseBearing"
type="number" min="0" max="359.9" step="0.1" value="351.5"></label></div>
<p>Výchozí poloha: <b>Ločenice, přibližný bod obce</b>, nikoli geodeticky určený bod parcely. Ponecháno
původní nastavení <b>351,5°</b>, v původním HTML označené jako odečet severky D.1.1.2.1.1. Přiložené
situace a výškopis bez číselných souřadnic neumožňují toto natočení nezávisle potvrdit. Nejde o ověřený
azimut stavby.</p>
<p id="bearingNote">Jižní štít: 171,5° · vstupní fasáda: 261,5°.</p>
<button class="mini-btn" id="sunResetSite">Obnovit Ločenice a sever z projektu</button>
<p>Časové pásmo zůstává <b>Europe/Prague</b>. Letní čas se přepočítává podle zvoleného data a pravidel
prohlížeče.</p>
</details>
<details class="sun-advanced">
<summary>Co simulace počítá a co ne</summary>
<p>Sluneční poloha se počítá z data, času a zeměpisných souřadnic podle astronomických rovnic Meeus / NOAA.
Směr přímého světla i stínová mapa se mění spolu s časem. Zobrazená výška slunce je geometrická. Východ
a západ jsou určeny pro výšku středu −0,833°, bez místního horizontu.</p>
<p>Stíny vytváří geometrie tohoto modelu. <b>Okolní domy, stromy, ploty a vzdálený horizont nejsou
modelovány.</b> Terén navazuje na body výškopisu a úpravy C.3; mezi body je interpolovaný. Nejde o
výpočet vnitřního denního osvětlení, tepelných
zisků ani výkonu fotovoltaiky. Oblačnost není zahrnuta; jas a barva jsou vizualizační.</p>
<p>Dráha ve 3D je vysvětlující překryv v symbolickém měřítku; slunce není ve skutečné vzdálenosti. Noční
pohled je mírně přisvětlen pro orientaci. Velmi nízké slunce může mít stín mimo rozsah terénu.</p>
<p>Podklady: D.1.1.2.1.1 (severka), D.1.1.2.3.1 (fasády), D.1.1.1 a B (orientace a terasa); situační výkresy
C.1–C.5 pro umístění a „Ločenice p.č. 3480/37 – polohopis a výškopis“ pro terén.</p>
<p>Zdroje výpočtu a polohy: <a href="https://gml.noaa.gov/grad/solcalc/calcdetails.html" target="_blank"
rel="noopener">NOAA / Meeus</a> · <a href="https://www.mistopisy.cz/pruvodce/obec/8006/locenice/"
target="_blank" rel="noopener">Ločenice – souřadnice</a>. Připojení je potřeba jen pro otevření
těchto zdrojů, ne pro simulaci.</p>
</details>
<p class="sun-footnote">Pracovní studie stínů · bez internetu<br>Geometrie domu zůstává zachována. Export GLB
neobsahuje ovládání slunce.</p>
</section>
<button id="interiorLaunch" type="button" aria-controls="interiorPanel" aria-expanded="false" disabled>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><path d="M3 11 12 4 21 11M5 10v10h14V10M10 20v-7h5v7"/></svg>
<span>Zapnout interiér<small>Půdorys · 3D bez střechy · procházení</small></span>
</button>
<div class="interior-heading"><button class="btn" id="interiorExit" title="Zpět na původní exteriér (Esc)">← Exteriér</button><div><div class="eyebrow">INTERIÉR / 1. NADZEMNÍ PODLAŽÍ</div><h2 id="interiorViewTitle">Dům bez střechy</h2></div></div>
<section id="interiorPanel" aria-label="Pohledy a nastavení interiéru">
<div class="interior-panel-title"><h3>Uvnitř domu</h3><span>9 místností</span></div>
<svg id="interiorMap" viewBox="0 0 330 205" role="group" aria-label="Kliknutím na místnost přejdete dovnitř"></svg>
<p class="int-map-hint">Klikněte na místnost v mapě nebo vyberte připravený pohled.</p>
<div class="int-kicker">Kuchyň a obytný prostor</div>
<div class="int-views">
<button data-interior-view="kitchen">Kuchyně</button><button data-interior-view="outlook">Z kuchyně ven</button>
<button data-interior-view="living">Obývací prostor</button><button data-interior-view="vault">Trámy a vysoké okno</button>
<button data-interior-view="kitchenVault" style="grid-column:1/-1">Vysoký strop nad kuchyní</button>
</div>
<div class="int-kicker">Přejít do místnosti</div>
<select id="interiorRoom" aria-label="Pohled z vybrané místnosti"><option value="">Vyberte místnost…</option></select>
<section class="int-paint" aria-labelledby="interiorPaintTitle">
<div class="int-paint-head"><h4 id="interiorPaintTitle">Barva zd&#237;</h4><span>Vnit&#345;n&#237; om&#237;tka</span></div>
<div class="int-paint-fields">
<label class="int-paint-picker" title="Vybrat vlastn&#237; barvu zd&#237;"><input id="interiorWallColor" type="color" value="#eeeae1" aria-label="Barva vnit&#345;n&#237;ch zd&#237;" aria-describedby="interiorPaintScope"></label>
<label class="int-paint-hex" for="interiorWallHex">Vlastn&#237; odst&#237;n / HEX<input id="interiorWallHex" type="text" value="#EEEAE1" maxlength="7" spellcheck="false" autocapitalize="characters" autocomplete="off" aria-label="HEX k&#243;d barvy vnit&#345;n&#237;ch zd&#237;"></label>
</div>
<div class="int-paint-presets" role="group" aria-label="P&#345;ipraven&#233; barvy zd&#237;">
<button type="button" data-interior-paint="#eeeae1" aria-pressed="true"><span class="int-paint-chip" style="--paint:#eeeae1" aria-hidden="true"></span>Tepl&#225; b&#237;l&#225;</button>
<button type="button" data-interior-paint="#ffffff" aria-pressed="false"><span class="int-paint-chip" style="--paint:#ffffff" aria-hidden="true"></span>&#268;ist&#225; b&#237;l&#225;</button>
<button type="button" data-interior-paint="#dfceb3" aria-pressed="false"><span class="int-paint-chip" style="--paint:#dfceb3" aria-hidden="true"></span>P&#237;skov&#225;</button>
<button type="button" data-interior-paint="#d9d9d4" aria-pressed="false"><span class="int-paint-chip" style="--paint:#d9d9d4" aria-hidden="true"></span>Sv&#283;tle &#353;ed&#225;</button>
<button type="button" data-interior-paint="#c4cebc" aria-pressed="false"><span class="int-paint-chip" style="--paint:#c4cebc" aria-hidden="true"></span>&#352;alv&#283;jov&#225;</button>
<button type="button" data-interior-paint="#d5c7b9" aria-pressed="false"><span class="int-paint-chip" style="--paint:#d5c7b9" aria-hidden="true"></span>Jemn&#283; b&#233;&#382;ov&#225;</button>
</div>
<button class="int-paint-reset" id="interiorWallReset" type="button">Obnovit p&#367;vodn&#237; barvu zd&#237;</button>
<p class="int-paint-note" id="interiorPaintScope">M&#283;n&#237; v&#353;echny vnit&#345;n&#237; om&#237;tnut&#233; st&#283;ny. Strop, tr&#225;my, obklady a fas&#225;da z&#367;st&#225;vaj&#237; beze zm&#283;ny. Zvolen&#253; odst&#237;n se prom&#237;tne i do PNG a GLB.</p>
</section>
<div class="int-options">
<label><input type="checkbox" id="interiorFurniture" checked>Vybavení</label>
<label><input type="checkbox" id="interiorRoomLabels" checked>Názvy místností</label>
<label><input type="checkbox" id="interiorFill" checked>Přisvětlení interiéru</label>
</div>
<p>V pohledech shora je střecha skrytá a stěny zkrácené do výšky 1,12 m. Procházení obnoví plnou výšku stěn, podhledy a trámy. Dveře mezi místnostmi jsou zobrazené otevřené.</p>
<details class="int-source"><summary>Podklady a přesnost modelu</summary>
<p><b>Dispozice:</b> půdorys D.1.1.2.1.1 ze dne 21. 9. 2026. Čísla místností a popisky ploch jsou převzaté z výkresu. Obvod domu, poloha oken a vnějších dveří jsou beze změny z původního modelu.</p>
<p><b>Kuchyň:</b> zelená dvířka, dubové plochy, vysoké skříně, otevřené police a poloostrov podle dodaných obrázků. Vinotéka je na konci poloostrova u stěny. Nad celou kuchyní a obývacím prostorem je souvislý vysoký šikmý strop s přiznanými trámy. Uspořádání do U je přizpůsobené místnosti 108 a průchodům; přesné výrobní rozměry skříněk ani typy spotřebičů nejsou doložené.</p>
<p><b>Trámy:</b> vzhled upraven hlavně podle pohled_ven.jpeg: vodorovné trámy, svislé podpěry, krátké podélné vzpěry a navazující horní trám. Světlé dřevo má kresbu podél jednotlivých prvků. Přesné průřezy a spoje nejsou z obrázků ověřené; jde o vzhledovou studii, ne statický návrh.</p>
<p><b>Orientační:</b> rozměry nábytku, světlá výška ostatních místností 2,60 m, vysoký strop obytného prostoru podle stávajícího sklonu střechy, průřezy a detaily trámů, sanita a technické vybavení. Jde o prostorovou studii, nikoli výrobní dokumentaci nebo statický návrh.</p>
<p>Rámy oken zůstaly v původní barvě, i když mají referenční obrázky různé odstíny. Výhled používá stávající 3D okolí; fotografie nejsou přesným panoramatem okolní krajiny. V procházení jsou okenní skla opticky skrytá pro volný výhled.</p>
<p>Přisvětlení slouží k čitelnosti interiéru. Simulace slunce není výpočtem vnitřního denního osvětlení.</p>
<div class="int-source-buttons"><button data-int-ref="plan">Původní půdorys</button><button data-int-ref="kitchen1">Kuchyň · 1</button><button data-int-ref="kitchen2">Kuchyň · 2</button><button data-int-ref="view1">Výhled · 1</button><button data-int-ref="view2">Výhled · 2</button></div>
</details>
<button class="int-export" id="interiorSavePng">Uložit aktuální pohled PNG</button>
<button class="int-export" id="interiorSaveGlb">Stáhnout zobrazený model GLB</button>
</section>
<div id="interiorLabels" aria-label="Místnosti v půdorysu"></div>
<div id="interiorTools"><div id="interiorHint">Tažením otáčejte · kolečkem přibližujte · kliknutím na místnost vstupte dovnitř</div>
<nav class="int-mode-bar" aria-label="Režim interiéru"><button data-interior-mode="plan">Půdorys</button><button data-interior-mode="axon" class="active">3D bez střechy</button><button data-interior-mode="walk">Procházet</button><button id="interiorFit" class="int-nav-button" title="Zarámovat dům / obnovit pohled">⌖</button><button id="interiorPanelToggle" class="int-nav-button" title="Skrýt nebo zobrazit navigaci" aria-expanded="true">☷</button></nav>
</div>
<div id="walkPad" aria-label="Ovládání chůze"><button data-walk="forward" aria-label="Jít vpřed">↑</button><button data-walk="left" aria-label="Krok vlevo">←</button><button data-walk="back" aria-label="Jít vzad">↓</button><button data-walk="right" aria-label="Krok vpravo">→</button></div>
<dialog id="interiorReferenceDialog"><div class="int-ref-head"><h3 id="interiorReferenceTitle">Podklad</h3><button id="interiorReferenceClose" aria-label="Zavřít podklad">Zavřít ×</button></div><img id="interiorReferenceImage" alt="Dodaný podklad interiéru"><p class="int-ref-caption" id="interiorReferenceCaption"></p></dialog>
<div id="toast"></div>
<div id="loading">
<div class="spinner"></div>
<div class="label">Na&#269;&#237;t&#225;m 3D model...</div>
</div>
<aside id="standardsPanel" aria-label="Výběr standardů ALLSTAV">
<div class="std-head"><div class="std-kicker">ALLSTAV / STANDARDY 2025</div><div class="std-head-row"><h2>Váš dům, váš výběr</h2><button id="stdClose" class="std-close" aria-label="Zavřít standardy" type="button">×</button></div><p>Katalogové varianty a materiály přímo v modelu.</p></div>
<div class="std-tabs" role="tablist" aria-label="Kategorie standardů"><button role="tab" id="std-tab-exterior" data-std-tab="exterior" aria-selected="true" aria-controls="std-exterior">Exteriér</button><button role="tab" id="std-tab-interior" data-std-tab="interior" aria-selected="false" aria-controls="std-interior">Interiér</button><button role="tab" id="std-tab-summary" data-std-tab="summary" aria-selected="false" aria-controls="std-summary">Můj výběr</button></div>
<div class="std-scroll"><div id="std-exterior" role="tabpanel" aria-labelledby="std-tab-exterior"></div><div id="std-interior" role="tabpanel" aria-labelledby="std-tab-interior" hidden></div><div id="std-summary" role="tabpanel" aria-labelledby="std-tab-summary" hidden></div></div>
<div class="std-footer"><div id="stdSaved" class="std-saved" role="status">Připraveno</div><div class="std-footer-row"><button class="std-action dark" data-std-action="summary">Přehled výběru</button><button class="std-action" data-std-action="exportJson">Zálohovat výběr</button></div></div></aside>
<dialog id="stdCatalogDialog" aria-labelledby="stdCatalogTitle"><div class="std-dialog-head"><h3 id="stdCatalogTitle">Katalog ALLSTAV</h3><button id="stdCatalogClose">Zavřít ×</button></div><img id="stdCatalogImage" alt="Katalog ALLSTAV"><p id="stdCatalogCaption"></p><div class="std-dialog-pager"><button id="stdCatalogPrev">← Předchozí</button><button id="stdCatalogNext">Další →</button></div></dialog>
<dialog id="stdResetDialog" aria-labelledby="stdResetTitle"><h3 id="stdResetTitle">Obnovit výchozí výběr?</h3><p>Vaše volby standardů budou nahrazeny výchozím nastavením. Před obnovením je můžete zálohovat jako JSON. Slunce a okolí domu se nemění.</p><div class="std-two"><button id="stdResetCancel" class="std-action">Zrušit</button><button id="stdResetConfirm" class="std-action dark">Obnovit</button></div></dialog>
<input id="stdImport" type="file" accept=".json,application/json" hidden>
<script id="stdSavedState" type="application/json">{}</script>
<script type="module" src="./js/bootstrap.js"></script>
<div id="webStatus" role="status">Načítání modelu…</div>
<button id="projectToggle" class="btn" type="button">Projekt a podklady</button>
<dialog id="projectDialog" aria-labelledby="projectTitle">
<div class="web-dialog-head"><div><small>LOČENICE / ZDROJOVÝ MODEL</small><h2 id="projectTitle">Projekt a podklady</h2></div><button id="projectClose" class="btn" aria-label="Zavřít">Zavřít</button></div>
<div class="web-dialog-body">
<p class="web-lead">Dům, katalog a ovládání jsou samostatné soubory. Stavební geometrie vychází z dosavadního modelu, vybavení z referenčních obrázků.</p>
<h3>Kuchyň a obývací pokoj</h3><div id="projectPhotos" class="web-photo-grid"></div>
<p class="web-note">Fotografie se liší v rámech oken a detailech nábytku. Jde o vzhledové reference, nikoli o výrobní výkres kuchyně nebo zaměřené panorama.</p>
<h3>Pozemek a výšky</h3><div id="surveyStats" class="web-stat-grid"></div>
<p class="web-note">Body výškopisu jsou v Bpv; poloha v 3D je převzatá z grafického odečtu PDF. Upravený terén u domu je jiná vrstva než původní zaměření. Rozpor plochy není opraven natažením modelu.</p>
<div class="web-actions"><button class="btn" id="surveyShow">Zobrazit body v modelu</button><button class="btn" data-int-ref="survey">Otevřít výškopis</button><a class="btn" href="./data/site.json" download="locenice_pozemek.json">Data pozemku JSON</a></div>
<h3>Editace modelu</h3><p>Soubor <code>models/dum.glb</code> lze importovat do Blenderu. Kompletní zdroj obsahuje i skryté varianty dveří, žaluzií a interiéru. Export „viditelný výběr“ je naopak pouze konkrétní varianta.</p>
<div class="web-actions"><a class="btn primary" href="./models/dum.glb" download="dum_zdrojovy.glb">Stáhnout celý zdrojový GLB</a><a class="btn" href="./data/catalog.json" download="allstav_katalog.json">Katalog JSON</a></div>
<p class="web-note" id="backendNote"></p>
</div>
</dialog>
<svg id="surveyOverlay" aria-label="Body výškopisu" style="display:none"></svg>
<noscript><div class="web-fatal">Pro 3D model povolte JavaScript. <a href="./models/dum.glb">Stáhnout GLB</a></div></noscript>
</body>
</html>