Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 47 additions & 4 deletions .github/workflows/build-apks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,55 @@ name: Build sample APKs

on:
push:
branches: [main]
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
pull_request:
branches: [main]
workflow_dispatch:

jobs:
build-demo:
name: Build demo APK (quick — always available)
runs-on: ubuntu-latest
permissions:
contents: write

steps:
- uses: actions/checkout@v4

- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
cache: gradle

- run: chmod +x ./gradlew

- name: Build SceneView Demo APK
run: ./gradlew :samples:sceneview-demo:assembleDebug --console=plain

- name: Collect demo APK
run: |
mkdir -p dist
apk=$(find samples/sceneview-demo/build/outputs/apk/debug -name "*.apk" | head -1)
cp "$apk" dist/sceneview-demo.apk

- name: Upload demo APK
uses: actions/upload-artifact@v4
with:
name: sceneview-demo-apk
path: dist/sceneview-demo.apk
retention-days: 90

- name: Attach demo APK to GitHub Release
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
uses: softprops/action-gh-release@v2
with:
files: dist/sceneview-demo.apk

build-samples:
name: Build sample APKs
name: Build all sample APKs
runs-on: ubuntu-latest
permissions:
contents: write
Expand All @@ -28,6 +70,7 @@ jobs:
- name: Build all sample APKs
run: |
./gradlew \
:samples:sceneview-demo:assembleDebug \
:samples:model-viewer:assembleDebug \
:samples:camera-manipulator:assembleDebug \
:samples:gltf-camera:assembleDebug \
Expand All @@ -47,9 +90,9 @@ jobs:
- name: Collect APKs
run: |
mkdir -p dist
for sample in model-viewer camera-manipulator gltf-camera autopilot-demo \
physics-demo post-processing dynamic-sky line-path \
text-labels reflection-probe \
for sample in sceneview-demo model-viewer camera-manipulator gltf-camera \
autopilot-demo physics-demo post-processing dynamic-sky \
line-path text-labels reflection-probe \
ar-model-viewer ar-augmented-image ar-cloud-anchor ar-point-cloud; do
apk=$(find "samples/$sample/build/outputs/apk/debug" -name "*.apk" | head -1)
if [ -n "$apk" ]; then
Expand Down
4 changes: 4 additions & 0 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ on:
- 'CONTRIBUTING.md'
- 'ROADMAP.md'
- 'llms.txt'
- 'sceneview/Module.md'
- 'arsceneview/Module.md'
release:
types: [published]
workflow_dispatch:

jobs:
Expand Down
3 changes: 1 addition & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,5 @@ samples/*/build/
# MCP compiled test artifacts
mcp/dist/*.test.js
mcp/llms.txt

# MkDocs build output
sceneview-core/build/
docs/site/
10 changes: 5 additions & 5 deletions docs/docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ from your Kotlin code all the way down to the GPU.
SceneView is a stack of five layers. Each layer only talks to the one directly below it,
keeping responsibilities clean and dependencies one-directional.

```
```text
┌──────────────────────────────────────────────────┐
│ Your Android App (Kotlin/Compose) │
├──────────────────────────────────────────────────┤
Expand Down Expand Up @@ -124,7 +124,7 @@ maintains an idempotent `managedNodes` set to prevent double-add/remove.

### How the threading works in practice

```
```text
┌────────────────────┐ ┌──────────────────────┐
│ Dispatchers.IO │ │ Main Thread │
│ │ │ │
Expand Down Expand Up @@ -190,7 +190,7 @@ LaunchedEffect(engine, renderer, view, scene) {
SceneView ties every Filament resource to Compose's lifecycle through `remember` +
`DisposableEffect`, following a consistent pattern:

```
```text
remember { create resource } → DisposableEffect { onDispose { destroy resource } }
```

Expand Down Expand Up @@ -228,7 +228,7 @@ registered models when the loader itself is disposed.

Every frame follows this sequence:

```
```text
1. Compose recomposition
└─ SideEffect pushes updated node properties to Filament entities

Expand Down Expand Up @@ -261,7 +261,7 @@ For AR scenes (`ARScene`), step 2 additionally:

SceneView is split into two Gradle modules with a strict dependency direction:

```
```text
┌─────────────────────┐ ┌─────────────────────────┐
│ sceneview/ │◀────────│ arsceneview/ │
│ │ depends │ │
Expand Down
Loading
Loading