# axiefeat/arc architecture

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

- Interactive diagram: https://gitdiagram.com/axiefeat/arc
- Repository: https://github.com/axiefeat/arc

## Overview

Arc Engine is a modular, implementation-agnostic 2D/3D game engine. A game installs and bootstraps an implementation, finds and initializes an Application, then uses its window and render context to build and draw vertex buffers with shaders. OpenGL, OpenGLES, and Vulkan are documented runtime alternatives; extensions add input, audio, display, fonts, models, and profiling. Source excerpts support selected API-to-implementation relationships, while several extension relationships are documented only at the product level.

Main entry points: [`arc-core/src/main/kotlin/arc/graphics/RenderContext.kt`](https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/graphics/RenderContext.kt) (Render Context), [`arc-core/src/main/kotlin/arc/Application.kt`](https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/Application.kt) (Application API), [`arc-core/src/main/kotlin/arc/Arc.kt`](https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/Arc.kt) (Factory Registry), [`arc-core/src/main/kotlin/arc/graphics/Drawer.kt`](https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/graphics/Drawer.kt) (Drawing API)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_runtime["Engine Runtime"]
  node_factory["Factory Registry<br/>[Arc.kt]"]
  node_application["Application API<br/>[Application.kt]"]
  node_window["Window API<br/>[Window.kt]"]
  node_assets["Asset API<br/>[AssetLike.kt]"]
end

subgraph group_render["Rendering API"]
  node_rendercontext["Render Context<br/>[RenderContext.kt]"]
  node_drawer["Drawing API<br/>[Drawer.kt]"]
  node_drawbuffer["Draw Buffer<br/>[DrawBuffer.kt]"]
  node_vertexbuffer["Vertex Buffer<br/>[VertexBuffer.kt]"]
  node_vertexformat["Vertex Format<br/>[VertexFormat.kt]"]
  node_shader["Shader Instance<br/>[ShaderInstance.kt]"]
  node_texture["Texture API<br/>[Texture.kt]"]
end

subgraph group_backends["Graphics Backends"]
  node_gl["OpenGL Backend<br/>[GlRenderContext.kt]"]
  node_gles["OpenGLES Backend"]
  node_vulkan["Vulkan Backend<br/>[VkRenderContext.kt]"]
end

subgraph group_extensions["Engine Extensions"]
  node_input["GLFW Input<br/>[GlfwInputEngine.kt]"]
  node_audio["OpenAL Audio<br/>[AlSoundEngine.kt]"]
  node_display["Virtual Display<br/>[Display.kt]"]
  node_font["Font Rendering<br/>[FontProvider.kt]"]
  node_model["Model System<br/>[ModelHandler.kt]"]
  node_profiler["Profiler<br/>[Profiler.kt]"]
end

subgraph group_annotations["API Annotations"]
  node_typefactory["Factory Annotation<br/>[TypeFactory.kt]"]
  node_immutable["Immutable Annotation<br/>[ImmutableType.kt]"]
  node_processor["Annotation Processor<br/>[SymbolProcessor.kt]"]
end

node_game(("Game Application"))

node_game -->|"installs and bootstraps"| node_factory
node_game -->|"finds and initializes"| node_application
node_factory -->|"provides implementation"| node_application
node_application -->|"exposes"| node_rendercontext
node_application -->|"exposes"| node_window
node_game -->|"builds vertices"| node_drawbuffer
node_drawbuffer -->|"builds"| node_vertexbuffer
node_game -->|"creates and compiles"| node_shader
node_rendercontext -->|"exposes"| node_drawer
node_drawer -->|"draws"| node_vertexbuffer
node_game -->|"begins and ends frames"| node_rendercontext
node_rendercontext -->|"manages"| node_shader
node_rendercontext -->|"manages"| node_texture
node_gl -->|"implements"| node_rendercontext
node_gles -->|"implements"| node_rendercontext
node_vulkan -->|"implements"| node_rendercontext
node_game -.->|"adds input extension"| node_input
node_game -.->|"adds audio extension"| node_audio
node_game -.->|"adds display extension"| node_display
node_game -.->|"adds font extension"| node_font
node_game -.->|"adds model extension"| node_model
node_game -.->|"adds profiler extension"| node_profiler
node_typefactory -->|"validated by"| node_processor
node_immutable -.->|"validated by"| node_processor

click node_factory "https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/Arc.kt"
click node_application "https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/Application.kt"
click node_window "https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/window/Window.kt"
click node_assets "https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/asset/AssetLike.kt"
click node_rendercontext "https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/graphics/RenderContext.kt"
click node_drawer "https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/graphics/Drawer.kt"
click node_drawbuffer "https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/graphics/DrawBuffer.kt"
click node_vertexbuffer "https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/graphics/vertex/VertexBuffer.kt"
click node_vertexformat "https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/graphics/vertex/VertexFormat.kt"
click node_shader "https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/shader/ShaderInstance.kt"
click node_texture "https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/texture/Texture.kt"
click node_gl "https://github.com/axiefeat/arc/blob/master/backend/render/arc-opengl/src/main/kotlin/arc/gl/graphics/GlRenderContext.kt"
click node_gles "https://github.com/axiefeat/arc/blob/master/backend/render/arc-opengles/src/main/kotlin/arc/gles/graphics/GlesRenderContext.kt"
click node_vulkan "https://github.com/axiefeat/arc/blob/master/backend/render/arc-vulkan/src/main/kotlin/arc/vk/graphics/VkRenderContext.kt"
click node_input "https://github.com/axiefeat/arc/blob/master/arc-extensions/arc-input/arc-input-glfw/src/main/kotlin/arc/input/GlfwInputEngine.kt"
click node_audio "https://github.com/axiefeat/arc/blob/master/arc-extensions/arc-audio/arc-audio-openal/src/main/kotlin/arc/audio/AlSoundEngine.kt"
click node_display "https://github.com/axiefeat/arc/blob/master/arc-extensions/arc-display/arc-display-core/src/main/kotlin/arc/display/Display.kt"
click node_font "https://github.com/axiefeat/arc/blob/master/arc-extensions/arc-font/arc-font-core/src/main/kotlin/arc/font/FontProvider.kt"
click node_model "https://github.com/axiefeat/arc/blob/master/arc-extensions/arc-model/arc-model-core/src/main/kotlin/arc/graphics/ModelHandler.kt"
click node_profiler "https://github.com/axiefeat/arc/blob/master/arc-extensions/arc-profiler/arc-profiler-core/src/main/kotlin/arc/profiler/Profiler.kt"
click node_typefactory "https://github.com/axiefeat/arc/blob/master/arc-annotations/src/main/kotlin/arc/annotations/TypeFactory.kt"
click node_immutable "https://github.com/axiefeat/arc/blob/master/arc-annotations/src/main/kotlin/arc/annotations/ImmutableType.kt"
click node_processor "https://github.com/axiefeat/arc/blob/master/arc-annotation-processor/src/main/kotlin/arc/annotation/processor/SymbolProcessor.kt"

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_factory,node_application,node_window,node_assets toneBlue
class node_rendercontext,node_drawer,node_drawbuffer,node_vertexbuffer,node_vertexformat,node_shader,node_texture toneAmber
class node_gl,node_gles,node_vulkan toneMint
class node_input,node_audio,node_display,node_font,node_model,node_profiler toneRose
class node_typefactory,node_immutable,node_processor,node_game toneIndigo
```

## Components

### Engine Runtime

- [Factory Registry](https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/Arc.kt): `arc-core/src/main/kotlin/arc/Arc.kt`
- [Application API](https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/Application.kt): `arc-core/src/main/kotlin/arc/Application.kt`
- [Window API](https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/window/Window.kt): `arc-core/src/main/kotlin/arc/window/Window.kt`
- [Asset API](https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/asset/AssetLike.kt): `arc-core/src/main/kotlin/arc/asset/AssetLike.kt`

### Rendering API

- [Render Context](https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/graphics/RenderContext.kt): `arc-core/src/main/kotlin/arc/graphics/RenderContext.kt`
- [Drawing API](https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/graphics/Drawer.kt): `arc-core/src/main/kotlin/arc/graphics/Drawer.kt`
- [Draw Buffer](https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/graphics/DrawBuffer.kt): `arc-core/src/main/kotlin/arc/graphics/DrawBuffer.kt`
- [Vertex Buffer](https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/graphics/vertex/VertexBuffer.kt): `arc-core/src/main/kotlin/arc/graphics/vertex/VertexBuffer.kt`
- [Vertex Format](https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/graphics/vertex/VertexFormat.kt): `arc-core/src/main/kotlin/arc/graphics/vertex/VertexFormat.kt`
- [Shader Instance](https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/shader/ShaderInstance.kt): `arc-core/src/main/kotlin/arc/shader/ShaderInstance.kt`
- [Texture API](https://github.com/axiefeat/arc/blob/master/arc-core/src/main/kotlin/arc/texture/Texture.kt): `arc-core/src/main/kotlin/arc/texture/Texture.kt`

### Graphics Backends

- [OpenGL Backend](https://github.com/axiefeat/arc/blob/master/backend/render/arc-opengl/src/main/kotlin/arc/gl/graphics/GlRenderContext.kt): `backend/render/arc-opengl/src/main/kotlin/arc/gl/graphics/GlRenderContext.kt`
- [OpenGLES Backend](https://github.com/axiefeat/arc/blob/master/backend/render/arc-opengles/src/main/kotlin/arc/gles/graphics/GlesRenderContext.kt): `backend/render/arc-opengles/src/main/kotlin/arc/gles/graphics/GlesRenderContext.kt`
- [Vulkan Backend](https://github.com/axiefeat/arc/blob/master/backend/render/arc-vulkan/src/main/kotlin/arc/vk/graphics/VkRenderContext.kt): `backend/render/arc-vulkan/src/main/kotlin/arc/vk/graphics/VkRenderContext.kt`

### Engine Extensions

- [GLFW Input](https://github.com/axiefeat/arc/blob/master/arc-extensions/arc-input/arc-input-glfw/src/main/kotlin/arc/input/GlfwInputEngine.kt): `arc-extensions/arc-input/arc-input-glfw/src/main/kotlin/arc/input/GlfwInputEngine.kt`
- [OpenAL Audio](https://github.com/axiefeat/arc/blob/master/arc-extensions/arc-audio/arc-audio-openal/src/main/kotlin/arc/audio/AlSoundEngine.kt): `arc-extensions/arc-audio/arc-audio-openal/src/main/kotlin/arc/audio/AlSoundEngine.kt`
- [Virtual Display](https://github.com/axiefeat/arc/blob/master/arc-extensions/arc-display/arc-display-core/src/main/kotlin/arc/display/Display.kt): `arc-extensions/arc-display/arc-display-core/src/main/kotlin/arc/display/Display.kt`
- [Font Rendering](https://github.com/axiefeat/arc/blob/master/arc-extensions/arc-font/arc-font-core/src/main/kotlin/arc/font/FontProvider.kt): `arc-extensions/arc-font/arc-font-core/src/main/kotlin/arc/font/FontProvider.kt`
- [Model System](https://github.com/axiefeat/arc/blob/master/arc-extensions/arc-model/arc-model-core/src/main/kotlin/arc/graphics/ModelHandler.kt): `arc-extensions/arc-model/arc-model-core/src/main/kotlin/arc/graphics/ModelHandler.kt`
- [Profiler](https://github.com/axiefeat/arc/blob/master/arc-extensions/arc-profiler/arc-profiler-core/src/main/kotlin/arc/profiler/Profiler.kt): `arc-extensions/arc-profiler/arc-profiler-core/src/main/kotlin/arc/profiler/Profiler.kt`

### API Annotations

- [Factory Annotation](https://github.com/axiefeat/arc/blob/master/arc-annotations/src/main/kotlin/arc/annotations/TypeFactory.kt): `arc-annotations/src/main/kotlin/arc/annotations/TypeFactory.kt`
- [Immutable Annotation](https://github.com/axiefeat/arc/blob/master/arc-annotations/src/main/kotlin/arc/annotations/ImmutableType.kt): `arc-annotations/src/main/kotlin/arc/annotations/ImmutableType.kt`
- [Annotation Processor](https://github.com/axiefeat/arc/blob/master/arc-annotation-processor/src/main/kotlin/arc/annotation/processor/SymbolProcessor.kt): `arc-annotation-processor/src/main/kotlin/arc/annotation/processor/SymbolProcessor.kt`

### Other components

- **Game Application**

## Connections

- Game Application → Factory Registry: installs and bootstraps (evidence: `README.md`)
- Game Application → Application API: finds and initializes (evidence: `README.md`)
- Factory Registry → Application API: provides implementation (evidence: `arc-core/src/main/kotlin/arc/Application.kt`)
- Application API → Render Context: exposes (evidence: `arc-core/src/main/kotlin/arc/Application.kt`)
- Application API → Window API: exposes (evidence: `arc-core/src/main/kotlin/arc/Application.kt`)
- Game Application → Draw Buffer: builds vertices (evidence: `README.md`)
- Draw Buffer → Vertex Buffer: builds (evidence: `arc-common/src/main/kotlin/arc/graphics/NativeDrawBuffer.kt`)
- Game Application → Shader Instance: creates and compiles (evidence: `README.md`)
- Render Context → Drawing API: exposes (evidence: `arc-core/src/main/kotlin/arc/graphics/RenderContext.kt`)
- Drawing API → Vertex Buffer: draws (evidence: `arc-core/src/main/kotlin/arc/graphics/Drawer.kt`)
- Game Application → Render Context: begins and ends frames (evidence: `README.md`)
- Render Context → Shader Instance: manages (evidence: `arc-core/src/main/kotlin/arc/graphics/RenderContext.kt`)
- Render Context → Texture API: manages (evidence: `arc-core/src/main/kotlin/arc/graphics/RenderContext.kt`)
- OpenGL Backend → Render Context: implements (evidence: `backend/render/arc-opengl/src/main/kotlin/arc/gl/graphics/GlRenderContext.kt`)
- OpenGLES Backend → Render Context: implements (evidence: `backend/render/arc-opengles/src/main/kotlin/arc/gles/graphics/GlesRenderContext.kt`)
- Vulkan Backend → Render Context: implements (evidence: `backend/render/arc-vulkan/src/main/kotlin/arc/vk/graphics/VkRenderContext.kt`)
- Game Application → GLFW Input: adds input extension (evidence: `README.md`)
- Game Application → OpenAL Audio: adds audio extension (evidence: `README.md`)
- Game Application → Virtual Display: adds display extension (evidence: `README.md`)
- Game Application → Font Rendering: adds font extension (evidence: `README.md`)
- Game Application → Model System: adds model extension (evidence: `README.md`)
- Game Application → Profiler: adds profiler extension (evidence: `README.md`)
- Factory Annotation → Annotation Processor: validated by (evidence: `arc-annotations/src/main/kotlin/arc/annotations/TypeFactory.kt`)
- Immutable Annotation → Annotation Processor: validated by
