Hilltop Villa’s terrace lounge and outdoor dining table, with the sea beyond the glass rail
The terrace lounge and outdoor dining, captured in the visionOS Simulator.

Tools we used

1. Start from reference images

Hilltop Villa started from two reference images: a cutaway top-down render of a floor plan, and a double-height living room at sunset that opens onto a terrace. Bring your own, or ask for them.

Prompt for your agentGenerate two reference images for a modern hilltop villa: a cutaway top-down render of the floor plan, and the double-height living room at golden hour, opening onto a terrace with a fire table lounge, outdoor dining for eight and a plunge pool.
Cutaway top-down render of a villa with a plunge pool, terrace lounge, outdoor dining, living room, kitchen island and stair
Our reference for the plan.
Double-height living room at sunset with a travertine fireplace wall, an ivory sofa, bouclé chairs and glass tube pendants, opening onto a terrace above a city and bay
Our reference for the living room.

You do not need an API key for image generation. The image generation included in a ChatGPT subscription is enough; we happened to use Scenario and the OpenAI API.

2. Plan the floor and seats

Prompt for your agentTurn these two reference images into a metric floor plan and seat layout: two levels, the double-height void, the terrace and the pool. Show me the plan before you build.

The agent wrote the plan as numbers in metres, then drew it. The drawings, the model and the seats all come from that one file, so moving a piece of furniture also moves its seat.

There are 33 seats in 9 groups. Three groups have a desk you can hide: the kitchen island, outdoor dining and the Sky Room.

Hilltop Villa, Level 1 and terrace planLiving roomKitchen islandFireplace wallStairEntranceTerrace loungeOutdoor diningPlunge pool123456789101112131415161718192021222324252627N05 m
Level 1 and the terrace. Numbered dots are seats; the dashed outline is the Sky Room above.
Hilltop Villa, Level 2 plan over a faint outline of Level 1VoidNorth bridgeLibrary gallerySky RoomStair282930313233N05 m
Level 2, over a faint outline of Level 1.
GroupSeatsOn the plan
Living room sofa41–4
Living room chairs45–8
Kitchen island49–12
Terrace sofa513–17
Terrace lounge chairs218–19
Outdoor dining820–27
Sky Room228–29
North bridge230–31
Library gallery232–33

3. Build it in Blender

Prompt for your agentBuild it in headless Blender from the plan. Use free CC0 textures first and generate only what is missing. Generate each chair as a product image, then turn it into a 3D model. Review every seat in renders before export, and stay under 150,000 triangles.

For Hilltop Villa, that meant twelve texture sets from Poly Haven and one travertine from ambientCG, plus generated stone, artwork and book spines. Six chairs went from product images to 3D models. The first build came in at 148,484 triangles.

Blender render of the double-height living room, looking past the sofa and swivel chairs to the terrace, pool and outdoor dining
A Blender review render of version 1.0.4.

4. Fix what you see

Then try the Room on Apple Vision Pro and tell the agent what is wrong. Our three rounds of headset feedback came down to prompts like these:

Prompt for your agentOn the headset, I can’t tap the Sky Room desk, the guard glass around the void is invisible, the ottomans face the wrong way and the fires are too big. Fix these.
Prompt for your agentThe back pillows lean forward, two seats sit too deep, and the desk lamp is too bright.
Prompt for your agentUse Locus’s built-in Room water for the pool instead of the modeled water.
The floating oak stair along the south wall, with the kitchen island under the upper floor
The stair and kitchen island, captured in the visionOS Simulator.
Two bouclé swivel chairs facing the kitchen island, with outdoor dining beyond the open glass
The living room toward the kitchen, captured in the visionOS Simulator.

5. Fix the frame rate

The first build ran slowly on the headset. Getting it smooth took prompts like these:

Prompt for your agentWhy is it so slow on the headset?

The agent looked through the Room, found 165 megapixels of textures and eight real-time spot lights, and suggested what to change.

Prompt for your agentGo ahead: size the textures by viewing distance and cut the real-time spot lights.
Prompt for your agentBake every lamp into light layers, so no real-time lamps remain.

Textures dropped from 165 to 33 megapixels. In the end every lamp was baked into one of five groups you can switch, so no real-time spot lights remain. Baking made the download bigger again: about 118 MB today.

More details

If you’re curious, here’s a bit more about how this room came together.

How long did it take?

About a day. We started from the reference images on the evening of October 23, and the first finished version was ready the next morning.

The headset fixes in steps 4 and 5 came afterwards, over a few rounds of feedback.

What did it cost, and which services did you use?

Not much. Here is everything we paid for:

  • Scenario: six chair product images with GPT Image 2, and eight image-to-3D models with Rodin Gen-2.5, two of them rerolls. 750 CU in total.
  • OpenAI Images: six requests for two stone textures, the fireplace artwork, a book-spine atlas and two olive sprigs we never used. About US$0.30.
  • fal: a three-view image-to-3D test on one chair, US$1.35. Nothing from it shipped.

You can do the image generation with the usage included in a ChatGPT subscription, no API key needed. We just happened to use Scenario and the API.

We used no other generation services: no Tripo, Meshy, Hunyuan3D or Trellis. These costs are recorded usage, not invoices.

Did Locus itself need changes?

A few. A Room this big ran into some limits in the app. The fixes have all shipped, so a similar Room gets them for free:

  • With Seats open, the Sky Room dropped to 2–3 fps: every seat marker re-checked its line of sight against the whole house ten times a second. Markers now keep their sightline until you or the marker move, and their cost fell from 300–450 ms to under 1 ms per frame.
  • Fire became a real 3D flame. Linear burners first kept their flames in the burner’s own plane. Then the flat flame, which looked like a paper cut-out, became a volumetric one that now starts right at the burner instead of 6 cm above it.
  • Pool water vanished at one terrace seat when the seat-move overlay drew over it. The overlay no longer hides what is behind it.
  • From upstairs seats, trees in the View came uncomfortably close, so a Room can now hide the View’s nearby scenery.
  • Grouped and partly hidden seat markers, like the one at the upstairs desk, can now be selected directly.
  • To find what costs frame rate on the headset, we added internal switches that turn off fires or transparent surfaces.

Room water and baked light layers already existed in Locus. Hilltop Villa simply uses them.

How well does it run on Apple Vision Pro?

We measured version 1.0.2 on the headset. Seated views held 90 fps. The library gallery seat ran at 61–69 fps and reached 90 with the fires off or the transparent surfaces hidden.

Those numbers came from a debug build of Locus with extra performance logging, which the App Store version does not have. For your own Room, describe what you see on the headset and let the agent check textures, triangles and lights.

GPU texture compression is not applied to this Room yet, and we have not re-measured comfort or performance on the current version.

What went wrong along the way?

  • Generated furniture showed up black in the app, because roughness and metal were packed into one texture. Splitting them fixed it.
  • Books floated up to 0.6 m off their shelves: each one was rotated about the wrong origin.
  • Back pillows leaned forward because of a sign error.
  • Reusing every identical material sounded smart, but it raised memory by about 132 MiB, so we dropped it.

Hilltop Villa is free in Locus. Find it in the Library, in the Mansions series.

Get Hilltop Villa · Make your own Room