diff --git a/README.md b/README.md index 50582a7137114074f68fcd8b0c5e7e6d949621ba..49ceb22cb95f49ac0e93baed9e0310d91dc5aff3 100644 --- a/README.md +++ b/README.md @@ -11,9 +11,10 @@ short_description: Benchmarking coding agents that build 3D scenes # Code4Scene -Project page for Code4Scene's construction (Text-to-Scene) setting: the leaderboard on the 20-case public set, the paper's -Spatial Composition takeaway, and selected cases whose saved Unreal Engine scenes can be viewed in 3D. Since 2026-10-01 the -page shows Text-to-Scene only; `scripts/t2s_only.py` records that edit. +Project page for Code4Scene: the leaderboard, the paper's takeaways, and selected cases whose saved Unreal Engine scenes can +be viewed in 3D. Each section has a Text-to-Scene tab (construction; selected by default, the 20-scene Research Track) and an +Image-to-Scene tab (editing; the 75-case public evaluation). `scripts/t2s_only.py` removed Image-to-Scene on 2026-10-01; +`scripts/i2s_tabs.py` brought it back as the second tab on 2026-10-04. Paper: [arXiv:2609.36777](https://arxiv.org/abs/2609.36777) · Code: [SimWorld-AI/Code4Scene](https://github.com/SimWorld-AI/Code4Scene) @@ -27,17 +28,17 @@ The reference toolkit's Inter, IBM Plex Mono and Source Serif 4 font files are b Deployment remains this Hugging Face static Space: `index.html` and `cases.html`, with the existing media/model paths and headers. The pre-restyle version is recoverable at commit `9ff787d0f9d72905d92f780da56bd2229782b981`. -The Pareto renderer (`assets/pareto.js`) ports the reference toolkit's reversed logarithmic cost axis, connected frontier, provider palette and greedy collision-aware label placement. `data/pareto.json` combines unrounded scores from the existing `data/site.js` with exact mean costs from the original published tables; the Text-to-Scene view recomputes non-dominance from those values. The table displays three decimals but sorts at source precision. +The Pareto renderer (`assets/pareto.js`) ports the reference toolkit's reversed logarithmic cost axis, connected frontier, provider palette and greedy collision-aware label placement. `data/pareto.json` combines unrounded scores from the existing `data/site.js` with exact mean costs from the original published tables; each view recomputes non-dominance from those values. The table displays three decimals but sorts at source precision. -Homepage scenes (`assets/scene-cards.js`) adapt BuildingBench's shared WebGL renderer and per-view canvas engine. Existing public packed models are decoded with the same adapter as `cases.html`; geometry and the full case explorer remain unchanged. Visible scenes load automatically; repeated scenes share decoded assets. Drag or arrow keys orbit, wheel or +/- zoom, and the pause control stops rotation. +Homepage scenes (`assets/scene-cards.js`) adapt BuildingBench's shared WebGL renderer and per-view canvas engine. Existing public packed models are decoded with the same adapter as `cases.html`; geometry and the full case explorer remain unchanged. Visible scenes load automatically; repeated scenes share decoded assets. Drag or arrow keys orbit, wheel or +/- zoom, and the pause control stops rotation. Both Image-to-Scene cards switch between the saved repair, corrupted input and ground truth using the reference camera. ## Interaction and loading reliability -Task Format shows the construction example: instructions, inputs, saved output and evaluator. Bar marks, labels and Pareto points share pointer, keyboard and tap tooltips with source-precision scores and costs in `data/leaderboard-details.json`. The ranking supports filtering and source-precision sorting. +Task Format switches the entire construction/editing example, including instructions, inputs, saved output and evaluator. Bar marks, labels and Pareto points share pointer, keyboard and tap tooltips with source-precision scores and costs in `data/leaderboard-details.json`. The ranking supports filtering and source-precision sorting. Homepage model work uses a shared two-job download/decode queue. Hidden/offscreen views release their request; stale results cannot replace the selected state. Card textures are limited to 512px and render resolution is bounded, while original model files and the full case explorer stay intact. Idle decoded assets are evicted; the 128 MiB cache target is not a hard limit on currently visible geometry. Downloads show progress, abort after 20 seconds without data or 90 seconds total, retry once, then expose an explicit Retry button. Context loss pauses drawing and restoration rebuilds the environment; failures expose recovery instead of an indefinite loading overlay. -Queue tests: `node --test tests/scene-assets.test.mjs`. Browser QA includes public-model cold loads, quick scrolling, desktop/mobile resize, forced HTTP failures, stalled downloads, retry and WebGL context loss. +Queue tests: `node --test tests/scene-assets.test.mjs`. Browser QA includes public-model cold loads, quick scrolling, task/repair switching, desktop/mobile resize, forced HTTP failures, stalled downloads, retry and WebGL context loss. ## Geometry-first scene cards diff --git a/assets/leaderboard-bars.js b/assets/leaderboard-bars.js index 7feb7570df1c0be71b1e8fdaffdc1b91c5aab956..6f36806ce47472e91b23f066dea338c8e4df9873 100644 --- a/assets/leaderboard-bars.js +++ b/assets/leaderboard-bars.js @@ -3,7 +3,7 @@ (async function(){ const {bindChartTooltip}=await import("./chart-interactions.js?v=20261004kit"); await Promise.all([document.fonts.load('400 13px Inter'),document.fonts.load('700 13px Inter'),document.fonts.load('500 15.5px "IBM Plex Mono"')]); -const ALL = {"t2s": [{"name": "Claude Fable 5.1 (max)", "org": "Anthropic", "score": 0.78775, "colour": "#D97757", "ink": "#ffffff", "label": "79", "new": false}, {"name": "GPT-6 Astra (max)", "org": "OpenAI", "score": 0.72382, "colour": "#10A37F", "ink": "#ffffff", "label": "72", "new": false}, {"name": "Claude Opus 5 (max)", "org": "Anthropic", "score": 0.7181599999999999, "colour": "#D97757", "ink": "#ffffff", "label": "72", "new": false}, {"name": "GPT-5.6 Sol (high)", "org": "OpenAI", "score": 0.70704, "colour": "#10A37F", "ink": "#ffffff", "label": "71", "new": false}, {"name": "Gemini 3.8 Flash (high)", "org": "Google", "score": 0.65689, "colour": "#7b1fa2", "ink": "#ffffff", "label": "66", "new": false}, {"name": "Muse Spark 1.3 (medium)", "org": "Meta", "score": 0.646195, "colour": "#42a5f5", "ink": "#111111", "label": "65", "new": false}, {"name": "Grok 4.6 (high)", "org": "xAI", "score": 0.56721, "colour": "#111111", "ink": "#ffffff", "label": "57", "new": false}, {"name": "Qwen 3.8 27B (thinking off)", "org": "Alibaba", "score": 0.55666, "colour": "#fe7016", "ink": "#111111", "label": "56", "new": false}, {"name": "Qwen 3.8 27B (thinking on)", "org": "Alibaba", "score": 0.51571, "colour": "#fe7016", "ink": "#111111", "label": "52", "new": false}, {"name": "GLM-5.3 Flash (max)", "org": "Z.ai", "score": 0.5094299999999999, "colour": "#96650b", "ink": "#ffffff", "label": "51", "new": false}, {"name": "Gemma 4 31B (thinking on)", "org": "Google", "score": 0.470705, "colour": "#7b1fa2", "ink": "#ffffff", "label": "47", "new": false}, {"name": "Gemma 4 31B (thinking off)", "org": "Google", "score": 0.45494, "colour": "#7b1fa2", "ink": "#ffffff", "label": "45", "new": false}, {"name": "Inkling (high)", "org": "Thinking Machines", "score": 0.42498500000000006, "colour": "#686868", "ink": "#ffffff", "label": "42", "new": false}, {"name": "DeepSeek V4.1 Flash (high)", "org": "DeepSeek", "score": 0.24269, "colour": "#3f51e0", "ink": "#ffffff", "label": "24", "new": false}]}; +const ALL = {"t2s": [{"name": "Claude Fable 5.1 (max)", "org": "Anthropic", "score": 0.78775, "colour": "#D97757", "ink": "#ffffff", "label": "79", "new": false}, {"name": "GPT-6 Astra (max)", "org": "OpenAI", "score": 0.72382, "colour": "#10A37F", "ink": "#ffffff", "label": "72", "new": false}, {"name": "Claude Opus 5 (max)", "org": "Anthropic", "score": 0.7181599999999999, "colour": "#D97757", "ink": "#ffffff", "label": "72", "new": false}, {"name": "GPT-5.6 Sol (high)", "org": "OpenAI", "score": 0.70704, "colour": "#10A37F", "ink": "#ffffff", "label": "71", "new": false}, {"name": "Gemini 3.8 Flash (high)", "org": "Google", "score": 0.65689, "colour": "#7b1fa2", "ink": "#ffffff", "label": "66", "new": false}, {"name": "Muse Spark 1.3 (medium)", "org": "Meta", "score": 0.646195, "colour": "#42a5f5", "ink": "#111111", "label": "65", "new": false}, {"name": "Grok 4.6 (high)", "org": "xAI", "score": 0.56721, "colour": "#111111", "ink": "#ffffff", "label": "57", "new": false}, {"name": "Qwen 3.8 27B (thinking off)", "org": "Alibaba", "score": 0.55666, "colour": "#fe7016", "ink": "#111111", "label": "56", "new": false}, {"name": "Qwen 3.8 27B (thinking on)", "org": "Alibaba", "score": 0.51571, "colour": "#fe7016", "ink": "#111111", "label": "52", "new": false}, {"name": "GLM-5.3 Flash (max)", "org": "Z.ai", "score": 0.5094299999999999, "colour": "#96650b", "ink": "#ffffff", "label": "51", "new": false}, {"name": "Gemma 4 31B (thinking on)", "org": "Google", "score": 0.470705, "colour": "#7b1fa2", "ink": "#ffffff", "label": "47", "new": false}, {"name": "Gemma 4 31B (thinking off)", "org": "Google", "score": 0.45494, "colour": "#7b1fa2", "ink": "#ffffff", "label": "45", "new": false}, {"name": "Inkling (high)", "org": "Thinking Machines", "score": 0.42498500000000006, "colour": "#686868", "ink": "#ffffff", "label": "42", "new": false}, {"name": "DeepSeek V4.1 Flash (high)", "org": "DeepSeek", "score": 0.24269, "colour": "#3f51e0", "ink": "#ffffff", "label": "24", "new": false}], "i2s": [{"name": "Gemini 3.8 Flash (high)", "org": "Google", "score": 0.5810600533333334, "colour": "#7b1fa2", "ink": "#ffffff", "label": "58", "new": false}, {"name": "GPT-6 Astra (max)", "org": "OpenAI", "score": 0.5148505733333334, "colour": "#10A37F", "ink": "#ffffff", "label": "51", "new": false}, {"name": "Claude Opus 5 (max)", "org": "Anthropic", "score": 0.46809998666666675, "colour": "#D97757", "ink": "#ffffff", "label": "47", "new": false}, {"name": "Claude Fable 5.1 (max)", "org": "Anthropic", "score": 0.4243479600000001, "colour": "#D97757", "ink": "#ffffff", "label": "42", "new": false}, {"name": "GPT-5.6 Sol (high)", "org": "OpenAI", "score": 0.3929589333333333, "colour": "#10A37F", "ink": "#ffffff", "label": "39", "new": false}, {"name": "Muse Spark 1.3 (medium)", "org": "Meta", "score": 0.35821573333333334, "colour": "#42a5f5", "ink": "#111111", "label": "36", "new": false}, {"name": "GLM-5.3 Flash (max)", "org": "Z.ai", "score": 0.3199877333333333, "colour": "#96650b", "ink": "#ffffff", "label": "32", "new": false}, {"name": "Qwen 3.8 27B (thinking on)", "org": "Alibaba", "score": 0.2261779866666667, "colour": "#fe7016", "ink": "#111111", "label": "23", "new": false}, {"name": "DeepSeek V4.1 Flash (high)", "org": "DeepSeek", "score": 0.21048916, "colour": "#3f51e0", "ink": "#ffffff", "label": "21", "new": false}, {"name": "Qwen 3.8 27B (thinking off)", "org": "Alibaba", "score": 0.19970338666666668, "colour": "#fe7016", "ink": "#111111", "label": "20", "new": false}, {"name": "Inkling (high)", "org": "Thinking Machines", "score": 0.19801974666666666, "colour": "#686868", "ink": "#ffffff", "label": "20", "new": false}, {"name": "Grok 4.6 (high)", "org": "xAI", "score": 0.18414012, "colour": "#111111", "ink": "#ffffff", "label": "18", "new": false}, {"name": "Gemma 4 31B (thinking on)", "org": "Google", "score": 0.12554015999999998, "colour": "#7b1fa2", "ink": "#ffffff", "label": "13", "new": false}, {"name": "Gemma 4 31B (thinking off)", "org": "Google", "score": 0.11503794666666667, "colour": "#7b1fa2", "ink": "#ffffff", "label": "12", "new": false}]}; const LOGOS = {"Anthropic": {"icon": "anthropic", "fill": "#141413", "viewBox": "0 0 24 24", "inner": "", "rule": "evenodd"}, "OpenAI": {"icon": "openai", "fill": "#141413", "viewBox": "0 0 24 24", "inner": "", "rule": "evenodd"}, "Meta": {"icon": "meta-color", "viewBox": "0 0 24 24", "inner": "", "rule": null}, "Google": {"icon": "google-color", "viewBox": "0 0 24 24", "inner": "", "rule": null}, "DeepSeek": {"icon": "deepseek-color", "viewBox": "0 0 24 24", "inner": "", "rule": null}, "xAI": {"icon": "xai", "tile": "#111111", "shape": "square", "viewBox": "0 0 24 24", "inner": "", "rule": "evenodd"}, "Z.ai": {"icon": "zai", "tile": "#111111", "shape": "square", "viewBox": "0 0 24 24", "inner": "", "rule": "evenodd"}, "Moonshot": {"icon": "kimi", "tile": "#111111", "shape": "square", "viewBox": "0 0 24 24", "inner": "", "rule": "evenodd"}, "StepFun": {"icon": "stepfun", "tile": "#01d9cf", "shape": "circle", "viewBox": "0 0 24 24", "inner": "", "rule": "evenodd"}, "Undisclosed": {"icon": "unionalpha-color", "viewBox": "0 0 24 24", "inner": "", "rule": null}, "Cognition": {"icon": "devin-color", "viewBox": "0 0 24 24", "inner": "", "rule": null}, "Fireworks": {"icon": "fireworks-color", "viewBox": "0 0 24 24", "inner": "", "rule": null}, "Stealth": {"wordmark": ["STEALTH"]}, "Thinking Machines": {"wordmark": ["THINKING", "MACHINES"]}, "Alibaba": {"icon": "qwen-color", "viewBox": "0 0 24 24", "inner": "", "rule": null}}; for(const [key,DATA] of Object.entries(ALL)){ const svg=document.getElementById('bars-'+key), W=1200, H=420; diff --git a/assets/pareto.js b/assets/pareto.js index 879f3570feb54bbc67d6e31f39db2fa26fe781a1..9c57e16db20b4acbd79266c03e5b4bd89bec0ebb 100644 --- a/assets/pareto.js +++ b/assets/pareto.js @@ -19,7 +19,7 @@ for(const svg of document.querySelectorAll('.pareto-svg')){ for(const c of [100,50,20,10,5,2,1,.5,.2,.1,.05,.02,.01,.005,.002,.001])if(-Math.log10(c)>lo&&-Math.log10(c)(i?'L':'M')+x(d.cost)+','+y(d.score)).join(' '); add('path',{d:path,class:'frontier-halo'});add('path',{d:path,class:'frontier-line'}); const points=rows.map(d=>({x:x(d.cost),y:y(d.score)}));const boxes=points.map(p=>[p.x-9,p.y-9,p.x+9,p.y+9]); diff --git a/cases.html b/cases.html index d0d921c05d5631b0d339861f09b13adfc8561d19..ab77202f4edcf2776f3cf3be7638a4fd8337a2b9 100644 --- a/cases.html +++ b/cases.html @@ -82,12 +82,12 @@ table.cs td,table.cs th{white-space:nowrap}.panel code{font-size:.82em;backgroun .in-open{border:1px solid var(--primary);background:#fff;color:var(--primary-dark);border-radius:8px;padding:.45rem .9rem;font:600 .85rem Inter,sans-serif;cursor:pointer} .in-open:hover{background:var(--primary);color:#fff} @media(max-width:900px){.in-i2s{grid-template-columns:1fr}} - +

Every scene in 3D, with its scores

Each agent's result is the engine-native scene it saved, exported from Unreal Engine so you can turn it in the browser. Beside it, how the -evaluator scored that scene. 4 cases, 29 scenes in 3D. Pick a case, then an agent.

+evaluator scored that scene. 6 cases, 41 scenes in 3D. Pick a case, then an agent.

·

@@ -99,7 +99,7 @@ evaluator scored that scene. 4 cases, 29 scenes in 3D. Pick a case, then an agen - -

Constructing
3D Scenes with Code

Benchmarking coding agents that turn open-ended scene descriptions into engine-native 3D scenes in Unreal Engine. Measuring spatial reasoning, task fulfillment and physical validity.

Task Format

Nordic Harbour · Text-to-Scene

An open-ended scene description, an asset catalog and the Unreal Engine editor.

Agent inputText + assets
Task instruction

Build me a compact, sunlit Copenhagen-style canal district with narrow cobblestone streets and rectangular waterways enclosing dense urban blocks.

Townhouses, canals, bridges and a waterfront promenade — with detailed requirements for materials, layout and street furniture.

Given: an empty level and the content pack’s asset catalog.

EvaluationEngine-native scene
CASE SCORE0.877
Detailed Alignment
0.757
Overview Alignment
0.909
Physical Safety
0.900

Task fulfillment, artifact integrity and static physical validity.

0.2 × Detailed + 0.6 × Overview + 0.2 × Physical

+ Full task instructionTEXT-TO-SCENE

Build me a compact, sunlit Copenhagen-style canal district with narrow cobblestone streets and rectangular waterways enclosing dense urban blocks. Arrange roughly thirty attached four- to six-storey townhouses in continuous street and canal-front rows, using slender façades, repetitive white-framed windows, arched doors and carriage entrances, modest cornices, and steep tiled roofs packed with dormers and brick chimneys. Include occasional exposed party walls between staggered building rows. Finish the façades in weathered muted red, mustard yellow, dusty blue, warm grey, beige, and exposed brick, with red, orange, and charcoal roof tiles. Run a principal waterfront street along a stone quay, crossed by smaller streets and linked across the canals by short, gently arched stone-and-metal bridges, including one opening onto a broad paved promenade with rounded landings. Form the canal edges from stepped pale stone, dark timber retaining walls, and iron railings around reflective rippling water. Add regularly spaced leafy trees, ornate black lamps, stone bollards, benches, European road signs, zebra crossings, puddles, grime, and sparse weeds.

20 scenes in the Research Track: affordable, reproducible evaluation for academic and model-development use160 scenes in the Full Benchmark: comprehensive evaluation for leaderboard and final reporting
+ +

Constructing
3D Scenes with Code

Benchmarking coding agents that turn open-ended scene descriptions into engine-native 3D scenes in Unreal Engine. Measuring spatial reasoning, task fulfillment and physical validity.

Task Format

Nordic Harbour · Text-to-Scene

An open-ended scene description, an asset catalog and the Unreal Engine editor.

Agent inputText + assets
Task instruction

Build me a compact, sunlit Copenhagen-style canal district with narrow cobblestone streets and rectangular waterways enclosing dense urban blocks.

Townhouses, canals, bridges and a waterfront promenade — with detailed requirements for materials, layout and street furniture.

Given: an empty level and the content pack’s asset catalog.

EvaluationEngine-native scene
CASE SCORE0.877
Detailed Alignment
0.757
Overview Alignment
0.909
Physical Safety
0.900

Task fulfillment, artifact integrity and static physical validity.

0.2 × Detailed + 0.6 × Overview + 0.2 × Physical

+ Full task instructionTEXT-TO-SCENE

Build me a compact, sunlit Copenhagen-style canal district with narrow cobblestone streets and rectangular waterways enclosing dense urban blocks. Arrange roughly thirty attached four- to six-storey townhouses in continuous street and canal-front rows, using slender façades, repetitive white-framed windows, arched doors and carriage entrances, modest cornices, and steep tiled roofs packed with dormers and brick chimneys. Include occasional exposed party walls between staggered building rows. Finish the façades in weathered muted red, mustard yellow, dusty blue, warm grey, beige, and exposed brick, with red, orange, and charcoal roof tiles. Run a principal waterfront street along a stone quay, crossed by smaller streets and linked across the canals by short, gently arched stone-and-metal bridges, including one opening onto a broad paved promenade with rounded landings. Form the canal edges from stepped pale stone, dark timber retaining walls, and iron railings around reflective rippling water. Add regularly spaced leafy trees, ornate black lamps, stone bollards, benches, European road signs, zebra crossings, puddles, grime, and sparse weeds.

20 scenes in the Research Track: affordable, reproducible evaluation for academic and model-development use160 scenes in the Full Benchmark: comprehensive evaluation for leaderboard and final reporting

Leaderboard

-

Research Track · 20 representative scenes · 14 coding-agent configurations.

Text-to-scene generation with frontier models is a long-horizon agentic task with substantial inference cost and runtime, which makes repeated full-scale evaluation difficult for many research groups. The Research Track supports affordable, reproducible experimentation; the Full Benchmark provides the more comprehensive evaluation for final model comparison and leaderboard reporting.

-

Code4Scene Research Track

20 scenes · score out of 100

Swipe to view all 14 configurations →

Sorted by score. Bar labels round scores ×100; the table preserves three decimal places. One color per model provider.

-

Code4Scene Pareto Frontier

Quality against the cost of one case · Research Track, 20 scenes

Swipe to explore all configurations →

Solid: the frontier — nothing cheaper scores higher. One point per configuration, at its evaluated reasoning effort. Cost is the mean USD per case.

+

Research Track · 20 representative scenes · 14 coding-agent configurations.

Text-to-scene generation with frontier models is a long-horizon agentic task with substantial inference cost and runtime, which makes repeated full-scale evaluation difficult for many research groups. The Research Track supports affordable, reproducible experimentation; the Full Benchmark provides the more comprehensive evaluation for final model comparison and leaderboard reporting.

+

Code4Scene Research Track

20 scenes · score out of 10075 scenes · score out of 100

Swipe to view all 14 configurations →

Sorted by score. Bar labels round scores ×100; the table preserves three decimal places. One color per model provider.

+

Code4Scene Pareto Frontier

Quality against the cost of one case · Research Track, 20 scenes

Swipe to explore all configurations →

Solid: the frontier — nothing cheaper scores higher. One point per configuration, at its evaluated reasoning effort. Cost is the mean USD per case.

14 configurations
Ranking

Research Track, 20 scenes. Case score = 0.2 × Detailed + 0.6 × Overview + 0.2 × Physical. Detailed and Overview are means of the per-case scores.

#Agent configurationScoreDetailedOverviewPhysicalCost / case
1Claude Fable 5.1 (max)ParetoAnthropic
0.788
0.7250.7720.898$18.16
2GPT-6 Astra (max)OpenAI
0.724
0.7070.7330.712$22.47
3Claude Opus 5 (max)Anthropic
0.718
0.6310.7160.811$34.50
4GPT-5.6 Sol (high)ParetoOpenAI
0.707
0.6320.7100.772$4.07
5Gemini 3.8 Flash (high)ParetoGoogle
0.657
0.6370.6640.655$2.49
6Muse Spark 1.3 (medium)ParetoMeta
0.646
0.5980.6610.651$0.10
7Grok 4.6 (high)xAI
0.567
0.5220.5760.585$4.33
8Qwen 3.8 27B (thinking off)open weightsAlibaba
0.557
0.5070.5300.688$0.49
9Qwen 3.8 27B (thinking on)open weightsAlibaba
0.516
0.5050.4600.694$0.33
10GLM-5.3 Flash (max)open weightsZ.ai
0.509
0.4030.5370.533$0.71
11Gemma 4 31B (thinking on)open weightsParetoGoogle
0.471
0.4120.4160.694$0.03
12Gemma 4 31B (thinking off)open weightsParetoGoogle
0.455
0.4380.3700.725$0.02
13Inkling (high)Thinking Machines
0.425
0.3930.3370.722$0.20
14DeepSeek V4.1 Flash (high)open weightsDeepSeek
0.243
0.2170.1610.513$0.19
+Inkling (high)Thinking Machines
0.425
0.3930.3370.722$0.2014DeepSeek V4.1 Flash (high)open weightsDeepSeek
0.243
0.2170.1610.513$0.19

75 public cases (25 indoor, 50 outdoor). Case score = 0.8 × Repair F1 + 0.2 × Physical. Repair F1 counts target actors restored to the withheld ground truth.

#Agent configurationScoreRepair F1PhysicalIndoorOutdoorCost / case
1Gemini 3.8 Flash (high)ParetoGoogle
0.581
0.5270.7960.7170.513$1.35
2GPT-6 Astra (max)OpenAI
0.515
0.4450.7960.7850.380$3.32
3Claude Opus 5 (max)Anthropic
0.468
0.3890.7860.6180.393$4.46
4Claude Fable 5.1 (max)Anthropic
0.424
0.3320.7950.5350.369$3.09
5GPT-5.6 Sol (high)OpenAI
0.393
0.3190.6890.4970.341$1.88
6Muse Spark 1.3 (medium)ParetoMeta
0.358
0.2460.8070.6330.221$0.07
7GLM-5.3 Flash (max)open weightsZ.ai
0.320
0.1880.8480.4650.247$0.09
8Qwen 3.8 27B (thinking on)open weightsAlibaba
0.226
0.1180.6600.2970.191$0.26
9DeepSeek V4.1 Flash (high)open weightsParetoDeepSeek
0.210
0.0660.7870.1890.221$0.05
10Qwen 3.8 27B (thinking off)open weightsAlibaba
0.200
0.0830.6670.2660.166$0.28
11Inkling (high)Thinking Machines
0.198
0.0950.6090.1690.213$0.75
12Grok 4.6 (high)xAI
0.184
0.0440.7440.1970.178$0.26
13Gemma 4 31B (thinking on)open weightsParetoGoogle
0.126
0.0030.6150.1270.125$0.03
14Gemma 4 31B (thinking off)open weightsParetoGoogle
0.115
0.0010.5720.1120.116$0.02

Click a column to sort. Pareto: on the score-against-cost frontier.

Visualizing agent outputs

-

Drag any scene to inspect the saved 3D output, or open a case to explore every agent.

-
Loading 3D scene…Drag to orbit · Scroll to zoom
Text-to-Scene

Nordic Harbour

GPT-6 Astra (max) · score 0.877

Compare all 14 agents ↗
Loading 3D scene…Drag to orbit · Scroll to zoom
Text-to-Scene

Medieval Big Farm Town

Claude Fable 5.1 (max) · score 0.830

Compare all 14 agents ↗
Loading 3D scene…Drag to orbit · Scroll to zoom
Text-to-Scene

Egyptian Temple

Claude Opus 5 (max) · score 0.777

Compare all 14 agents ↗
Loading 3D scene…Drag to orbit · Scroll to zoom
Text-to-Scene

Bazaar

Claude Fable 5.1 (max) · score 0.930

Compare all 14 agents ↗
+

Drag any scene to inspect the saved 3D output, or open a case to explore every agent.

+
Loading 3D scene…Drag to orbit · Scroll to zoom
Text-to-Scene

Nordic Harbour

GPT-6 Astra (max) · score 0.877

Compare all 14 agents ↗
Loading 3D scene…Drag to orbit · Scroll to zoom
Text-to-Scene

Medieval Big Farm Town

Claude Fable 5.1 (max) · score 0.830

Compare all 14 agents ↗
Loading 3D scene…Drag to orbit · Scroll to zoom
Text-to-Scene

Egyptian Temple

Claude Opus 5 (max) · score 0.777

Compare all 14 agents ↗
Loading 3D scene…Drag to orbit · Scroll to zoom
Text-to-Scene

Bazaar

Claude Fable 5.1 (max) · score 0.930

Compare all 14 agents ↗
Open the case explorer
-

Takeaway

+

Takeaways

What the evaluation shows across the 14 agents. Every chart below is drawn from the paper's numbers; hover for values.

-
Takeaway

Spatial Composition remains the weakest requirement family for all 14 agents.

Errors persist even when the required objects are present: generating the right objects does not ensure that their relationships satisfy the specification.

Requirement-family score per agent
Identity & Environmentmean 67Content & Quantitymean 54Attributes & Materialsmean 48Spatial Composition, in the agent’s colourmean 36
One group per agent, in Text-to-Scene rank order: Identity & Environment, Content & Quantity, Attributes & Materials, then Spatial Composition, the lowest bar in every group. Scores ×100 (paper Figure 14b).
The objects are there; the relation is not
Loading 3D scene…Drag to orbit · Scroll to zoom
✓ slab roof 0.95✓ stone coping 0.82✗ slab roof enclosed by the coping 0.78
GPT-5.6 Sol’s saved Egyptian Temple scene. The judge finds the roof and stone coping, but flags their spatial relationship. View the judge’s evidence ↗
Mismatch when the objects are present
0%10%20%30%40%Spatial relation32.0%Distribution19.1%Composition4.3%
Share of checks that fail although every object they name is in the scene, across the benchmark (paper Figure 6a).
+
Takeaway

Spatial Composition remains the weakest requirement family for all 14 agents.

Errors persist even when the required objects are present: generating the right objects does not ensure that their relationships satisfy the specification.

Requirement-family score per agent
Identity & Environmentmean 67Content & Quantitymean 54Attributes & Materialsmean 48Spatial Composition, in the agent’s colourmean 36
One group per agent, in Text-to-Scene rank order: Identity & Environment, Content & Quantity, Attributes & Materials, then Spatial Composition, the lowest bar in every group. Scores ×100 (paper Figure 14b).
The objects are there; the relation is not
Loading 3D scene…Drag to orbit · Scroll to zoom
✓ slab roof 0.95✓ stone coping 0.82✗ slab roof enclosed by the coping 0.78
GPT-5.6 Sol’s saved Egyptian Temple scene. The judge finds the roof and stone coping, but flags their spatial relationship. View the judge’s evidence ↗
Mismatch when the objects are present
0%10%20%30%40%Spatial relation32.0%Distribution19.1%Composition4.3%
Share of checks that fail although every object they name is in the scene, across the benchmark (paper Figure 6a).

Cite This Work

@misc{ye2026code4scene,
   title         = {Code4Scene: Benchmarking Coding Agents for Constructing and Editing 3D Scenes},
@@ -56,4 +57,4 @@ svg.ch .dim{opacity:.42}svg.ch g.row:hover{opacity:1}svg.ch .hot{fill:var(--c4s-
 SimWorld Home

Part of the SimWorld project.

- \ No newline at end of file + \ No newline at end of file diff --git a/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/astra.jpg b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/astra.jpg new file mode 100644 index 0000000000000000000000000000000000000000..31b1670ffa9a52d2afa13bf7523a686567a72e10 Binary files /dev/null and b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/astra.jpg differ diff --git a/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/astra_full.jpg b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/astra_full.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7d8d4ec6d3aa2710cf4543b8b754134e6155a54a --- /dev/null +++ b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/astra_full.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2428eabd4fc7e7ae35f49002191401f5d76e43bce2e9126a88eb31f089a78738 +size 258441 diff --git a/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/deepseek.jpg b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/deepseek.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f2567098ba4fac5fc558bd1ee4995709535a10b2 Binary files /dev/null and b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/deepseek.jpg differ diff --git a/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/fable.jpg b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/fable.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2b78ac2449e90c80cff7a5b3f1f8f50e4f91a164 Binary files /dev/null and b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/fable.jpg differ diff --git a/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/gemini.jpg b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/gemini.jpg new file mode 100644 index 0000000000000000000000000000000000000000..02b0d2dccaedd04053a63663a315755553aaec4e Binary files /dev/null and b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/gemini.jpg differ diff --git a/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/gemma-off.jpg b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/gemma-off.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b3a401d5596de2cffa7209607a6df77ea6a23f4a Binary files /dev/null and b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/gemma-off.jpg differ diff --git a/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/gemma-on.jpg b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/gemma-on.jpg new file mode 100644 index 0000000000000000000000000000000000000000..84ba849313f7521a6b68c0bc04171eb2d2fd4bb4 Binary files /dev/null and b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/gemma-on.jpg differ diff --git a/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/glm.jpg b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/glm.jpg new file mode 100644 index 0000000000000000000000000000000000000000..308d5ec002f6e2a1a95f5d8384c37f25a39647ab Binary files /dev/null and b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/glm.jpg differ diff --git a/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/grok.jpg b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/grok.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c6a92ead328219a1a941d9a77ee02d8ba76459ac Binary files /dev/null and b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/grok.jpg differ diff --git a/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/gt.jpg b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/gt.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e5851e7ee8e4a07bc0e01cd0236cba3b5789943b --- /dev/null +++ b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/gt.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f12f8640243069fe0e322717baf3be59ca1f7cf48aa89db5b24ef506671cb58 +size 255782 diff --git a/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/inkling.jpg b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/inkling.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e73cf79212a85f1c8d50e7b156aab79c41249d5a Binary files /dev/null and b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/inkling.jpg differ diff --git a/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/inkling_full.jpg b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/inkling_full.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee27e5059bf205a15b41e8ea1fa561dd4171e418 --- /dev/null +++ b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/inkling_full.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:57dc6b976c35c6a0f3a47a28de6c9ccd202f37e3ca2a19a11469f4c18a5db986 +size 170357 diff --git a/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/muse.jpg b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/muse.jpg new file mode 100644 index 0000000000000000000000000000000000000000..51e096b657b90ba674569e21a8cc92689ade403b Binary files /dev/null and b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/muse.jpg differ diff --git a/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/opus.jpg b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/opus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b154b9d07cfcbe99877919b7888b48e4a3c86914 Binary files /dev/null and b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/opus.jpg differ diff --git a/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/qwen-off.jpg b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/qwen-off.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e8438500652a66f2b55aa8b7730caf7d073945ad Binary files /dev/null and b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/qwen-off.jpg differ diff --git a/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/qwen-on.jpg b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/qwen-on.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fbbc3b0f0da5d03ccbaf2eb3261629430ce9a490 Binary files /dev/null and b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/qwen-on.jpg differ diff --git a/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/ref-1.jpg b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/ref-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1b580f871707d8d449204d9ced8beb9cf43508fd --- /dev/null +++ b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/ref-1.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c8257406259a3fcc0e74b435099098bdca15e811eee01b2162be84a29e92cf9 +size 161932 diff --git a/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/sol.jpg b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/sol.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5a1efc82c10b92abac98f9e5210ef8b02bcbea32 Binary files /dev/null and b/media/i2s/comp-31-old-industrial-pallet-bay-repair-v2/sol.jpg differ diff --git a/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/astra.jpg b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/astra.jpg new file mode 100644 index 0000000000000000000000000000000000000000..336517507bb29c2b0467030fa74271ab77d7e984 Binary files /dev/null and b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/astra.jpg differ diff --git a/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/deepseek.jpg b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/deepseek.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0a75b1ca206b172280812a60c64b1c3882f7ac8f Binary files /dev/null and b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/deepseek.jpg differ diff --git a/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/deepseek_full.jpg b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/deepseek_full.jpg new file mode 100644 index 0000000000000000000000000000000000000000..87cf60dffda00e2ebde35f7f7d4ee4b16bd70e26 --- /dev/null +++ b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/deepseek_full.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:96f999b53f3e393ca2b9c52f370316194aed7cf343a9ea2261832d1fbd78be00 +size 203722 diff --git a/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/fable.jpg b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/fable.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8f745ad544494faa4adea6d3fb859cc8d56c734b Binary files /dev/null and b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/fable.jpg differ diff --git a/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/gemini.jpg b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/gemini.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5d6d7cc3caabda5eecc4a0b4b14e922a204d5ed3 Binary files /dev/null and b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/gemini.jpg differ diff --git a/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/gemma-off.jpg b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/gemma-off.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c6d444364f9e92c51b68e438bebcbd43e85a0606 Binary files /dev/null and b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/gemma-off.jpg differ diff --git a/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/gemma-on.jpg b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/gemma-on.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3837f2b480936b576ccbe07384f3f593582957fe Binary files /dev/null and b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/gemma-on.jpg differ diff --git a/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/glm.jpg b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/glm.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3e5d228aef160073099c68b06b15118fb567181f Binary files /dev/null and b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/glm.jpg differ diff --git a/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/grok.jpg b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/grok.jpg new file mode 100644 index 0000000000000000000000000000000000000000..16e67d3d2a7c14aaff9b451de57f3cbec1a46f91 Binary files /dev/null and b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/grok.jpg differ diff --git a/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/gt.jpg b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/gt.jpg new file mode 100644 index 0000000000000000000000000000000000000000..919029265f3c16a154b36ee15b9b3cf1174b96e1 --- /dev/null +++ b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/gt.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aae7442f73199b06f9a81c06431bcb88eba33d05a24785a8f67349b8f8ca2248 +size 204033 diff --git a/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/inkling.jpg b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/inkling.jpg new file mode 100644 index 0000000000000000000000000000000000000000..23bf93b1bee684ee9dae2b463fb9671ed19972b7 Binary files /dev/null and b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/inkling.jpg differ diff --git a/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/muse.jpg b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/muse.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f954139d17acd0966dc08787a77eb39307485d55 Binary files /dev/null and b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/muse.jpg differ diff --git a/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/opus.jpg b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/opus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4da10b16f610698ba1e2ff8f27bea804eff3b47a Binary files /dev/null and b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/opus.jpg differ diff --git a/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/opus_full.jpg b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/opus_full.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb9a379d9181983e822e652be9370ddaac9f5c10 --- /dev/null +++ b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/opus_full.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5fc3a2bc6140e07ce07922e1a3b05664a7725738fb079a6e3615267767c4fbd7 +size 200996 diff --git a/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/qwen-off.jpg b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/qwen-off.jpg new file mode 100644 index 0000000000000000000000000000000000000000..94da006fbc3e5898ea9293d65b35046426f2f504 Binary files /dev/null and b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/qwen-off.jpg differ diff --git a/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/qwen-on.jpg b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/qwen-on.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2b3a54c9b4bfd5707e545ac1cdcec9817c6535ef Binary files /dev/null and b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/qwen-on.jpg differ diff --git a/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/ref-1.jpg b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/ref-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b2fa77ebaf5cbda5db275793429454c7aa9a7f69 --- /dev/null +++ b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/ref-1.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a614b6ed99e735d7e726690039d8ffeda2137bce7ca806eadfdebb3c6dd7c9d8 +size 154708 diff --git a/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/sol.jpg b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/sol.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c172ff3a1ced5d80d3bf022881821d08e085cd69 Binary files /dev/null and b/media/i2s/comp-61-new-york-mailbox-pair-repair-v2/sol.jpg differ diff --git a/models/38071c69a86d174dc55f.bin b/models/38071c69a86d174dc55f.bin new file mode 100644 index 0000000000000000000000000000000000000000..69cabb4321839aa2af38d81622f17dd88243b1b2 --- /dev/null +++ b/models/38071c69a86d174dc55f.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:382ac2c033f39e59675262de43670afea3e7d0ae1f5ab7ea144766dd8d3f4b0d +size 7634384 diff --git a/models/46734878f740aae816d8.bin b/models/46734878f740aae816d8.bin new file mode 100644 index 0000000000000000000000000000000000000000..b776743a9600ff31673a15ad034b0895c00d6aa8 --- /dev/null +++ b/models/46734878f740aae816d8.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a56c7af6257426b2648aaaa40771994d50f703737baefefbf9ce38954414cfa5 +size 8173240 diff --git a/models/486b4742affe835723a3.bin b/models/486b4742affe835723a3.bin new file mode 100644 index 0000000000000000000000000000000000000000..ac0c240552adea63285f2f1ea0aa2a9bdef52b66 --- /dev/null +++ b/models/486b4742affe835723a3.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:337244b0898058cdc927ec17dc7c0fc08f29216e3ac02b2fbce7d1115aff925d +size 7634676 diff --git a/models/66da6868d20ebb100197.bin b/models/66da6868d20ebb100197.bin new file mode 100644 index 0000000000000000000000000000000000000000..8ac349c6041f2b162cd4c3736155c04722e34e8e --- /dev/null +++ b/models/66da6868d20ebb100197.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9066c3ecac3cbb912f2ba8aba2bd2b00dab8af66ed7af9422c94f0bf74bfaf9d +size 7634592 diff --git a/models/6afbbaec6b7a4271b21f.bin b/models/6afbbaec6b7a4271b21f.bin new file mode 100644 index 0000000000000000000000000000000000000000..d311e60fd74958669084725d451974e3429b685d --- /dev/null +++ b/models/6afbbaec6b7a4271b21f.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6e7bf9288aba68d24da78b34023d1fd8ee266b29516cb39b9898b4944182a06 +size 7634280 diff --git a/models/7daf8107bb630cffdc18.bin b/models/7daf8107bb630cffdc18.bin new file mode 100644 index 0000000000000000000000000000000000000000..ed969fc5f04d4b05247c0c183e9845e5f1ef9fb5 --- /dev/null +++ b/models/7daf8107bb630cffdc18.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:587f112df975584f5de081be644500286456e11e3a8f05fa76cf646c20f90565 +size 8175548 diff --git a/models/c79715b9e6967c4f6c90.bin b/models/c79715b9e6967c4f6c90.bin new file mode 100644 index 0000000000000000000000000000000000000000..1e69bcad8cc765aed58eb6e2cbc3d148d4b44129 --- /dev/null +++ b/models/c79715b9e6967c4f6c90.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e7b4618a3517a986e1e36ab8e0bdbe66047d3641e64298c1a23c5dc7775d791 +size 7634448 diff --git a/models/db5c0c5d2b78f9e47bb7.bin b/models/db5c0c5d2b78f9e47bb7.bin new file mode 100644 index 0000000000000000000000000000000000000000..4553b89b6f5ab2ba3d9084e67292fabe403d59b0 --- /dev/null +++ b/models/db5c0c5d2b78f9e47bb7.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba92effe3a190dca01d426fd2494911a06a6c3239f0ea1da72828a71369833e6 +size 8173352 diff --git a/models/e6a6333939ccfe57d584.bin b/models/e6a6333939ccfe57d584.bin new file mode 100644 index 0000000000000000000000000000000000000000..91f23d26896f926d3041cac3902269b5a5ed95bd --- /dev/null +++ b/models/e6a6333939ccfe57d584.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6912d973ed45866ca45ed3ffae73681486fe318510d26e5e9888e3de21178985 +size 8173556 diff --git a/models/e9177d0cbf727df88100.bin b/models/e9177d0cbf727df88100.bin new file mode 100644 index 0000000000000000000000000000000000000000..29a70a80ce7726d923c31da4073a0e8d5cbdb26f --- /dev/null +++ b/models/e9177d0cbf727df88100.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6b9135268824348cafad1d53c13d163d483a364cf3a4e979a54079eeb686254 +size 7634692 diff --git a/models/f2b2b285e27a26ee6780.bin b/models/f2b2b285e27a26ee6780.bin new file mode 100644 index 0000000000000000000000000000000000000000..ce279d4c4d71164618c67980cecf7df9830718ab --- /dev/null +++ b/models/f2b2b285e27a26ee6780.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b377aaa04976f50647e8fea3460d1e83f30808d2555a0260854b2072388859b6 +size 8173344 diff --git a/models/f3648a5ad9887ac0937d.bin b/models/f3648a5ad9887ac0937d.bin new file mode 100644 index 0000000000000000000000000000000000000000..a079504820c40edf78cddff961be0ad69cc649a4 --- /dev/null +++ b/models/f3648a5ad9887ac0937d.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:458e50aaf44d700b2fbda8c0bcab6008053748963fb8237299e79139eaeeef4b +size 8173404 diff --git a/models/progressive-v1/geo-2cb0699fcdfbb0077b14a03a.bin b/models/progressive-v1/geo-2cb0699fcdfbb0077b14a03a.bin new file mode 100644 index 0000000000000000000000000000000000000000..b99174704c451633b6bc08a3eb72f78b11779780 --- /dev/null +++ b/models/progressive-v1/geo-2cb0699fcdfbb0077b14a03a.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bff1001b5a26f15eee108e1132b5111ba48471cfde831ca77a68aa05fdf58750 +size 5524504 diff --git a/models/progressive-v1/geo-ab194913839cc37985edc5c8.bin b/models/progressive-v1/geo-ab194913839cc37985edc5c8.bin new file mode 100644 index 0000000000000000000000000000000000000000..f1dad6a359b96a1dc7246387fda20e0572d6ff5f --- /dev/null +++ b/models/progressive-v1/geo-ab194913839cc37985edc5c8.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:35c2562176df2b8910475416aeb6458cb2bff747c9b07d14f32c57a56b5e66ea +size 5524192 diff --git a/models/progressive-v1/geo-b0e37abcf8f8538d5c7c567d.bin b/models/progressive-v1/geo-b0e37abcf8f8538d5c7c567d.bin new file mode 100644 index 0000000000000000000000000000000000000000..3e78eddde8351d5397c39ea32210ca99baeec31c --- /dev/null +++ b/models/progressive-v1/geo-b0e37abcf8f8538d5c7c567d.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e80ec4defc3922ccefa5e71212d9d3fc21882c5db88285455615719315fa9bc8 +size 5524292 diff --git a/models/progressive-v1/geo-cfc8f9530bbdf82e9ad5803e.bin b/models/progressive-v1/geo-cfc8f9530bbdf82e9ad5803e.bin new file mode 100644 index 0000000000000000000000000000000000000000..1499954db749cd8b573d232d65156aaa7b524e74 --- /dev/null +++ b/models/progressive-v1/geo-cfc8f9530bbdf82e9ad5803e.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c13dd111bc77897f60d64b4ffe1ce256d3e44f950381762f7e0046a046150a82 +size 6144796 diff --git a/models/progressive-v1/geo-f52df859622b51e5a8e79b7f.bin b/models/progressive-v1/geo-f52df859622b51e5a8e79b7f.bin new file mode 100644 index 0000000000000000000000000000000000000000..7042ca482dde8eef6dd1416cdba66642f07faea4 --- /dev/null +++ b/models/progressive-v1/geo-f52df859622b51e5a8e79b7f.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c8b5581c2c5ce1999e1a3d3adae0f610a904820963ff4be84bb70e19bf072e3 +size 6145112 diff --git a/models/progressive-v1/geo-fbdfbee814c5ec5bbbd7b049.bin b/models/progressive-v1/geo-fbdfbee814c5ec5bbbd7b049.bin new file mode 100644 index 0000000000000000000000000000000000000000..0844e13c38d43a98e78086b47eb927ccd5124989 --- /dev/null +++ b/models/progressive-v1/geo-fbdfbee814c5ec5bbbd7b049.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ce75ed4b3087e84bf62c608cff771f1a7d100126374590f263f7b1516f78afb +size 6144908 diff --git a/models/progressive-v1/tex-012c8e3c3ec399a5e3814072.bin b/models/progressive-v1/tex-012c8e3c3ec399a5e3814072.bin new file mode 100644 index 0000000000000000000000000000000000000000..ee515a1ff53b19cc898f72afde8e131c3df4f6ba --- /dev/null +++ b/models/progressive-v1/tex-012c8e3c3ec399a5e3814072.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7b600f787d580d23d63f19b506ef498d0f747d76f5cb9c69ba3a2ce13ce9ed6 +size 235174 diff --git a/models/progressive-v1/tex-1c281547b397376efd0199f4.bin b/models/progressive-v1/tex-1c281547b397376efd0199f4.bin new file mode 100644 index 0000000000000000000000000000000000000000..c3312ea5151b2a3b170d57481cafe3cfce35f228 --- /dev/null +++ b/models/progressive-v1/tex-1c281547b397376efd0199f4.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06e4053254de95a64ddefa098cee389a73fbc909419cca880cf7a2937ce33b41 +size 127330 diff --git a/models/progressive-v1/tex-1f1e882fba2f5973b698e4eb.bin b/models/progressive-v1/tex-1f1e882fba2f5973b698e4eb.bin new file mode 100644 index 0000000000000000000000000000000000000000..975b1d6a98c2c60ee64a6b20226b96c580dca858 --- /dev/null +++ b/models/progressive-v1/tex-1f1e882fba2f5973b698e4eb.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3fa34efaa8af420eae7667f6848fd5c5c7106c1044813cab468d6c6481bb49e2 +size 226390 diff --git a/models/progressive-v1/tex-2452f0e9439a921b6ddef41f.bin b/models/progressive-v1/tex-2452f0e9439a921b6ddef41f.bin new file mode 100644 index 0000000000000000000000000000000000000000..c46ab5033927c8d490a9ae8a33fc107cd3242bf6 --- /dev/null +++ b/models/progressive-v1/tex-2452f0e9439a921b6ddef41f.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:74c27a4385573ee86a08a37c4f9e9d7c79e873a2f23494d76916095f409d516d +size 261254 diff --git a/models/progressive-v1/tex-60a1d5975059cf1464d7e63d.bin b/models/progressive-v1/tex-60a1d5975059cf1464d7e63d.bin new file mode 100644 index 0000000000000000000000000000000000000000..d748c9fe4100469e1be5daeefb433d47a6fe6005 --- /dev/null +++ b/models/progressive-v1/tex-60a1d5975059cf1464d7e63d.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5acb7c239d9612f05250503aa1d9b96d34fc751b711b47013ccf90ce650829ca +size 180404 diff --git a/models/progressive-v1/tex-62e57d9806cfa50c8907036d.bin b/models/progressive-v1/tex-62e57d9806cfa50c8907036d.bin new file mode 100644 index 0000000000000000000000000000000000000000..fc46cfdd1b0fe970388b7db139370f93e0fef149 --- /dev/null +++ b/models/progressive-v1/tex-62e57d9806cfa50c8907036d.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c7f17e45f852be3c9d65bcfa3781592c6b26ee4de6484143e9ebf6b8860b979 +size 163086 diff --git a/models/progressive-v1/tex-787aa264f2ab67e4714dd87d.bin b/models/progressive-v1/tex-787aa264f2ab67e4714dd87d.bin new file mode 100644 index 0000000000000000000000000000000000000000..0064c42c062b802ab2708d5fbe08a74d981bd4ad --- /dev/null +++ b/models/progressive-v1/tex-787aa264f2ab67e4714dd87d.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b5e5170b9116ce6a828b4fda401efdf96cd101ab60ddd1313cba4ccdc2352b5c +size 167396 diff --git a/models/progressive-v1/tex-80312b3d120467ae6a6d0c5c.bin b/models/progressive-v1/tex-80312b3d120467ae6a6d0c5c.bin new file mode 100644 index 0000000000000000000000000000000000000000..ffa0bbef97e465e6de728420e1460c9719dd6f06 --- /dev/null +++ b/models/progressive-v1/tex-80312b3d120467ae6a6d0c5c.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a624930bccb545fef20b993ab2e809d38cae476ff8712800347d7ff834f282b7 +size 275902 diff --git a/models/progressive-v1/tex-89b9c55ddabdd596bb39e1b0.bin b/models/progressive-v1/tex-89b9c55ddabdd596bb39e1b0.bin new file mode 100644 index 0000000000000000000000000000000000000000..77615b7bc96c67f7b86a96c43df78d27bddc7fc5 --- /dev/null +++ b/models/progressive-v1/tex-89b9c55ddabdd596bb39e1b0.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d48186a4b603a37110ae537a7fd00262b7aaee4a1a216843c53d7204bdeebf4 +size 203236 diff --git a/models/progressive-v1/tex-8eb5e2b95996e3395d479ec7.bin b/models/progressive-v1/tex-8eb5e2b95996e3395d479ec7.bin new file mode 100644 index 0000000000000000000000000000000000000000..0da6262e7810a74f549ddde5a32ea68850620ee5 --- /dev/null +++ b/models/progressive-v1/tex-8eb5e2b95996e3395d479ec7.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8d2891460a4d34a397c6d7109da7e1c6c24f9925711a29182e1306304f1575a1 +size 225566 diff --git a/models/progressive-v1/tex-963facb3e164ec96503ed7ca.bin b/models/progressive-v1/tex-963facb3e164ec96503ed7ca.bin new file mode 100644 index 0000000000000000000000000000000000000000..bc62650cea2b328fa345ef1c8959597c756b9475 --- /dev/null +++ b/models/progressive-v1/tex-963facb3e164ec96503ed7ca.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a8bab1693b3f0f3d17278f4daf0192f64f452acedeca3c3d70263f9b8aa8bad +size 300832 diff --git a/models/progressive-v1/tex-9a41f5863878bed1ee54fb91.bin b/models/progressive-v1/tex-9a41f5863878bed1ee54fb91.bin new file mode 100644 index 0000000000000000000000000000000000000000..9fba4e52014eae6e5bfadd354efe3643545ef528 --- /dev/null +++ b/models/progressive-v1/tex-9a41f5863878bed1ee54fb91.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:449c3e020c5697925cc52a26bccc3ef04bf2766be82f14d96355f1df1cecfb59 +size 566968 diff --git a/models/progressive-v1/tex-b50f6625c3e5be695c7d28ec.bin b/models/progressive-v1/tex-b50f6625c3e5be695c7d28ec.bin new file mode 100644 index 0000000000000000000000000000000000000000..9656e175a24e808a0b042ddbb05cc684306e465c --- /dev/null +++ b/models/progressive-v1/tex-b50f6625c3e5be695c7d28ec.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c7010abc09c878bf05dcb305302f794d13dca0ae0bbe734d1c7f10cdf62bd01 +size 326182 diff --git a/models/progressive-v1/tex-b5533e545d0dc348c6891056.bin b/models/progressive-v1/tex-b5533e545d0dc348c6891056.bin new file mode 100644 index 0000000000000000000000000000000000000000..ffc8f85ccd6ead32096afe2d802962728c10c521 --- /dev/null +++ b/models/progressive-v1/tex-b5533e545d0dc348c6891056.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e95ae9c8701fa268c508f2fab3083644077d1cfa19aaa9210cb1c0be84db3c2f +size 276668 diff --git a/models/progressive-v1/tex-c322bd73af19935404c3166c.bin b/models/progressive-v1/tex-c322bd73af19935404c3166c.bin new file mode 100644 index 0000000000000000000000000000000000000000..982c52906739bc86ac22d2102e2f2f4f63d8ffd9 --- /dev/null +++ b/models/progressive-v1/tex-c322bd73af19935404c3166c.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d25d238d5d9111d06f30d66f08314e2bef359f79ae02635641683321424c1a43 +size 277766 diff --git a/models/progressive-v1/tex-dcec8d0a78a3535ce1ec0d50.bin b/models/progressive-v1/tex-dcec8d0a78a3535ce1ec0d50.bin new file mode 100644 index 0000000000000000000000000000000000000000..a83729d8276ba624eb493f03282711fafdbbb3e6 --- /dev/null +++ b/models/progressive-v1/tex-dcec8d0a78a3535ce1ec0d50.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5cc2b484204ddf73e2a9b0407c8e70598ecfbedda270a7c24a2e2de3487dea6f +size 217614 diff --git a/models/progressive-v1/tex-e953bcfc3967684c77da0c67.bin b/models/progressive-v1/tex-e953bcfc3967684c77da0c67.bin new file mode 100644 index 0000000000000000000000000000000000000000..9496996be80234ee2abeedf69163429220d6a28b --- /dev/null +++ b/models/progressive-v1/tex-e953bcfc3967684c77da0c67.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:559ba0c1fe91762b01edb230001f0e53e01abc3dcdf5eb32c911354a3ab37320 +size 169914 diff --git a/scripts/i2s_tabs.py b/scripts/i2s_tabs.py new file mode 100644 index 0000000000000000000000000000000000000000..88f9e4081048d772745532623595564082561d64 --- /dev/null +++ b/scripts/i2s_tabs.py @@ -0,0 +1,207 @@ +"""Bring Image-to-Scene back as a second tab (user, 2026-10-04: "每一栏分两个小tab,默认是text2scene,然后另一个是image2scene"). + +Task Format, Leaderboard, the case cards and the takeaways each get a Text-to-Scene / Image-to-Scene tab pair, Text-to-Scene +selected. The Image-to-Scene content is the page's own from before scripts/t2s_only.py (commit c77f6d97b3): the task +example, bars, Pareto view, ranking, the two repair cases with their models, and the three editing takeaways. The +Text-to-Scene content, the Research Track naming and the kit-style charts stay as they are. There is no Overall tab. + +Each step asserts it found what it edits, so a re-run on an already-edited page stops instead of half-applying. + python3 scripts/i2s_tabs.py +""" +from __future__ import annotations +import json, re, subprocess +from pathlib import Path +from bs4 import BeautifulSoup + +ROOT = Path(__file__).resolve().parent.parent +BEFORE = "c77f6d97b3" # the last commit with Image-to-Scene on the page +V = "20261004i2s" +I2S_CASES = ("comp-31-old-industrial-pallet-bay-repair-v2", "comp-61-new-york-mailbox-pair-repair-v2") +HIDE = "display:none" + + +def one(found, what): + assert found, f"not found: {what}" + return found + + +def old(path): + return subprocess.run(["git", "show", f"{BEFORE}:{path}"], cwd=ROOT, check=True, capture_output=True, text=True).stdout + + +def frag(html): + return BeautifulSoup(html, "html.parser") + + +def tabs(section_id): + """The leaderboard's tab pair; paper.js shows the [data-view] elements of the section that match the pressed button.""" + return frag(f'
' + '' + '
') + + +def view(el, v): + el["data-view"] = v + if v == "i2s": + el["style"] = HIDE + return el + + +def restore_files(): + """The media and packed models t2s_only.py deleted (the v30 teaser stays retired).""" + gone = subprocess.run(["git", "diff", "--name-only", "--diff-filter=D", BEFORE, "HEAD"], cwd=ROOT, check=True, + capture_output=True, text=True).stdout.split() + gone = [p for p in gone if p != "media/teaser.mp4"] + assert gone and all(p.startswith(("media/i2s/", "models/")) for p in gone), gone + missing = [p for p in gone if not (ROOT / p).exists()] + assert missing, "already restored" + subprocess.run(["git", "checkout", BEFORE, "--", *missing], cwd=ROOT, check=True) + print("restored", len(missing), "files") + + +def index(): + p = ROOT / "index.html" + soup = BeautifulSoup(p.read_text(), "html.parser") + was = BeautifulSoup(old("index.html"), "html.parser") + assert not soup.find(id="task-i2s"), "already has Image-to-Scene" + + # task format: the old tab bar and editing example; each tab carries its own case-count strip + tf = one(soup.find(id="task-format"), "task format") + t2s = one(tf.find(id="task-t2s"), "task-t2s") + bar = one(was.find(id="task-format").find(class_="task-tabs"), "old task tabs") + one(bar.find(id="task-tab-t2s"), "t2s tab").string = "Text-to-Scene" + one(bar.find(id="task-tab-i2s"), "i2s tab").string = "Image-to-Scene" + t2s.insert_before(bar) + i2s = one(was.find(id="task-i2s"), "old task-i2s") + i2s["hidden"] = "" + t2s.insert_after(i2s) + av = one(tf.find(class_="availability"), "availability strip") + t2s.append(av.extract()) + i2s.append(frag('
160 editing cases in the full benchmark target, including ' + 'private cases72 public editing cases (22 indoor, 50 outdoor)
')) + + # leaderboard: the header, bar title, Pareto subtitle and ranking each get an Image-to-Scene twin + lb = one(soup.find(id="leaderboard"), "leaderboard") + olb = one(was.find(id="leaderboard"), "old leaderboard") + desc = view(one(lb.find(class_="section-desc"), "leaderboard desc"), "t2s") + view(one(lb.find(class_="tracks-why"), "tracks why"), "t2s") + desc.insert_after(view(frag('

Image-to-Scene · 75 public cases (25 indoor, 50 outdoor) · ' + '14 coding-agent configurations.

').p, "i2s")) + wrap = one(lb.find(id="lbwrap"), "lbwrap") + wrap.insert(0, tabs("leaderboard")) + q = one(lb.select_one(".bar-heading h3 span.q"), "bar qualifier") + view(q, "t2s"); q.insert_after(view(frag('Image-to-Scene').span, "i2s")) + side = lb.select(".bar-heading > span"); assert len(side) == 1, side + s = side[0].get_text(strip=True); assert s == "20 scenes · score out of 100", s + side[0].clear() + side[0].append(view(frag(f"{s}").span, "t2s")) + side[0].append(view(frag("75 scenes · score out of 100").span, "i2s")) + for kind, find in (("bars", lambda r: r.find(class_="bar-scroll").find("div", attrs={"data-view": "i2s"}, recursive=False)), + ("pareto", lambda r: r.find(class_="pareto-view", attrs={"data-view": "i2s"})), + ("ranking", lambda r: r.find(class_="ranking-card").find("div", attrs={"data-view": "i2s"}, recursive=False))): + new_ = one(find(olb), f"old i2s {kind}") + t2s_ = one({"bars": lambda r: r.find(class_="bar-scroll").find("div", attrs={"data-view": "t2s"}, recursive=False), + "pareto": lambda r: r.find(class_="pareto-view", attrs={"data-view": "t2s"}), + "ranking": lambda r: r.find(class_="ranking-card").find("div", attrs={"data-view": "t2s"}, recursive=False)}[kind](lb), + f"t2s {kind}") + t2s_.insert_after(view(new_, "i2s")) + sub = one(lb.find(class_="figure-subtitle"), "pareto subtitle") + view(sub, "t2s") + sub.insert_after(view(frag('

Quality against the cost of one case · Image-to-Scene, ' + '75 public cases

').p, "i2s")) + + # cases: the four construction cards, or the two repairs with their input/ground-truth switch + cs = one(soup.find(id="cases"), "cases") + grid = view(one(cs.find(class_="case-grid"), "case grid"), "t2s") + cards = [] + for c in I2S_CASES: + scene = one(was.find(id="cases").find(attrs={"data-case": c}), c) + cards.append(one(scene.find_parent("article", class_="case-card"), f"{c} card")) + i2s_grid = view(frag('
').div, "i2s") + for c in cards: + i2s_grid.append(c) + grid.insert_after(i2s_grid) + cdesc = one(cs.find(class_="section-desc"), "cases desc") + view(cdesc, "t2s") + cdesc.insert_after(view(frag('

Drag any scene to inspect the saved 3D output. Switch each repair ' + 'between the saved scene, its corrupted input and the ground truth, or open a case to ' + 'explore every agent.

').p, "i2s")) + grid.insert_before(tabs("cases")) + + # takeaways: Spatial Composition, or the three editing takeaways (the construction-vs-editing one first) + tk = one(soup.find(id="takeaways"), "takeaways") + t2s_card = view(one(tk.find(class_="tk"), "t2s takeaway"), "t2s") + old_cards = [c for c in was.find(id="takeaways").find_all(class_="tk") + if not " ".join(c.find("h3").get_text(" ").split()).startswith("Spatial Composition remains")] + assert len(old_cards) == 3, len(old_cards) + at = t2s_card + for k, c in enumerate(old_cards, 1): + for n in c.find_all(class_="n"): + n.string = f"Takeaway {k}" + at.insert_after(view(c, "i2s")); at = c + t2s_card.insert_before(tabs("takeaways")) + for h in tk.find_all("h2"): + if h.get_text(strip=True) == "Takeaway": + h.string = "Takeaways" + for a in soup.find_all("a"): + if a.get_text(strip=True) == "Takeaway": + a.string = "Takeaways" + + # cache keys for what this edit changes + for t in soup.find_all(["script", "link"]): + a = "src" if t.name == "script" else "href" + u = t.get(a) or "" + if re.match(r"(assets/(buildingbench\.css|leaderboard-bars\.js|pareto\.js)|data/site\.js)", u): + t[a] = re.sub(r"\?v=.*$", "", u) + f"?v={V}" + p.write_text(str(soup)) + print("index.html: Text-to-Scene / Image-to-Scene tabs in task format, leaderboard, cases and takeaways") + + +def bars(): + p = ROOT / "assets/leaderboard-bars.js"; s = p.read_text() + m = one(re.search(r"const ALL = (\{.*?\});\n", s, re.S), "const ALL") + data = json.loads(m.group(1)); assert list(data) == ["t2s"], list(data) + data["i2s"] = json.loads(re.search(r"const ALL = (\{.*?\});\n", old("assets/leaderboard-bars.js"), re.S).group(1))["i2s"] + p.write_text(s[:m.start(1)] + json.dumps(data) + s[m.end(1):]) + print("leaderboard-bars.js: views", list(data)) + + +def pareto(): + p = ROOT / "assets/pareto.js"; s = p.read_text() + a = "'Text-to-Scene Score');"; assert s.count(a) == 1, "pareto axis title" + s = s.replace(a, "{t2s:'Text-to-Scene Score',i2s:'Image-to-Scene Score'}[svg.dataset.mode]);") + p.write_text(s); print("pareto.js: axis title per view") + + +def site_data(): + p = ROOT / "data/site.js" + S = json.loads(p.read_text().split("=", 1)[1].rstrip().rstrip(";")) + assert all(c["track"] == "t2s" for c in S["cases"]), "already has Image-to-Scene cases" + was = json.loads(old("data/site.js").split("=", 1)[1].rstrip().rstrip(";")) + add = [c for c in was["cases"] if c["track"] == "i2s"] + assert [c["id"] for c in add] == list(I2S_CASES), [c["id"] for c in add] + S["cases"] += add + p.write_text("window.SITE = " + json.dumps(S) + ";\n") + n3d = sum(1 for c in S["cases"] for a in c["agents"] if a.get("glb")) + sum(1 for c in S["cases"] for k in ("gt_glb", "input_glb") if c.get(k)) + cp = ROOT / "cases.html"; cs = cp.read_text() + cs, n = re.subn(r"\d+ cases, \d+ scenes in 3D", f'{len(S["cases"])} cases, {n3d} scenes in 3D', cs); assert n == 1 + cs, n = re.subn(r"(data/site\.js|assets/buildingbench\.css)\?v=\w+", lambda m: f"{m.group(1)}?v={V}", cs); assert n == 2, n + cp.write_text(cs) + print("data/site.js: cases", len(S["cases"]), "· cases.html:", n3d, "scenes in 3D") + + +def progressive(): + p = ROOT / "data/progressive-scenes.json" + d = json.loads(p.read_text()); n0 = len(d) + was = json.loads(old("data/progressive-scenes.json")) + add = {k: v for k, v in was.items() if k not in d} + i2s_models = {f.rsplit("/", 1)[1] for f in subprocess.run(["git", "diff", "--name-only", "--diff-filter=D", BEFORE, "HEAD", "--", "models/*.bin"], + cwd=ROOT, check=True, capture_output=True, text=True).stdout.split()} + assert add and set(add) <= i2s_models, sorted(add) # 6 of the 12 Image-to-Scene models are progressive + d.update(add) + p.write_text(json.dumps(d, indent=2) + "\n") + print("data/progressive-scenes.json:", n0, "->", len(d)) + + +if __name__ == "__main__": + restore_files(); index(); bars(); pareto(); site_data(); progressive()