Go to file
StillHammer 1b7703f07b feat(IIO)!: BREAKING CHANGE - Callback-based message dispatch
## Breaking Change

IIO API redesigned from manual pull+if-forest to callback dispatch.
All modules must update their subscribe() calls to pass handlers.

### Before (OLD API)
```cpp
io->subscribe("input:mouse");

void process(...) {
    while (io->hasMessages()) {
        auto msg = io->pullMessage();
        if (msg.topic == "input:mouse") {
            handleMouse(msg);
        } else if (msg.topic == "input:keyboard") {
            handleKeyboard(msg);
        }
    }
}
```

### After (NEW API)
```cpp
io->subscribe("input:mouse", [this](const Message& msg) {
    handleMouse(msg);
});

void process(...) {
    while (io->hasMessages()) {
        io->pullAndDispatch();  // Callbacks invoked automatically
    }
}
```

## Changes

**Core API (include/grove/IIO.h)**
- Added: `using MessageHandler = std::function<void(const Message&)>`
- Changed: `subscribe()` now requires `MessageHandler` callback parameter
- Changed: `subscribeLowFreq()` now requires `MessageHandler` callback
- Removed: `pullMessage()`
- Added: `pullAndDispatch()` - pulls and auto-dispatches to handlers

**Implementation (src/IntraIO.cpp)**
- Store callbacks in `Subscription.handler`
- `pullAndDispatch()` matches topic against ALL subscriptions (not just first)
- Fixed: Regex pattern compilation supports both wildcards (*) and regex (.*)
- Performance: ~1000 msg/s throughput (unchanged from before)

**Files Updated**
- 31 test/module files migrated to callback API (via parallel agents)
- 8 documentation files updated (DEVELOPER_GUIDE, USER_GUIDE, module READMEs)

## Bugs Fixed During Migration

1. **pullAndDispatch() early return bug**: Was only calling FIRST matching handler
   - Fix: Loop through ALL subscriptions, invoke all matching handlers

2. **Regex pattern compilation bug**: Pattern "player:.*" failed to match
   - Fix: Detect ".*" in pattern → use as regex, otherwise escape and convert wildcards

## Testing

 test_11_io_system: PASSED (IIO pub/sub, pattern matching, batching)
 test_threaded_module_system: 6/6 PASSED
 test_threaded_stress: 5/5 PASSED (50 modules, 100x reload, concurrent ops)
 test_12_datanode: PASSED
 10 TopicTree scenarios: 10/10 PASSED
 benchmark_e2e: ~1000 msg/s throughput

Total: 23+ tests passing

## Performance Impact

No performance regression from callback dispatch:
- IIO throughput: ~1000 msg/s (same as before)
- ThreadedModuleSystem: Speedup ~1.0x (barrier pattern expected)

## Migration Guide

For all modules using IIO:

1. Update subscribe() calls to include handler lambda
2. Replace pullMessage() loops with pullAndDispatch()
3. Move topic-specific logic from if-forest into callbacks

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-19 14:19:27 +07:00
.claude fix: Resolve bgfx Frame 1 crash on Windows DLL + MinGW GCC 15 compatibility 2025-12-30 11:03:06 +07:00
assets fix: Multi-texture sprite rendering - setState per batch + transient buffers 2026-01-14 14:05:56 +07:00
docs feat(IIO)!: BREAKING CHANGE - Callback-based message dispatch 2026-01-19 14:19:27 +07:00
external/StillHammer fix: Critical race conditions in ThreadedModuleSystem and logger 2026-01-19 07:37:31 +07:00
include/grove feat(IIO)!: BREAKING CHANGE - Callback-based message dispatch 2026-01-19 14:19:27 +07:00
modules feat(IIO)!: BREAKING CHANGE - Callback-based message dispatch 2026-01-19 14:19:27 +07:00
plans Migration Gitea 2025-12-04 20:15:53 +08:00
src feat(IIO)!: BREAKING CHANGE - Callback-based message dispatch 2026-01-19 14:19:27 +07:00
Testing/Temporary Migration Gitea 2025-12-04 20:15:53 +08:00
tests feat(IIO)!: BREAKING CHANGE - Callback-based message dispatch 2026-01-19 14:19:27 +07:00
.gitignore feat: Add texture support to UI widgets and update gitignore 2026-01-14 23:15:13 +07:00
build_renderer.bat feat: Add BgfxRenderer module skeleton 2025-11-26 00:41:55 +08:00
CLAUDE_NEXT_SESSION.md Migration Gitea 2025-12-04 20:15:53 +08:00
CLAUDE.md fix: Critical race conditions in ThreadedModuleSystem and logger 2026-01-19 07:37:31 +07:00
CMakeLists.txt fix: Critical race conditions in ThreadedModuleSystem and logger 2026-01-19 07:37:31 +07:00
diagram_dev_workflow.html fix: Critical race conditions in ThreadedModuleSystem and logger 2026-01-19 07:37:31 +07:00
diagram_iio_messaging.html fix: Critical race conditions in ThreadedModuleSystem and logger 2026-01-19 07:37:31 +07:00
diagram_module_lifecycle.html fix: Critical race conditions in ThreadedModuleSystem and logger 2026-01-19 07:37:31 +07:00
groveengine_architecture.html fix: Critical race conditions in ThreadedModuleSystem and logger 2026-01-19 07:37:31 +07:00
groveengine_diagram.html fix: Critical race conditions in ThreadedModuleSystem and logger 2026-01-19 07:37:31 +07:00
helgrind.supp fix: Resolve deadlock in IntraIOManager + cleanup SEGFAULTs 2025-11-23 11:36:33 +08:00
LICENSE-COMMERCIAL chore: Switch to dual license (GPL v3 + Commercial) 2026-01-15 08:54:42 +07:00
LICENSE-GPL chore: Switch to dual license (GPL v3 + Commercial) 2026-01-15 08:54:42 +07:00
logger_demo feat: Add StillHammer Logger & IntraIO batching (WIP) 2025-11-20 03:01:09 +08:00
README.md docs: Clarify development stage and non-deterministic nature 2026-01-15 09:19:06 +07:00
run_all_tests.sh docs: Consolidate all plans into docs/plans/ directory 2025-11-21 19:32:33 +08:00
run_full_stack_demo.bat fix: Resolve bgfx Frame 1 crash on Windows DLL + MinGW GCC 15 compatibility 2025-12-30 11:03:06 +07:00

GroveEngine 🌳

Experimental Modular C++ Engine Architecture for Rapid Prototyping

GroveEngine is a lightweight, modular engine architecture designed for blazing-fast development iteration (0.4ms hot-reload validated) and optimized for AI-assisted prototyping. Currently in development stage - suitable for experimentation and learning, not production games.

Key Features

  • 🔥 Hot-Reload 0.4ms - Validated blazing-fast module reloading
  • 🧩 Modular Architecture - Clean separation via interfaces (IEngine, IModule, IIO, IModuleSystem)
  • 🚀 Development Velocity - Edit → Build → Hot-reload < 1 second total
  • 🤖 AI-Assisted Development - 200-300 line modules optimized for Claude Code
  • 📦 Autonomous Builds - Each module builds independently
  • ⚠️ Experimental - Non-deterministic, development-focused architecture

Architecture Overview

grove::IEngine (Orchestration)
├── grove::IModuleSystem (Execution strategy)
│   ├── SequentialModuleSystem (✅ Implemented - 1 module at a time)
│   ├── ThreadedModuleSystem (🚧 TODO - Each module in thread)
│   └── MultithreadedModuleSystem (🚧 TODO - Thread pool)
├── grove::IModule (Business logic - 200-300 lines)
│   └── Your modules (.so/.dll hot-reloadable)
└── grove::IIO (Communication)
    ├── IntraIO (✅ Implemented - Same process pub/sub)
    ├── LocalIO (🚧 TODO - Same machine IPC)
    └── NetworkIO (🚧 TODO - Distributed messaging)

Current Status

⚠️ Development Stage: GroveEngine is currently development-ready but not production-ready. The engine is non-deterministic and suited for prototyping, experimentation, and rapid iteration. Production use requires significant additional work (see Roadmap).

Implemented Components

  • Core Engine:

    • DebugEngine - Comprehensive logging and health monitoring
    • SequentialModuleSystem - Single-threaded module execution
    • IntraIO + IntraIOManager - Sub-millisecond pub/sub with pattern matching
    • ModuleLoader - Hot-reload system (0.4ms average, 0.055ms best)
  • Rendering Stack (BgfxRenderer):

    • Sprite rendering with automatic batching
    • Tilemap rendering with instancing
    • Particle effects system
    • Debug text overlay (8x8 bitmap font)
    • RHI abstraction over bgfx
  • UI System (UIModule):

    • 10 widget types (button, panel, label, checkbox, slider, text input, progress bar, image, scroll panel, tooltip)
    • JSON layout loading
    • Retained mode rendering (85%+ IIO reduction)
    • Thread-safe input handling
  • Input System (InputModule):

    • Mouse (movement, buttons, wheel)
    • Keyboard (keys, text input)
    • SDL2 backend
  • Test Suite: 20+ integration tests + visual demos

⚠️ Known Limitations

  • Non-Deterministic Execution: Module execution order not guaranteed
  • Single-Threaded Only: Only SequentialModuleSystem implemented
  • No Determinism Guarantees: Not suitable for networked games or replays
  • Development Focus: Optimized for rapid iteration, not stability

🚧 Roadmap to Production

  • Deterministic Execution: Predictable module execution order
  • Module Systems: ThreadedModuleSystem, MultithreadedModuleSystem
  • IO Systems: LocalIO (IPC), NetworkIO (distributed)
  • Input: Gamepad support (Phase 2)
  • Renderer: Advanced text rendering, post-processing effects
  • Stability: Error recovery, graceful degradation
  • Performance: Profiling, optimization, memory pooling

Quick Start

Try the Interactive Demo

See it in action first! Run the full stack demo to see BgfxRenderer + UIModule + InputModule working together:

# Windows
run_full_stack_demo.bat

# Linux
./build/tests/test_full_stack_interactive

Features:

  • Click buttons, drag sliders, interact with UI
  • Spawn bouncing sprites with physics
  • Complete input → UI → game → render flow
  • All IIO topics demonstrated

See tests/visual/README_FULL_STACK.md for details.

Directory Structure

GroveEngine/
├── include/grove/          # 27 headers
│   ├── IEngine.h          # Core interfaces
│   ├── IModule.h
│   ├── IModuleSystem.h
│   ├── IIO.h
│   ├── IDataTree.h        # Configuration system
│   ├── IDataNode.h
│   └── ...
├── src/                    # 10 implementations
│   ├── DebugEngine.cpp
│   ├── SequentialModuleSystem.cpp
│   ├── IntraIO.cpp
│   ├── ModuleFactory.cpp
│   └── ...
├── docs/                   # Documentation
│   ├── architecture/
│   │   ├── architecture-modulaire.md
│   │   └── claude-code-integration.md
│   └── implementation/
│       └── CLAUDE-HOT-RELOAD-GUIDE.md
├── modules/                # Your application modules
├── tests/                  # Tests
└── CMakeLists.txt         # Build system

Build

cd GroveEngine
mkdir build && cd build
cmake ..
make

# Or use the root CMakeLists.txt directly
cmake .
make

Create a Module

// MyModule.h
#include <grove/IModule.h>

class MyModule : public grove::IModule {
public:
    json process(const json& input) override {
        // Your logic here (200-300 lines max)
        return {"result": "processed"};
    }

    void setConfiguration(const IDataNode& config, IIO* io, ITaskScheduler* scheduler) override {
        // Configuration setup
    }

    // ... other interface methods
};

Documentation

For Developers Using GroveEngine

  • DEVELOPER_GUIDE.md - 📘 START HERE - Complete guide with modules, IIO topics, and full examples
  • USER_GUIDE.md - Module system basics, hot-reload, IIO communication

Module Documentation

  • BgfxRenderer - 2D rendering (sprites, tilemap, particles, debug text)
  • UIModule - User interface (10 widget types, layout, scrolling)
  • InputModule - Input handling (mouse, keyboard via SDL)

Architecture & Internals

Philosophy

Micro-Context Development

  • Small modules (200-300 lines) for AI-friendly development
  • Autonomous builds - Zero parent dependencies
  • Hot-swappable infrastructure - Change performance without touching business logic

Progressive Evolution

// Current (Production-Ready)
DebugEngine + SequentialModuleSystem + IntraIO

// Future Vision (Roadmap)
HighPerfEngine + MultithreadedModuleSystem + NetworkIO
// Same module code - just swap the infrastructure

Complexity Through Simplicity

Complex behavior emerges from the interaction of simple, well-defined modules.

Performance

Hot-Reload Benchmarks (Validated):

  • Average: 0.4ms
  • Best: 0.055ms
  • 5-cycle test: 2ms total
  • State persistence: 100% success rate
  • Classification: 🚀 BLAZING (Theoretical maximum achieved)

Origin & Development

  • WarFactory - Original architecture source and inspiration
  • AISSIA - Experimental AI assistant project (development/testing)

GroveEngine is currently used for prototyping and experimentation, not production deployments.

License

GroveEngine is dual-licensed - you choose the license that fits your project:

📜 GPL v3 (Open Source - Free)

Use GroveEngine in open-source projects under the GNU GPL v3.

  • 100% Free - No costs, no royalties
  • Full engine access - Modify and use freely
  • Your game must be GPL - Source code must be published
  • 👥 Community support

💼 Commercial License (Proprietary - Royalty-Based)

Use GroveEngine in closed-source commercial games under the Commercial License.

  • FREE up to €100,000 revenue per project
  • 1% royalty on revenue above €100,000
  • Keep your code private - Proprietary games allowed
  • Email support - 72h response time
  • Priority bug fixes

🎮 Best for indie developers: Most favorable royalty model in the industry!


📊 License Comparison

Feature GPL v3 (Free) Commercial
Cost Free Free up to €100k revenue
Royalties None 1% above €100k
Your game license Must be GPL (open) Proprietary allowed
Engine modifications Share modifications Keep private
Support Community Email (72h) + priority
Updates Yes Yes + priority fixes
Attribution Required Required ("Powered by")
Number of projects Unlimited Unlimited

FAQ - Which License Should I Choose?

Q: I'm making a commercial indie game. Which license? A: Commercial License - It's FREE until €100k, then only 1% royalties. Much better than Unreal (5% above $1M).

Q: I'm making an open-source game. Which license? A: GPL v3 - Perfect for open-source projects, 100% free forever.

Q: How do I declare my revenue? A: Annual email with your project revenue. Simple and trust-based. Audits possible but rare.

Q: Can I modify the engine? A: Yes! Both licenses allow modifications. GPL requires sharing them, Commercial lets you keep them private.

Q: Is GroveEngine cheaper than Unreal Engine? A: Yes! We charge 1% above €100k vs Unreal's 5% above $1M USD. For a €500k game, you'd pay €4,000 with GroveEngine vs €0 with Unreal (under threshold). For a €1.5M game: €14,000 vs ~€25,000 with Unreal.

Q: What if my game makes €80,000? A: €0 royalties! You're within the free tier. No payment required.

Q: Is support included? A: GPL = community support. Commercial = email support (72h response) + priority bug fixes.

Q: How do I get the Commercial License? A: Email alexistrouve.pro@gmail.com with subject "GroveEngine Commercial License Request". No upfront payment - royalties only after €100k!


🏆 Industry Comparison

Engine Free Tier Royalty Notes
GroveEngine €0 - €100k 1% > €100k Best for EU indie devs
Unreal Engine $0 - $1M USD 5% > $1M Higher %, higher threshold
Unity Subscription None Monthly fees (~€2k/year Pro)
Godot 100% Free None MIT, but minimal official support

GroveEngine = Best value for games earning €100k - €500k 🎯


📧 License Questions? Contact alexistrouve.pro@gmail.com

Contributing

This engine uses an architecture optimized for Claude Code development. Each module is autonomous and can be developed independently.

Constraints:

  • Modules 200-300 lines maximum
  • Autonomous build: cmake . from module directory
  • JSON-only communication between modules
  • Zero dependencies up (no #include "../")
  • Never cmake ..

GroveEngine - Where modules grow like trees in a grove 🌳