# stephengold/monkeywrench architecture

> Architecture diagram of the GitHub repository stephengold/monkeywrench, 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/stephengold/monkeywrench
- Repository: https://github.com/stephengold/monkeywrench

## Overview

MonkeyWrench is a JVM library for importing 3-D models and animations into jMonkeyEngine. The principal workflow is to configure a load with an asset key, import a supported asset through the Assimp-based runtime, convert scene content into JME objects, and resolve referenced textures. The README also describes example and comparison applications. Some runtime classes are documented or present in the tree but were not sampled, so uncertain internal call links are omitted.

Main entry points: [`lib/src/main/java/com/github/stephengold/wrench/AssetBuilder.java`](https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/AssetBuilder.java) (AssetBuilder), [`lib/src/main/java/com/github/stephengold/wrench/LwjglReader.java`](https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/LwjglReader.java) (LwjglReader), [`lib/src/main/java/com/github/stephengold/wrench/LwjglAssetLoader.java`](https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/LwjglAssetLoader.java) (Asset loader), [`lib/src/main/java/com/github/stephengold/wrench/AssetKeyBuilder.java`](https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/AssetKeyBuilder.java) (AssetKeyBuilder)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_configuration["Load configuration"]
  node_keybuilder["AssetKeyBuilder"]
  node_key["LwjglAssetKey<br/>[LwjglAssetKey.java]"]
end

subgraph group_import["Asset import"]
  node_loader["Asset loader"]
  node_reader["LwjglReader<br/>[LwjglReader.java]"]
  node_filesystem["Asset filesystem"]
end

subgraph group_conversion["JME conversion"]
  node_assetbuilder["AssetBuilder<br/>[AssetBuilder.java]"]
  node_mesh["MeshBuilder<br/>[MeshBuilder.java]"]
  node_material["MaterialBuilder"]
  node_skinner["SkinnerBuilder"]
  node_texture["TextureLoader<br/>[TextureLoader.java]"]
  node_scene["JME scene and animation<br/>[AssetBuilder.java]"]
end

subgraph group_applications["Related applications"]
  node_importmixamo["ImportMixamo<br/>[ImportMixamo.java]"]
  node_compare["CompareLoaders"]
  node_appdata["Example and test assets"]
end

node_user(("JME application"))
node_asset["3-D asset"]
node_lwjgl{{"LWJGL Assimp"}}
node_jme{{"JME runtime"}}

node_user -->|"configures import"| node_keybuilder
node_keybuilder -->|"builds key"| node_key
node_user -->|"requests model"| node_loader
node_asset -->|"supplies asset"| node_loader
node_loader --> node_reader
node_reader -->|"imports scene"| node_lwjgl
node_reader --> node_filesystem
node_reader --> node_assetbuilder
node_assetbuilder -->|"converts meshes"| node_mesh
node_assetbuilder -->|"converts materials"| node_material
node_assetbuilder -->|"builds skinning"| node_skinner
node_material -->|"loads textures"| node_texture
node_texture -->|"creates textures"| node_jme
node_assetbuilder -->|"builds scene"| node_scene
node_scene -->|"returns JME objects"| node_jme
node_user -->|"runs example"| node_importmixamo
node_user -->|"runs comparison"| node_compare
node_compare -->|"uses test assets"| node_appdata
node_importmixamo -->|"loads assets"| node_loader

click node_keybuilder "https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/AssetKeyBuilder.java"
click node_key "https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/LwjglAssetKey.java"
click node_loader "https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/LwjglAssetLoader.java"
click node_reader "https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/LwjglReader.java"
click node_filesystem "https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/AssetFileSystem.java"
click node_assetbuilder "https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/AssetBuilder.java"
click node_mesh "https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/MeshBuilder.java"
click node_material "https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/MaterialBuilder.java"
click node_skinner "https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/SkinnerBuilder.java"
click node_texture "https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/TextureLoader.java"
click node_scene "https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/AssetBuilder.java"
click node_importmixamo "https://github.com/stephengold/monkeywrench/blob/master/apps/src/main/java/com/github/stephengold/wrench/example/ImportMixamo.java"
click node_compare "https://github.com/stephengold/monkeywrench/blob/master/apps/src/main/java/com/github/stephengold/wrench/test/CompareLoaders.java"
click node_appdata "https://github.com/stephengold/monkeywrench/tree/master/apps/src/main/java/com/github/stephengold/wrench/test"

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_keybuilder,node_key toneBlue
class node_loader,node_reader,node_filesystem toneAmber
class node_assetbuilder,node_mesh,node_material,node_skinner,node_texture,node_scene toneMint
class node_importmixamo,node_compare,node_appdata toneRose
class node_user,node_asset,node_lwjgl,node_jme toneIndigo
```

## Components

### Load configuration

- [AssetKeyBuilder](https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/AssetKeyBuilder.java): `lib/src/main/java/com/github/stephengold/wrench/AssetKeyBuilder.java`
- [LwjglAssetKey](https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/LwjglAssetKey.java): `lib/src/main/java/com/github/stephengold/wrench/LwjglAssetKey.java`

### Asset import

- [Asset loader](https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/LwjglAssetLoader.java): `lib/src/main/java/com/github/stephengold/wrench/LwjglAssetLoader.java`
- [LwjglReader](https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/LwjglReader.java): `lib/src/main/java/com/github/stephengold/wrench/LwjglReader.java`
- [Asset filesystem](https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/AssetFileSystem.java): `lib/src/main/java/com/github/stephengold/wrench/AssetFileSystem.java`

### JME conversion

- [AssetBuilder](https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/AssetBuilder.java): `lib/src/main/java/com/github/stephengold/wrench/AssetBuilder.java`
- [MeshBuilder](https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/MeshBuilder.java): `lib/src/main/java/com/github/stephengold/wrench/MeshBuilder.java`
- [MaterialBuilder](https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/MaterialBuilder.java): `lib/src/main/java/com/github/stephengold/wrench/MaterialBuilder.java`
- [SkinnerBuilder](https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/SkinnerBuilder.java): `lib/src/main/java/com/github/stephengold/wrench/SkinnerBuilder.java`
- [TextureLoader](https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/TextureLoader.java): `lib/src/main/java/com/github/stephengold/wrench/TextureLoader.java`
- [JME scene and animation](https://github.com/stephengold/monkeywrench/blob/master/lib/src/main/java/com/github/stephengold/wrench/AssetBuilder.java): `lib/src/main/java/com/github/stephengold/wrench/AssetBuilder.java`

### Related applications

- [ImportMixamo](https://github.com/stephengold/monkeywrench/blob/master/apps/src/main/java/com/github/stephengold/wrench/example/ImportMixamo.java): `apps/src/main/java/com/github/stephengold/wrench/example/ImportMixamo.java`
- [CompareLoaders](https://github.com/stephengold/monkeywrench/blob/master/apps/src/main/java/com/github/stephengold/wrench/test/CompareLoaders.java): `apps/src/main/java/com/github/stephengold/wrench/test/CompareLoaders.java`
- [Example and test assets](https://github.com/stephengold/monkeywrench/tree/master/apps/src/main/java/com/github/stephengold/wrench/test): `apps/src/main/java/com/github/stephengold/wrench/test`

### Other components

- **JME application**
- **3-D asset**
- **LWJGL Assimp**
- **JME runtime**

## Connections

- JME application → AssetKeyBuilder: configures import
- AssetKeyBuilder → LwjglAssetKey: builds key
- JME application → Asset loader: requests model
- 3-D asset → Asset loader: supplies asset
- Asset loader → LwjglReader
- LwjglReader → LWJGL Assimp: imports scene
- LwjglReader → Asset filesystem
- LwjglReader → AssetBuilder
- AssetBuilder → MeshBuilder: converts meshes
- AssetBuilder → MaterialBuilder: converts materials
- AssetBuilder → SkinnerBuilder: builds skinning
- MaterialBuilder → TextureLoader: loads textures
- TextureLoader → JME runtime: creates textures
- AssetBuilder → JME scene and animation: builds scene
- JME scene and animation → JME runtime: returns JME objects
- JME application → ImportMixamo: runs example
- JME application → CompareLoaders: runs comparison
- CompareLoaders → Example and test assets: uses test assets
- ImportMixamo → Asset loader: loads assets
