+
+## Start building in 5 minutes
+
+One Gradle line. No XML. No OpenGL. Just Compose.
-[:octicons-comment-discussion-24: Discord](https://discord.gg/UbNDDBTNqb){ .md-button }
-[:octicons-mark-github-24: GitHub](https://github.com/SceneView/sceneview-android){ .md-button .md-button--primary }
+[:octicons-arrow-right-24: Start building now](quickstart.md){ .md-button .md-button--primary }
+[:octicons-comment-discussion-24: Join Discord](https://discord.gg/UbNDDBTNqb){ .md-button }
+[:octicons-mark-github-24: Star on GitHub](https://github.com/SceneView/sceneview-android){ .md-button }
+
+
-
+
diff --git a/docs/docs/samples.md b/docs/docs/samples.md
index 72fdc7561..ed114686b 100644
--- a/docs/docs/samples.md
+++ b/docs/docs/samples.md
@@ -56,6 +56,8 @@ Use cameras defined inside a glTF file. The scene animates between camera viewpo
### Dynamic Sky
+
+
+
+11 models
+Khronos PBR demos, Sketchfab realistic & animated characters
+
+
+
+6 HDR environments
+Night, studio, warm, sunset, outdoor, autumn
+
+
+
+26+ node types
+Model, Light, Cube, Sphere, Text, Path, Video, View...
+
+
+
+60fps on mid-range
+Filament rendering engine, optimized for mobile
+
+
+
+
+---
+
+## Build from source
+
+```bash
+# Clone
+git clone https://github.com/SceneView/sceneview-android.git
+cd sceneview-android
+
+# Build just the demo
+./gradlew :samples:sceneview-demo:assembleDebug
+
+# Build all samples
+./gradlew assembleDebug
+
+# Run lint
+./gradlew :samples:sceneview-demo:lint
+```
+
+The APK lands in `samples/sceneview-demo/build/outputs/apk/debug/`.
diff --git a/docs/docs/use-cases.md b/docs/docs/use-cases.md
index 9e5f440fd..6979a00cf 100644
--- a/docs/docs/use-cases.md
+++ b/docs/docs/use-cases.md
@@ -2,6 +2,40 @@
Real-world applications of SceneView across industries. Each example includes the key composables used and approximate line counts.
+
@@ -241,15 +184,7 @@ Scene(modifier = Modifier.fillMaxSize()) {
|---|---|
| One Scene per screen | Multiple independent Scenes |
| Flat scene graph | `PortalNode` — scenes within scenes |
-| Android only | Kotlin Multiplatform (iOS, Desktop, Web) |
+| Android only | Kotlin Multiplatform (iOS) |
| Phone/tablet only | `SceneView-XR` for spatial computing |
----
-
-## How to Get Involved
-
-- **Join the discussion**: [Discord #v4-planning](https://discord.gg/UbNDDBTNqb)
-- **Contribute**: Check [CONTRIBUTING.md](../contributing/) for guidelines
-- **Sponsor**: Help fund multi-platform development on [Open Collective](https://opencollective.com/sceneview)
-
[:octicons-arrow-right-24: Full roadmap on GitHub](https://github.com/SceneView/sceneview-android/blob/main/ROADMAP.md)
diff --git a/docs/ios-swift-package-design.md b/docs/ios-swift-package-design.md
new file mode 100644
index 000000000..7e6b7038c
--- /dev/null
+++ b/docs/ios-swift-package-design.md
@@ -0,0 +1,161 @@
+# SceneView for iOS — Swift Package Design
+
+## Overview
+
+Native SwiftUI framework for 3D and AR, mirroring SceneView Android's API philosophy.
+Two distribution paths:
+1. **SceneViewSwift** — Native Swift Package using RealityKit (pure iOS)
+2. **SceneViewKMP** — Kotlin/Native framework via sceneview-core (cross-platform)
+
+## Why RealityKit over SceneKit?
+
+- **SceneKit is officially deprecated** (WWDC 2025) — Apple published migration guide
+- Apple published "Bring your SceneKit project to RealityKit" (WWDC25 session 288)
+- visionOS/Vision Pro native support (SceneKit does not support visionOS)
+- Built-in AR anchoring via ARKit integration
+- PBR materials, physics, animation out of the box
+- `RealityView` in SwiftUI (iOS 18+) — no UIViewRepresentable needed
+- Future-proof: Apple's only actively developed 3D framework
+
+## API Design — SwiftUI Declarative
+
+### 3D Scene (mirrors `Scene { }`)
+
+```swift
+import SceneViewSwift
+
+struct ModelViewer: View {
+ @State private var model: ModelEntity?
+
+ var body: some View {
+ SceneView {
+ if let model {
+ ModelNode(model)
+ .position(.init(x: 0, y: 0, z: -2))
+ .scale(.init(repeating: 0.5))
+ }
+
+ LightNode(.directional)
+ .direction(.init(x: 0, y: -1, z: -1))
+ .intensity(1000)
+
+ CameraNode()
+ .position(.init(x: 0, y: 1, z: 3))
+ .lookAt(.zero)
+ }
+ .environment(.studio)
+ .cameraControls(.orbit)
+ .task {
+ model = try? await ModelLoader.load("models/car.usdz")
+ }
+ }
+}
+```
+
+### AR Scene (mirrors `ARScene { }`)
+
+```swift
+struct ARModelViewer: View {
+ @State private var model: ModelEntity?
+
+ var body: some View {
+ ARSceneView(planeDetection: .horizontal) { anchor in
+ if let model {
+ AnchorNode(anchor) {
+ ModelNode(model)
+ .scale(.init(repeating: 0.1))
+ }
+ .onTapGesture { node in
+ // Handle tap on placed model
+ }
+ }
+ }
+ .task {
+ model = try? await ModelLoader.load("models/robot.usdz")
+ }
+ }
+}
+```
+
+## Module Structure
+
+```
+SceneViewSwift/
+├── Package.swift
+├── Sources/
+│ ├── SceneViewSwift/
+│ │ ├── SceneView.swift — Main RealityView wrapper
+│ │ ├── ARSceneView.swift — AR RealityView wrapper
+│ │ ├── Nodes/
+│ │ │ ├── ModelNode.swift — 3D model entity
+│ │ │ ├── LightNode.swift — Light entity
+│ │ │ ├── CameraNode.swift — Camera entity
+│ │ │ ├── ShapeNode.swift — Primitive geometry
+│ │ │ └── AnchorNode.swift — AR anchor entity
+│ │ ├── Modifiers/
+│ │ │ ├── TransformModifiers.swift — .position(), .rotation(), .scale()
+│ │ │ ├── MaterialModifiers.swift — .color(), .metallic(), .roughness()
+│ │ │ └── GestureModifiers.swift — .onTapGesture(), .draggable()
+│ │ ├── Environment/
+│ │ │ ├── Environment.swift — IBL + skybox loading
+│ │ │ └── EnvironmentPresets.swift — .studio, .outdoor, .sunset
+│ │ ├── Loaders/
+│ │ │ ├── ModelLoader.swift — USDZ/glTF async loading
+│ │ │ └── EnvironmentLoader.swift — HDR/EXR loading
+│ │ └── Camera/
+│ │ ├── CameraControls.swift — Orbit/pan/zoom gestures
+│ │ └── CameraManipulator.swift — Camera transform math
+│ └── SceneViewAR/
+│ ├── ARSceneView.swift — ARKit + RealityKit
+│ ├── PlaneDetection.swift — Plane anchoring
+│ └── ImageTracking.swift — Image detection
+└── Tests/
+```
+
+## glTF Support
+
+RealityKit natively supports USDZ. For glTF:
+- Use **GLTFKit2** (MIT license) for runtime glTF→Entity conversion
+- Or pre-convert glTF→USDZ at build time via Apple's `reality-converter` CLI
+- Accept both `.glb` and `.usdz` in ModelLoader
+
+## Shared Code with sceneview-core (KMP)
+
+The `sceneview-core` KMP module exports a Kotlin/Native framework:
+- Collision detection (ray-sphere, ray-box, etc.)
+- Math utilities (type aliases, transforms, comparisons)
+- Triangulation (Earcut, Delaunator)
+
+Swift can consume this via:
+```swift
+import SceneViewCore // KMP framework
+
+let ray = Ray(origin: Vector3(0, 0, -5), direction: Vector3(0, 0, 1))
+let sphere = Sphere(center: Vector3.zero, radius: 1.0)
+let hit = RayHit()
+if sphere.rayIntersection(ray, hit) {
+ print("Hit at distance: \(hit.getDistance())")
+}
+```
+
+## Estimated Effort
+
+| Component | Lines | Complexity |
+|-----------|-------|------------|
+| SceneView (RealityView wrapper) | ~200 | Low |
+| Node modifiers (position, rotation, etc.) | ~300 | Low |
+| ModelLoader (USDZ + glTF) | ~400 | Medium |
+| Environment/IBL loading | ~200 | Medium |
+| Camera controls (orbit/pan/zoom) | ~500 | Medium |
+| ARSceneView + anchoring | ~400 | High |
+| Gesture system | ~300 | Medium |
+| **Total** | **~2,300** | Medium |
+
+## AI-First Design Checklist
+
+- [ ] Every public API has DocC documentation
+- [ ] Parameter names match Android SceneView (position, rotation, scale)
+- [ ] Default values make basic usage zero-config
+- [ ] Loading is always async/await (no callback hell)
+- [ ] Errors are typed Swift errors, not crashes
+- [ ] `llms-swift.txt` with complete API reference for AI assistants
diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml
index 254409cef..633c1cdb3 100644
--- a/docs/mkdocs.yml
+++ b/docs/mkdocs.yml
@@ -9,19 +9,19 @@ theme:
name: material
palette:
- scheme: default
- primary: deep purple
- accent: purple
+ primary: custom
+ accent: custom
toggle:
icon: material/brightness-7
name: Switch to dark mode
- scheme: slate
- primary: deep purple
- accent: purple
+ primary: custom
+ accent: custom
toggle:
icon: material/brightness-4
name: Switch to light mode
font:
- text: Roboto
+ text: Google Sans
code: JetBrains Mono
icon:
logo: material/cube-outline
@@ -41,6 +41,7 @@ theme:
nav:
- Home: index.md
+ - Try the Demo: try.md
- Get Started:
- Quickstart: quickstart.md
- API Cheatsheet: cheatsheet.md
@@ -62,6 +63,10 @@ nav:
- codelabs/index.md
- 3D with Compose: codelabs/codelab-3d-compose.md
- AR with Compose: codelabs/codelab-ar-compose.md
+ - Dynamic Sky: codelabs/guide-dynamic-sky.md
+ - Lines & Text: codelabs/guide-lines-text.md
+ - Physics: codelabs/guide-physics.md
+ - Reflection Probes: codelabs/guide-reflection-probes.md
- API:
- API (3D — sceneview): https://sceneview.github.io/api/sceneview-android/sceneview/
- API (AR — arsceneview): https://sceneview.github.io/api/sceneview-android/arsceneview/
diff --git a/docs/research/3d-models-capabilities.md b/docs/research/3d-models-capabilities.md
new file mode 100644
index 000000000..4b6109c28
--- /dev/null
+++ b/docs/research/3d-models-capabilities.md
@@ -0,0 +1,182 @@
+# 3D Models for SceneView Capability Demos — Research
+
+> Research compiled for SceneView demo app expansion.
+> Models selected to showcase specific SceneView features.
+
+## Top 10 Picks (covers the most features with fewest downloads)
+
+| # | Model | Feature | License | ~Size |
+|---|-------|---------|---------|-------|
+| 1 | **DamagedHelmet** (Khronos) | PBR, emissive, lighting, tone mapping, SSAO | CC-BY | ~3.7 MB |
+| 2 | **Fox** (Khronos) | Skeletal animation (3 clips), AR placement | CC-BY | ~1 MB |
+| 3 | **ABeautifulGame** (Khronos) | Transmission, volume, SSAO, complex scene | CC-BY | ~8-12 MB |
+| 4 | **SheenChair** (Khronos/Wayfair) | Sheen extension, AR furniture | CC-BY | ~4 MB |
+| 5 | **SunglassesKhronos** | Iridescence + transmission | CC-BY | ~2-4 MB |
+| 6 | **EmissiveStrengthTest** (Khronos) | Bloom post-processing | CC-BY | ~0.1 MB |
+| 7 | **AnimatedMorphSphere** (Khronos) | Morph targets | CC0 | ~50 KB |
+| 8 | **Kenney Physics Assets** | 215 physics-ready shapes | CC0 | ~5 MB pack |
+| 9 | **CC0 Chair 8 + Table + Plant Pot** (plaggy) | AR furniture trio | CC0 | ~1.5 MB |
+| 10 | **Brain with Labeled Parts** | TextNode annotation | CC-BY | ~5-10 MB |
+
+---
+
+## 1. PBR Materials (ModelNode)
+
+### Metallic / Roughness Extremes
+| Model | License | ~Size | Feature |
+|-------|---------|-------|---------|
+| **DamagedHelmet** (Khronos) | CC-BY | ~3.7 MB | Mixed metallic/roughness, emissive visor, normal maps |
+| **FlightHelmet** (Khronos) | CC-BY | ~5 MB | Multiple materials: leather, glass, metal, rubber |
+| **AnisotropyBarnLamp** (Khronos) | CC-BY | ~8.4 MB | Brushed copper with anisotropic reflections, 6 extensions |
+
+### Iridescence / Sheen / Clearcoat
+| Model | License | ~Size | Feature |
+|-------|---------|-------|---------|
+| **SunglassesKhronos** | CC-BY | ~2-4 MB | `KHR_materials_iridescence` + `KHR_materials_transmission` |
+| **IridescenceLamp** (Wayfair) | CC-BY | ~3-5 MB | Iridescence with thickness texture |
+| **SheenChair** (Wayfair) | CC-BY | ~4 MB | `KHR_materials_sheen` — damask fabric |
+| **ClearCoatCarPaint** | CC0 | ~1-2 MB | `KHR_materials_clearcoat` — automotive paint |
+
+### Transmission / Volume (Glass, Gems)
+| Model | License | ~Size | Feature |
+|-------|---------|-------|---------|
+| **ABeautifulGame** (ASWF) | CC-BY | ~8-12 MB | Chess set with glass pawn tops |
+| **GlassVaseFlowers** (Wayfair) | CC-BY | ~5-8 MB | Alpha blend vs. transmission comparison |
+| **CommercialRefrigerator** | CC-BY | ~5-10 MB | Glass doors + animated door |
+
+---
+
+## 2. Animations
+
+### Skeletal Animation
+| Model | License | ~Size | Feature |
+|-------|---------|-------|---------|
+| **Fox** (Khronos) | CC-BY | ~1 MB | 3 animations (Survey, Walk, Run) — `playAnimation(index)` |
+| **CesiumMan** (Khronos) | CC-BY | ~0.5 MB | Textured walking man |
+| **Soldier.glb** (three.js) | MIT | ~1 MB | Walk/run/idle — human-scale for AR |
+| **Quaternius Platformer Character** | CC0 | ~0.5-1 MB | 18 animations per character |
+
+### Morph Targets
+| Model | License | ~Size | Feature |
+|-------|---------|-------|---------|
+| **AnimatedMorphSphere** (Khronos) | CC0 | ~50 KB | Smooth morph transitions |
+| **AnimatedMorphCube** (Khronos) | CC0 | ~10 KB | Two morph targets, minimal |
+| **MorphStressTest** (Khronos) | CC-BY | ~1-2 MB | High morph-target count stress test |
+
+### Animated Machinery
+| Model | License | ~Size | Feature |
+|-------|---------|-------|---------|
+| **CesiumMilkTruck** (Khronos) | CC-BY | ~0.5 MB | Spinning wheels (rigid body) |
+| **CC0 - Gear** (plaggy) | CC0 | ~0.3 MB | 384 polys, PBR metallic |
+
+---
+
+## 3. Lighting (LightNode)
+
+### Dramatic Lighting Demos
+| Model | License | ~Size | Feature |
+|-------|---------|-------|---------|
+| **BoomBox** (Khronos) | CC0 | ~10 MB | Emissive panel + reflective metal |
+| **Corset** (Khronos) | CC0 | ~5 MB | Fine detail needing good lighting |
+| **FlightHelmet** (Khronos) | CC-BY | ~5 MB | Glass reflects, leather absorbs |
+
+### Emissive Materials
+| Model | License | ~Size | Feature |
+|-------|---------|-------|---------|
+| **EmissiveStrengthTest** (Khronos) | CC-BY | ~0.1 MB | Progressive brightness cubes |
+| **CC0 - Neon Sign Open** (plaggy) | CC0 | ~1 MB | Neon "OPEN" sign, 974 polys |
+
+---
+
+## 4. Physics (PhysicsNode)
+
+| Model | License | ~Size | Feature |
+|-------|---------|-------|---------|
+| **Kenney Physics Assets** | CC0 | ~5 MB | 215 shapes: balls, cubes, planks, ramps |
+| **Avocado** (Khronos) | CC0 | ~0.1 MB | Simple convex shape for drop/bounce |
+| **Box** (Khronos) | CC-BY | ~1 KB | Minimal stacking primitive |
+| **Low Poly Bowling Pins** (Sketchfab) | CC-BY | ~0.5 MB | 3 damage levels per pin |
+| **Quaternius Platformer Pack** | CC0 | ~15 MB | Platforms, hazards, stackable shapes |
+
+---
+
+## 5. Text & Labels (TextNode)
+
+| Model | License | ~Size | Feature |
+|-------|---------|-------|---------|
+| **Brain with Labeled Parts** (Sketchfab) | CC-BY | ~5-10 MB | Pre-labeled anatomical regions |
+| **Male Skeleton** (Sketchfab) | CC-BY | ~5-10 MB | Labeled bones |
+| **Anatomy of a Flower** (Sketchfab) | CC-BY | ~1-3 MB | Named parts (stamen, pistil) |
+
+---
+
+## 6. Path & Line Drawing (PathNode)
+
+Best demonstrated procedurally (sine waves, Lissajous, helices). Context models:
+
+| Model | License | ~Size | Feature |
+|-------|---------|-------|---------|
+| **DNA Helix** (Sketchfab) | CC-BY | ~1-3 MB | Extract path coords for helix demo |
+| **Klein Bottle** (Sketchfab) | CC-BY | ~0.5-1 MB | Mathematical surface |
+
+---
+
+## 7. Post-Processing
+
+### Bloom
+| Model | License | ~Size | Feature |
+|-------|---------|-------|---------|
+| **EmissiveStrengthTest** (Khronos) | CC-BY | ~0.1 MB | Bloom makes flat white → glowing |
+| **CC0 - Neon Sign Open** (plaggy) | CC0 | ~1 MB | Neon tubes glow with bloom |
+| **BoomBox** (Khronos) | CC0 | ~10 MB | Emissive panel + bloom |
+
+### SSAO
+| Model | License | ~Size | Feature |
+|-------|---------|-------|---------|
+| **ABeautifulGame** (Khronos) | CC-BY | ~8-12 MB | Contact shadows between chess pieces |
+| **FlightHelmet** (Khronos) | CC-BY | ~5 MB | Depth in goggle cavities |
+| **Corset** (Khronos) | CC0 | ~5 MB | Rich AO in fabric folds |
+
+### Tone Mapping
+| Model | License | ~Size | Feature |
+|-------|---------|-------|---------|
+| **DamagedHelmet** (Khronos) | CC-BY | ~3.7 MB | Wide dynamic range: ACES vs Filmic vs Linear |
+| **AnisotropyBarnLamp** (Khronos) | CC-BY | ~8.4 MB | Highlight rolloff on copper |
+
+---
+
+## 8. AR Placement (AnchorNode)
+
+### Furniture (room scale)
+| Model | License | ~Size | Feature |
+|-------|---------|-------|---------|
+| **CC0 - Chair 8** (plaggy) | CC0 | ~0.5 MB | 324 polys, PBR, glTF + USDZ |
+| **CC0 - Table** (plaggy) | CC0 | ~0.5 MB | Pairs with Chair 8 |
+| **SheenChair** (Khronos/Wayfair) | CC-BY | ~4 MB | Premium AR furniture preview |
+
+### Plants / Decorative
+| Model | License | ~Size | Feature |
+|-------|---------|-------|---------|
+| **CC0 - Plant Pot** (plaggy) | CC0 | ~0.5 MB | Tabletop-scale |
+| **Avocado** (Khronos) | CC0 | ~0.1 MB | Tiny object, demonstrates scaleToUnits |
+
+### Characters (human scale)
+| Model | License | ~Size | Feature |
+|-------|---------|-------|---------|
+| **Fox** (Khronos) | CC-BY | ~1 MB | Animated walk, floor-scale placement |
+| **CesiumMan** (Khronos) | CC-BY | ~0.5 MB | Walking human figure |
+| **PS1 Character Walk Cycle** (Sketchfab) | CC0 | ~0.5 MB | Retro-style, CC0, walk loop |
+
+---
+
+## Key Repositories
+
+| Repository | License | Description |
+|---|---|---|
+| [Khronos glTF-Sample-Assets](https://github.com/KhronosGroup/glTF-Sample-Assets) | CC0/CC-BY | Official reference models for all glTF extensions |
+| [Poly Haven](https://polyhaven.com/models) | CC0 | 1700+ photoscanned assets, up to 8K textures |
+| [Kenney 3D](https://kenney.nl/assets/category:3D) | CC0 | 40k+ game-ready GLB assets |
+| [Quaternius](https://quaternius.com/) | CC0 | Themed packs with animated characters |
+| [three.js models](https://github.com/mrdoob/three.js/tree/dev/examples/models/gltf) | MIT | Soldier, Horse, Flamingo, Parrot — lightweight animated GLBs |
+| [plaggy CC0 collection](https://sketchfab.com/plaggy/models) | CC0 | Furniture, signs, gears, plants with PBR + glTF/USDZ |
+| [awesome-cc0](https://github.com/madjin/awesome-cc0) | N/A | Master list of all CC0 3D asset sources |
diff --git a/docs/research/3d-models-industry.md b/docs/research/3d-models-industry.md
new file mode 100644
index 000000000..195f2d8f8
--- /dev/null
+++ b/docs/research/3d-models-industry.md
@@ -0,0 +1,140 @@
+# 3D Models for Industry Use Cases — Research
+
+> Research compiled for SceneView demo app expansion.
+> Priority: CC0/CC-BY, GLB format, < 10 MB, high visual quality.
+
+## Key Sources
+
+| Source | License | Notes |
+|--------|---------|-------|
+| [Khronos glTF-Sample-Assets](https://github.com/KhronosGroup/glTF-Sample-Assets) | Permissive | Official PBR reference models |
+| [Sketchfab CC0](https://sketchfab.com/tags/cc0) | CC0 | 800k+ downloadable, auto-converts to GLB |
+| [Poly Haven](https://polyhaven.com/models) | CC0 | Photoscanned, 4K-8K PBR |
+| [Quaternius](https://quaternius.com/) | CC0 | Thousands of game-ready assets, many animated |
+| [Kenney.nl](https://kenney.nl/assets) | CC0 | 40k+ low-poly assets |
+| [plaggy CC0 Collection](https://sketchfab.com/plaggy/collections/cc0-public-domain-free-models-c1af6539a9ee49f4b3d51fabd6c25a85) | CC0 | 193 models with 4K PBR |
+
+---
+
+## Top 10 Picks (highest confidence — CC0 or Khronos-licensed)
+
+| # | Model | Industry | License | ~Size | Why |
+|---|-------|----------|---------|-------|-----|
+| 1 | **Khronos ToyCar** | Automotive | Khronos | ~3 MB | Clearcoat PBR, already in demo |
+| 2 | **Khronos SheenChair** | Furniture | Khronos | ~3 MB | Fabric sheen extension, already in demo |
+| 3 | **Khronos MaterialsVariantsShoe** | E-commerce | Khronos | ~5 MB | Color configurator (KHR_materials_variants) |
+| 4 | **Khronos Sunglasses** | AR try-on | Khronos | ~3 MB | Iridescence + transmission |
+| 5 | **Khronos FlightHelmet** | Materials | Khronos | ~5 MB | Multi-material worn textures |
+| 6 | **CC0 Chair 8** (plaggy) | AR placement | CC0 | ~2 MB | 4K PBR, 324 polys |
+| 7 | **Animated Triceratops** (Smithsonian) | Education | CC0 | ~10 MB | Walking animation, museum scan |
+| 8 | **Concept Car 025** (Unity Fan) | Automotive | CC0 | ~5-10 MB | Sleek design, no attribution needed |
+| 9 | **4K Antique Ceramic Vase** | Museum | CC0 | ~5-10 MB | Historical artifact |
+| 10 | **Earth 3D Globe** (Jeremy Faivre) | Education | CC-BY | ~5-10 MB | Recognizable, educational |
+
+---
+
+## Per-Industry Breakdown
+
+### 1. E-commerce / Retail
+
+**Sneaker / Shoe:**
+- Khronos **MaterialsVariantsShoe** — color configurator demo (KHR_materials_variants)
+- Sketchfab "Shoe Model - Realistic 3D Sneaker" (Taohid Animation) — CC-BY, ~5-10 MB
+
+**Watch / Jewelry:**
+- Khronos **IridescenceAbalone** / **IridescenceLamp** — iridescence for jewelry reflections
+- Khronos **AntiqueCamera** — metallic materials showcase
+
+**Furniture:**
+- Sketchfab **CC0 - Chair 8** (plaggy) — CC0, 4K PBR, ~2 MB
+- Khronos **SheenChair** — velvet/fabric with KHR_materials_sheen
+
+**Sunglasses (AR try-on):**
+- Khronos **Sunglasses** — iridescence + transmission
+- Sketchfab "3D Glasses - Optimized for Virtual Try-on" (IceyTape) — built for AR VTO
+
+### 2. Automotive
+
+**Car exterior:**
+- Sketchfab "FREE Concept Car 025" (Unity Fan) — **CC0**, ~5-10 MB
+- Sketchfab "FREE Concept Car 003/006" (Unity Fan) — **CC0** variants
+- Khronos **ToyCar** — clearcoat PBR, ~3 MB
+- Khronos **ClearCoatCarPaint** — automotive paint finish
+
+**Wheels:**
+- Sketchfab "Rims_N_Tyres_kit_1.0" (britdawgmasterfunk) — **CC0**, configurator
+
+**Mechanical parts:**
+- Sketchfab **CC0 - Gear** (plaggy) — **CC0**, 4K PBR metallic
+- Khronos **CarbonFibre** — anisotropy on carbon fiber
+
+### 3. Healthcare / Medical
+
+**Anatomy:**
+- Sketchfab "Human Skeleton" (Terrie Simmons-Ehrhardt) — CC-BY, NIH source, CT-derived
+- Sketchfab "Human Skull: Colored Bone Anatomy" (SGU BioMedViz) — color-coded bones
+
+**Medical devices:**
+- Sketchfab "MRI Machine" (Phillip Stephens) — recognizable equipment
+- Sketchfab "Surgical Instruments Collection" (Digital Surgery) — accurate tools
+
+**Molecular:**
+- Sketchfab "DNA by Holoxica" — clean double helix
+- Sketchfab "16-base-pair B-DNA" (S.Duce) — from Protein Data Bank X-ray data
+
+### 4. Real Estate / Architecture
+
+**Houses:**
+- Sketchfab "American House" (AleixoAlonso) — CC-BY, PBR, exterior + kitchen
+- Sketchfab "Buildings_kit_1.0" (britdawgmasterfunk) — **CC0**, domestic housing kit
+
+**Interiors:**
+- Poly Haven indoor models — **CC0**, photoscanned furniture/props, 4K-8K PBR
+
+### 5. Education / STEM
+
+**Solar system:**
+- Sketchfab "Earth 3D Globe" (Jeremy Faivre) — CC-BY
+- Sketchfab "Solar System" (dannzjs)
+
+**Dinosaurs:**
+- Sketchfab "Animated Triceratops Skeleton" (Zacxophone) — **CC0**, Smithsonian scan, animated walk
+- Sketchfab "T. rex / Triceratops" (Thomas Flynn / Smithsonian DPO) — **CC0**, museum quality
+
+**Artifacts:**
+- Sketchfab "4k Antique Ceramic Vase" (mohamedhussien) — **CC0**
+- Sketchfab "CC0 Museum Artifacts Collection" (danielpett) — all **CC0**
+
+### 6. Gaming / Entertainment
+
+**Characters:**
+- Quaternius "Ultimate Platformer Pack" — **CC0**, 100+ models, 18 character animations
+- Sketchfab "The Forgotten Knight" (dark_igorek) — CC-BY, rigged fantasy knight
+
+**Robots:**
+- Sketchfab "Futuristic Flying Animated Robot" (Shayan) — 5.7K polys, animated
+- Sketchfab "MechaVolt MK-II" (DevPoly3D) — PBR, optimized for VR/AR
+
+**Weapons:**
+- OpenGameArt "CC0 - 3D Weapons" — **CC0**, shields, swords, fantasy weapons
+
+**Landscapes:**
+- Quaternius "Ultimate Space Kit" — **CC0**, 90+ models
+- Kenney Nature Assets — **CC0**, consistent low-poly style
+
+---
+
+## Khronos Models — Feature Demo Matrix
+
+| Model | Extension / Feature | Best For |
+|-------|-------------------|----------|
+| ToyCar | clearcoat | Automotive paint |
+| SheenChair | sheen | Fabric/velvet |
+| MaterialsVariantsShoe | variants | Color configurator |
+| Sunglasses | iridescence + transmission | AR try-on |
+| FlightHelmet | multi-material | Material showcase |
+| DragonAttenuation | transmission + volume | Glass/transparency |
+| CarbonFibre | anisotropy | Sports/automotive |
+| DiffuseTransmissionPlant | diffuse transmission | Nature/foliage |
+| AnisotropyBarnLamp | 6 extensions combined | Advanced materials |
+| CommercialRefrigerator | glass + animation | Retail/appliance |
diff --git a/try-demo b/try-demo
new file mode 100755
index 000000000..f698f1739
--- /dev/null
+++ b/try-demo
@@ -0,0 +1,201 @@
+#!/usr/bin/env bash
+# ─────────────────────────────────────────────────────────────────────
+# SceneView Demo — one-click installer
+#
+# Usage:
+# ./try-demo # Build & install the demo app
+# ./try-demo --download # Download latest APK from GitHub Releases
+# ./try-demo --sample ar-model-viewer # Build & install a specific sample
+#
+# Requirements:
+# - Android device connected via USB/Wi-Fi with USB debugging ON
+# - Java 17+ (for local build)
+# - adb on PATH (comes with Android SDK)
+# ─────────────────────────────────────────────────────────────────────
+set -euo pipefail
+
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+CYAN='\033[0;36m'
+BOLD='\033[1m'
+RESET='\033[0m'
+
+REPO_ROOT="$(cd "$(dirname "$0")" && pwd)"
+DEMO_MODULE=":samples:sceneview-demo"
+DEMO_PKG="io.github.sceneview.demo"
+GITHUB_REPO="SceneView/sceneview-android"
+
+banner() {
+ echo ""
+ echo -e "${CYAN}${BOLD}╔══════════════════════════════════════════╗${RESET}"
+ echo -e "${CYAN}${BOLD}║ SceneView Demo Installer ║${RESET}"
+ echo -e "${CYAN}${BOLD}║ 3D & AR for Jetpack Compose — try it ║${RESET}"
+ echo -e "${CYAN}${BOLD}╚══════════════════════════════════════════╝${RESET}"
+ echo ""
+}
+
+check_device() {
+ if ! command -v adb &>/dev/null; then
+ echo -e "${RED}Error: adb not found. Install Android SDK platform-tools.${RESET}"
+ echo " brew install android-platform-tools # macOS"
+ echo " sudo apt install adb # Linux"
+ exit 1
+ fi
+
+ local devices
+ devices=$(adb devices | grep -c 'device$' || true)
+ if [[ "$devices" -eq 0 ]]; then
+ echo -e "${RED}No Android device detected.${RESET}"
+ echo ""
+ echo " 1. Connect your phone via USB"
+ echo " 2. Enable USB debugging in Developer Options"
+ echo " 3. Accept the USB debugging prompt on your phone"
+ echo ""
+ echo -e " Or use Wi-Fi: ${CYAN}adb connect
:5555${RESET}"
+ exit 1
+ fi
+ echo -e "${GREEN}✓${RESET} Device connected ($devices device(s))"
+}
+
+download_and_install() {
+ echo -e "${CYAN}Downloading latest demo APK from GitHub Releases...${RESET}"
+
+ local url
+ if command -v gh &>/dev/null; then
+ url=$(gh release view --repo "$GITHUB_REPO" --json assets \
+ --jq '.assets[] | select(.name == "sceneview-demo.apk") | .url' 2>/dev/null || true)
+ fi
+
+ if [[ -z "${url:-}" ]]; then
+ url="https://github.com/$GITHUB_REPO/releases/latest/download/sceneview-demo.apk"
+ fi
+
+ local tmp_apk="/tmp/sceneview-demo.apk"
+ curl -fSL --progress-bar -o "$tmp_apk" "$url"
+ echo -e "${GREEN}✓${RESET} Downloaded"
+
+ echo -e "${CYAN}Installing on device...${RESET}"
+ adb install -r "$tmp_apk"
+ echo -e "${GREEN}✓${RESET} Installed"
+
+ launch_app
+}
+
+build_and_install() {
+ local module="${1:-$DEMO_MODULE}"
+ local pkg="${2:-$DEMO_PKG}"
+
+ echo -e "${CYAN}Building ${BOLD}${module}${RESET}${CYAN}...${RESET}"
+ cd "$REPO_ROOT"
+
+ if [[ ! -f gradlew ]]; then
+ echo -e "${RED}Error: gradlew not found. Are you in the SceneView repo root?${RESET}"
+ exit 1
+ fi
+
+ chmod +x gradlew
+ ./gradlew "${module}:assembleDebug" --console=plain -q
+
+ local apk
+ apk=$(find "$REPO_ROOT" -path "*${module##*:}*/build/outputs/apk/debug/*.apk" | head -1)
+ if [[ -z "$apk" ]]; then
+ # Fallback: search by module name converted to path
+ local module_path="${module//:///}"
+ apk=$(find "$REPO_ROOT${module_path}/build/outputs/apk/debug" -name "*.apk" 2>/dev/null | head -1)
+ fi
+
+ if [[ -z "$apk" ]]; then
+ echo -e "${RED}Error: APK not found after build.${RESET}"
+ exit 1
+ fi
+
+ echo -e "${GREEN}✓${RESET} Built: $(basename "$apk")"
+ echo -e "${CYAN}Installing on device...${RESET}"
+ adb install -r "$apk"
+ echo -e "${GREEN}✓${RESET} Installed"
+
+ launch_app "$pkg"
+}
+
+launch_app() {
+ local pkg="${1:-$DEMO_PKG}"
+ echo -e "${CYAN}Launching...${RESET}"
+ adb shell am start -n "${pkg}/.MainActivity" 2>/dev/null \
+ || adb shell monkey -p "$pkg" -c android.intent.category.LAUNCHER 1 2>/dev/null \
+ || true
+ echo ""
+ echo -e "${GREEN}${BOLD}🎉 SceneView Demo is running on your device!${RESET}"
+ echo -e " Explore 3D models, switch environments, try animations."
+ echo ""
+}
+
+# ── Sample name → Gradle module mapping ──
+sample_to_module() {
+ local sample="$1"
+ case "$sample" in
+ demo|sceneview-demo) echo ":samples:sceneview-demo" ;;
+ model-viewer) echo ":samples:model-viewer" ;;
+ ar-model-viewer) echo ":samples:ar-model-viewer" ;;
+ ar-augmented-image) echo ":samples:ar-augmented-image" ;;
+ ar-cloud-anchor) echo ":samples:ar-cloud-anchor" ;;
+ ar-point-cloud) echo ":samples:ar-point-cloud" ;;
+ camera-manipulator) echo ":samples:camera-manipulator" ;;
+ gltf-camera) echo ":samples:gltf-camera" ;;
+ autopilot-demo) echo ":samples:autopilot-demo" ;;
+ physics-demo) echo ":samples:physics-demo" ;;
+ dynamic-sky) echo ":samples:dynamic-sky" ;;
+ line-path) echo ":samples:line-path" ;;
+ text-labels) echo ":samples:text-labels" ;;
+ reflection-probe) echo ":samples:reflection-probe" ;;
+ post-processing) echo ":samples:post-processing" ;;
+ *)
+ echo -e "${RED}Unknown sample: $sample${RESET}" >&2
+ echo "Available: demo, model-viewer, ar-model-viewer, camera-manipulator," >&2
+ echo " gltf-camera, autopilot-demo, physics-demo, dynamic-sky, line-path," >&2
+ echo " text-labels, reflection-probe, post-processing, ar-augmented-image," >&2
+ echo " ar-cloud-anchor, ar-point-cloud" >&2
+ exit 1
+ ;;
+ esac
+}
+
+# ── Main ──
+banner
+
+MODE="build"
+SAMPLE=""
+
+while [[ $# -gt 0 ]]; do
+ case "$1" in
+ --download|-d) MODE="download"; shift ;;
+ --sample|-s) SAMPLE="$2"; shift 2 ;;
+ --help|-h)
+ echo "Usage: ./try-demo [OPTIONS]"
+ echo ""
+ echo "Options:"
+ echo " --download, -d Download latest APK from GitHub Releases"
+ echo " --sample, -s NAME Build a specific sample (e.g. ar-model-viewer)"
+ echo " --help, -h Show this help"
+ echo ""
+ echo "Examples:"
+ echo " ./try-demo # Build & install the demo app"
+ echo " ./try-demo --download # Download pre-built APK"
+ echo " ./try-demo --sample physics-demo # Try the physics sample"
+ exit 0
+ ;;
+ *) echo -e "${RED}Unknown option: $1${RESET}"; exit 1 ;;
+ esac
+done
+
+check_device
+
+if [[ "$MODE" == "download" ]]; then
+ download_and_install
+elif [[ -n "$SAMPLE" ]]; then
+ module=$(sample_to_module "$SAMPLE")
+ # Derive package from sample name
+ sample_pkg="io.github.sceneview.sample.${SAMPLE//-/.}"
+ build_and_install "$module" "$sample_pkg"
+else
+ build_and_install
+fi