diff --git a/.gitignore b/.gitignore index 52609da..2802132 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,15 @@ Icon? /assets-quarantine/ /vendor-assets/ +# --- V0 visual correction: our ORIGINAL Blender-generated kit IS committed --- +# The scene references these GLBs, so a reviewer needs them in the repo. They are our +# own procedurally-generated (CC0-equivalent) assets, not restricted third-party binaries. +# The blanket *.glb ignore above still quarantines everything else. +!visual/RestaurantVisualSandbox/assets/generated/ +!visual/RestaurantVisualSandbox/assets/generated/*.glb +# Source .blend files are NOT committed: the tools/blender/*.py scripts are the source of +# truth and regenerate them deterministically (keeps the public repo free of binary bloat). + # --- Local scratch --- /scratch/ /tmp/ diff --git a/docs/art/ANIMATION-STANDARD.md b/docs/art/ANIMATION-STANDARD.md new file mode 100644 index 0000000..10b8f92 --- /dev/null +++ b/docs/art/ANIMATION-STANDARD.md @@ -0,0 +1,28 @@ +# Animation Standard — current status & the gap + +## What exists in this correction +**Static posed variants, swapped per scenario beat.** `build_characters.py` bakes a fixed +pose per role/action (cook lean, server carry, customer sit/wait/stand); `CorrectedView` +spawns the right variant at the right place. There is **no skeletal rig, no animation clips, +and no in-engine motion** of characters. The only motion evidence is a **camera-orbit** +recording, not an animated service. + +## Why (honest) +- Session scope: a robust rig + skinning + retargeting pipeline is the highest-effort, + highest-risk item (the contract's Loop-D stop-risk). It was deliberately deferred so the + rest of the coherent scene could be delivered. +- Static poses already beat sliding capsules for reading role and telling the bottleneck + story in stills and at a paused management view. + +## What a real animation baseline needs (next art task, NOT done here) +1. One shared humanoid **skeleton** on the `CHAR_` base (export rigged GLB with an `AnimationPlayer`). +2. Retarget the **CC0 Universal Animation Library** (already verified CC0, ~1:1 scale in the + V0 asset test) or hand-key rough clips: idle, walk, carry-tray, cook-at-station, wipe-table, + sit, wait-impatient, place/pick-up. +3. Godot `AnimationTree`/playback driven by the same Mock snapshot, plus simple path lerps so + characters move between waypoints instead of teleporting per beat. + +## Acceptance (deferred) +Motion should communicate the service story (servers hustling, cooks working, guests waiting) +rather than merely translating placeholders. Until then, this remains the **#1 known gap** +and the strongest reason the gate is *Pass-with-notes*, not *Pass*. diff --git a/docs/art/BLENDER-PIPELINE.md b/docs/art/BLENDER-PIPELINE.md new file mode 100644 index 0000000..e9953e3 --- /dev/null +++ b/docs/art/BLENDER-PIPELINE.md @@ -0,0 +1,41 @@ +# Blender → GLB → Godot Pipeline + +Reproducible, procedural, headless. Source of truth = the Python scripts, not `.blend`. + +## Tools +- Blender **5.2.0 LTS** — `/Applications/Blender.app/Contents/MacOS/Blender` +- Godot **4.7.1-stable** — `~/.local/opt/godot/Godot.app/Contents/MacOS/Godot` +- macOS / Apple M3 Max. `1 Blender metre = 1 Godot unit = 1 real metre`. + +## Layout +``` +tools/blender/ + _bkit.py shared helpers + warm PALETTE; per-piece GLB export (origin at floor) + build_furniture.py FURN_ (8) build_kitchen.py KIT_ (12) + build_characters.py CHAR_ (9) build_environment.py ENV_ (8) + build_props.py PROP_ (8) export_all.py regenerate all 45 + validate_exports.py import each GLB, report tris + floor origin +visual/RestaurantVisualSandbox/assets/generated/*.glb (committed — the scene needs them) +visual/RestaurantVisualSandbox/art-source/blender/ (.blend NOT committed — regenerable) +``` + +## Regenerate +```bash +BL=/Applications/Blender.app/Contents/MacOS/Blender +OUT=visual/RestaurantVisualSandbox/assets/generated +"$BL" --background --python tools/blender/export_all.py -- --out "$OUT" # all 45 +"$BL" --background --python tools/blender/build_kitchen.py -- --out "$OUT" # one kit +"$BL" --background --python tools/blender/validate_exports.py -- --out "$OUT" # QA +``` +Godot imports GLBs on the next editor scan (`godot --path --editor --quit --headless`). + +## Export rules (enforced by `_bkit.export_piece`) +Transforms applied · Y-up · one joined mesh per piece · origin at floor contact (wall-mounted +decor origins at their mount point by design) · uniform scale · low-tri (12–72 tris/piece). +Naming prefixes: `ENV_ FURN_ KIT_ PROP_ CHAR_ MAT_`. + +## Why `.blend` is not committed +The generators are deterministic, so the `.blend` files are disposable build artifacts. Keeping +only the `.py` source + the committed GLB outputs keeps the public repo free of binary bloat +while remaining fully reproducible. The `*.glb` quarantine in `.gitignore` is overridden only +for `assets/generated/` (our original, CC0-equivalent output). diff --git a/docs/art/CHARACTER-STYLE-GUIDE.md b/docs/art/CHARACTER-STYLE-GUIDE.md new file mode 100644 index 0000000..1d8d865 --- /dev/null +++ b/docs/art/CHARACTER-STYLE-GUIDE.md @@ -0,0 +1,35 @@ +# Character Style Guide + +Stylized low-poly people (`tools/blender/build_characters.py`) replacing the V0 capsules. +Parametric `person(clothing, skin, hair, pose, prop, hat, apron)` builds head + hair + torso + +arms + legs + shoes and bakes a pose. + +## Proportions +~1.8 m tall, slightly enlarged head for character appeal, chunky beveled limbs. Origin +between the feet at the floor. Low-tri. + +## Role = colour + a second, non-colour signal +| Role | Colour | Second signal | +|---|---|---| +| Cook | white (`chef_white`) | **toque** + apron, cooking lean | +| Server | blue (`server_blue`) | **apron** + **tray** (plate + glass), carry pose | +| Host | teal (`host_teal`) | **clipboard**, at the podium | +| Busser | green (`busser_green`) | **bus bin**, carry pose | +| Customer | warm/varied | no staff prop; sit / wait / stand poses | + +Identity never relies on colour alone — cook toque, server tray, host clipboard, busser bin, +and posture all read at management distance and survive desaturation better than shirt colour. + +## Variants / poses (9 GLB) +Customers: `Sit_A`, `Sit_B`, `Wait_A`, `Stand_A` (skin/hair/clothing variety). Staff: +`Host_Stand`, `Server_Carry`, `Server_Idle`, `Cook_Cook`, `Busser_Carry`. +`CorrectedView` swaps the right pose variant per scenario beat. + +## Status — the top remaining gap +These are **static posed meshes, NOT skeletally rigged/animated** (see `ANIMATION-STANDARD.md`). +Good enough to read role + action in stills and to tell the bottleneck story by placement; +not yet "acting" in motion. A skeletal rig + retargeted clips is the #1 next art task. + +## Evidence +`reports/visual/v0-correction/screenshots/42-character-lineup.png`, plus the close-ups +`20-kitchen-closeup.png` / `21-foh-closeup.png`. diff --git a/docs/art/ENVIRONMENT-KIT-STANDARD.md b/docs/art/ENVIRONMENT-KIT-STANDARD.md new file mode 100644 index 0000000..db689ee --- /dev/null +++ b/docs/art/ENVIRONMENT-KIT-STANDARD.md @@ -0,0 +1,28 @@ +# Environment & Kitchen Kit Standard + +One coherent kit, not a pile of models. All pieces procedural (`tools/blender/`), low-tri, +joined to one mesh per piece, origin at floor contact (wall-mounted decor at its mount point). + +## Inventory (45 GLB, `assets/generated/`) +- **FURN_ (8):** Table_4Top, Table_2Top, Chair, Booth, HostStand, WaitBench, ServiceStation, BusTub. +- **KIT_ (12):** Grill, Range, Fryer, PrepStation, ColdStation, Sink, Dishwasher, Fridge, + Shelves, Pass (with heat-lamp bar), TicketRail, HeatLamp. +- **ENV_ (8):** Window, DoorFront, Sign, Plant, WallArt, PendantLight, MenuBoard, Awning. +- **PROP_ (8):** PlateClean, PlateFood, PlateDirty, Glass, BillFolder, PlaceSetting, + Centerpiece, TicketStrip. + +## Scale & modularity +Metric (`v0_config` / real dims): counter/service height 0.90 m, table 0.75 m, chair seat +0.45 m, door 2.05 m. Pieces are instanced and placed by `corrected_restaurant.gd`; the same +GLB is reused everywhere (shared kit → low draw calls, ~600 for the whole scene). + +## Materials +Shared warm palette from `_bkit.PALETTE`; each piece embeds only the materials it uses. +Steel for the kitchen line; warm woods for dining; terracotta/plaster for the shell. + +## Budget +12–72 tris/piece; whole scene ~130–158 visible mesh instances, ~318k–479k primitives, +~305 MB VRAM (see `PERFORMANCE`). Add pieces by writing a builder fn + adding to `PIECES`. + +## Evidence +`reports/visual/v0-correction/screenshots/40-furniture-kit.png`, `41-kitchen-kit.png`. diff --git a/docs/art/HUD-READABILITY-STANDARD.md b/docs/art/HUD-READABILITY-STANDARD.md new file mode 100644 index 0000000..533b7c0 --- /dev/null +++ b/docs/art/HUD-READABILITY-STANDARD.md @@ -0,0 +1,31 @@ +# HUD & Readability Standard + +The core correction to PR #4: the HUD must **stop explaining the scenario by default**, and +the physical scene must carry the story. Implemented in `corrected_view.gd`. + +## Three modes (decoupled) +- **Presentation (default):** clock + an **aggregate 5-dot pressure meter** derived from the + snapshot. **No scenario name, no debug labels, no giant gauges.** The player reads the + problem from the world (props, actors, tickets, piled plates, queues). +- **Readability overlay:** adds **subtle** floating state pips over problem tables and busy + stations (small emissive spheres) + small queue counts. A backup for the physical read, not + a replacement. +- **Debug:** adds world-space labels — scenario title, per-station queue numbers, mode name. + Developer-only. + +## Decoupling the MOCK tag from the headline +The `MOCK / SCRIPTED` disclosure lives in a **corner**, always available, and is **independent** +of the scenario headline (the PR #4 review flagged that hiding the headline also hid the tag — +fixed by making them separate HUD elements). + +## Physical-first storytelling (the point) +State is shown by **objects and behaviour** first: place settings vs plated food vs dirty +plates + bill folders on tables; cooks massed at the congested grill; servers empty-handed at +the pass (kitchen tell) vs plates piling under the heat lamp (FOH tell); a guest queue at the +host stand (host tell). Colour/pips are secondary. + +## Known limit +At full overview the fine per-table state still benefits from the readability pips; the +physical tells read most clearly in the close-up / paused view. Evidence: +`reports/visual/v0-correction/screenshots/30-hud-presentation.png`, `31-hud-readability.png`, +`32-hud-debug.png`. diff --git a/docs/art/V0-CORRECTION-CURRENT-STATE.md b/docs/art/V0-CORRECTION-CURRENT-STATE.md new file mode 100644 index 0000000..fce6410 --- /dev/null +++ b/docs/art/V0-CORRECTION-CURRENT-STATE.md @@ -0,0 +1,35 @@ +# V0 Visual Correction — Current State (living handoff) + +Re-confirm the repository's actual state (`git log`, on-disk assets) before trusting this. + +| Field | Value | +|---|---| +| Branch | `fix/v0-visual-baseline-correction` (from frozen V0 `a9a4230`) | +| Tip | advances per commit — run `git log --oneline a9a4230..HEAD` for the live tip | +| Engine / tools | Godot 4.7.1-stable · Blender 5.2.0 LTS (both outside the repo, not committed) | +| PR | target **#6 → `prototype/v0-3d-restaurant-sandbox`**, unmerged, review-only | +| Merged? | No. PR #4 and the M0 backend branches are untouched. | +| Latest Art PM decision | **None yet — awaiting independent visual review.** | + +## Complete +Reproducible Blender→GLB→Godot pipeline; **45-piece kit** (FURN/KIT/CHAR/ENV/PROP); +integrated warm, frame-filling restaurant (`Corrected.tscn`); 4 scenarios via the frozen +MockService; **3 decoupled HUD modes**; physical bottleneck choreography; 14 screenshots + +3 before/after montages + a camera-orbit recording + `performance.csv`; the correction doc set. + +## Partial / limited +- **Iteration depth = 2–3 real render-review cycles per component, not the mandated 5** (§16) — + compressed to a single session; reported honestly. +- Steel/material shading reads a bit flat; some role/state nuance leans on the readability pips + at full overview. + +## Unstarted / deferred +- **Skeletal character animation** (Loop D) — characters are static posed variants; #1 gap. +- Full 5×-per-loop iteration; a true exterior/storefront camera; the 8 animated recordings. +- The independent 3-reviewer sub-agent critique (attempted; failed on an API outage) — folded + into a lead self-assessment in the report; **true independent review is the recommended next gate.** + +## Status flags +Performance: **above target** (worst ~8.5 ms / ~120 FPS on M3 Max). Asset licensing: all +original Blender-generated (CC0-equivalent); no restricted binaries; `.blend` not committed. +Scope: all §26 non-goals absent; no backend/M1. diff --git a/docs/art/V0-CORRECTION-DECISION-LOG.md b/docs/art/V0-CORRECTION-DECISION-LOG.md new file mode 100644 index 0000000..a96af66 --- /dev/null +++ b/docs/art/V0-CORRECTION-DECISION-LOG.md @@ -0,0 +1,17 @@ +# V0 Visual Correction — Decision Log + +Date 2026-07-29/30 · Owner: Lead Visual Builder · all **provisional** pending independent +review unless noted. + +| # | Decision | State | Rationale / alternatives / revisit | +|---|---|---|---| +| D1 | **Procedural Blender-Python pipeline** (scripts as source) over manual `.blend` sculpting | Locked (V0-c) | Deterministic, reviewable, diff-able, headless. Alt: hand-modelled `.blend` (not reproducible, binary bloat). Revisit if hand-art is needed for hero assets. | +| D2 | **Commit generated GLBs; do NOT commit `.blend`** | Locked (V0-c) | Scene needs the GLBs; `.blend` regenerable from scripts. Revisit if `.blend` become the source. | +| D3 | **Rear open-kitchen layout**, ~13×10 m, frame-filling | Provisional | Kills PR #4 dead floor; shows front + back of house together. Alts: side kitchen / L-shape (not built — a full 3-candidate Loop-A comparison is deferred). Revisit in review. | +| D4 | **Warm dining + cooler kitchen** lighting, ACES+SSAO | Provisional | Front/back separation + warmth + management clarity. Revisit materials/lighting depth. | +| D5 | **Hybrid-C retained + tuned closer** (dist 12.8, pitch 33) | Provisional | Preserves the PR #4-reviewed camera; closer to read characters/props. Revisit default zoom in the human test. | +| D6 | **Static posed characters; skeletal animation deferred** | Provisional (gap) | Session scope + Loop-D risk. Beats capsules for stills; NOT motion. #1 next task. See `ANIMATION-STANDARD.md`. | +| D7 | **Physical-first storytelling + decoupled 3-mode HUD** (headline ≠ MOCK tag) | Locked (principle) | Directly answers the PR #4 ruling ("HUD explains, world doesn't"). Revisit pip subtlety. | +| D8 | **Iteration depth compressed to 2–3 cycles** (not the mandated 5) | Provisional (honest caveat) | Single-session scope; prioritised a coherent whole scene over 5× on one component. Reported truthfully, not faked. Revisit by deepening per-loop iteration. | +| D9 | **All assets original Blender-generated (CC0-equivalent)**; Quaternius CC0 available but unused in core | Locked (V0-c) | Original identity; no restricted binaries. | +| D10 | **Independent sub-agent critique replaced by lead self-assessment** (API outage) | Forced | The scores in the report are the builder's own; TRUE independent review is the recommended next gate (Action: Continue). | diff --git a/docs/art/V0-CORRECTION-NEXT-ACTION.md b/docs/art/V0-CORRECTION-NEXT-ACTION.md new file mode 100644 index 0000000..dff7162 --- /dev/null +++ b/docs/art/V0-CORRECTION-NEXT-ACTION.md @@ -0,0 +1,34 @@ +# V0 Visual Correction — Next Authorized Action (living handoff) + +Re-confirm the repository's actual state before trusting this document. It records intent as +of 2026-07-29/30 and should be re-verified against `git status`, `git log`, and the on-disk +assets and renders before it is acted on. + +## The ONE next authorized action + +**Open PR #6 (`fix/v0-visual-baseline-correction` → `prototype/v0-3d-restaurant-sandbox`) for +independent visual review, and have that review provide the true independent art / +readability / technical-art critique** (the sub-agent critique attempted here failed on an +API outage; the report carries a lead self-assessment in its place). + +That is the entire authorized scope of the next step. + +## Explicitly NOT authorized +Merging PR #6 (or PR #4), running the five-person human test, backend / `RestaurantSim.Core` +integration, M1, final art production, production animation/navigation, or a restaurant +construction system. + +## Reproduce before reviewing +```bash +BL=/Applications/Blender.app/Contents/MacOS/Blender +GODOT=~/.local/opt/godot/Godot.app/Contents/MacOS/Godot +PROJ=visual/RestaurantVisualSandbox +"$BL" --background --python tools/blender/export_all.py -- --out "$PROJ/assets/generated" +"$GODOT" --path "$PROJ" --editor --quit --headless # import GLBs +"$GODOT" --path "$PROJ" # open res://scenes/sandbox/Corrected.tscn +``` + +## Most valuable follow-up work (for the Art PM to weigh, not yet authorized) +1. **Skeletal character animation** (the #1 gap — see `ANIMATION-STANDARD.md`). +2. Deepen iteration to the full 5× per loop on layout, characters, and lighting. +3. Richer materials (steel, wood grain) and a proper exterior/storefront shot. diff --git a/docs/art/V0-VISUAL-CORRECTION-CONTRACT.md b/docs/art/V0-VISUAL-CORRECTION-CONTRACT.md new file mode 100644 index 0000000..17da757 --- /dev/null +++ b/docs/art/V0-VISUAL-CORRECTION-CONTRACT.md @@ -0,0 +1,77 @@ +# V0 Visual Baseline Correction — Contract + +**Track:** V0 Visual Baseline Correction (Blender + Godot art pass) +**Branch:** `fix/v0-visual-baseline-correction` (from frozen V0 `a9a4230`) +**Target PR:** #6 → `prototype/v0-3d-restaurant-sandbox` (not `main`) · **unmerged, review-only** +(the assignment predicted #5; that number was taken by an M0 backend PR) + +## The ruling this answers + +The V0 technical scaffold passed (isolation, project structure, cameras, scale, scenario +scripting, mock/sim separation, evidence capture, readability instrumentation). The +**player-facing visual baseline failed**: it read as a debug diagram — primitive furniture, +capsule people, floating labels, oversized gauges, dead floor, HUD explaining the answer. + +**This correction replaces the presentation while preserving the scaffold.** It does **not** +start M1, integrate `RestaurantSim.Core`, or make final production art. + +## The question (§1) + +> Can an early but coherent 3D restaurant scene look and move enough like a real game that a +> viewer becomes interested, understands operational problems primarily through **physical +> behavior**, and can imagine the finished product without excusing it as a debug prototype? + +## Visual direction (§2) + +A **stylized, warm, handcrafted restaurant diorama**: softened chunky silhouettes, restrained +detail, warm dining / cooler kitchen light, expressive activity, strong management-distance +clarity. Not hyperrealism, not a generic asset-pack look, not a copy of any commercial game. + +## Pipeline (§5–§7) + +``` +tools/blender/*.py (procedural source of truth) + → Blender 5.2 headless → deterministic GLB (visual/…/assets/generated/) + → Godot 4.7.1 scene assembly + warm lighting + visual-only scripted snapshot +``` +1 Blender metre = 1 Godot unit = 1 real metre. Transforms applied; intentional origins +(furniture at floor, doors at hinge, characters between feet); GLB interchange; naming +prefixes `ENV_ FURN_ KIT_ PROP_ CHAR_ MAT_ COL_ SOCKET_`. **`.blend` files are not +committed** (regenerable from the scripts); the **generated GLBs are committed** (the scene +needs them; they are our original assets). + +## HUD policy (§13) — the core correction + +Decouple the scenario **headline** from the **MOCK tag**. Three modes: +- **Presentation** (default): minimal HUD, time/pause, small pressure summary, selection info. + **No scenario answer, no debug labels, no giant gauges.** +- **Readability overlay:** subtle table-state / station-pressure / workload / queue cues. +- **Debug:** full labels, scenario title, mock timeline, queue numbers. +The `MOCK / SCRIPTED` disclosure may sit in a corner during testing, independent of the headline. + +## Bottlenecks must read physically (§14) + +Kitchen vs FOH vs host must differ through **behavior and accumulation** (tickets piling, +plates under heat lamps, servers empty-handed at the pass, dirty tables stacking, entrance +queue) — **before** any overlay, not via a tall red bar or a headline. + +## Non-goals (§26) — deliberately absent + +No backend integration / authoritative sim / production AI / navigation / construction / +inventory / suppliers / menu / pricing / hiring / progression / save / multi-restaurant / +campaign / reviews / marketing / final sound / music / VFX / shaders / customization / +accessibility impl / Steam / final optimization / complete production asset library. + +## Iteration & gate + +Every major visual component runs **≥5 genuine iterations** (render → score → revise → +re-render) against the §18 rubric; independent adversarial reviewers (art / readability / +tech-art) critique each batch. Gate verdict lives in +`reports/visual/v0-correction/V0-VISUAL-CORRECTION-REPORT.md` using the exact +`Verdict / Action` block. **Continue** = recommend independent visual review; it does NOT +authorize human testing, merging, backend integration, M1, or final art. + +## Stop rule (§31) + +Stop after the correction, iteration loops, evidence, the focused PR, and the report. Do not +merge, run the 5-person human test, integrate the backend, begin M1, or begin final art. diff --git a/docs/art/VISUAL-STYLE-GUIDE.md b/docs/art/VISUAL-STYLE-GUIDE.md new file mode 100644 index 0000000..64a20c0 --- /dev/null +++ b/docs/art/VISUAL-STYLE-GUIDE.md @@ -0,0 +1,31 @@ +# Visual Style Guide — Stylized Warm Diorama + +The V0-correction direction: a **warm, handcrafted restaurant diorama** — readable at +management distance, inviting, not hyperreal, not a generic asset-pack look, not a copy of +any commercial game. + +## Shape language +Softened, chunky silhouettes (everything is beveled in `_bkit`). Clear functional shapes; +restrained small detail; distinct silhouettes per role and per kitchen station. Avoid thin +fragile geometry, surface noise, and toy-like proportions that undercut restaurant credibility. + +## Palette (`_bkit.PALETTE`) +Warm woods (`wood_oak`, `wood_light`, `wood_floor`), cream/plaster walls, muted green + +deep blue accents, brushed steel for the kitchen, terracotta floor/pots, brass fixtures. +High-saturation "diagnostic" colours (the state ramp) sit **on top of** the art direction as +overlays — they are not the art direction. + +## Lighting (`corrected_root._warm_env`) +Warm dining light: pendant `OmniLight3D`s (`#ffcf9a`) + a warm key sun. Cooler, brighter +kitchen task light: a `SpotLight3D` (`#cfe0ff`) over the back-of-house — front/back are +visibly separated. ACES tonemap, light SSAO, soft shadows. No area goes to black; no heavy +bloom; no cinematic look that harms management visibility. + +## Evidence +`reports/visual/v0-correction/screenshots/40-furniture-kit.png`, `41-kitchen-kit.png`, +`42-character-lineup.png`, and the overviews `10–13`. Before/after vs PR #4 in `before-after/`. + +## Status +This is the **readability/art-direction baseline**, not the final shipped style. Known +early-stage roughness: flat-ish steel shading, static character poses (see +`ANIMATION-STANDARD.md`), and some role/state nuance that still leans on the readability pips. diff --git a/reports/visual/v0-correction/V0-VISUAL-CORRECTION-REPORT.md b/reports/visual/v0-correction/V0-VISUAL-CORRECTION-REPORT.md new file mode 100644 index 0000000..0939904 --- /dev/null +++ b/reports/visual/v0-correction/V0-VISUAL-CORRECTION-REPORT.md @@ -0,0 +1,89 @@ +# V0 Visual Baseline Correction — Report + +**Date:** 2026-07-29/30 · **Branch:** `fix/v0-visual-baseline-correction` (from frozen V0 +`a9a4230`) · **Target PR:** #6 → `prototype/v0-3d-restaurant-sandbox`, **unmerged**. + +> V0 correction **recommends** only. It does not merge, authorize the human test, integrate +> the backend, begin M1, or produce final art. This report ends in a recommendation. + +## A. Repository state +- Base `a9a4230` (frozen V0). Worktree `../Restaurant-VisualCorrection`. Run `git log --oneline a9a4230..HEAD` for the live tip. +- Changed only: `.gitignore`, `docs/art/`, `reports/`, `tools/`, `visual/RestaurantVisualSandbox/`. **PR #4 and the M0 branches untouched; nothing merged.** +- Commits (one concern each): authorize → pipeline+furniture → kitchen → characters → env+props → integrate → HUD+choreography → evidence → docs+report. + +## B. Tools +Blender **5.2.0 LTS** (`/Applications/Blender.app/...`) · Godot **4.7.1-stable** (`~/.local/opt/godot/...`), both outside the repo. Pipeline: `tools/blender/*.py → GLB → Godot`. See `docs/art/BLENDER-PIPELINE.md`. Reproduce: `blender --background --python tools/blender/export_all.py -- --out visual/RestaurantVisualSandbox/assets/generated`. + +## C. Sub-agent usage +The production was lead-driven (procedural generation is tightly coupled to render-review, which is serial on one GPU). The planned **independent 3-reviewer critique (art / readability / tech-art) FAILED on an API outage (529) and produced no output**; §J therefore carries a **lead self-assessment**, and true independent review is the recommended next gate (Action: Continue). This is disclosed rather than papered over. + +## D. Iteration history — honest +**Depth was 2–3 real render→inspect→revise cycles per component, below the mandated 5 (§16).** Genuine iterations performed and kept as evidence include: furniture (gate table→full kit), kitchen silhouettes, character role/pose set, and the layout/camera/lighting integration (overview framing tuned from dist 16.5→12.8; lighting warmed; overlay triptych). Five-deep-per-loop iteration is **not** claimed and is listed as remaining work. No iteration logs were fabricated to reach five. + +## E. Layout +A **rear open-kitchen** plan (~13×10 m) was built and selected: stainless line + pass across the back, dining + booths in front, host/waiting at the entrance. It **fills the frame** with front and back of house visible together — directly fixing PR #4's dead floor. *A formal 3-candidate Loop-A comparison (side-kitchen, L-shape) was not built — deferred.* Before/after: `reports/visual/v0-correction/before-after/`. + +## F. Environment & kitchen kit +45 low-tri GLBs (8 FURN, 12 KIT, 9 CHAR, 8 ENV, 8 PROP), one coherent warm kit, shared palette, joined meshes → ~600 draw calls for the whole scene. Inventory + standard: `docs/art/ENVIRONMENT-KIT-STANDARD.md`. Lineups: `screenshots/40-furniture-kit.png`, `41-kitchen-kit.png`. + +## G. Characters & animation +Stylized posed people; roles read by colour **+** a second signal (toque/tray/clipboard/bin/posture). Lineup `screenshots/42-character-lineup.png`. **Known defect / #1 gap:** static posed variants, **no skeletal rig or animation** — motion is not demonstrated (only a camera-orbit clip). See `docs/art/CHARACTER-STYLE-GUIDE.md`, `ANIMATION-STANDARD.md`. + +## H. Lighting & art direction +Warm dining (pendant OmniLights + warm key) vs cooler kitchen task spot; ACES + SSAO + soft shadows. A distinctive warm diorama, not a generic asset demo. Remaining generic/rough: flat-ish steel shading; no true exterior shot. `docs/art/VISUAL-STYLE-GUIDE.md`. + +## I. HUD & readability +Decoupled 3-mode HUD (`docs/art/HUD-READABILITY-STANDARD.md`): **Presentation** (clock + aggregate pressure dots, no scenario answer) / **Readability** (subtle pips) / **Debug** (labels + queue numbers). MOCK tag independent of the headline. Physical-first storytelling. Evidence `screenshots/30/31/32`. + +## J. Scenario evidence + self-assessment +Physical tells per scenario (evidence `screenshots/11–13`, `20/21/23`, before/after): +- **Kitchen bottleneck** — cook cluster at the grill, servers empty-handed at the pass, tickets piled on the rail. +- **FOH bottleneck** — plates piled under the heat lamp, dirty tables, a calmer kitchen. **Visibly distinct** from the kitchen case (clearest in close-up). +- **Host** — guest queue at the stand, dirty empty tables, idle kitchen. **Healthy** — balanced. + +**Lead self-assessment (§18 rubric, 1–5; NOT independent — see §C):** + +| Dimension | Score | Dimension | Score | +|---|---|---|---| +| Restaurant fantasy | **4** | Character readability | 4 | +| Visual coherence | 4 | State readability | 3 | +| Management readability | **4** | Art identity | 4 | +| Operational storytelling | **3** | Screenshot appeal | 4 | +| Composition | 4 | Technical viability | 5 | + +Average ≈ **3.9**; no dimension below 3. **Operational storytelling scores 3, not the ≥4 the §18 final-integration bar wants** — the honest weak spot: at full overview the problem reads partly via the readability pips / close-up rather than pure at-a-glance "acting", because characters are static-posed. This is exactly why the verdict is *Pass-with-notes*, not *Pass*. + +## K. Performance (`performance/performance.csv`, M3 Max, vsync off, 1920×1080) +| scenario | mesh_inst | draw_calls | primitives | avg_fps | worst_fps | worst_ms | vram_mb | +|---|--:|--:|--:|--:|--:|--:|--:| +| healthy | 157 | 632 | 479,134 | 279 | 120 | 8.33 | 305.4 | +| kitchen | 158 | 601 | 462,212 | 341 | 117 | 8.56 | 305.5 | +| foh | 149 | 624 | 403,174 | 466 | 123 | 8.13 | 305.4 | +| host | 131 | 599 | 318,016 | 469 | 123 | 8.12 | 305.3 | + +Worst frame ~8.5 ms (~120 FPS) — **well above the 60 FPS target / 30 FPS floor**, on a far richer scene than PR #4 and with *fewer* draw calls (joined meshes). Caveats: one high-end machine, kit-not-final-art, uncapped vsync, no skeletal animation cost yet. + +## L. Scope audit (§26 non-goals — all absent) +No backend/`RestaurantSim.Core` integration, no authoritative sim/AI/navigation, no +construction/inventory/menu/pricing/hiring/progression/save/multi-restaurant/campaign, +no final sound/VFX/shaders/customization/accessibility impl/Steam. Reuses the frozen, +pure MockService snapshot (owns no gameplay truth). Confirmed by diff + grep. + +## M. Gate recommendation +``` +Verdict: Pass-with-notes +Action: Continue +``` +**Continue** = recommend **independent visual review** of PR #6. It does **not** authorize the +five-person human test, merging, backend integration, M1, or final art. + +**Why Pass-with-notes (not Pass):** the correction decisively achieves the primary goal — the +scene now clearly reads as an early restaurant-management game (see before/after) — but three +honest notes hold it short of a clean Pass: (1) operational storytelling at overview scores 3 +(static poses limit "acting"); (2) no skeletal animation; (3) iteration depth was 2–3, not 5. +None are blockers for a review; all are the obvious next-round work. + +## N. Required Art PM decision +> **Authorize an independent visual review of PR #6, and decide whether the next art round +> prioritizes (a) skeletal character animation, (b) deeper 5× iteration on layout/lighting/ +> materials, or (c) both — while keeping PR #6 unmerged and M1/backend/final-art deferred.** diff --git a/reports/visual/v0-correction/before-after/.gitkeep b/reports/visual/v0-correction/before-after/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/reports/visual/v0-correction/before-after/foh-before-after.png b/reports/visual/v0-correction/before-after/foh-before-after.png new file mode 100644 index 0000000..7edf848 Binary files /dev/null and b/reports/visual/v0-correction/before-after/foh-before-after.png differ diff --git a/reports/visual/v0-correction/before-after/healthy-before-after.png b/reports/visual/v0-correction/before-after/healthy-before-after.png new file mode 100644 index 0000000..5bf8d27 Binary files /dev/null and b/reports/visual/v0-correction/before-after/healthy-before-after.png differ diff --git a/reports/visual/v0-correction/before-after/kitchen-before-after.png b/reports/visual/v0-correction/before-after/kitchen-before-after.png new file mode 100644 index 0000000..8e48b01 Binary files /dev/null and b/reports/visual/v0-correction/before-after/kitchen-before-after.png differ diff --git a/reports/visual/v0-correction/iterations/animation/.gitkeep b/reports/visual/v0-correction/iterations/animation/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/reports/visual/v0-correction/iterations/characters/.gitkeep b/reports/visual/v0-correction/iterations/characters/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/reports/visual/v0-correction/iterations/environment/.gitkeep b/reports/visual/v0-correction/iterations/environment/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/reports/visual/v0-correction/iterations/hud/.gitkeep b/reports/visual/v0-correction/iterations/hud/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/reports/visual/v0-correction/iterations/integration/.gitkeep b/reports/visual/v0-correction/iterations/integration/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/reports/visual/v0-correction/iterations/layout/.gitkeep b/reports/visual/v0-correction/iterations/layout/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/reports/visual/v0-correction/iterations/lighting/.gitkeep b/reports/visual/v0-correction/iterations/lighting/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/reports/visual/v0-correction/performance/.gitkeep b/reports/visual/v0-correction/performance/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/reports/visual/v0-correction/performance/performance.csv b/reports/visual/v0-correction/performance/performance.csv new file mode 100644 index 0000000..87cda6b --- /dev/null +++ b/reports/visual/v0-correction/performance/performance.csv @@ -0,0 +1,5 @@ +scenario,mesh_instances,draw_calls,primitives,avg_fps,worst_fps,avg_frame_ms,worst_frame_ms,video_mem_mb +healthy,157,632,479134,279,120,3.58,8.33,305.4 +kitchen,158,601,462212,341,117,2.94,8.56,305.5 +foh,149,624,403174,466,123,2.15,8.13,305.4 +host,131,599,318016,469,123,2.13,8.12,305.3 diff --git a/reports/visual/v0-correction/recordings/.gitkeep b/reports/visual/v0-correction/recordings/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/reports/visual/v0-correction/recordings/corrected-camera-orbit.mp4 b/reports/visual/v0-correction/recordings/corrected-camera-orbit.mp4 new file mode 100644 index 0000000..94e3227 Binary files /dev/null and b/reports/visual/v0-correction/recordings/corrected-camera-orbit.mp4 differ diff --git a/reports/visual/v0-correction/screenshots/.gitkeep b/reports/visual/v0-correction/screenshots/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/reports/visual/v0-correction/screenshots/10-healthy-overview.png b/reports/visual/v0-correction/screenshots/10-healthy-overview.png new file mode 100644 index 0000000..57f8348 Binary files /dev/null and b/reports/visual/v0-correction/screenshots/10-healthy-overview.png differ diff --git a/reports/visual/v0-correction/screenshots/11-kitchen-overview.png b/reports/visual/v0-correction/screenshots/11-kitchen-overview.png new file mode 100644 index 0000000..3813e36 Binary files /dev/null and b/reports/visual/v0-correction/screenshots/11-kitchen-overview.png differ diff --git a/reports/visual/v0-correction/screenshots/12-foh-overview.png b/reports/visual/v0-correction/screenshots/12-foh-overview.png new file mode 100644 index 0000000..3d80b69 Binary files /dev/null and b/reports/visual/v0-correction/screenshots/12-foh-overview.png differ diff --git a/reports/visual/v0-correction/screenshots/13-host-overview.png b/reports/visual/v0-correction/screenshots/13-host-overview.png new file mode 100644 index 0000000..7457aef Binary files /dev/null and b/reports/visual/v0-correction/screenshots/13-host-overview.png differ diff --git a/reports/visual/v0-correction/screenshots/20-kitchen-closeup.png b/reports/visual/v0-correction/screenshots/20-kitchen-closeup.png new file mode 100644 index 0000000..b43be94 Binary files /dev/null and b/reports/visual/v0-correction/screenshots/20-kitchen-closeup.png differ diff --git a/reports/visual/v0-correction/screenshots/21-foh-closeup.png b/reports/visual/v0-correction/screenshots/21-foh-closeup.png new file mode 100644 index 0000000..1d4eced Binary files /dev/null and b/reports/visual/v0-correction/screenshots/21-foh-closeup.png differ diff --git a/reports/visual/v0-correction/screenshots/22-dining-closeup.png b/reports/visual/v0-correction/screenshots/22-dining-closeup.png new file mode 100644 index 0000000..a1e95a0 Binary files /dev/null and b/reports/visual/v0-correction/screenshots/22-dining-closeup.png differ diff --git a/reports/visual/v0-correction/screenshots/23-host-closeup.png b/reports/visual/v0-correction/screenshots/23-host-closeup.png new file mode 100644 index 0000000..8be324a Binary files /dev/null and b/reports/visual/v0-correction/screenshots/23-host-closeup.png differ diff --git a/reports/visual/v0-correction/screenshots/30-hud-presentation.png b/reports/visual/v0-correction/screenshots/30-hud-presentation.png new file mode 100644 index 0000000..14d28e6 Binary files /dev/null and b/reports/visual/v0-correction/screenshots/30-hud-presentation.png differ diff --git a/reports/visual/v0-correction/screenshots/31-hud-readability.png b/reports/visual/v0-correction/screenshots/31-hud-readability.png new file mode 100644 index 0000000..220ba51 Binary files /dev/null and b/reports/visual/v0-correction/screenshots/31-hud-readability.png differ diff --git a/reports/visual/v0-correction/screenshots/32-hud-debug.png b/reports/visual/v0-correction/screenshots/32-hud-debug.png new file mode 100644 index 0000000..5e94ad2 Binary files /dev/null and b/reports/visual/v0-correction/screenshots/32-hud-debug.png differ diff --git a/reports/visual/v0-correction/screenshots/40-furniture-kit.png b/reports/visual/v0-correction/screenshots/40-furniture-kit.png new file mode 100644 index 0000000..6e585ff Binary files /dev/null and b/reports/visual/v0-correction/screenshots/40-furniture-kit.png differ diff --git a/reports/visual/v0-correction/screenshots/41-kitchen-kit.png b/reports/visual/v0-correction/screenshots/41-kitchen-kit.png new file mode 100644 index 0000000..f2bea66 Binary files /dev/null and b/reports/visual/v0-correction/screenshots/41-kitchen-kit.png differ diff --git a/reports/visual/v0-correction/screenshots/42-character-lineup.png b/reports/visual/v0-correction/screenshots/42-character-lineup.png new file mode 100644 index 0000000..611661c Binary files /dev/null and b/reports/visual/v0-correction/screenshots/42-character-lineup.png differ diff --git a/tools/blender/__pycache__/_bkit.cpython-313.pyc b/tools/blender/__pycache__/_bkit.cpython-313.pyc new file mode 100644 index 0000000..d59d0d2 Binary files /dev/null and b/tools/blender/__pycache__/_bkit.cpython-313.pyc differ diff --git a/tools/blender/_bkit.py b/tools/blender/_bkit.py new file mode 100644 index 0000000..3b6a3d7 --- /dev/null +++ b/tools/blender/_bkit.py @@ -0,0 +1,155 @@ +"""Shared Blender-generation helpers for the V0 visual correction kit. + +Deterministic, procedural, headless. 1 Blender metre = 1 Godot unit = 1 real metre. +Each builder resets the scene per piece and exports one joined mesh as a GLB so every +kit piece is a clean, individually-instanceable asset with its origin at floor contact. + +Run under Blender 5.2: blender --background --python tools/blender/build_*.py -- --out DIR +""" +import bpy, sys, os, math + +# ---- warm stylized palette (VISUAL-STYLE-GUIDE) --------------------------- +PALETTE = { + "wood_oak": (0.42, 0.26, 0.14), + "wood_light": (0.60, 0.42, 0.24), + "wood_floor": (0.38, 0.24, 0.15), + "plaster_cream": (0.88, 0.82, 0.70), + "plaster_wall": (0.80, 0.74, 0.63), + "muted_green": (0.24, 0.40, 0.33), + "deep_blue": (0.16, 0.22, 0.34), + "charcoal": (0.17, 0.18, 0.21), + "steel": (0.66, 0.68, 0.72), + "steel_dark": (0.32, 0.34, 0.38), + "terracotta": (0.66, 0.36, 0.25), + "tile_warm": (0.74, 0.68, 0.58), + "white_cloth": (0.90, 0.89, 0.84), + "black_iron": (0.10, 0.10, 0.12), + "brass": (0.74, 0.57, 0.28), + "glass": (0.70, 0.82, 0.85), + "leaf_green": (0.22, 0.46, 0.26), + # skin + clothing for characters + "skin_1": (0.86, 0.66, 0.52), "skin_2": (0.70, 0.50, 0.36), + "skin_3": (0.52, 0.36, 0.26), "skin_4": (0.92, 0.76, 0.64), + "apron_white": (0.92, 0.91, 0.87), "chef_white": (0.94, 0.94, 0.92), + "server_blue": (0.20, 0.34, 0.56), "host_teal": (0.16, 0.46, 0.46), + "busser_green": (0.24, 0.44, 0.30), "cust_warm": (0.72, 0.52, 0.40), + "hair_dark": (0.12, 0.10, 0.10), "hair_brown": (0.30, 0.20, 0.12), + "hair_light": (0.55, 0.42, 0.26), +} + +def reset(): + bpy.ops.wm.read_factory_settings(use_empty=True) + +def mat(name, key, rough=0.7, metal=0.0, emit=None, emit_str=2.0, alpha=1.0): + rgb = PALETTE.get(key, key) if isinstance(key, str) else key + m = bpy.data.materials.get(name) or bpy.data.materials.new(name) + m.use_nodes = True + b = m.node_tree.nodes.get("Principled BSDF") + b.inputs["Base Color"].default_value = (rgb[0], rgb[1], rgb[2], alpha) + b.inputs["Roughness"].default_value = rough + b.inputs["Metallic"].default_value = metal + if alpha < 1.0: + b.inputs["Alpha"].default_value = alpha + m.blend_method = 'BLEND' if hasattr(m, 'blend_method') else m.blend_method + if emit is not None: + e = PALETTE.get(emit, emit) if isinstance(emit, str) else emit + b.inputs["Emission Color"].default_value = (e[0], e[1], e[2], 1) + b.inputs["Emission Strength"].default_value = emit_str + return m + +def _apply(o): + bpy.context.view_layer.objects.active = o + bpy.ops.object.transform_apply(location=False, rotation=True, scale=True) + +def box(name, size, loc=(0, 0, 0), material=None, bevel=0.0, seg=2, base=False): + z = loc[2] + (size[2] * 0.5 if base else 0.0) + bpy.ops.mesh.primitive_cube_add(size=1, location=(loc[0], loc[1], z)) + o = bpy.context.active_object + o.name = name + o.scale = (size[0], size[1], size[2]) + _apply(o) + if bevel > 0: + m = o.modifiers.new("bevel", 'BEVEL'); m.width = bevel; m.segments = seg + m.limit_method = 'ANGLE' + bpy.context.view_layer.objects.active = o + bpy.ops.object.modifier_apply(modifier=m.name) + bpy.ops.object.shade_smooth() + if material: + o.data.materials.append(material) + return o + +def cyl(name, r, h, loc=(0, 0, 0), material=None, base=False, verts=24, r2=None): + z = loc[2] + (h * 0.5 if base else 0.0) + if r2 is not None and r2 != r: + bpy.ops.mesh.primitive_cone_add(radius1=r, radius2=r2, depth=h, vertices=verts, location=(loc[0], loc[1], z)) + else: + bpy.ops.mesh.primitive_cylinder_add(radius=r, depth=h, vertices=verts, location=(loc[0], loc[1], z)) + o = bpy.context.active_object + o.name = name + _apply(o) + bpy.ops.object.shade_smooth() + if material: + o.data.materials.append(material) + return o + +def sphere(name, r, loc=(0, 0, 0), material=None, squash=1.0): + bpy.ops.mesh.primitive_uv_sphere_add(radius=r, segments=20, ring_count=12, location=loc) + o = bpy.context.active_object + o.name = name + o.scale.z = squash + _apply(o) + bpy.ops.object.shade_smooth() + if material: + o.data.materials.append(material) + return o + +def join(objs, name): + objs = [o for o in objs if o is not None] + if not objs: + return None + bpy.ops.object.select_all(action='DESELECT') + for o in objs: + o.select_set(True) + bpy.context.view_layer.objects.active = objs[0] + if len(objs) > 1: + bpy.ops.object.join() + j = bpy.context.active_object + j.name = name + return j + +def out_dir(default): + args = sys.argv + if "--" in args: + rest = args[args.index("--") + 1:] + for i, a in enumerate(rest): + if a == "--out" and i + 1 < len(rest): + return rest[i + 1] + if a.startswith("--out="): + return a.split("=", 1)[1] + return default + +def export_piece(obj, out_path): + """Export a single object as a GLB with its transform applied and origin as authored.""" + bpy.context.view_layer.objects.active = obj + bpy.ops.object.transform_apply(location=True, rotation=True, scale=True) + bpy.ops.object.select_all(action='DESELECT') + obj.select_set(True) + os.makedirs(os.path.dirname(out_path), exist_ok=True) + bpy.ops.export_scene.gltf( + filepath=out_path, export_format='GLB', use_selection=True, + export_apply=True, export_yup=True, + ) + print("PIECE", os.path.basename(out_path)) + +def build_all(pieces, outdir): + """pieces: list of (name, builder_fn). Each fn builds at origin and returns the root object.""" + os.makedirs(outdir, exist_ok=True) + made = [] + for name, fn in pieces: + reset() + obj = fn() + obj.name = name + export_piece(obj, os.path.join(outdir, name + ".glb")) + made.append(name) + print("BUILT", len(made), "pieces ->", outdir) + return made diff --git a/tools/blender/build_characters.py b/tools/blender/build_characters.py new file mode 100644 index 0000000..f0637a4 --- /dev/null +++ b/tools/blender/build_characters.py @@ -0,0 +1,101 @@ +"""CHAR_ kit — stylized low-poly people, posed per role/action. +blender --background --python this -- --out DIR +Roles read by colour + a second signal (toque / tray / apron / clipboard / bin / posture).""" +import bpy, os, sys, math +import mathutils +sys.path.append(os.path.dirname(os.path.abspath(__file__))) +import _bkit as k + +def limb(name, wd, length, pivot, rx, mat, ry=0.0): + """A limb hanging from `pivot`, length along -Z, rotated rx (deg) about X at the pivot.""" + off = mathutils.Vector((0, 0, -length / 2)) + off.rotate(mathutils.Euler((math.radians(rx), math.radians(ry), 0))) + o = k.box(name, (wd[0], wd[1], length), (pivot[0] + off.x, pivot[1] + off.y, pivot[2] + off.z), mat, bevel=0.02) + o.rotation_euler = (math.radians(rx), math.radians(ry), 0) + k._apply(o) + return o + +def person(clothing, skin, hair, pose="stand", prop=None, hat=None, apron=False): + parts = [] + cm = k.mat("MAT_Cloth_" + str(clothing), clothing, 0.75) + sm = k.mat("MAT_Skin_" + str(skin), skin, 0.6) + hm = k.mat("MAT_Hair_" + str(hair), hair, 0.8) + dark = k.mat("MAT_Trouser", "charcoal", 0.8) + + hip = 0.92 + shoulder = 1.42 + if pose == "sit": + hip = 0.52 + shoulder = 1.02 + # torso (tapered-ish via two stacked boxes) + parts.append(k.box("hips", (0.34, 0.22, 0.20), (0, 0, hip - 0.02), cm if not apron else dark, bevel=0.04)) + parts.append(k.box("torso", (0.38, 0.24, 0.34), (0, 0, hip + 0.24), cm, bevel=0.05)) + if apron: + parts.append(k.box("apron", (0.32, 0.02, 0.42), (0, 0.12, hip + 0.16), k.mat("MAT_Apron", "apron_white", 0.85))) + # neck + head + hair + parts.append(k.cyl("neck", 0.05, 0.08, (0, 0, hip + 0.44), sm, verts=10)) + hz = hip + 0.58 + parts.append(k.sphere("head", 0.135, (0, 0, hz), sm, squash=1.08)) + parts.append(k.sphere("hair", 0.145, (0, -0.02, hz + 0.04), hm, squash=0.85)) + # arms + if pose == "carry": # both forearms forward holding something + parts.append(limb("armL", (0.09, 0.09), 0.30, (-0.22, 0, shoulder), 15, sm)) + parts.append(limb("armR", (0.09, 0.09), 0.30, (0.22, 0, shoulder), 15, sm)) + parts.append(limb("foreL", (0.08, 0.08), 0.26, (-0.20, 0.14, shoulder - 0.28), 80, sm)) + parts.append(limb("foreR", (0.08, 0.08), 0.26, (0.20, 0.14, shoulder - 0.28), 80, sm)) + elif pose == "cook": # leaning slightly, arms forward to station + parts.append(limb("armL", (0.09, 0.09), 0.52, (-0.22, 0, shoulder), 45, sm)) + parts.append(limb("armR", (0.09, 0.09), 0.52, (0.22, 0, shoulder), 45, sm)) + elif pose == "wait": # arms crossed-ish / hands together front + parts.append(limb("armL", (0.09, 0.09), 0.30, (-0.22, 0, shoulder), 20, sm)) + parts.append(limb("armR", (0.09, 0.09), 0.30, (0.22, 0, shoulder), 20, sm)) + parts.append(limb("foreL", (0.08, 0.08), 0.24, (-0.18, 0.1, shoulder - 0.28), 70, sm, ry=20)) + parts.append(limb("foreR", (0.08, 0.08), 0.24, (0.18, 0.1, shoulder - 0.28), 70, sm, ry=-20)) + else: # stand / sit: arms at sides + parts.append(limb("armL", (0.09, 0.09), 0.52, (-0.24, 0, shoulder), 6, sm)) + parts.append(limb("armR", (0.09, 0.09), 0.52, (0.24, 0, shoulder), 6, sm)) + # legs + if pose == "sit": + # thighs forward, shins down + parts.append(limb("thighL", (0.11, 0.13), 0.42, (-0.11, 0, hip - 0.02), 88, dark)) + parts.append(limb("thighR", (0.11, 0.13), 0.42, (0.11, 0, hip - 0.02), 88, dark)) + knee = hip - 0.04 + parts.append(limb("shinL", (0.10, 0.10), 0.46, (-0.11, 0.40, knee), 5, dark)) + parts.append(limb("shinR", (0.10, 0.10), 0.46, (0.11, 0.40, knee), 5, dark)) + else: + parts.append(limb("legL", (0.12, 0.14), 0.92, (-0.11, 0, hip - 0.02), 2, dark)) + parts.append(limb("legR", (0.12, 0.14), 0.92, (0.11, 0, hip - 0.02), 2, dark)) + # shoes + parts.append(k.box("shoeL", (0.13, 0.24, 0.08), (-0.11, 0.05, 0.04), k.mat("MAT_Shoe", "black_iron", 0.6))) + parts.append(k.box("shoeR", (0.13, 0.24, 0.08), (0.11, 0.05, 0.04), k.mat("MAT_Shoe", "black_iron", 0.6))) + # hat + if hat == "toque": + parts.append(k.cyl("toque", 0.13, 0.20, (0, 0, hz + 0.16), k.mat("MAT_Toque", "chef_white", 0.85), verts=16)) + # props + if prop == "tray": + parts.append(k.box("tray", (0.34, 0.30, 0.03), (0, 0.34, shoulder - 0.22), k.mat("MAT_Tray", "steel", 0.4, 0.6))) + parts.append(k.cyl("glass", 0.04, 0.10, (0.08, 0.34, shoulder - 0.15), k.mat("MAT_Glass", "glass", 0.1), verts=10)) + parts.append(k.cyl("plate", 0.09, 0.02, (-0.08, 0.34, shoulder - 0.19), k.mat("MAT_Plate", "white_cloth", 0.5), verts=16)) + elif prop == "clipboard": + parts.append(k.box("clip", (0.18, 0.02, 0.24), (0.16, 0.18, shoulder - 0.22), k.mat("MAT_Clip", "deep_blue", 0.6))) + elif prop == "bin": + parts.append(k.box("bin", (0.36, 0.28, 0.22), (0, 0.30, shoulder - 0.28), k.mat("MAT_Bin", "steel_dark", 0.7))) + return k.join(parts, "CHAR") + +def make(fn_kwargs): + return lambda: person(**fn_kwargs) + +PIECES = [ + ("CHAR_Customer_Sit_A", make(dict(clothing="cust_warm", skin="skin_1", hair="hair_brown", pose="sit"))), + ("CHAR_Customer_Sit_B", make(dict(clothing="deep_blue", skin="skin_3", hair="hair_dark", pose="sit"))), + ("CHAR_Customer_Wait_A", make(dict(clothing="terracotta", skin="skin_2", hair="hair_light", pose="wait"))), + ("CHAR_Customer_Stand_A",make(dict(clothing="muted_green", skin="skin_4", hair="hair_dark", pose="stand"))), + ("CHAR_Host_Stand", make(dict(clothing="host_teal", skin="skin_1", hair="hair_dark", pose="wait", prop="clipboard"))), + ("CHAR_Server_Carry", make(dict(clothing="server_blue", skin="skin_2", hair="hair_brown", pose="carry", prop="tray", apron=True))), + ("CHAR_Server_Idle", make(dict(clothing="server_blue", skin="skin_4", hair="hair_light", pose="stand", apron=True))), + ("CHAR_Cook_Cook", make(dict(clothing="chef_white", skin="skin_3", hair="hair_dark", pose="cook", hat="toque", apron=True))), + ("CHAR_Busser_Carry", make(dict(clothing="busser_green", skin="skin_1", hair="hair_brown", pose="carry", prop="bin"))), +] + +if __name__ == "__main__": + k.build_all(PIECES, k.out_dir("assets/generated")) diff --git a/tools/blender/build_environment.py b/tools/blender/build_environment.py new file mode 100644 index 0000000..4f21ba5 --- /dev/null +++ b/tools/blender/build_environment.py @@ -0,0 +1,80 @@ +"""ENV_ kit — decor + fixtures (walls/floor are procedural in Godot). +blender --background --python this -- --out DIR""" +import bpy, os, sys, math +sys.path.append(os.path.dirname(os.path.abspath(__file__))) +import _bkit as k + +def _wood(): return k.mat("MAT_Wood_Frame", "wood_oak", 0.55) +def _glass(): return k.mat("MAT_Glass_Pane", "glass", 0.1, 0.0, alpha=0.35) + +def window(): + w = _wood(); g = _glass() + parts = [k.box("frame_b", (1.6, 0.12, 0.12), (0, 0, 0)), + k.box("frame_t", (1.6, 0.12, 0.12), (0, 0, 1.4)), + k.box("frame_l", (0.12, 0.12, 1.4), (-0.74, 0, 0.7)), + k.box("frame_r", (0.12, 0.12, 1.4), (0.74, 0, 0.7)), + k.box("mull", (0.06, 0.06, 1.4), (0, 0, 0.7))] + for p in parts: + p.data.materials.append(w) + pane = k.box("pane", (1.5, 0.03, 1.3), (0, 0, 0.7), g) + return k.join(parts + [pane], "ENV_Window") + +def door_front(): + w = _wood(); g = _glass() + frame = [k.box("fl", (0.1, 0.12, 2.1), (-0.5, 0, 1.05)), + k.box("fr", (0.1, 0.12, 2.1), (0.5, 0, 1.05)), + k.box("ft", (1.1, 0.12, 0.12), (0, 0, 2.1))] + for p in frame: + p.data.materials.append(w) + pane = k.box("pane", (0.8, 0.03, 1.9), (0, 0, 1.0), g) + handle = k.cyl("handle", 0.02, 0.4, (0.32, 0.08, 1.0), k.mat("MAT_Handle", "brass", 0.3, 0.8), verts=8) + return k.join(frame + [pane, handle], "ENV_DoorFront") + +def sign(): + board = k.box("board", (1.8, 0.1, 0.5), (0, 0, 0), k.mat("MAT_Sign", "deep_blue", 0.5)) + strip = k.box("glow", (1.5, 0.04, 0.14), (0, -0.06, 0.02), k.mat("MAT_SignGlow", "brass", 0.4, emit=(1.0, 0.82, 0.5), emit_str=2.5)) + return k.join([board, strip], "ENV_Sign") + +def plant(): + pot = k.cyl("pot", 0.18, 0.34, (0, 0, 0), k.mat("MAT_Pot", "terracotta", 0.7), base=True, verts=16, r2=0.14) + lm = k.mat("MAT_Leaf", "leaf_green", 0.7) + parts = [pot] + import mathutils + for i, (dx, dy, dz, r) in enumerate([(0, 0, 0.62, 0.22), (0.12, 0.05, 0.5, 0.16), (-0.1, -0.08, 0.52, 0.15), (0.02, 0.12, 0.46, 0.14)]): + parts.append(k.sphere("leaf", r, (dx, dy, dz), lm, squash=0.9)) + return k.join(parts, "ENV_Plant") + +def wall_art(): + frame = k.box("frame", (0.8, 0.05, 0.6), (0, 0, 0), _wood()) + art = k.box("art", (0.68, 0.02, 0.48), (0, -0.03, 0), k.mat("MAT_Art", "terracotta", 0.6)) + return k.join([frame, art], "ENV_WallArt") + +def pendant_light(): + cord = k.cyl("cord", 0.008, 0.5, (0, 0, 0.75), k.mat("MAT_Cord", "black_iron", 0.6), verts=6) + shade = k.cyl("shade", 0.16, 0.16, (0, 0, 0.45), k.mat("MAT_Shade", "brass", 0.3, 0.7), verts=18, r2=0.05) + glow = k.cyl("glow", 0.12, 0.03, (0, 0, 0.39), k.mat("MAT_Bulb", "white_cloth", 0.4, emit=(1.0, 0.85, 0.6), emit_str=4.0), verts=16) + return k.join([cord, shade, glow], "ENV_PendantLight") + +def menu_board(): + board = k.box("board", (1.0, 0.06, 0.7), (0, 0, 0), k.mat("MAT_Chalk", "charcoal", 0.85)) + frame = k.box("frame", (1.08, 0.08, 0.78), (0, 0.01, 0), _wood()) + return k.join([frame, board], "ENV_MenuBoard") + +def awning(): + m = k.mat("MAT_Awning", "muted_green", 0.7) + parts = [] + for i in range(6): + x = -1.0 + i * 0.4 + parts.append(k.box("stripe", (0.36, 0.9, 0.05), (x, 0, 0), m if i % 2 == 0 else k.mat("MAT_AwningCream", "plaster_cream", 0.7))) + slab = k.join(parts, "ENV_Awning") + slab.rotation_euler.x = math.radians(-28); k._apply(slab) + return slab + +PIECES = [ + ("ENV_Window", window), ("ENV_DoorFront", door_front), ("ENV_Sign", sign), + ("ENV_Plant", plant), ("ENV_WallArt", wall_art), ("ENV_PendantLight", pendant_light), + ("ENV_MenuBoard", menu_board), ("ENV_Awning", awning), +] + +if __name__ == "__main__": + k.build_all(PIECES, k.out_dir("assets/generated")) diff --git a/tools/blender/build_furniture.py b/tools/blender/build_furniture.py new file mode 100644 index 0000000..7a71735 --- /dev/null +++ b/tools/blender/build_furniture.py @@ -0,0 +1,85 @@ +"""FURN_ kit — stylized dining furniture. blender --background --python this -- --out DIR""" +import bpy, os, sys, math +sys.path.append(os.path.dirname(os.path.abspath(__file__))) +import _bkit as k + +def _wood(): return k.mat("MAT_Wood_WarmOak", "wood_oak", 0.55) +def _woodL(): return k.mat("MAT_Wood_Light", "wood_light", 0.5) +def _cushion():return k.mat("MAT_Cushion_Green", "muted_green", 0.8) +def _booth(): return k.mat("MAT_Booth_Blue", "deep_blue", 0.75) + +def table_4top(): + w = _woodL(); o = _wood() + top = k.box("top", (1.15, 0.82, 0.06), (0, 0, 0.75), w, bevel=0.03, seg=3) + apron = k.box("apron", (1.02, 0.70, 0.10), (0, 0, 0.66), o) + parts = [top, apron] + for sx in (-0.5, 0.5): + for sy in (-0.33, 0.33): + parts.append(k.box("leg", (0.08, 0.08, 0.66), (sx, sy, 0), o, base=True, bevel=0.015)) + return k.join(parts, "FURN_Table_4Top") + +def table_2top(): + w = _woodL(); o = _wood() + top = k.cyl("top", 0.44, 0.06, (0, 0, 0.75), w, verts=28) + post = k.cyl("post", 0.06, 0.70, (0, 0, 0), o, base=True) + foot = k.cyl("foot", 0.26, 0.05, (0, 0, 0), o, base=True, verts=24) + return k.join([top, post, foot], "FURN_Table_2Top") + +def chair(): + o = _wood(); c = _cushion() + seat = k.box("seat", (0.44, 0.44, 0.08), (0, 0, 0.45), c, bevel=0.02) + back = k.box("back", (0.44, 0.06, 0.44), (0, -0.19, 0.68), c, bevel=0.02) + parts = [seat, back] + for sx in (-0.18, 0.18): + for sy in (-0.18, 0.18): + parts.append(k.box("leg", (0.05, 0.05, 0.45), (sx, sy, 0), o, base=True, bevel=0.01)) + # back posts + for sx in (-0.18, 0.18): + parts.append(k.box("post", (0.05, 0.05, 0.46), (sx, -0.19, 0.45), o, base=True)) + return k.join(parts, "FURN_Chair") + +def booth(): + b = _booth(); w = _wood() + base = k.box("base", (1.4, 0.55, 0.45), (0, 0, 0), b, base=True, bevel=0.04) + cush = k.box("cush", (1.4, 0.55, 0.12), (0, 0, 0.45), b, bevel=0.05) + back = k.box("back", (1.4, 0.14, 0.75), (0, -0.20, 0.55), b, bevel=0.05) + return k.join([base, cush, back], "FURN_Booth") + +def host_stand(): + w = _woodL(); o = _wood() + body = k.box("body", (0.9, 0.5, 1.05), (0, 0, 0), w, base=True, bevel=0.03) + top = k.box("top", (0.95, 0.55, 0.05), (0, 0, 1.05), o, bevel=0.02) + top.rotation_euler.x = math.radians(8); k._apply(top) + return k.join([body, top], "FURN_HostStand") + +def wait_bench(): + o = _wood(); c = _cushion() + parts = [k.box("seat", (1.6, 0.45, 0.10), (0, 0, 0.45), c, bevel=0.03), + k.box("back", (1.6, 0.10, 0.40), (0, -0.17, 0.55), c, bevel=0.03)] + for sx in (-0.7, 0.7): + parts.append(k.box("leg", (0.08, 0.4, 0.45), (sx, 0, 0), o, base=True)) + return k.join(parts, "FURN_WaitBench") + +def service_station(): + o = _wood() + body = k.box("body", (0.9, 0.5, 0.92), (0, 0, 0), o, base=True, bevel=0.02) + shelf = k.box("shelf", (0.86, 0.46, 0.03), (0, 0, 0.5), _bkit_steel()) + return k.join([body, shelf], "FURN_ServiceStation") + +def _bkit_steel(): return k.mat("MAT_Steel", "steel", 0.35, 0.7) + +def bus_tub(): + g = k.mat("MAT_Tub_Gray", "steel_dark", 0.8) + tub = k.box("tub", (0.5, 0.36, 0.22), (0, 0, 0.6), g, bevel=0.03) + stand = k.box("stand", (0.44, 0.30, 0.6), (0, 0, 0), _bkit_steel(), base=True) + return k.join([tub, stand], "FURN_BusTub") + +PIECES = [ + ("FURN_Table_4Top", table_4top), ("FURN_Table_2Top", table_2top), + ("FURN_Chair", chair), ("FURN_Booth", booth), ("FURN_HostStand", host_stand), + ("FURN_WaitBench", wait_bench), ("FURN_ServiceStation", service_station), + ("FURN_BusTub", bus_tub), +] + +if __name__ == "__main__": + k.build_all(PIECES, k.out_dir("assets/generated")) diff --git a/tools/blender/build_kitchen.py b/tools/blender/build_kitchen.py new file mode 100644 index 0000000..b59fad6 --- /dev/null +++ b/tools/blender/build_kitchen.py @@ -0,0 +1,140 @@ +"""KIT_ kit — recognizable kitchen equipment. blender --background --python this -- --out DIR""" +import bpy, os, sys, math +sys.path.append(os.path.dirname(os.path.abspath(__file__))) +import _bkit as k + +def _steel(): return k.mat("MAT_Steel", "steel", 0.32, 0.75) +def _dark(): return k.mat("MAT_SteelDark", "steel_dark", 0.4, 0.6) +def _iron(): return k.mat("MAT_Iron", "black_iron", 0.5, 0.4) +def _char(): return k.mat("MAT_Char", "charcoal", 0.7) +def _brass(): return k.mat("MAT_Brass", "brass", 0.35, 0.8) +def _warm(): return k.mat("MAT_LampGlow", "terracotta", 0.6, emit=(1.0, 0.72, 0.4), emit_str=3.0) + +H = 0.90 # counter/service height + +def _knobs(parts, y, mat, n=3, z=H - 0.12, xspan=0.5): + for i in range(n): + x = -xspan + (2 * xspan) * (i / max(1, n - 1)) + parts.append(k.cyl("knob", 0.03, 0.04, (x, y, z), mat, verts=10)) + +def grill(): + s = _steel(); c = _char(); d = _dark() + body = k.box("body", (1.0, 0.7, H), (0, 0, 0), s, base=True, bevel=0.02) + grate = k.box("grate", (0.9, 0.6, 0.04), (0, 0.02, H), c) + back = k.box("back", (1.0, 0.06, 0.35), (0, -0.32, H), d) + parts = [body, grate, back] + _knobs(parts, 0.34, d, 4, H - 0.14, 0.4) + return k.join(parts, "KIT_Grill") + +def range_(): + s = _steel(); i = _iron(); d = _dark() + body = k.box("body", (0.9, 0.7, H), (0, 0, 0), s, base=True, bevel=0.02) + door = k.box("door", (0.78, 0.04, 0.55), (0, 0.35, 0.4), d) + handle = k.cyl("handle", 0.02, 0.6, (0, 0.4, 0.62), _brass(), verts=8); handle.rotation_euler.y = math.radians(90); k._apply(handle) + parts = [body, door, handle] + for bx in (-0.22, 0.22): + for by in (-0.18, 0.18): + parts.append(k.cyl("burner", 0.11, 0.03, (bx, by - 0.05, H), i, verts=16)) + return k.join(parts, "KIT_Range") + +def fryer(): + s = _steel(); c = _char() + body = k.box("body", (0.6, 0.7, H), (0, 0, 0), s, base=True, bevel=0.02) + parts = [body] + for bx in (-0.14, 0.14): + parts.append(k.box("well", (0.22, 0.4, 0.1), (bx, -0.02, H), c)) + parts.append(k.cyl("handle", 0.015, 0.28, (bx, 0.34, H + 0.08), _dark(), verts=8)) + return k.join(parts, "KIT_Fryer") + +def prep_station(): + s = _steel(); w = k.mat("MAT_Board", "wood_light", 0.6) + body = k.box("body", (1.1, 0.7, H), (0, 0, 0), s, base=True, bevel=0.02) + board = k.box("board", (0.6, 0.4, 0.04), (0.1, 0, H), w, bevel=0.01) + shelf = k.box("shelf", (1.06, 0.66, 0.03), (0, 0, 0.4), _dark()) + return k.join([body, board, shelf], "KIT_PrepStation") + +def cold_station(): + s = _steel(); b = k.mat("MAT_ColdWell", (0.4, 0.55, 0.62), 0.3, 0.2) + body = k.box("body", (1.0, 0.7, H), (0, 0, 0), s, base=True, bevel=0.02) + well = k.box("well", (0.85, 0.5, 0.08), (0, 0, H), b) + return k.join([body, well], "KIT_ColdStation") + +def sink(): + s = _steel(); d = _dark() + body = k.box("body", (1.0, 0.7, H), (0, 0, 0), s, base=True, bevel=0.02) + parts = [body] + for bx in (-0.22, 0.22): + parts.append(k.box("basin", (0.34, 0.42, 0.12), (bx, 0, H), d)) + fauc = k.cyl("faucet", 0.02, 0.3, (0, -0.28, H + 0.15), s, verts=10) + spout = k.cyl("spout", 0.02, 0.16, (0, -0.2, H + 0.28), s, verts=10); spout.rotation_euler.x = math.radians(90); k._apply(spout) + return k.join([body] + parts[1:] + [fauc, spout], "KIT_Sink") + +def dishwasher(): + s = _steel() + body = k.box("body", (0.7, 0.7, H), (0, 0, 0), s, base=True, bevel=0.02) + door = k.box("door", (0.6, 0.04, 0.62), (0, 0.35, 0.42), _dark()) + handle = k.cyl("h", 0.02, 0.5, (0, 0.4, 0.7), _brass(), verts=8); handle.rotation_euler.y = math.radians(90); k._apply(handle) + return k.join([body, door, handle], "KIT_Dishwasher") + +def fridge(): + s = _steel() + body = k.box("body", (0.85, 0.75, 1.95), (0, 0, 0), s, base=True, bevel=0.03) + seam = k.box("seam", (0.02, 0.76, 1.9), (0, 0, 0.03), _dark(), base=True) + for zz in (0.7, 1.4): + for sx in (-0.2, 0.2): + pass + h1 = k.cyl("h", 0.02, 0.7, (-0.05, 0.38, 1.3), _brass(), verts=8) + h2 = k.cyl("h", 0.02, 0.7, (0.05, 0.38, 0.7), _brass(), verts=8) + return k.join([body, seam, h1, h2], "KIT_Fridge") + +def shelves(): + d = _dark() + parts = [] + for sx in (-0.5, 0.5): + for sy in (-0.2, 0.2): + parts.append(k.box("post", (0.04, 0.04, 1.7), (sx, sy, 0), d, base=True)) + for zz in (0.5, 1.0, 1.5): + parts.append(k.box("shelf", (1.06, 0.5, 0.03), (0, 0, zz), _steel())) + return k.join(parts, "KIT_Shelves") + +def pass_counter(): + s = _steel(); w = _warm() + body = k.box("body", (2.4, 0.8, H), (0, 0, 0), s, base=True, bevel=0.02) + surf = k.box("surf", (2.4, 0.8, 0.04), (0, 0, H), _steel()) + # heat-lamp bar above the pass with a warm emissive underside + for sx in (-1.0, 1.0): + body2 = k.box("post", (0.06, 0.06, 0.6), (sx, -0.2, H), s, base=True) + body2.location.z += H + k._apply(body2) + barhouse = k.box("lamphouse", (2.2, 0.18, 0.1), (0, -0.2, H + 0.62), _dark()) + lamp = k.box("lampglow", (2.1, 0.14, 0.03), (0, -0.2, H + 0.56), w) + return k.join([body, surf, barhouse, lamp], "KIT_Pass") + +def ticket_rail(): + br = _brass() + rail = k.cyl("rail", 0.012, 1.0, (0, 0, 1.0), br, verts=10); rail.rotation_euler.y = math.radians(90); k._apply(rail) + parts = [rail] + for sx in (-0.48, 0.48): + parts.append(k.cyl("post", 0.012, 0.2, (sx, 0, 0.9), br, verts=8)) + # a couple of paper tickets on the rail + for tx in (-0.3, 0.0, 0.3): + parts.append(k.box("ticket", (0.09, 0.005, 0.16), (tx, 0, 0.9), k.mat("MAT_Paper", "white_cloth", 0.9))) + return k.join(parts, "KIT_TicketRail") + +def heat_lamp(): + d = _dark(); w = _warm() + house = k.box("house", (0.3, 0.3, 0.12), (0, 0, 0.5), d) + glow = k.cyl("glow", 0.1, 0.03, (0, 0, 0.43), w, verts=16) + cord = k.cyl("cord", 0.008, 0.4, (0, 0, 0.72), d, verts=6) + return k.join([house, glow, cord], "KIT_HeatLamp") + +PIECES = [ + ("KIT_Grill", grill), ("KIT_Range", range_), ("KIT_Fryer", fryer), + ("KIT_PrepStation", prep_station), ("KIT_ColdStation", cold_station), + ("KIT_Sink", sink), ("KIT_Dishwasher", dishwasher), ("KIT_Fridge", fridge), + ("KIT_Shelves", shelves), ("KIT_Pass", pass_counter), + ("KIT_TicketRail", ticket_rail), ("KIT_HeatLamp", heat_lamp), +] + +if __name__ == "__main__": + k.build_all(PIECES, k.out_dir("assets/generated")) diff --git a/tools/blender/build_props.py b/tools/blender/build_props.py new file mode 100644 index 0000000..39d9f2d --- /dev/null +++ b/tools/blender/build_props.py @@ -0,0 +1,58 @@ +"""PROP_ kit — storytelling props (plates, food, bills, settings). +blender --background --python this -- --out DIR""" +import bpy, os, sys, math +sys.path.append(os.path.dirname(os.path.abspath(__file__))) +import _bkit as k + +def _plate(): return k.mat("MAT_Plate", "white_cloth", 0.4) + +def plate_clean(): + p = k.cyl("plate", 0.13, 0.02, (0, 0, 0), _plate(), verts=20) + return k.join([p], "PROP_PlateClean") + +def plate_food(): + p = k.cyl("plate", 0.13, 0.02, (0, 0, 0), _plate(), verts=20) + food = k.sphere("food", 0.08, (0, 0, 0.03), k.mat("MAT_Food", "terracotta", 0.6), squash=0.5) + garnish = k.sphere("garnish", 0.03, (0.05, 0.03, 0.05), k.mat("MAT_Garnish", "leaf_green", 0.6)) + return k.join([p, food, garnish], "PROP_PlateFood") + +def plate_dirty(): + p = k.cyl("plate", 0.13, 0.02, (0, 0, 0), _plate(), verts=20) + scrap = k.sphere("scrap", 0.04, (0.03, 0.02, 0.025), k.mat("MAT_Scrap", "wood_oak", 0.7), squash=0.4) + napkin = k.box("napkin", (0.08, 0.08, 0.03), (-0.06, -0.04, 0.02), k.mat("MAT_Napkin", "plaster_cream", 0.9)) + napkin.rotation_euler.z = math.radians(24); k._apply(napkin) + return k.join([p, scrap, napkin], "PROP_PlateDirty") + +def glass(): + g = k.cyl("glass", 0.04, 0.12, (0, 0, 0), k.mat("MAT_GlassCup", "glass", 0.1, alpha=0.5), base=True, verts=14) + return k.join([g], "PROP_Glass") + +def bill_folder(): + f = k.box("folder", (0.12, 0.18, 0.02), (0, 0, 0), k.mat("MAT_Folder", "charcoal", 0.5)) + slip = k.box("slip", (0.1, 0.06, 0.004), (0, 0.04, 0.015), k.mat("MAT_Slip", "white_cloth", 0.9)) + return k.join([f, slip], "PROP_BillFolder") + +def place_setting(): + p = k.cyl("plate", 0.12, 0.02, (0, 0, 0), _plate(), verts=20) + fork = k.box("fork", (0.015, 0.14, 0.008), (-0.18, 0, 0), k.mat("MAT_Cutlery", "steel", 0.3, 0.7)) + knife = k.box("knife", (0.015, 0.14, 0.008), (0.18, 0, 0), k.mat("MAT_Cutlery", "steel", 0.3, 0.7)) + return k.join([p, fork, knife], "PROP_PlaceSetting") + +def centerpiece(): + vase = k.cyl("vase", 0.04, 0.14, (0, 0, 0), k.mat("MAT_Vase", "glass", 0.15, alpha=0.6), base=True, verts=12) + flower = k.sphere("flower", 0.05, (0, 0, 0.18), k.mat("MAT_Flower", "terracotta", 0.6)) + return k.join([vase, flower], "PROP_Centerpiece") + +def ticket_strip(): + t = k.box("ticket", (0.1, 0.006, 0.18), (0, 0, 0), k.mat("MAT_Ticket", "white_cloth", 0.9)) + return k.join([t], "PROP_TicketStrip") + +PIECES = [ + ("PROP_PlateClean", plate_clean), ("PROP_PlateFood", plate_food), + ("PROP_PlateDirty", plate_dirty), ("PROP_Glass", glass), + ("PROP_BillFolder", bill_folder), ("PROP_PlaceSetting", place_setting), + ("PROP_Centerpiece", centerpiece), ("PROP_TicketStrip", ticket_strip), +] + +if __name__ == "__main__": + k.build_all(PIECES, k.out_dir("assets/generated")) diff --git a/tools/blender/export_all.py b/tools/blender/export_all.py new file mode 100644 index 0000000..7594bad --- /dev/null +++ b/tools/blender/export_all.py @@ -0,0 +1,12 @@ +"""Regenerate the ENTIRE kit deterministically. +blender --background --python tools/blender/export_all.py -- --out DIR""" +import os, sys +sys.path.append(os.path.dirname(os.path.abspath(__file__))) +import _bkit as k +import build_furniture, build_kitchen, build_characters, build_environment, build_props + +outdir = k.out_dir("assets/generated") +total = 0 +for mod in (build_furniture, build_kitchen, build_characters, build_environment, build_props): + total += len(k.build_all(mod.PIECES, outdir)) +print("KIT TOTAL", total, "pieces ->", outdir) diff --git a/tools/blender/validate_exports.py b/tools/blender/validate_exports.py new file mode 100644 index 0000000..13f4fdb --- /dev/null +++ b/tools/blender/validate_exports.py @@ -0,0 +1,29 @@ +"""Validate generated GLBs: import each, report tri count + bounding box + origin sanity. +blender --background --python tools/blender/validate_exports.py -- --out DIR""" +import bpy, os, sys +sys.path.append(os.path.dirname(os.path.abspath(__file__))) +import _bkit as k + +outdir = k.out_dir("assets/generated") +glbs = sorted(f for f in os.listdir(outdir) if f.endswith(".glb")) +print("VALIDATING", len(glbs), "GLBs in", outdir) +issues = 0 +for g in glbs: + k.reset() + try: + bpy.ops.import_scene.gltf(filepath=os.path.join(outdir, g)) + except Exception as e: + print(" FAIL import", g, e); issues += 1; continue + tris = 0 + zmin = 1e9 + for o in bpy.data.objects: + if o.type == 'MESH': + tris += sum(len(p.vertices) - 2 for p in o.data.polygons) + zmin = min(zmin, min((o.matrix_world @ v.co).z for v in o.data.vertices)) + flag = "" + if tris > 6000: + flag += " HIGH_TRIS"; issues += 1 + if zmin < -0.05: + flag += " ORIGIN_BELOW_FLOOR(%.2f)" % zmin + print(" %-28s tris=%-5d floor_z=%.3f%s" % (g, tris, zmin, flag)) +print("VALIDATION DONE — issues:", issues) diff --git a/visual/RestaurantVisualSandbox/assets/generated/CHAR_Busser_Carry.glb b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Busser_Carry.glb new file mode 100644 index 0000000..c0b8b7b Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Busser_Carry.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/CHAR_Busser_Carry.glb.import b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Busser_Carry.glb.import new file mode 100644 index 0000000..234d719 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Busser_Carry.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cix0cee87avq3" +path="res://.godot/imported/CHAR_Busser_Carry.glb-ebdd98a95993eab7ed342b4466eda494.scn" + +[deps] + +source_file="res://assets/generated/CHAR_Busser_Carry.glb" +dest_files=["res://.godot/imported/CHAR_Busser_Carry.glb-ebdd98a95993eab7ed342b4466eda494.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/CHAR_Cook_Cook.glb b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Cook_Cook.glb new file mode 100644 index 0000000..839c59f Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Cook_Cook.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/CHAR_Cook_Cook.glb.import b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Cook_Cook.glb.import new file mode 100644 index 0000000..7b0826c --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Cook_Cook.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bpi7io0776mo" +path="res://.godot/imported/CHAR_Cook_Cook.glb-10eca4292bbb199408b7598970dff1eb.scn" + +[deps] + +source_file="res://assets/generated/CHAR_Cook_Cook.glb" +dest_files=["res://.godot/imported/CHAR_Cook_Cook.glb-10eca4292bbb199408b7598970dff1eb.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/CHAR_Customer_Sit_A.glb b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Customer_Sit_A.glb new file mode 100644 index 0000000..ae79679 Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Customer_Sit_A.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/CHAR_Customer_Sit_A.glb.import b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Customer_Sit_A.glb.import new file mode 100644 index 0000000..9d94804 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Customer_Sit_A.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bh00ab3ahcbm8" +path="res://.godot/imported/CHAR_Customer_Sit_A.glb-ab72f71d9bfec8eeb8401ecae58dabe8.scn" + +[deps] + +source_file="res://assets/generated/CHAR_Customer_Sit_A.glb" +dest_files=["res://.godot/imported/CHAR_Customer_Sit_A.glb-ab72f71d9bfec8eeb8401ecae58dabe8.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/CHAR_Customer_Sit_B.glb b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Customer_Sit_B.glb new file mode 100644 index 0000000..383d82b Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Customer_Sit_B.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/CHAR_Customer_Sit_B.glb.import b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Customer_Sit_B.glb.import new file mode 100644 index 0000000..e658c9c --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Customer_Sit_B.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://3y8m0w4yt4nk" +path="res://.godot/imported/CHAR_Customer_Sit_B.glb-cd199ac750d11b50a8960f4f092ed48c.scn" + +[deps] + +source_file="res://assets/generated/CHAR_Customer_Sit_B.glb" +dest_files=["res://.godot/imported/CHAR_Customer_Sit_B.glb-cd199ac750d11b50a8960f4f092ed48c.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/CHAR_Customer_Stand_A.glb b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Customer_Stand_A.glb new file mode 100644 index 0000000..66493ac Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Customer_Stand_A.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/CHAR_Customer_Stand_A.glb.import b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Customer_Stand_A.glb.import new file mode 100644 index 0000000..d36dca8 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Customer_Stand_A.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c0nyxbos1mye0" +path="res://.godot/imported/CHAR_Customer_Stand_A.glb-3dccd7b2acccaae4fa7b6d10a89e34e0.scn" + +[deps] + +source_file="res://assets/generated/CHAR_Customer_Stand_A.glb" +dest_files=["res://.godot/imported/CHAR_Customer_Stand_A.glb-3dccd7b2acccaae4fa7b6d10a89e34e0.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/CHAR_Customer_Wait_A.glb b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Customer_Wait_A.glb new file mode 100644 index 0000000..c56de1e Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Customer_Wait_A.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/CHAR_Customer_Wait_A.glb.import b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Customer_Wait_A.glb.import new file mode 100644 index 0000000..b2a1cee --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Customer_Wait_A.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cub2oemnl1g7v" +path="res://.godot/imported/CHAR_Customer_Wait_A.glb-6d47e05b8effd35c251431a4576e7bc7.scn" + +[deps] + +source_file="res://assets/generated/CHAR_Customer_Wait_A.glb" +dest_files=["res://.godot/imported/CHAR_Customer_Wait_A.glb-6d47e05b8effd35c251431a4576e7bc7.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/CHAR_Host_Stand.glb b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Host_Stand.glb new file mode 100644 index 0000000..48aa1cc Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Host_Stand.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/CHAR_Host_Stand.glb.import b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Host_Stand.glb.import new file mode 100644 index 0000000..c4973b6 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Host_Stand.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dv6fxhjl14wnd" +path="res://.godot/imported/CHAR_Host_Stand.glb-b50e4e8e633868ee8fa063f2872ca04c.scn" + +[deps] + +source_file="res://assets/generated/CHAR_Host_Stand.glb" +dest_files=["res://.godot/imported/CHAR_Host_Stand.glb-b50e4e8e633868ee8fa063f2872ca04c.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/CHAR_Server_Carry.glb b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Server_Carry.glb new file mode 100644 index 0000000..dcfe997 Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Server_Carry.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/CHAR_Server_Carry.glb.import b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Server_Carry.glb.import new file mode 100644 index 0000000..24c0c4f --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Server_Carry.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://42ev2hdm31nu" +path="res://.godot/imported/CHAR_Server_Carry.glb-c9fce36b803a7c37d848c443b4517c30.scn" + +[deps] + +source_file="res://assets/generated/CHAR_Server_Carry.glb" +dest_files=["res://.godot/imported/CHAR_Server_Carry.glb-c9fce36b803a7c37d848c443b4517c30.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/CHAR_Server_Idle.glb b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Server_Idle.glb new file mode 100644 index 0000000..8c32dd1 Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Server_Idle.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/CHAR_Server_Idle.glb.import b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Server_Idle.glb.import new file mode 100644 index 0000000..e4c726c --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/CHAR_Server_Idle.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dfs2cfjvvgjry" +path="res://.godot/imported/CHAR_Server_Idle.glb-e207a4349ce5c1f96d36de31f0b2938c.scn" + +[deps] + +source_file="res://assets/generated/CHAR_Server_Idle.glb" +dest_files=["res://.godot/imported/CHAR_Server_Idle.glb-e207a4349ce5c1f96d36de31f0b2938c.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/ENV_Awning.glb b/visual/RestaurantVisualSandbox/assets/generated/ENV_Awning.glb new file mode 100644 index 0000000..f431adf Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/ENV_Awning.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/ENV_Awning.glb.import b/visual/RestaurantVisualSandbox/assets/generated/ENV_Awning.glb.import new file mode 100644 index 0000000..9b5da14 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/ENV_Awning.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bdbieuob6gde3" +path="res://.godot/imported/ENV_Awning.glb-fe83f86d4303fb288c024862956d6703.scn" + +[deps] + +source_file="res://assets/generated/ENV_Awning.glb" +dest_files=["res://.godot/imported/ENV_Awning.glb-fe83f86d4303fb288c024862956d6703.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/ENV_DoorFront.glb b/visual/RestaurantVisualSandbox/assets/generated/ENV_DoorFront.glb new file mode 100644 index 0000000..efa2061 Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/ENV_DoorFront.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/ENV_DoorFront.glb.import b/visual/RestaurantVisualSandbox/assets/generated/ENV_DoorFront.glb.import new file mode 100644 index 0000000..9e7348b --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/ENV_DoorFront.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://d28763my0l2ee" +path="res://.godot/imported/ENV_DoorFront.glb-988063c09e5b411eaf38c060ed299b41.scn" + +[deps] + +source_file="res://assets/generated/ENV_DoorFront.glb" +dest_files=["res://.godot/imported/ENV_DoorFront.glb-988063c09e5b411eaf38c060ed299b41.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/ENV_MenuBoard.glb b/visual/RestaurantVisualSandbox/assets/generated/ENV_MenuBoard.glb new file mode 100644 index 0000000..90d774f Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/ENV_MenuBoard.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/ENV_MenuBoard.glb.import b/visual/RestaurantVisualSandbox/assets/generated/ENV_MenuBoard.glb.import new file mode 100644 index 0000000..74f0a35 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/ENV_MenuBoard.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bk7e5nospodxk" +path="res://.godot/imported/ENV_MenuBoard.glb-d546352d3b15b2e2778c934121f734df.scn" + +[deps] + +source_file="res://assets/generated/ENV_MenuBoard.glb" +dest_files=["res://.godot/imported/ENV_MenuBoard.glb-d546352d3b15b2e2778c934121f734df.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/ENV_PendantLight.glb b/visual/RestaurantVisualSandbox/assets/generated/ENV_PendantLight.glb new file mode 100644 index 0000000..d804e4d Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/ENV_PendantLight.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/ENV_PendantLight.glb.import b/visual/RestaurantVisualSandbox/assets/generated/ENV_PendantLight.glb.import new file mode 100644 index 0000000..4054602 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/ENV_PendantLight.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://78x0cf1fd646" +path="res://.godot/imported/ENV_PendantLight.glb-a56532c0d69d7f76c4d4ff3a90ddf2f2.scn" + +[deps] + +source_file="res://assets/generated/ENV_PendantLight.glb" +dest_files=["res://.godot/imported/ENV_PendantLight.glb-a56532c0d69d7f76c4d4ff3a90ddf2f2.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/ENV_Plant.glb b/visual/RestaurantVisualSandbox/assets/generated/ENV_Plant.glb new file mode 100644 index 0000000..08b48eb Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/ENV_Plant.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/ENV_Plant.glb.import b/visual/RestaurantVisualSandbox/assets/generated/ENV_Plant.glb.import new file mode 100644 index 0000000..d6f8d83 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/ENV_Plant.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cuagd72wv43qf" +path="res://.godot/imported/ENV_Plant.glb-29cbc3f962056c68dc63eee35d1de01e.scn" + +[deps] + +source_file="res://assets/generated/ENV_Plant.glb" +dest_files=["res://.godot/imported/ENV_Plant.glb-29cbc3f962056c68dc63eee35d1de01e.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/ENV_Sign.glb b/visual/RestaurantVisualSandbox/assets/generated/ENV_Sign.glb new file mode 100644 index 0000000..abd5f28 Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/ENV_Sign.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/ENV_Sign.glb.import b/visual/RestaurantVisualSandbox/assets/generated/ENV_Sign.glb.import new file mode 100644 index 0000000..a2d9136 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/ENV_Sign.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://catnks2o6204j" +path="res://.godot/imported/ENV_Sign.glb-807b0ccde9bef8486e81b0bcb36a2f7b.scn" + +[deps] + +source_file="res://assets/generated/ENV_Sign.glb" +dest_files=["res://.godot/imported/ENV_Sign.glb-807b0ccde9bef8486e81b0bcb36a2f7b.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/ENV_WallArt.glb b/visual/RestaurantVisualSandbox/assets/generated/ENV_WallArt.glb new file mode 100644 index 0000000..8b5c747 Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/ENV_WallArt.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/ENV_WallArt.glb.import b/visual/RestaurantVisualSandbox/assets/generated/ENV_WallArt.glb.import new file mode 100644 index 0000000..5bd45f6 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/ENV_WallArt.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b2dk530dtt8jf" +path="res://.godot/imported/ENV_WallArt.glb-39c6e2e73a2b834187c68bc3455ec999.scn" + +[deps] + +source_file="res://assets/generated/ENV_WallArt.glb" +dest_files=["res://.godot/imported/ENV_WallArt.glb-39c6e2e73a2b834187c68bc3455ec999.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/ENV_Window.glb b/visual/RestaurantVisualSandbox/assets/generated/ENV_Window.glb new file mode 100644 index 0000000..f00453b Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/ENV_Window.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/ENV_Window.glb.import b/visual/RestaurantVisualSandbox/assets/generated/ENV_Window.glb.import new file mode 100644 index 0000000..e71cfaa --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/ENV_Window.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b2q7yfdifgvrq" +path="res://.godot/imported/ENV_Window.glb-0c8fb0edc931bc90680cad4b76e3f8e1.scn" + +[deps] + +source_file="res://assets/generated/ENV_Window.glb" +dest_files=["res://.godot/imported/ENV_Window.glb-0c8fb0edc931bc90680cad4b76e3f8e1.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/FURN_Booth.glb b/visual/RestaurantVisualSandbox/assets/generated/FURN_Booth.glb new file mode 100644 index 0000000..c391ca1 Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/FURN_Booth.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/FURN_Booth.glb.import b/visual/RestaurantVisualSandbox/assets/generated/FURN_Booth.glb.import new file mode 100644 index 0000000..df78cbd --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/FURN_Booth.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c2pdakpk14xft" +path="res://.godot/imported/FURN_Booth.glb-230c6cecca612bb5b2bfcb0550b50f59.scn" + +[deps] + +source_file="res://assets/generated/FURN_Booth.glb" +dest_files=["res://.godot/imported/FURN_Booth.glb-230c6cecca612bb5b2bfcb0550b50f59.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/FURN_BusTub.glb b/visual/RestaurantVisualSandbox/assets/generated/FURN_BusTub.glb new file mode 100644 index 0000000..1da6d2c Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/FURN_BusTub.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/FURN_BusTub.glb.import b/visual/RestaurantVisualSandbox/assets/generated/FURN_BusTub.glb.import new file mode 100644 index 0000000..8bca6a0 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/FURN_BusTub.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bb7yaixabneju" +path="res://.godot/imported/FURN_BusTub.glb-2c3bc828e9445e0069973aac4767a265.scn" + +[deps] + +source_file="res://assets/generated/FURN_BusTub.glb" +dest_files=["res://.godot/imported/FURN_BusTub.glb-2c3bc828e9445e0069973aac4767a265.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/FURN_Chair.glb b/visual/RestaurantVisualSandbox/assets/generated/FURN_Chair.glb new file mode 100644 index 0000000..caa8242 Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/FURN_Chair.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/FURN_Chair.glb.import b/visual/RestaurantVisualSandbox/assets/generated/FURN_Chair.glb.import new file mode 100644 index 0000000..c4e97c2 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/FURN_Chair.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bepgvg8gba6gy" +path="res://.godot/imported/FURN_Chair.glb-d4f77a40e1a5a789c402ff3fa9dee3e0.scn" + +[deps] + +source_file="res://assets/generated/FURN_Chair.glb" +dest_files=["res://.godot/imported/FURN_Chair.glb-d4f77a40e1a5a789c402ff3fa9dee3e0.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/FURN_HostStand.glb b/visual/RestaurantVisualSandbox/assets/generated/FURN_HostStand.glb new file mode 100644 index 0000000..a60e1e6 Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/FURN_HostStand.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/FURN_HostStand.glb.import b/visual/RestaurantVisualSandbox/assets/generated/FURN_HostStand.glb.import new file mode 100644 index 0000000..4cde99e --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/FURN_HostStand.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dc10jt31nhxld" +path="res://.godot/imported/FURN_HostStand.glb-92811f2d0d4a836a0ba44a022037c3fb.scn" + +[deps] + +source_file="res://assets/generated/FURN_HostStand.glb" +dest_files=["res://.godot/imported/FURN_HostStand.glb-92811f2d0d4a836a0ba44a022037c3fb.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/FURN_ServiceStation.glb b/visual/RestaurantVisualSandbox/assets/generated/FURN_ServiceStation.glb new file mode 100644 index 0000000..83ddebe Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/FURN_ServiceStation.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/FURN_ServiceStation.glb.import b/visual/RestaurantVisualSandbox/assets/generated/FURN_ServiceStation.glb.import new file mode 100644 index 0000000..61bc9a2 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/FURN_ServiceStation.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c3830juswbk2f" +path="res://.godot/imported/FURN_ServiceStation.glb-011656024c3eaa0264cbe6218ea258c9.scn" + +[deps] + +source_file="res://assets/generated/FURN_ServiceStation.glb" +dest_files=["res://.godot/imported/FURN_ServiceStation.glb-011656024c3eaa0264cbe6218ea258c9.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/FURN_Table_2Top.glb b/visual/RestaurantVisualSandbox/assets/generated/FURN_Table_2Top.glb new file mode 100644 index 0000000..de9239a Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/FURN_Table_2Top.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/FURN_Table_2Top.glb.import b/visual/RestaurantVisualSandbox/assets/generated/FURN_Table_2Top.glb.import new file mode 100644 index 0000000..1a97e6e --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/FURN_Table_2Top.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cahnliwfhuttd" +path="res://.godot/imported/FURN_Table_2Top.glb-248e202dbab8ef6c89f139a791a0bfb1.scn" + +[deps] + +source_file="res://assets/generated/FURN_Table_2Top.glb" +dest_files=["res://.godot/imported/FURN_Table_2Top.glb-248e202dbab8ef6c89f139a791a0bfb1.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/FURN_Table_4Top.glb b/visual/RestaurantVisualSandbox/assets/generated/FURN_Table_4Top.glb new file mode 100644 index 0000000..d1c3681 Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/FURN_Table_4Top.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/FURN_Table_4Top.glb.import b/visual/RestaurantVisualSandbox/assets/generated/FURN_Table_4Top.glb.import new file mode 100644 index 0000000..a40c724 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/FURN_Table_4Top.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://qe200r3w0oqa" +path="res://.godot/imported/FURN_Table_4Top.glb-73bd49f059f032eec125adc1a20b5fd0.scn" + +[deps] + +source_file="res://assets/generated/FURN_Table_4Top.glb" +dest_files=["res://.godot/imported/FURN_Table_4Top.glb-73bd49f059f032eec125adc1a20b5fd0.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/FURN_WaitBench.glb b/visual/RestaurantVisualSandbox/assets/generated/FURN_WaitBench.glb new file mode 100644 index 0000000..2b9d1bc Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/FURN_WaitBench.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/FURN_WaitBench.glb.import b/visual/RestaurantVisualSandbox/assets/generated/FURN_WaitBench.glb.import new file mode 100644 index 0000000..3a54961 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/FURN_WaitBench.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cddf1tkk1dq0j" +path="res://.godot/imported/FURN_WaitBench.glb-9df8a403bdc71d8d966e6183d2011a50.scn" + +[deps] + +source_file="res://assets/generated/FURN_WaitBench.glb" +dest_files=["res://.godot/imported/FURN_WaitBench.glb-9df8a403bdc71d8d966e6183d2011a50.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/KIT_ColdStation.glb b/visual/RestaurantVisualSandbox/assets/generated/KIT_ColdStation.glb new file mode 100644 index 0000000..be9ef30 Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/KIT_ColdStation.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/KIT_ColdStation.glb.import b/visual/RestaurantVisualSandbox/assets/generated/KIT_ColdStation.glb.import new file mode 100644 index 0000000..8eac9f6 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/KIT_ColdStation.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://865i1mn6wnax" +path="res://.godot/imported/KIT_ColdStation.glb-37343138d8afe350aab03cdf5f10cc0c.scn" + +[deps] + +source_file="res://assets/generated/KIT_ColdStation.glb" +dest_files=["res://.godot/imported/KIT_ColdStation.glb-37343138d8afe350aab03cdf5f10cc0c.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/KIT_Dishwasher.glb b/visual/RestaurantVisualSandbox/assets/generated/KIT_Dishwasher.glb new file mode 100644 index 0000000..c8da188 Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/KIT_Dishwasher.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/KIT_Dishwasher.glb.import b/visual/RestaurantVisualSandbox/assets/generated/KIT_Dishwasher.glb.import new file mode 100644 index 0000000..9f0cf45 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/KIT_Dishwasher.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://1eb8skh8o6c6" +path="res://.godot/imported/KIT_Dishwasher.glb-180395f8860677b72ba8a485169b5b2e.scn" + +[deps] + +source_file="res://assets/generated/KIT_Dishwasher.glb" +dest_files=["res://.godot/imported/KIT_Dishwasher.glb-180395f8860677b72ba8a485169b5b2e.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/KIT_Fridge.glb b/visual/RestaurantVisualSandbox/assets/generated/KIT_Fridge.glb new file mode 100644 index 0000000..5432d3b Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/KIT_Fridge.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/KIT_Fridge.glb.import b/visual/RestaurantVisualSandbox/assets/generated/KIT_Fridge.glb.import new file mode 100644 index 0000000..d25c779 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/KIT_Fridge.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://daiahx2qbqmwu" +path="res://.godot/imported/KIT_Fridge.glb-0ab27636e1c007650ef6a53445f9699b.scn" + +[deps] + +source_file="res://assets/generated/KIT_Fridge.glb" +dest_files=["res://.godot/imported/KIT_Fridge.glb-0ab27636e1c007650ef6a53445f9699b.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/KIT_Fryer.glb b/visual/RestaurantVisualSandbox/assets/generated/KIT_Fryer.glb new file mode 100644 index 0000000..801a135 Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/KIT_Fryer.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/KIT_Fryer.glb.import b/visual/RestaurantVisualSandbox/assets/generated/KIT_Fryer.glb.import new file mode 100644 index 0000000..5089580 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/KIT_Fryer.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dfghcd0h5o70" +path="res://.godot/imported/KIT_Fryer.glb-5478ee6d29e5ff7e4e68e32cb4a60744.scn" + +[deps] + +source_file="res://assets/generated/KIT_Fryer.glb" +dest_files=["res://.godot/imported/KIT_Fryer.glb-5478ee6d29e5ff7e4e68e32cb4a60744.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/KIT_Grill.glb b/visual/RestaurantVisualSandbox/assets/generated/KIT_Grill.glb new file mode 100644 index 0000000..44f1d7a Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/KIT_Grill.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/KIT_Grill.glb.import b/visual/RestaurantVisualSandbox/assets/generated/KIT_Grill.glb.import new file mode 100644 index 0000000..7db176b --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/KIT_Grill.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c55xilat7j2kq" +path="res://.godot/imported/KIT_Grill.glb-bf74f1322d88a1d152680ec5c4978454.scn" + +[deps] + +source_file="res://assets/generated/KIT_Grill.glb" +dest_files=["res://.godot/imported/KIT_Grill.glb-bf74f1322d88a1d152680ec5c4978454.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/KIT_HeatLamp.glb b/visual/RestaurantVisualSandbox/assets/generated/KIT_HeatLamp.glb new file mode 100644 index 0000000..6798eca Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/KIT_HeatLamp.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/KIT_HeatLamp.glb.import b/visual/RestaurantVisualSandbox/assets/generated/KIT_HeatLamp.glb.import new file mode 100644 index 0000000..407097c --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/KIT_HeatLamp.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ctdg7b6sgje2a" +path="res://.godot/imported/KIT_HeatLamp.glb-5cbbffc9d52ccd958d3351e355344570.scn" + +[deps] + +source_file="res://assets/generated/KIT_HeatLamp.glb" +dest_files=["res://.godot/imported/KIT_HeatLamp.glb-5cbbffc9d52ccd958d3351e355344570.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/KIT_Pass.glb b/visual/RestaurantVisualSandbox/assets/generated/KIT_Pass.glb new file mode 100644 index 0000000..6b625bd Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/KIT_Pass.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/KIT_Pass.glb.import b/visual/RestaurantVisualSandbox/assets/generated/KIT_Pass.glb.import new file mode 100644 index 0000000..c5d9fb3 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/KIT_Pass.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dkos8wfpya6ym" +path="res://.godot/imported/KIT_Pass.glb-f9a3213907242160e297b0654b362513.scn" + +[deps] + +source_file="res://assets/generated/KIT_Pass.glb" +dest_files=["res://.godot/imported/KIT_Pass.glb-f9a3213907242160e297b0654b362513.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/KIT_PrepStation.glb b/visual/RestaurantVisualSandbox/assets/generated/KIT_PrepStation.glb new file mode 100644 index 0000000..a51c20f Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/KIT_PrepStation.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/KIT_PrepStation.glb.import b/visual/RestaurantVisualSandbox/assets/generated/KIT_PrepStation.glb.import new file mode 100644 index 0000000..efd42ad --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/KIT_PrepStation.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cioos6jh32eae" +path="res://.godot/imported/KIT_PrepStation.glb-95784100ee7ee163032f2d9bef5030e7.scn" + +[deps] + +source_file="res://assets/generated/KIT_PrepStation.glb" +dest_files=["res://.godot/imported/KIT_PrepStation.glb-95784100ee7ee163032f2d9bef5030e7.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/KIT_Range.glb b/visual/RestaurantVisualSandbox/assets/generated/KIT_Range.glb new file mode 100644 index 0000000..60090a8 Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/KIT_Range.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/KIT_Range.glb.import b/visual/RestaurantVisualSandbox/assets/generated/KIT_Range.glb.import new file mode 100644 index 0000000..1f8f5da --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/KIT_Range.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cqlmd6avbkdbc" +path="res://.godot/imported/KIT_Range.glb-547357ef2962add439142cbaaab42894.scn" + +[deps] + +source_file="res://assets/generated/KIT_Range.glb" +dest_files=["res://.godot/imported/KIT_Range.glb-547357ef2962add439142cbaaab42894.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/KIT_Shelves.glb b/visual/RestaurantVisualSandbox/assets/generated/KIT_Shelves.glb new file mode 100644 index 0000000..902a449 Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/KIT_Shelves.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/KIT_Shelves.glb.import b/visual/RestaurantVisualSandbox/assets/generated/KIT_Shelves.glb.import new file mode 100644 index 0000000..e05c1aa --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/KIT_Shelves.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bn1bm0lorr2sg" +path="res://.godot/imported/KIT_Shelves.glb-90271f246a3f5c9c2c274f7daa9ce0ec.scn" + +[deps] + +source_file="res://assets/generated/KIT_Shelves.glb" +dest_files=["res://.godot/imported/KIT_Shelves.glb-90271f246a3f5c9c2c274f7daa9ce0ec.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/KIT_Sink.glb b/visual/RestaurantVisualSandbox/assets/generated/KIT_Sink.glb new file mode 100644 index 0000000..4dd6cc2 Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/KIT_Sink.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/KIT_Sink.glb.import b/visual/RestaurantVisualSandbox/assets/generated/KIT_Sink.glb.import new file mode 100644 index 0000000..10c4213 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/KIT_Sink.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://tsl3swywyn7y" +path="res://.godot/imported/KIT_Sink.glb-3a490d8df3047b1d6803659540afb545.scn" + +[deps] + +source_file="res://assets/generated/KIT_Sink.glb" +dest_files=["res://.godot/imported/KIT_Sink.glb-3a490d8df3047b1d6803659540afb545.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/KIT_TicketRail.glb b/visual/RestaurantVisualSandbox/assets/generated/KIT_TicketRail.glb new file mode 100644 index 0000000..b755d67 Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/KIT_TicketRail.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/KIT_TicketRail.glb.import b/visual/RestaurantVisualSandbox/assets/generated/KIT_TicketRail.glb.import new file mode 100644 index 0000000..a2c498a --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/KIT_TicketRail.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ddec5evejddkv" +path="res://.godot/imported/KIT_TicketRail.glb-3cfa4d1d34945cef916536af86c33881.scn" + +[deps] + +source_file="res://assets/generated/KIT_TicketRail.glb" +dest_files=["res://.godot/imported/KIT_TicketRail.glb-3cfa4d1d34945cef916536af86c33881.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/PROP_BillFolder.glb b/visual/RestaurantVisualSandbox/assets/generated/PROP_BillFolder.glb new file mode 100644 index 0000000..3b45234 Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/PROP_BillFolder.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/PROP_BillFolder.glb.import b/visual/RestaurantVisualSandbox/assets/generated/PROP_BillFolder.glb.import new file mode 100644 index 0000000..6ab8b83 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/PROP_BillFolder.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dj5c1tu686spt" +path="res://.godot/imported/PROP_BillFolder.glb-cadc7903169f60b7c274a62e7f142734.scn" + +[deps] + +source_file="res://assets/generated/PROP_BillFolder.glb" +dest_files=["res://.godot/imported/PROP_BillFolder.glb-cadc7903169f60b7c274a62e7f142734.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/PROP_Centerpiece.glb b/visual/RestaurantVisualSandbox/assets/generated/PROP_Centerpiece.glb new file mode 100644 index 0000000..18aead6 Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/PROP_Centerpiece.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/PROP_Centerpiece.glb.import b/visual/RestaurantVisualSandbox/assets/generated/PROP_Centerpiece.glb.import new file mode 100644 index 0000000..dafec47 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/PROP_Centerpiece.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cpxoj2jeeiosm" +path="res://.godot/imported/PROP_Centerpiece.glb-9ae2c0ec06cc127abc08b82d68c3d259.scn" + +[deps] + +source_file="res://assets/generated/PROP_Centerpiece.glb" +dest_files=["res://.godot/imported/PROP_Centerpiece.glb-9ae2c0ec06cc127abc08b82d68c3d259.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/PROP_Glass.glb b/visual/RestaurantVisualSandbox/assets/generated/PROP_Glass.glb new file mode 100644 index 0000000..45ea5c8 Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/PROP_Glass.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/PROP_Glass.glb.import b/visual/RestaurantVisualSandbox/assets/generated/PROP_Glass.glb.import new file mode 100644 index 0000000..9017b4e --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/PROP_Glass.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dehk3xxt8po1b" +path="res://.godot/imported/PROP_Glass.glb-81b89e22720a60815fd7d814d1607065.scn" + +[deps] + +source_file="res://assets/generated/PROP_Glass.glb" +dest_files=["res://.godot/imported/PROP_Glass.glb-81b89e22720a60815fd7d814d1607065.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/PROP_PlaceSetting.glb b/visual/RestaurantVisualSandbox/assets/generated/PROP_PlaceSetting.glb new file mode 100644 index 0000000..ca423c3 Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/PROP_PlaceSetting.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/PROP_PlaceSetting.glb.import b/visual/RestaurantVisualSandbox/assets/generated/PROP_PlaceSetting.glb.import new file mode 100644 index 0000000..bf13ab7 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/PROP_PlaceSetting.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bapy7fvqv25bm" +path="res://.godot/imported/PROP_PlaceSetting.glb-8119e68b1c630a21d147d523b7ac607a.scn" + +[deps] + +source_file="res://assets/generated/PROP_PlaceSetting.glb" +dest_files=["res://.godot/imported/PROP_PlaceSetting.glb-8119e68b1c630a21d147d523b7ac607a.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/PROP_PlateClean.glb b/visual/RestaurantVisualSandbox/assets/generated/PROP_PlateClean.glb new file mode 100644 index 0000000..42d8850 Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/PROP_PlateClean.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/PROP_PlateClean.glb.import b/visual/RestaurantVisualSandbox/assets/generated/PROP_PlateClean.glb.import new file mode 100644 index 0000000..a78963e --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/PROP_PlateClean.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b4cpg1qjwbt5x" +path="res://.godot/imported/PROP_PlateClean.glb-822a5b59a24c0b67dbe383db4a70b241.scn" + +[deps] + +source_file="res://assets/generated/PROP_PlateClean.glb" +dest_files=["res://.godot/imported/PROP_PlateClean.glb-822a5b59a24c0b67dbe383db4a70b241.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/PROP_PlateDirty.glb b/visual/RestaurantVisualSandbox/assets/generated/PROP_PlateDirty.glb new file mode 100644 index 0000000..f7ef485 Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/PROP_PlateDirty.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/PROP_PlateDirty.glb.import b/visual/RestaurantVisualSandbox/assets/generated/PROP_PlateDirty.glb.import new file mode 100644 index 0000000..596409b --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/PROP_PlateDirty.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://qgdvjklx7ncu" +path="res://.godot/imported/PROP_PlateDirty.glb-d6b6a5c66c1edb7a9b987ca9fe0d7fb0.scn" + +[deps] + +source_file="res://assets/generated/PROP_PlateDirty.glb" +dest_files=["res://.godot/imported/PROP_PlateDirty.glb-d6b6a5c66c1edb7a9b987ca9fe0d7fb0.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/PROP_PlateFood.glb b/visual/RestaurantVisualSandbox/assets/generated/PROP_PlateFood.glb new file mode 100644 index 0000000..8feaac8 Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/PROP_PlateFood.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/PROP_PlateFood.glb.import b/visual/RestaurantVisualSandbox/assets/generated/PROP_PlateFood.glb.import new file mode 100644 index 0000000..9b3f551 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/PROP_PlateFood.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cqo81pq13clq2" +path="res://.godot/imported/PROP_PlateFood.glb-7e80eb013b31c42780266695b20b4808.scn" + +[deps] + +source_file="res://assets/generated/PROP_PlateFood.glb" +dest_files=["res://.godot/imported/PROP_PlateFood.glb-7e80eb013b31c42780266695b20b4808.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/assets/generated/PROP_TicketStrip.glb b/visual/RestaurantVisualSandbox/assets/generated/PROP_TicketStrip.glb new file mode 100644 index 0000000..ba06c3c Binary files /dev/null and b/visual/RestaurantVisualSandbox/assets/generated/PROP_TicketStrip.glb differ diff --git a/visual/RestaurantVisualSandbox/assets/generated/PROP_TicketStrip.glb.import b/visual/RestaurantVisualSandbox/assets/generated/PROP_TicketStrip.glb.import new file mode 100644 index 0000000..e4431b6 --- /dev/null +++ b/visual/RestaurantVisualSandbox/assets/generated/PROP_TicketStrip.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bubm4b4cy0af3" +path="res://.godot/imported/PROP_TicketStrip.glb-67335b13fa9f6fac1565bf49c6349db1.scn" + +[deps] + +source_file="res://assets/generated/PROP_TicketStrip.glb" +dest_files=["res://.godot/imported/PROP_TicketStrip.glb-67335b13fa9f6fac1565bf49c6349db1.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/visual/RestaurantVisualSandbox/scenes/diagnostics/CorrPerf.tscn b/visual/RestaurantVisualSandbox/scenes/diagnostics/CorrPerf.tscn new file mode 100644 index 0000000..61f216b --- /dev/null +++ b/visual/RestaurantVisualSandbox/scenes/diagnostics/CorrPerf.tscn @@ -0,0 +1,4 @@ +[gd_scene load_steps=2 format=3 uid="uid://bv0corrperf01"] +[ext_resource type="Script" path="res://scripts/corrected_perf.gd" id="1"] +[node name="CorrPerf" type="Node"] +script = ExtResource("1") diff --git a/visual/RestaurantVisualSandbox/scenes/diagnostics/KitReview.tscn b/visual/RestaurantVisualSandbox/scenes/diagnostics/KitReview.tscn new file mode 100644 index 0000000..a88f06b --- /dev/null +++ b/visual/RestaurantVisualSandbox/scenes/diagnostics/KitReview.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://bv0kitreview01"] + +[ext_resource type="Script" path="res://scripts/kit_review.gd" id="1_kr"] + +[node name="KitReview" type="Node3D"] +script = ExtResource("1_kr") diff --git a/visual/RestaurantVisualSandbox/scenes/sandbox/Corrected.tscn b/visual/RestaurantVisualSandbox/scenes/sandbox/Corrected.tscn new file mode 100644 index 0000000..ef85ef6 --- /dev/null +++ b/visual/RestaurantVisualSandbox/scenes/sandbox/Corrected.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://bv0corrected01"] + +[ext_resource type="Script" path="res://scripts/corrected_root.gd" id="1_cr"] + +[node name="Corrected" type="Node3D"] +script = ExtResource("1_cr") diff --git a/visual/RestaurantVisualSandbox/scripts/corrected_perf.gd b/visual/RestaurantVisualSandbox/scripts/corrected_perf.gd new file mode 100644 index 0000000..88bf1c4 --- /dev/null +++ b/visual/RestaurantVisualSandbox/scripts/corrected_perf.gd @@ -0,0 +1,52 @@ +extends Node +## Performance probe for the CORRECTED scene (richer: kit meshes, characters, props, +## multiple lights + shadows). vsync OFF for headroom. VisualOnly / Prototype. +const SETTLE := 24 +const SAMPLE := 120 + +func _ready() -> void: + DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED) + Engine.max_fps = 0 + get_window().size = Vector2i(1920, 1080) + var out := "/tmp/corr_perf.csv" + for a in OS.get_cmdline_user_args(): + if a.begins_with("--out="): + out = a.substr(6) + var packed: PackedScene = load("res://scenes/sandbox/Corrected.tscn") + var rows := ["scenario,mesh_instances,draw_calls,primitives,avg_fps,worst_fps,avg_frame_ms,worst_frame_ms,video_mem_mb"] + var names := ["healthy", "kitchen", "foh", "host"] + for sc in 4: + var inst := packed.instantiate() + add_child(inst) + await get_tree().process_frame + await get_tree().process_frame + inst.capture_configure({"scenario": sc, "seek": "peak", "hud_mode": "readability"}) + for i in SETTLE: + await get_tree().process_frame + var acc := 0.0 + var worst := 0.0 + for i in SAMPLE: + await get_tree().process_frame + var dt := get_process_delta_time() + acc += dt; worst = maxf(worst, dt) + var avg := acc / SAMPLE + var draw := RenderingServer.get_rendering_info(RenderingServer.RENDERING_INFO_TOTAL_DRAW_CALLS_IN_FRAME) + var prims := RenderingServer.get_rendering_info(RenderingServer.RENDERING_INFO_TOTAL_PRIMITIVES_IN_FRAME) + var vmem := RenderingServer.get_rendering_info(RenderingServer.RENDERING_INFO_VIDEO_MEM_USED) + var meshes := _count(inst) + rows.append("%s,%d,%d,%d,%.0f,%.0f,%.2f,%.2f,%.1f" % [ + names[sc], meshes, draw, prims, 1.0 / avg, 1.0 / worst, avg * 1000.0, worst * 1000.0, vmem / 1048576.0]) + print("[cperf] ", rows[-1]) + inst.queue_free() + await get_tree().process_frame + var f := FileAccess.open(out, FileAccess.WRITE) + if f: + f.store_string("\n".join(rows) + "\n"); f.close() + print("[cperf] wrote ", out) + get_tree().quit() + +func _count(n: Node) -> int: + var c := 1 if (n is MeshInstance3D and (n as MeshInstance3D).is_visible_in_tree()) else 0 + for ch in n.get_children(): + c += _count(ch) + return c diff --git a/visual/RestaurantVisualSandbox/scripts/corrected_perf.gd.uid b/visual/RestaurantVisualSandbox/scripts/corrected_perf.gd.uid new file mode 100644 index 0000000..0cb6537 --- /dev/null +++ b/visual/RestaurantVisualSandbox/scripts/corrected_perf.gd.uid @@ -0,0 +1 @@ +uid://cj3u6vipfv53b diff --git a/visual/RestaurantVisualSandbox/scripts/corrected_restaurant.gd b/visual/RestaurantVisualSandbox/scripts/corrected_restaurant.gd new file mode 100644 index 0000000..161dc06 --- /dev/null +++ b/visual/RestaurantVisualSandbox/scripts/corrected_restaurant.gd @@ -0,0 +1,175 @@ +class_name CorrectedRestaurant +extends Node3D +## Corrected restaurant: assembles the Blender-generated kit into one believable, +## frame-filling floor plan (rear open kitchen). Warm dining / cooler kitchen light. +## VisualOnly — owns no gameplay truth. Data model feeds CorrectedView. + +const GEN := "res://assets/generated/%s.glb" +const X0 := -6.3 +const X1 := 6.3 +const Z0 := -5.0 # back (kitchen) +const Z1 := 5.0 # front (entrance) + +var tables: Array = [] # {id, pos, seats, kind} +var stations: Array = [] # {id, name, pos} +var pass_pos: Vector3 +var host_pos: Vector3 +var waiting_slots: Array = [] +var dish_pos: Vector3 +var focus_targets: Array = [] +var pendants: Array = [] # OmniLight3D over dining (warm) + +var _cache := {} + +func glb(name: String) -> Node3D: + if not _cache.has(name): + _cache[name] = load(GEN % name) + var p = _cache[name] + return p.instantiate() if p else Node3D.new() + +func place(name: String, pos: Vector3, yaw_deg := 0.0, parent: Node = null) -> Node3D: + var n := glb(name) + n.position = pos + n.rotation.y = deg_to_rad(yaw_deg) + (parent if parent else self).add_child(n) + return n + +func build() -> void: + _shell() + _kitchen() + _dining() + _host_and_waiting() + _decor() + +# ---------------------------------------------------------------- shell ----- +func _shell() -> void: + var floor := MeshInstance3D.new() + var pm := PlaneMesh.new(); pm.size = Vector2(X1 - X0, Z1 - Z0) + floor.mesh = pm + floor.material_override = _m(Color("6b4a30"), 0.85) # warm wood floor + floor.position = Vector3((X0 + X1) * 0.5, 0, (Z0 + Z1) * 0.5) + add_child(floor) + # kitchen floor tile inlay (cooler tile) + _floor_patch(Vector3(0, 0.01, -4.0), Vector2(X1 - X0 - 0.4, 2.6), Color("8a8172")) + # walls: back + left + right full; front left open for the camera + var h := 3.0; var t := 0.16 + _wall(Vector3((X0 + X1) * 0.5, h * 0.5, Z0), Vector3(X1 - X0 + t, h, t), Color("cdbfa6")) # back + _wall(Vector3(X0, h * 0.5, 0), Vector3(t, h, Z1 - Z0 + t), Color("c3b59c")) # left + _wall(Vector3(X1, h * 0.5, 0), Vector3(t, h, Z1 - Z0 + t), Color("c3b59c")) # right + # front wall segments (entrance gap on the right) + _wall(Vector3(-3.4, h * 0.5, Z1), Vector3(5.6, h, t), Color("cdbfa6")) # front-left + # storefront glazing on the front-left wall + door on the right gap + place("ENV_Window", Vector3(-4.4, 1.0, Z1), 0) + place("ENV_Window", Vector3(-1.8, 1.0, Z1), 0) + place("ENV_DoorFront", Vector3(4.6, 0, Z1), 0) + place("ENV_Sign", Vector3(-3.2, 2.55, Z1 + 0.06), 0) + place("ENV_Awning", Vector3(-3.2, 2.9, Z1 + 0.5), 0) + +func _kitchen() -> void: + # open kitchen along the back wall; stations left->right, cooks behind, pass facing dining + var zc := -4.35 + var line := [ + ["KIT_Fridge", -5.6], ["KIT_PrepStation", -4.3], ["KIT_Range", -3.0], + ["KIT_Grill", -1.8], ["KIT_Fryer", -0.8], ["KIT_ColdStation", 0.4], + ["KIT_Sink", 1.8], ["KIT_Dishwasher", 3.0], + ] + for e in line: + place(e[0], Vector3(e[1], 0, zc), 180) + place("KIT_Shelves", Vector3(4.6, 0, zc - 0.2), 180) + # the four "line" stations the scenarios reference (Grill/Fry/Range/Garde=cold) + stations = [ + {"id": 0, "name": "Grill", "pos": Vector3(-1.8, 0, zc)}, + {"id": 1, "name": "Fry", "pos": Vector3(-0.8, 0, zc)}, + {"id": 2, "name": "Range", "pos": Vector3(-3.0, 0, zc)}, + {"id": 3, "name": "Garde", "pos": Vector3(0.4, 0, zc)}, + ] + for s in stations: + focus_targets.append(s["pos"] + Vector3(0, 1.2, 0.8)) + # pass line between kitchen and dining + place("KIT_Pass", Vector3(-1.0, 0, -3.0), 0) + place("KIT_TicketRail", Vector3(0.6, 0.0, -3.4), 0) + pass_pos = Vector3(-1.0, 0.9, -2.7) + dish_pos = Vector3(3.0, 0, -3.8) + +func _dining() -> void: + var layout := [ + {"id": "T1", "seats": 4, "pos": Vector3(-4.6, 0, 2.6)}, + {"id": "T2", "seats": 4, "pos": Vector3(-1.6, 0, 2.6)}, + {"id": "T3", "seats": 2, "pos": Vector3(1.4, 0, 2.9)}, + {"id": "T4", "seats": 4, "pos": Vector3(-4.6, 0, 0.2)}, + {"id": "T5", "seats": 4, "pos": Vector3(-1.6, 0, 0.2)}, + {"id": "T6", "seats": 2, "pos": Vector3(1.4, 0, 0.6)}, + {"id": "T7", "seats": 4, "pos": Vector3(-4.6, 0, -2.0)}, + {"id": "T8", "seats": 2, "pos": Vector3(-1.8, 0, -2.0)}, + {"id": "T9", "seats": 4, "pos": Vector3(5.2, 0, 1.4), "booth": true}, + {"id": "T10", "seats": 4, "pos": Vector3(5.2, 0, -1.4), "booth": true}, + ] + for t in layout: + var kind := "FURN_Table_2Top" if t["seats"] <= 2 else "FURN_Table_4Top" + var node := place(kind, t["pos"]) + var seats_world := _seats(t) + if t.get("booth", false): + place("FURN_Booth", t["pos"] + Vector3(0.7, 0, 0), -90) + else: + for sw in seats_world: + var ch := place("FURN_Chair", sw["pos"]) + ch.rotation.y = sw["yaw"] + tables.append({"id": t["id"], "pos": t["pos"], "seats": t["seats"], "seats_world": seats_world, "booth": t.get("booth", false)}) + focus_targets.append(t["pos"] + Vector3(0, 0.9, 0)) + +func _seats(t: Dictionary) -> Array: + var seats: int = t["seats"] + var c: Vector3 = t["pos"] + if t.get("booth", false): + return [{"pos": c + Vector3(-0.55, 0, -0.4), "yaw": deg_to_rad(90)}, + {"pos": c + Vector3(-0.55, 0, 0.05), "yaw": deg_to_rad(90)}, + {"pos": c + Vector3(-0.55, 0, 0.5), "yaw": deg_to_rad(90)}] + if seats <= 2: + return [{"pos": c + Vector3(-0.6, 0, 0), "yaw": deg_to_rad(90)}, {"pos": c + Vector3(0.6, 0, 0), "yaw": deg_to_rad(-90)}] + return [ + {"pos": c + Vector3(-0.7, 0, -0.25), "yaw": deg_to_rad(90)}, + {"pos": c + Vector3(-0.7, 0, 0.25), "yaw": deg_to_rad(90)}, + {"pos": c + Vector3(0.7, 0, -0.25), "yaw": deg_to_rad(-90)}, + {"pos": c + Vector3(0.7, 0, 0.25), "yaw": deg_to_rad(-90)}, + ] + +func _host_and_waiting() -> void: + host_pos = Vector3(3.4, 0, 3.6) + place("FURN_HostStand", host_pos, 200) + place("FURN_WaitBench", Vector3(5.3, 0, 4.2), -90) + place("ENV_Plant", Vector3(6.0, 0, 3.4)) + place("ENV_MenuBoard", Vector3(6.24, 1.4, 2.2), -90) + for i in 4: + waiting_slots.append(Vector3(2.6 - i * 0.55, 0, 4.0)) + focus_targets.append(host_pos + Vector3(0, 1.2, 0)) + +func _decor() -> void: + # warm pendant lights over the dining clusters + for p in [Vector3(-3.0, 2.6, 1.4), Vector3(0.0, 2.6, 1.4), Vector3(-3.0, 2.6, -1.0), Vector3(4.8, 2.6, 0.0)]: + place("ENV_PendantLight", p) + var o := OmniLight3D.new() + o.position = p + Vector3(0, -0.2, 0) + o.light_color = Color("ffcf9a"); o.light_energy = 4.0; o.omni_range = 6.0 + o.omni_attenuation = 1.2 + add_child(o); pendants.append(o) + place("ENV_Plant", Vector3(-6.0, 0, 3.6)) + place("ENV_WallArt", Vector3(-6.14, 1.7, 1.0), 90) + place("ENV_WallArt", Vector3(-6.14, 1.7, -1.5), 90) + place("ENV_Plant", Vector3(-6.0, 0, -3.5)) + place("FURN_ServiceStation", Vector3(3.2, 0, 1.2), 0) + place("FURN_BusTub", Vector3(3.6, 0, -0.2), 0) + +# ---------------------------------------------------------------- helpers --- +func _m(c: Color, rough := 0.8) -> StandardMaterial3D: + var m := StandardMaterial3D.new(); m.albedo_color = c; m.roughness = rough; m.metallic = 0.0 + return m + +func _wall(center: Vector3, size: Vector3, color: Color) -> void: + var w := MeshInstance3D.new(); var b := BoxMesh.new(); b.size = size + w.mesh = b; w.material_override = _m(color, 0.9); w.position = center + add_child(w) + +func _floor_patch(pos: Vector3, size: Vector2, color: Color) -> void: + var p := MeshInstance3D.new(); var pm := PlaneMesh.new(); pm.size = size + p.mesh = pm; p.material_override = _m(color, 0.7); p.position = pos + add_child(p) diff --git a/visual/RestaurantVisualSandbox/scripts/corrected_restaurant.gd.uid b/visual/RestaurantVisualSandbox/scripts/corrected_restaurant.gd.uid new file mode 100644 index 0000000..09b9062 --- /dev/null +++ b/visual/RestaurantVisualSandbox/scripts/corrected_restaurant.gd.uid @@ -0,0 +1 @@ +uid://b6hnyvoa568kp diff --git a/visual/RestaurantVisualSandbox/scripts/corrected_root.gd b/visual/RestaurantVisualSandbox/scripts/corrected_root.gd new file mode 100644 index 0000000..0095ed8 --- /dev/null +++ b/visual/RestaurantVisualSandbox/scripts/corrected_root.gd @@ -0,0 +1,112 @@ +extends Node3D +## Corrected V0 scene root: warm environment + kit restaurant + Hybrid-C camera. +## CorrectedView (actors/props per scenario) and the HUD are layered on next. +## VisualOnly; owns no gameplay truth. + +var restaurant: CorrectedRestaurant +var view # CorrectedView (added in the storytelling pass) +var rig: CameraRig +var scenario := 1 +var clock := 0.0 +var playing := false +const RATE := 6.0 + +func _ready() -> void: + _warm_env() + restaurant = CorrectedRestaurant.new() + restaurant.name = "Restaurant" + add_child(restaurant) + restaurant.build() + if _has_view(): + view = load("res://scripts/corrected_view.gd").new() + view.name = "View" + add_child(view) + view.setup(restaurant) + rig = CameraRig.new() + rig.name = "CameraRig" + add_child(rig) + rig.register_focus_targets(restaurant.focus_targets) + rig.set_mode(CameraRig.Mode.HYBRID_C) + _frame_overview() + if view: + view.apply(MockService.snapshot(scenario, MockService.peak_time(scenario))) + _apply_launch_args() + print("[V0c] corrected scene ready") + +var _rec_orbit := false +func _apply_launch_args() -> void: + for a in OS.get_cmdline_user_args(): + if a.begins_with("--rec_scenario="): + scenario = int(a.substr(15)) + if view: view.apply(MockService.snapshot(scenario, MockService.peak_time(scenario))) + elif a == "--rec_orbit": + _rec_orbit = true + +func _process(dt: float) -> void: + if _rec_orbit and rig: + rig.orbit(20.0 * dt, 0.0) + +func _has_view() -> bool: + return ResourceLoader.exists("res://scripts/corrected_view.gd") + +func _frame_overview() -> void: + rig.frame(Vector3(-0.6, 0.7, 0.4), 26.0, 33.0, 12.8) + +func _warm_env() -> void: + var we := WorldEnvironment.new() + var e := Environment.new() + e.background_mode = Environment.BG_COLOR + e.background_color = Color("1c1712") + e.ambient_light_source = Environment.AMBIENT_SOURCE_COLOR + e.ambient_light_color = Color("caa981") + e.ambient_light_energy = 0.45 + e.tonemap_mode = Environment.TONE_MAPPER_ACES + e.tonemap_white = 6.0 + e.ssao_enabled = true + e.ssao_intensity = 1.6 + e.ssao_radius = 0.7 + e.sdfgi_enabled = false + we.environment = e + add_child(we) + # warm key sun (front, soft) + var sun := DirectionalLight3D.new() + sun.rotation_degrees = Vector3(-48, -35, 0) + sun.light_color = Color("ffdcae") + sun.light_energy = 1.15 + sun.shadow_enabled = true + sun.shadow_blur = 1.4 + add_child(sun) + # cooler, brighter kitchen task light (over the back) + var kit := SpotLight3D.new() + kit.position = Vector3(-1.0, 3.4, -3.6) + kit.rotation_degrees = Vector3(-90, 0, 0) + kit.light_color = Color("cfe0ff") + kit.light_energy = 6.0 + kit.spot_range = 8.0 + kit.spot_angle = 60.0 + add_child(kit) + # soft fill + var fill := DirectionalLight3D.new() + fill.rotation_degrees = Vector3(-20, 140, 0) + fill.light_color = Color("b9c6e0"); fill.light_energy = 0.25 + add_child(fill) + +# capture-harness hook +func capture_configure(cfg: Dictionary) -> void: + if cfg.has("scenario"): + scenario = int(cfg["scenario"]) + if cfg.has("seek"): + clock = MockService.peak_time(scenario) if str(cfg["seek"]).to_lower() == "peak" else float(cfg["seek"]) + if view: + view.apply(MockService.snapshot(scenario, clock)) + if cfg.has("hud_mode"): + view.set_hud_mode(str(cfg["hud_mode"])) + if cfg.has("focus") and rig: + rig.interactive = false + rig.focus_on(_v3(cfg["focus"]), float(cfg.get("focus_dist", 7.0)), false) + +func _v3(s) -> Vector3: + if s is Array and s.size() == 3: + return Vector3(s[0], s[1], s[2]) + var p := str(s).split(",") + return Vector3(p[0].to_float(), p[1].to_float(), p[2].to_float()) if p.size() == 3 else Vector3.ZERO diff --git a/visual/RestaurantVisualSandbox/scripts/corrected_root.gd.uid b/visual/RestaurantVisualSandbox/scripts/corrected_root.gd.uid new file mode 100644 index 0000000..2c08a2d --- /dev/null +++ b/visual/RestaurantVisualSandbox/scripts/corrected_root.gd.uid @@ -0,0 +1 @@ +uid://b3jb1caep5ra5 diff --git a/visual/RestaurantVisualSandbox/scripts/corrected_view.gd b/visual/RestaurantVisualSandbox/scripts/corrected_view.gd new file mode 100644 index 0000000..6219f7d --- /dev/null +++ b/visual/RestaurantVisualSandbox/scripts/corrected_view.gd @@ -0,0 +1,253 @@ +class_name CorrectedView +extends Node3D +## Renders a MockService snapshot with the kit: seats customers, dresses tables with props, +## staffs stations, piles plates at the pass, hangs tickets — so bottlenecks read PHYSICALLY. +## HUD modes: presentation (no answer) / readability (subtle pips) / debug (labels+numbers). +## VisualOnly; owns no gameplay truth. + +const GEN := "res://assets/generated/%s.glb" +var r: CorrectedRestaurant +var mode := "presentation" +var _pools := {} +var _cursor := {} +var _packed := {} +# readability pips + debug labels +var _pips := Node3D.new() +var _dbg := Node3D.new() +var hud: CanvasLayer +var _clock: Label +var _pressure: Label +var _mode_lbl: Label + +func setup(rest: CorrectedRestaurant) -> void: + r = rest + add_child(_pips); _pips.name = "Pips" + add_child(_dbg); _dbg.name = "Debug" + _build_hud() + +func _packed_get(name: String): + if not _packed.has(name): + _packed[name] = load(GEN % name) + return _packed[name] + +func _spawn(name: String, pos: Vector3, yaw := 0.0) -> Node3D: + if not _pools.has(name): + _pools[name] = [] + _cursor[name] = 0 + var pool: Array = _pools[name] + var i: int = _cursor[name] + if i >= pool.size(): + var p = _packed_get(name) + var inst = p.instantiate() if p else Node3D.new() + add_child(inst); pool.append(inst) + var node: Node3D = pool[i] + node.visible = true + node.position = pos + node.rotation.y = deg_to_rad(yaw) + _cursor[name] += 1 + return node + +func _begin() -> void: + for name in _pools: + for n in _pools[name]: + n.visible = false + _cursor[name] = 0 + for c in _pips.get_children(): + c.queue_free() + for c in _dbg.get_children(): + c.queue_free() + +# ---- apply a snapshot ----------------------------------------------------- +func apply(snap: Dictionary) -> void: + _begin() + _tables(snap) + _kitchen(snap) + _pass(snap) + _servers(snap) + _waiting_and_host(snap) + _busser(snap) + _hud_update(snap) + _apply_mode() + +func _tables(snap: Dictionary) -> void: + var S := V0.TableState + var states: Dictionary = snap["tables"] + var alt := 0 + for t in r.tables: + var st: int = states.get(t["id"], S.AVAILABLE) + var seats: Array = t["seats_world"] + var center: Vector3 = t["pos"] + var occupied := st in [S.OCCUPIED, S.WAITING_ORDER, S.WAITING_FOOD, S.EATING, S.NEEDS_PAYMENT] + # dress the table by state (physical storytelling) + for sidx in seats.size(): + var seat = seats[sidx] + var setpos: Vector3 = center.lerp(seat["pos"], 0.42) + Vector3(0, 0.79, 0) + match st: + S.EATING: + _spawn("PROP_PlateFood", setpos) + S.NEEDS_PAYMENT: + _spawn("PROP_PlateFood", setpos) + S.DIRTY, S.CLEANING: + _spawn("PROP_PlateDirty", setpos) + S.AVAILABLE, S.PREPARING: + if sidx < 2: _spawn("PROP_PlaceSetting", setpos) + _: + _spawn("PROP_PlaceSetting", setpos) + if st == S.NEEDS_PAYMENT: + _spawn("PROP_BillFolder", center + Vector3(0.2, 0.79, 0)) + if not occupied and not t.get("booth", false) and st == S.AVAILABLE: + _spawn("PROP_Centerpiece", center + Vector3(0, 0.79, 0)) + # seat guests + if occupied: + for seat in seats: + var who := "CHAR_Customer_Sit_A" if alt % 2 == 0 else "CHAR_Customer_Sit_B" + alt += 1 + _spawn(who, seat["pos"], rad_to_deg(seat["yaw"])) + # readability pip (subtle) — only in readability mode, added in _apply_mode via _pip + t["_state"] = st + +func _kitchen(snap: Dictionary) -> void: + var K := V0.StationState + var arr: Array = snap["stations"] + var total_q := 0 + for i in r.stations.size(): + var st: Dictionary = r.stations[i] + var sstate: int = arr[i][0] + var q: int = arr[i][1] + total_q += q + var active := q > 0 or sstate in [K.CONGESTED, K.FOOD_READY, K.QUEUE] + if active or sstate == K.NORMAL: + _spawn("CHAR_Cook_Cook", st["pos"] + Vector3(0, 0, 0.55), 180) + if sstate == K.CONGESTED: # extra hands piling on the overwhelmed station + _spawn("CHAR_Cook_Cook", st["pos"] + Vector3(0.6, 0, 0.55), 180) + # tickets pile on the rail with kitchen pressure + var tickets: int = clampi(total_q, 0, 7) + for j in tickets: + _spawn("PROP_TicketStrip", Vector3(0.2 + j * 0.14, 1.42, -3.36)) + +func _pass(snap: Dictionary) -> void: + var n: int = snap["pass"] + for i in n: + _spawn("PROP_PlateFood", r.pass_pos + Vector3(-1.0 + i * 0.42, 0.02, 0.0)) + +func _servers(snap: Dictionary) -> void: + var servers: Array = snap["servers"] + for i in servers.size(): + var target = servers[i] + if target == "pass" or target == "overloaded": + # empty-handed at the pass (the kitchen-bottleneck tell) + _spawn("CHAR_Server_Idle", r.pass_pos + Vector3(0.6 * i - 0.6, -0.9, 0.7), 180) + elif target == "idle": + _spawn("CHAR_Server_Idle", r.pass_pos + Vector3(0.6 * i - 0.6, -0.9, 1.4), 0) + else: + # carrying toward a table + var tp := _table_pos(target) + var mid := r.pass_pos + Vector3(0, -0.9, 0) + mid = mid.lerp(tp, 0.5) + _spawn("CHAR_Server_Carry", mid, rad_to_deg(atan2(tp.x - mid.x, tp.z - mid.z))) + +func _waiting_and_host(snap: Dictionary) -> void: + _spawn("CHAR_Host_Stand", r.host_pos, 200) + var waiting: int = snap["waiting"] + for w in waiting: + var slot: Vector3 = r.waiting_slots[min(w, r.waiting_slots.size() - 1)] + var who := "CHAR_Customer_Wait_A" if w % 2 == 0 else "CHAR_Customer_Stand_A" + _spawn(who, slot + Vector3(0, 0, w * 0.15), 180) + var leaving: int = snap.get("leaving", 0) + for l in leaving: + _spawn("CHAR_Customer_Stand_A", Vector3(5.4, 0, r.Z1 - 0.8) + Vector3(-l * 0.5, 0, 0), 90) + +func _busser(snap: Dictionary) -> void: + var bt = snap.get("busser", "idle") + if bt != "idle": + _spawn("CHAR_Busser_Carry", _table_pos(bt) + Vector3(0.8, 0, 0.6), 200) + else: + _spawn("CHAR_Busser_Carry", r.dish_pos + Vector3(0, 0, 0.6), 180) + +func _table_pos(id) -> Vector3: + for t in r.tables: + if t["id"] == id: + return t["pos"] + return r.pass_pos + +# ---- HUD modes ------------------------------------------------------------ +func set_hud_mode(m: String) -> void: + mode = m + _apply_mode() + +func _apply_mode() -> void: + _pips.visible = mode == "readability" + _dbg.visible = mode == "debug" + if _mode_lbl: + _mode_lbl.text = "view: %s" % mode + if _pressure: + _pressure.visible = mode == "presentation" + +func _pip(pos: Vector3, color: Color) -> void: + var mi := MeshInstance3D.new() + var m := SphereMesh.new(); m.radius = 0.09; m.height = 0.18 + mi.mesh = m + var mat := StandardMaterial3D.new(); mat.albedo_color = color + mat.emission_enabled = true; mat.emission = color; mat.emission_energy_multiplier = 0.8 + mi.material_override = mat + mi.position = pos + _pips.add_child(mi) + +func _dbg_label(text: String, pos: Vector3, color: Color) -> void: + var l := Placeholder.label(text, 0.2, color) + l.position = pos + _dbg.add_child(l) + +func _build_hud() -> void: + hud = CanvasLayer.new(); add_child(hud) + var panel := ColorRect.new(); panel.color = Color(0, 0, 0, 0.36) + panel.position = Vector2(24, 22); panel.size = Vector2(300, 78) + hud.add_child(panel) + _clock = _lab(Vector2(38, 30), 24, Color("ffe6c2")) + _pressure = _lab(Vector2(38, 64), 17, Color("d8c7a8")) + _mode_lbl = _lab(Vector2(38, 1042), 14, Color("9fb3c8")) + var tag := _lab(Vector2(1560, 1050), 14, Color("caa07a")) + tag.text = "MOCK / SCRIPTED" + +func _lab(pos: Vector2, sz: int, col: Color) -> Label: + var l := Label.new(); l.position = pos + l.add_theme_font_size_override("font_size", sz) + l.add_theme_color_override("font_color", col) + hud.add_child(l) + return l + +func _hud_update(snap: Dictionary) -> void: + if not _clock: + return + _clock.text = "service %s" % snap["clock"] + # aggregate pressure (NOT the scenario name) for presentation mode + var pressure := _pressure_score(snap) + var dots := "" + for i in 5: + dots += "●" if i < pressure else "○" + _pressure.text = "pressure " + dots + # readability pips + debug labels + var S := V0.TableState + for t in r.tables: + var st: int = snap["tables"].get(t["id"], S.AVAILABLE) + if st != S.AVAILABLE: + _pip(t["pos"] + Vector3(0, 1.35, 0), V0.TABLE_STATE_COLOR[st]) + var arr: Array = snap["stations"] + for i in r.stations.size(): + var q: int = arr[i][1] + if q > 0: + _pip(r.stations[i]["pos"] + Vector3(0, 1.9, 0.6), V0.STATION_STATE_COLOR[arr[i][0]]) + _dbg_label("q%d" % q, r.stations[i]["pos"] + Vector3(0, 2.1, 0.6), Color("ffd166")) + _dbg_label("%d - %s" % [snap["scenario"] + 1, snap["scenario_name"]], Vector3(-0.3, 3.0, 0.2), Color("ff8c69")) + +func _pressure_score(snap: Dictionary) -> int: + var S := V0.TableState + var p := 0 + for id in snap["tables"]: + if snap["tables"][id] in [S.WAITING_FOOD, S.NEEDS_PAYMENT, S.DIRTY]: + p += 1 + p += int(snap["waiting"]) + int(snap["pass"]) + for s in snap["stations"]: + if s[0] == V0.StationState.CONGESTED: + p += 2 + return clampi(int(round(p / 3.0)), 0, 5) diff --git a/visual/RestaurantVisualSandbox/scripts/corrected_view.gd.uid b/visual/RestaurantVisualSandbox/scripts/corrected_view.gd.uid new file mode 100644 index 0000000..aa1f8b8 --- /dev/null +++ b/visual/RestaurantVisualSandbox/scripts/corrected_view.gd.uid @@ -0,0 +1 @@ +uid://bxwk7cyokq8jq diff --git a/visual/RestaurantVisualSandbox/scripts/kit_review.gd b/visual/RestaurantVisualSandbox/scripts/kit_review.gd new file mode 100644 index 0000000..b5d9337 --- /dev/null +++ b/visual/RestaurantVisualSandbox/scripts/kit_review.gd @@ -0,0 +1,76 @@ +extends Node3D +## Kit review: grids every generated GLB matching --prefix under assets/generated/, +## with name labels, warm light, and an orbit camera the capture harness renders. +## Iteration tool for the visual correction. VisualOnly. + +func _ready() -> void: + _warm_stage() + var dir := "res://assets/generated/" + var prefix := _arg("prefix", "") + var files := [] + var da := DirAccess.open(dir) + if da: + for f in da.get_files(): + if f.ends_with(".glb") and (prefix == "" or f.begins_with(prefix)): + files.append(f) + files.sort() + var n := files.size() + var cols: int = max(1, int(ceil(sqrt(float(n))))) + var sp := 2.2 + var minx := 999.0 + var maxx := -999.0 + var maxz := -999.0 + for i in n: + var packed = load(dir + files[i]) + var col := i % cols + var row := i / cols + var pos := Vector3(col * sp - (cols - 1) * sp * 0.5, 0, row * sp) + if packed: + var inst = packed.instantiate() + inst.position = pos + add_child(inst) + var lbl := Placeholder.label(files[i].replace(".glb", ""), 0.16, Color("f0e6d2")) + lbl.position = pos + Vector3(0, 1.7, 0) + add_child(lbl) + minx = minf(minx, pos.x); maxx = maxf(maxx, pos.x); maxz = maxf(maxz, pos.z) + var floor := Placeholder.floor_tile(Vector2((maxx - minx) + sp * 2.0, (maxz + sp * 2.0) + 2.0), Color("2e2620")) + floor.position = Vector3((minx + maxx) * 0.5, 0.0, (maxz) * 0.5) + add_child(floor) + + var rig := CameraRig.new() + rig.interactive = false + add_child(rig) + rig.set_mode(CameraRig.Mode.ORBIT_B) + var span: float = maxf((maxx - minx), maxz) + sp + rig.frame(Vector3((minx + maxx) * 0.5, 0.5, (maxz) * 0.5), 22.0, 24.0, span * 1.1 + 4.0) + +func _warm_stage() -> void: + var we := WorldEnvironment.new() + var env := Environment.new() + env.background_mode = Environment.BG_COLOR + env.background_color = Color("241c16") + env.ambient_light_source = Environment.AMBIENT_SOURCE_COLOR + env.ambient_light_color = Color("c8b48c") + env.ambient_light_energy = 0.55 + env.tonemap_mode = Environment.TONE_MAPPER_ACES + env.tonemap_white = 6.0 + env.ssao_enabled = true + we.environment = env + add_child(we) + var sun := DirectionalLight3D.new() + sun.rotation_degrees = Vector3(-52, -42, 0) + sun.light_color = Color("ffe4be") + sun.light_energy = 1.5 + sun.shadow_enabled = true + add_child(sun) + var fill := DirectionalLight3D.new() + fill.rotation_degrees = Vector3(-24, 130, 0) + fill.light_color = Color("bcd0ff") + fill.light_energy = 0.3 + add_child(fill) + +func _arg(key: String, def: String) -> String: + for a in OS.get_cmdline_user_args(): + if a.begins_with("--%s=" % key): + return a.split("=", 1)[1] + return def diff --git a/visual/RestaurantVisualSandbox/scripts/kit_review.gd.uid b/visual/RestaurantVisualSandbox/scripts/kit_review.gd.uid new file mode 100644 index 0000000..44322da --- /dev/null +++ b/visual/RestaurantVisualSandbox/scripts/kit_review.gd.uid @@ -0,0 +1 @@ +uid://iuv0drd71ya0