# xianxiaowei/skymodelviewer-android architecture

> Architecture diagram of the GitHub repository xianxiaowei/skymodelviewer-android, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/xianxiaowei/skymodelviewer-android
- Repository: https://github.com/xianxiaowei/skymodelviewer-android

## Overview

Sky Model Viewer is an Android, read-only viewer for locally supplied Sky assets. Its principal workflow is selecting a local asset source, scanning and parsing mesh or level data, then viewing the result or exporting it. The README also documents texture and animation support, wardrobe and map tools, and multiple export formats. MainActivity and several supporting paths were only partially sampled, so the graph follows documented capabilities where implementation details are not visible; optional AI and auxiliary badge/piano features are kept distinct.

Main entry points: [`SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/MainActivity.java`](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/MainActivity.java) (Main activity), [`SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/ai/AIChatDialog.java`](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/ai/AIChatDialog.java) (AI chat dialog), [`SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/scanner/SkyAssetScanner.java`](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/scanner/SkyAssetScanner.java) (Asset scanner), [`SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/parsing/TgcMeshReader.java`](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/parsing/TgcMeshReader.java) (Mesh parsing)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["App workflow"]
  node_main["Main activity<br/>[MainActivity.java]"]
  node_settings["App settings<br/>[AppSettings.java]"]
end

subgraph group_assets["Asset discovery"]
  node_scanner["Asset scanner"]
  node_resolver["Resource resolver"]
  node_meshparse["Mesh parsing<br/>[TgcMeshReader.java]"]
  node_levelparse["Level parsing"]
  node_mapextract["Map extraction"]
  node_assetdata["Mesh data<br/>[MeshData.java]"]
  node_anim["Animation decoding"]
end

subgraph group_view["Viewing and export"]
  node_texture["Texture loading"]
  node_renderer["3D renderer<br/>[MeshRenderer.java]"]
  node_surface["3D viewport"]
  node_export["Model exporters<br/>[ObjExporter.java]"]
  node_textureexport["Texture exporter"]
end

subgraph group_extras["Additional tools"]
  node_wardrobe["Wardrobe browsing"]
  node_audio["Audio bank parsing"]
  node_badge["Badge helper"]
  node_piano["Piano playback<br/>[PianoActivity.java]"]
  node_sheet["Sheet parsing<br/>[SheetParser.java]"]
end

subgraph group_assistant["AI assistant"]
  node_aiui["AI chat dialog<br/>[AIChatDialog.java]"]
  node_context["AI context builder"]
  node_commands["AI commands"]
  node_aiclient["AI client<br/>[AIClient.java]"]
end

node_user(("Viewer user"))
node_aiendpoint(("Configured AI service"))

node_user -->|"selects assets"| node_main
node_main -->|"scans source"| node_scanner
node_scanner -->|"locates resources"| node_resolver
node_main -->|"loads mesh"| node_meshparse
node_main -->|"loads level"| node_levelparse
node_main -->|"extracts map"| node_mapextract
node_meshparse -->|"produces mesh data"| node_assetdata
node_levelparse -->|"produces terrain data"| node_assetdata
node_main -->|"decodes animation"| node_anim
node_main -->|"displays model"| node_renderer
node_renderer -->|"loads textures"| node_texture
node_main -->|"shows viewport"| node_surface
node_main -->|"exports geometry"| node_export
node_main -->|"exports textures"| node_textureexport
node_main -->|"browses wardrobe"| node_wardrobe
node_main -->|"browses audio"| node_audio
node_main -->|"opens badge tools"| node_badge
node_main -->|"opens piano tools"| node_piano
node_piano -->|"parses sheet"| node_sheet
node_main -.->|"opens assistant"| node_aiui
node_aiui -.->|"builds context"| node_context
node_aiui -.->|"sends chat"| node_aiclient
node_aiclient -.->|"requests response"| node_aiendpoint
node_aiui -.->|"dispatches commands"| node_commands
node_main -->|"reads preferences"| node_settings

click node_main "https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/MainActivity.java"
click node_settings "https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/AppSettings.java"
click node_scanner "https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/scanner/SkyAssetScanner.java"
click node_resolver "https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/scanner/SkyResourceResolver.java"
click node_meshparse "https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/parsing/TgcMeshReader.java"
click node_levelparse "https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/parsing/LevelMeshesReader.java"
click node_mapextract "https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/parsing/LevelMeshExtractor.java"
click node_assetdata "https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/model/MeshData.java"
click node_anim "https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/parsing/AnimPackParser.java"
click node_texture "https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/render/KtxTextureLoader.java"
click node_renderer "https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/render/MeshRenderer.java"
click node_surface "https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/render/MeshSurfaceView.java"
click node_export "https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/export/ObjExporter.java"
click node_textureexport "https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/export/TextureExporter.java"
click node_wardrobe "https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/ui/WardrobeGridAdapter.java"
click node_audio "https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/parsing/FmodBankParser.java"
click node_badge "https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/badge/BadgeHelperActivity.java"
click node_piano "https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/piano/PianoActivity.java"
click node_sheet "https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/piano/SheetParser.java"
click node_aiui "https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/ai/AIChatDialog.java"
click node_context "https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/ai/AIContextBuilder.java"
click node_commands "https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/ai/AICommandExecutor.java"
click node_aiclient "https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/ai/AIClient.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_main,node_settings,node_user toneBlue
class node_scanner,node_resolver,node_meshparse,node_levelparse,node_mapextract,node_assetdata,node_anim toneAmber
class node_texture,node_renderer,node_surface,node_export,node_textureexport toneMint
class node_wardrobe,node_audio,node_badge,node_piano,node_sheet toneRose
class node_aiui,node_context,node_commands,node_aiclient,node_aiendpoint toneIndigo
```

## Components

### App workflow

- [Main activity](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/MainActivity.java): `SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/MainActivity.java`
- [App settings](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/AppSettings.java): `SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/AppSettings.java`

### Asset discovery

- [Asset scanner](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/scanner/SkyAssetScanner.java): `SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/scanner/SkyAssetScanner.java`
- [Resource resolver](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/scanner/SkyResourceResolver.java): `SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/scanner/SkyResourceResolver.java`
- [Mesh parsing](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/parsing/TgcMeshReader.java): `SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/parsing/TgcMeshReader.java`
- [Level parsing](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/parsing/LevelMeshesReader.java): `SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/parsing/LevelMeshesReader.java`
- [Map extraction](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/parsing/LevelMeshExtractor.java): `SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/parsing/LevelMeshExtractor.java`
- [Mesh data](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/model/MeshData.java): `SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/model/MeshData.java`
- [Animation decoding](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/parsing/AnimPackParser.java): `SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/parsing/AnimPackParser.java`

### Viewing and export

- [Texture loading](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/render/KtxTextureLoader.java): `SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/render/KtxTextureLoader.java`
- [3D renderer](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/render/MeshRenderer.java): `SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/render/MeshRenderer.java`
- [3D viewport](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/render/MeshSurfaceView.java): `SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/render/MeshSurfaceView.java`
- [Model exporters](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/export/ObjExporter.java): `SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/export/ObjExporter.java`
- [Texture exporter](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/export/TextureExporter.java): `SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/export/TextureExporter.java`

### Additional tools

- [Wardrobe browsing](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/ui/WardrobeGridAdapter.java): `SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/ui/WardrobeGridAdapter.java`
- [Audio bank parsing](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/parsing/FmodBankParser.java): `SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/parsing/FmodBankParser.java`
- [Badge helper](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/badge/BadgeHelperActivity.java): `SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/badge/BadgeHelperActivity.java`
- [Piano playback](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/piano/PianoActivity.java): `SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/piano/PianoActivity.java`
- [Sheet parsing](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/piano/SheetParser.java): `SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/piano/SheetParser.java`

### AI assistant

- [AI chat dialog](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/ai/AIChatDialog.java): `SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/ai/AIChatDialog.java`
- [AI context builder](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/ai/AIContextBuilder.java): `SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/ai/AIContextBuilder.java`
- [AI commands](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/ai/AICommandExecutor.java): `SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/ai/AICommandExecutor.java`
- [AI client](https://github.com/xianxiaowei/skymodelviewer-android/blob/main/SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/ai/AIClient.java): `SkyModelViewerAIDE/app/src/main/java/com/sky/modelviewer/ai/AIClient.java`

### Other components

- **Viewer user**
- **Configured AI service**

## Connections

- Viewer user → Main activity: selects assets
- Main activity → Asset scanner: scans source
- Asset scanner → Resource resolver: locates resources
- Main activity → Mesh parsing: loads mesh
- Main activity → Level parsing: loads level
- Main activity → Map extraction: extracts map
- Mesh parsing → Mesh data: produces mesh data
- Level parsing → Mesh data: produces terrain data
- Main activity → Animation decoding: decodes animation
- Main activity → 3D renderer: displays model
- 3D renderer → Texture loading: loads textures
- Main activity → 3D viewport: shows viewport
- Main activity → Model exporters: exports geometry
- Main activity → Texture exporter: exports textures
- Main activity → Wardrobe browsing: browses wardrobe
- Main activity → Audio bank parsing: browses audio
- Main activity → Badge helper: opens badge tools
- Main activity → Piano playback: opens piano tools
- Piano playback → Sheet parsing: parses sheet
- Main activity → AI chat dialog: opens assistant
- AI chat dialog → AI context builder: builds context
- AI chat dialog → AI client: sends chat
- AI client → Configured AI service: requests response
- AI chat dialog → AI commands: dispatches commands
- Main activity → App settings: reads preferences
