08SPATIAL.CAFE.EXPERIENCE/Web App
CAFE DESTINO
A browser-based 3D recreation of Café Destino, with a street-front scene and a guided walk through its night-lit interior.
- Role
- Creator & 3D Web Developer
- Stack
- Three.js / Blender / JavaScript / Vite / HLS.js
- Year
- 2026
- Status
- Shipped
- Links
- Live app ↗
01Context
A first-person browser recreation of a local café, paired with a guided camera route through the same real-time scene.
02Problem
Build a detailed, warmly lit interior and street frontage that visitors can explore in real time, while keeping navigation responsive across devices.
03Constraints
- 01Keep storefront, interior, outdoor, and transparent surfaces correctly ordered as the camera crosses the entrance.
- 02Support detailed shadows, ambient occlusion, reflections, bloom, and anti-aliasing within a real-time frame budget.
- 03Make first-person movement, seating and menu interactions, scene settings, and the cinematic route share one scene model.
- 04Keep the in-world television and its positional audio independent from core movement and scene rendering.
04Architecture
Vite serves a modular Three.js WebGL app assembled from the Blender recreation and scene-specific JavaScript modules. A custom scene pass draws interior, storefront, outdoor, and transparent layers into a shared depth buffer before ambient occlusion, bloom, tone mapping, and edge smoothing. Visitors can move through the scene directly or follow a Catmull–Rom camera route. HLS.js provides the in-world television streams.
- Layered scene renderer
- Orders interior, storefront, outdoor, and transparent geometry so each part is drawn with the lights that can reach it.
- Walking and collision
- Uses a two-metre spatial grid to shortlist nearby geometry before the existing box and triangle checks resolve movement and contacts.
- Cinematic camera route
- Moves between authored camera positions and look targets with a smooth curve and eased orientation, including captioned stops inside the café.
- Adaptive graphics
- Tracks missed frame intervals, lowers render resolution when the frame budget slips, and raises it gradually after a stable period.
- Television and scene details
- Maps HLS.js channel video onto the café's television, with spatial audio, while separate modules provide textures, signage, and interactive fixtures.
05Decisions
D1Separate lighting into interior and exterior scene layers
Why
The room, street, and transparent surfaces need different lights and draw ordering.
Result
The scene pass shades the camera-facing layers first and shares one depth buffer across the full view.
D2Cache shadow depth for static geometry
Why
Rebuilding every lamp's full shadow map each frame spends work on objects that have not moved.
Result
Static shadow data is reused and refreshed when a moving object can affect a light's view.
D3Adapt render resolution to actual frame time
Why
High-quality lighting can exceed the frame budget on some devices, especially while walking through the interior.
Result
The app steps resolution down when frames are missed and brings it back only after a sustained calm period.
06Trade-offs
Keep the full lighting and post-processing pipeline available at high quality
Gained
- +Preserves soft shadows, contact detail, reflections, and glow in the café's night scene
- +Lets users choose an automatic or manual graphics preset
Gave up
- −High presets require more GPU time
- −Adaptive resolution can trade pixel sharpness for frame pacing on slower hardware
Use a spatial grid as a broad-phase accelerator
Gained
- +Reduces the number of meshes considered around the camera
- +Leaves the existing collision tests as the final authority
Gave up
- −The grid must be rebuilt when walkable geometry changes
- −Objects crossing cell boundaries can occupy multiple buckets
07Performance
- ↯Reuse static shadow depth and update only for relevant moving casters.
- ↯Adjust internal render scale in response to measured frame misses instead of altering the camera's motion timing.
- ↯Use a cell-based index to narrow movement and ground queries before the exact collision tests run.
08Challenges
- #Keep transparent glass and the interior visible as the camera moves across the doorway while retaining correct depth and light layering.
- #Balance warm night lighting with readable detail on the signboard, counter, floor tiles, and wall art.
- #Move the cinematic path through the entrance and around the counter without clipping into the glass panel or furniture.
09Learnings
- →Real-time scene quality benefits from separating lighting layers by the surfaces each light can reach.
- →Adaptive resolution can protect motion smoothness while preserving the scene's update timing.
- →A spatial broad phase can reduce collision work without replacing precise geometry checks.
10Retrospective
A future pass could add alternate guided routes for the counter and window seating, while keeping the current street-to-interior path as the default introduction.
11Gallery
The place. A Blender-built recreation of Café Destino in New Barrackpore renders as an explorable Three.js scene, from the street-facing façade to the tiled café interior.
The visit. Walk through the entrance, look around the counter and window seating, or follow the site's cinematic camera route from the street into the café and back outside.

The renderer. A Vite app layers custom lighting and post-processing over the scene. Visitors can change the time of day and graphics quality; adaptive resolution responds when a device starts missing its frame budget.



Next project · 04
DINO 3D →
Chrome's classic offline Dino runner reimagined in low-poly 3D for desktop and mobile with dynamic day/night cycles.