Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

25 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

AsterEngine

AsterEngine Logo

A modern, ECS-based 3D game engine built with C++ and Metal for macOS

Features β€’ Architecture β€’ Getting Started β€’ Building β€’ Usage β€’ Documentation


πŸ“Έ Screenshots

AsterEditor Interface
AsterEditor - Full-featured game editor with hierarchy, inspector, and project panels

3D Scene View
Real-time 3D scene rendering with transform gizmos and debug visualization


✨ Features

Core Engine

  • Pure ECS Architecture - Entity Component System for data-driven game development
  • Metal Rendering Backend - High-performance graphics via Apple's Metal API
  • Real-time 3D Rendering - Modern rendering pipeline with PBR material support
  • Scene Management - Complete scene serialization and deserialization system
  • Asset Management - Automatic asset discovery and import system
  • Transform Hierarchy - Parent-child entity relationships with world-space transformations
  • Camera System - Free-look camera with WASD movement and mouse controls

Editor Features

  • Visual Editor - Native macOS editor built with AppKit
  • Hierarchy Panel - Tree view of scene entities with drag-and-drop support
  • Inspector Panel - Component-based property editing
  • Project Panel - Asset browser with import functionality
  • Transform Gizmos - Interactive 3D manipulation of entities
  • Debug Overlay - Real-time performance metrics and statistics
  • Welcome Window - Project management (create, open, recent projects)

Asset Pipeline

  • Mesh Import - Universal 3D model loader supporting:
    • OBJ format (with Assimp)
    • FBX, GLTF, COLLADA (extensible)
  • Texture Import - Image loading via STB Image
  • Procedural Primitives - Built-in mesh generation:
    • Cube, Sphere, Plane
    • Cylinder, Cone, Torus, Capsule

Component System

  • Transform - Position, rotation, scale with hierarchical support
  • Mesh - Geometry reference (primitive or imported)
  • Material - PBR properties (albedo, metallic, roughness)
  • MeshRenderer - Visibility and rendering control
  • Name - Entity naming for editor display

πŸ—οΈ Architecture

Overview

AsterEngine follows a modular, layered architecture designed for maintainability and extensibility:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Applications                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  AsterEditor   β”‚              β”‚   Game Runtime   β”‚  β”‚
β”‚  β”‚   (AppKit UI)  β”‚              β”‚  (Custom Client) β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                       β”‚                   β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                   Engine Runtime                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  ECS Core (Registry, Components, Systems)        β”‚  β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
β”‚  β”‚  Scene Management & Serialization                β”‚  β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
β”‚  β”‚  Asset Manager (Meshes, Textures, Materials)     β”‚  β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
β”‚  β”‚  Rendering System (Camera, Debug Draw, Gizmos)   β”‚  β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
β”‚  β”‚  Editor Bridge (C API for UI interop)            β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                             β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              Rendering Hardware Interface (RHI)          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  Abstract Interface (Device, Pipeline, Buffer)   β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  Metal Backend (DeviceMetal, BufferMetal, etc.)  β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Entity Component System (ECS)

The engine uses a sparse-set based ECS for optimal performance:

// Entities are lightweight IDs
using EntityId = uint32_t;

// Components are pure data (no logic)
struct Transform {
    Vec3 position, rotationEuler, scale;
    Mat4 worldMatrix;
    EntityId parent;
};

// Systems operate on component combinations
for (EntityId entity : registry.GetEntitiesWith<MeshRenderer>()) {
    const Transform* transform = registry.Get<Transform>(entity);
    const Mesh* mesh = registry.Get<Mesh>(entity);
    const Material* material = registry.Get<Material>(entity);
    // Render entity...
}

Key Benefits:

  • O(1) component lookup
  • Cache-friendly iteration
  • Data-driven design
  • Easy to extend with new components

Rendering Pipeline

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 1. Scene Query: Get entities with MeshRenderer component β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                             β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 2. Component Gather: Collect Transform, Mesh, Material   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                             β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 3. Resource Binding: Load meshes/textures on-demand      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                             β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 4. Metal Draw Calls: Indexed rendering with instancing   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                             β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 5. Debug Overlay: Gizmos, grid, statistics               β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

RHI Abstraction

The Rendering Hardware Interface (RHI) provides a clean abstraction over graphics APIs:

namespace aster::rhi {
    struct Device;      // GPU device management
    struct Swapchain;   // Present surface
    struct Pipeline;    // Shader program + state
    struct Buffer;      // GPU buffer (vertex/index/uniform)
    struct Texture;     // 2D/3D textures
    struct CommandList; // Command recording
}

Current Implementation: Metal (macOS)
Future Targets: Vulkan (cross-platform), DirectX 12 (Windows)

Project Structure

AsterEngine/
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ engine/
β”‚   β”‚   β”œβ”€β”€ ecs/              # Entity Component System
β”‚   β”‚   β”‚   β”œβ”€β”€ Entity.h      # Entity ID type definitions
β”‚   β”‚   β”‚   β”œβ”€β”€ Registry.h    # Component storage & queries
β”‚   β”‚   β”‚   └── Components.h  # Component definitions
β”‚   β”‚   β”œβ”€β”€ scene/            # Scene management
β”‚   β”‚   β”‚   β”œβ”€β”€ Scene.h       # Scene container
β”‚   β”‚   β”‚   └── SceneSerializer.h  # Save/load scenes
β”‚   β”‚   β”œβ”€β”€ runtime/          # Core engine systems
β”‚   β”‚   β”‚   β”œβ”€β”€ Engine.h      # Main engine class
β”‚   β”‚   β”‚   β”œβ”€β”€ Camera.h      # Camera controller
β”‚   β”‚   β”‚   β”œβ”€β”€ AssetManager.h    # Asset loading
β”‚   β”‚   β”‚   β”œβ”€β”€ MeshLoader.h      # Mesh import (OBJ, etc.)
β”‚   β”‚   β”‚   └── PrimitiveAssets.h # Procedural meshes
β”‚   β”‚   β”œβ”€β”€ render/           # Rendering utilities
β”‚   β”‚   β”‚   β”œβ”€β”€ DebugDraw.h   # Debug line rendering
β”‚   β”‚   β”‚   └── GizmoAxis.h   # Transform gizmos
β”‚   β”‚   β”œβ”€β”€ rhi/              # Graphics abstraction
β”‚   β”‚   β”‚   └── Pipeline.h    # RHI interface
β”‚   β”‚   β”œβ”€β”€ editor/           # Editor-engine bridge
β”‚   β”‚   β”‚   └── EditorBridge.h    # C API for UI
β”‚   β”‚   └── platform_macos/   # Platform layer
β”‚   β”‚       └── AppHost.mm    # Window & event handling
β”‚   β”œβ”€β”€ rhi/
β”‚   β”‚   └── metal/            # Metal implementation
β”‚   β”‚       β”œβ”€β”€ DeviceMetal.mm
β”‚   β”‚       β”œβ”€β”€ CommandListMetal.mm
β”‚   β”‚       └── ...
β”‚   β”œβ”€β”€ apps/
β”‚   β”‚   └── editor/           # Editor application
β”‚   β”‚       β”œβ”€β”€ EditorApp.mm  # Editor entry point
β”‚   β”‚       └── ui/           # UI panels (AppKit)
β”‚   └── main.cpp              # Game runtime entry
β”œβ”€β”€ third_party/              # External dependencies
β”‚   β”œβ”€β”€ stb_image.h           # Image loading
β”‚   └── assimp/               # 3D model import
β”œβ”€β”€ resources/                # App resources
β”œβ”€β”€ docs/                     # Documentation
└── CMakeLists.txt            # Build configuration

πŸš€ Getting Started

Prerequisites

  • macOS 11.0+ (Big Sur or later)
  • Xcode 13+ with Command Line Tools
  • CMake 4.0+
  • Homebrew (for dependencies)

Dependencies

Install required libraries via Homebrew:

brew install cmake assimp

Quick Start

  1. Clone the repository:

    git clone https://github.com/N3ur0sis/AsterEngine.git
    cd AsterEngine
  2. Create build directory:

    mkdir build && cd build
  3. Configure with CMake:

    cmake ..
  4. Build the project:

    cmake --build .
  5. Run the editor:

    open AsterEditor.app

πŸ”¨ Building

Build Targets

The project produces three targets:

  1. AsterEditor - Full-featured game editor
  2. AsterEngine - Minimal game runtime
  3. engine_runtime / engine_rhi_metal - Static libraries

Build Configuration

# Debug build (default)
cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake --build .

# Release build
cmake -DCMAKE_BUILD_TYPE=Release ..
cmake --build .

CMake Options

set(CMAKE_CXX_STANDARD 23)           # C++23 features
set(CMAKE_CXX_STANDARD_REQUIRED ON)

Build Outputs

build/
β”œβ”€β”€ AsterEditor.app/        # Editor application bundle
β”œβ”€β”€ AsterEngine.app/        # Game runtime bundle
β”œβ”€β”€ libengine_runtime.a     # Core engine library
└── libengine_rhi_metal.a   # Metal rendering backend

πŸ“– Usage

Creating a New Project

  1. Launch AsterEditor.app
  2. Click "Create New Project"
  3. Choose a name and location
  4. The editor creates:
    MyProject/
    β”œβ”€β”€ Assets/
    β”‚   └── Meshes/
    β”œβ”€β”€ Scenes/
    β”‚   └── SampleScene.json
    └── MyProject.aproj
    

Importing Assets

Method 1: Drag & Drop

  • Drag .obj, .fbx, or image files into the Project Panel

Method 2: Import Menu

  • Right-click in Project Panel β†’ "Import Asset..."
  • Select files to import

Scene Editing

Creating Entities:

  • Right-click in Hierarchy β†’ "Create Empty" or "Create Primitive"
  • Entities are created with Transform component by default

Adding Components:

  • Select an entity
  • Click "Add Component" in Inspector
  • Choose: Mesh, Material, or MeshRenderer

Transform Manipulation:

  • W - Translate gizmo
  • E - Rotate gizmo
  • R - Scale gizmo

Camera Controls:

  • Right-click + drag - Look around
  • WASD - Move camera
  • Q/E - Move up/down
  • Scroll - Adjust speed

Scripting (C++ API)

Create a custom game client:

#include "runtime/AppHost.h"
#include "runtime/Engine.h"

class MyGame : public AppClient {
    aster::Engine engine;
    
    void OnStartup() override {
        // Initialize engine
        engine.Initialize(surface, 1920, 1080);
        engine.LoadScene("Assets/Scenes/MainScene.json");
        
        // Create entities programmatically
        aster::Scene* scene = engine.GetScene();
        auto entity = scene->CreateEntity("Player");
        scene->AddComponent(entity, aster::Mesh{aster::PrimitiveMeshType::Sphere});
        scene->AddComponent(entity, aster::MeshRenderer{});
    }
    
    void OnUpdate(double dt) override {
        engine.Update(dt);
    }
    
    void OnRender() override {
        engine.Render();
    }
};

int main() {
    MyGame game;
    AppConfig cfg{"My Game", 1920, 1080};
    return RunApp(game, cfg);
}

πŸ“š Documentation

Core Concepts

API Reference

Engine Core

class Engine {
    bool Initialize(const PlatformSurface& surface, int w, int h);
    void Update(double dt);
    void Render();
    
    Scene* GetScene();
    Camera* GetCamera();
    AssetManager* GetAssetManager();
    
    void NewScene(const std::string& name = "New Scene");
    bool LoadScene(const std::filesystem::path& path);
    bool SaveScene(const std::filesystem::path& path);
};

Scene Management

class Scene {
    EntityId CreateEntity(const char* name = nullptr);
    void DestroyEntity(EntityId entity);
    
    template<typename T>
    T& AddComponent(EntityId entity, T&& component);
    
    template<typename T>
    T* GetComponent(EntityId entity);
    
    Registry& GetRegistry();
};

ECS Registry

class Registry {
    EntityId CreateEntity();
    void DestroyEntity(EntityId entity);
    
    template<typename T>
    T& Add(EntityId entity, T&& component);
    
    template<typename T>
    T* Get(EntityId entity);
    
    template<typename T>
    bool Has(EntityId entity);
    
    template<typename... Components>
    std::vector<EntityId> GetEntitiesWith();
};

🎯 Roadmap

Current Features βœ…

  • βœ… ECS architecture with sparse-set storage
  • βœ… Metal rendering backend
  • βœ… Scene serialization (JSON)
  • βœ… OBJ mesh import via Assimp
  • βœ… Native macOS editor
  • βœ… Transform gizmos
  • βœ… Project management
  • βœ… Asset browser and import

In Progress 🚧

  • 🚧 PBR material system
  • 🚧 Texture import and management
  • 🚧 FBX/GLTF model support

Planned πŸ“‹

  • πŸ“‹ Physics system (RigidBody, Collider components)
  • πŸ“‹ Lighting system (Point, Directional, Spot lights)
  • πŸ“‹ Shadow mapping
  • πŸ“‹ Post-processing stack
  • πŸ“‹ Audio system (3D spatial audio)
  • πŸ“‹ Animation system
  • πŸ“‹ Particle system
  • πŸ“‹ Scripting (Lua/Python integration)
  • πŸ“‹ Vulkan backend (Windows/Linux support)
  • πŸ“‹ Scene runtime (playmode)
  • πŸ“‹ Build pipeline (game export)

🀝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Development Guidelines

  1. Follow the existing code style (C++23, modern practices)
  2. Keep components as data-only (no logic)
  3. Use the ECS pattern for new features
  4. Add documentation for public APIs
  5. Test on macOS before submitting

Areas for Contribution

  • Rendering: Implement PBR shading, shadows, post-processing
  • Physics: Integrate a physics library (Bullet, Jolt)
  • Animation: Skeletal animation system
  • Tools: Additional editor panels and tools
  • Platform: Vulkan/DirectX backends
  • Documentation: Tutorials, examples, API docs

πŸ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.


πŸ™ Acknowledgments

Third-Party Libraries

  • Assimp - Open Asset Import Library
  • STB - Single-file public domain libraries
  • Apple Metal - High-performance graphics API

Inspiration

  • Unity - ECS workflow and editor design
  • Unreal Engine - Asset management patterns
  • Godot - Scene system architecture

Made with ❀️ using C++23 and Metal

Back to Top

About

A modern, ECS-based 3D game engine built with C++ and Metal for macOS

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages