GroveEngine/docs
StillHammer a106c78bc8 feat: Retained mode rendering for UIModule
Implement retained mode rendering system to reduce IIO message traffic.
Widgets now register render entries that persist across frames and only
publish updates when visual state changes.

Core changes:
- UIWidget: Add dirty flags and render ID tracking
- UIRenderer: Add retained mode API (registerEntry, updateRect, updateText, updateSprite)
- SceneCollector: Add persistent sprite/text storage with add/update/remove handlers
- IIO protocol: New topics (render:sprite:add/update/remove, render:text:add/update/remove)

Widget migrations:
- UIPanel, UIButton, UILabel, UICheckbox, UISlider
- UIProgressBar, UITextInput, UIImage, UIScrollPanel

Documentation:
- docs/UI_RENDERING.md: Retained mode architecture
- modules/UIModule/README.md: Rendering modes section
- docs/DEVELOPER_GUIDE.md: Updated IIO topics

Performance: Reduces message traffic by 85-97% for static/mostly-static UIs

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-06 14:06:28 +07:00
..
architecture feat: Add integration test scenarios 11-13 for IO and DataNode systems 2025-11-18 15:09:39 +08:00
implementation Initial commit: Grove Engine core architecture 2025-10-28 00:19:15 +08:00
performance_reports fix: Resolve deadlock in IntraIOManager + cleanup SEGFAULTs 2025-11-23 11:36:33 +08:00
plans feat: Complete Phase 6.5 - Comprehensive BgfxRenderer testing 2025-11-29 22:56:29 +08:00
coding_guidelines.md fix: Resolve deadlock in IntraIOManager + cleanup SEGFAULTs 2025-11-23 11:36:33 +08:00
DEVELOPER_GUIDE.md feat: Retained mode rendering for UIModule 2026-01-06 14:06:28 +07:00
FEATURES.md fix: Resolve bgfx Frame 1 crash on Windows DLL + MinGW GCC 15 compatibility 2025-12-30 11:03:06 +07:00
PLAN_BGFX_RENDERER.md feat(BgfxRenderer): Complete Phase 4 - ShaderManager integration 2025-11-26 22:27:19 +08:00
PROMPT_UI_MODULE_PHASE6.md feat: Complete UIModule Phase 7 - ScrollPanel & Tooltips 2025-11-29 07:13:13 +08:00
README.md docs: Add complete IDataTree system architecture documentation 2025-10-28 16:18:15 +08:00
UI_MODULE_DEMO.md feat: Add UIModule interactive showcase demo 2025-11-29 08:52:25 +08:00
UI_MODULE_PHASE2_COMPLETE.md feat: Complete UIModule Phase 7 - ScrollPanel & Tooltips 2025-11-29 07:13:13 +08:00
UI_MODULE_PHASE3_COMPLETE.md feat: Complete UIModule Phase 7 - ScrollPanel & Tooltips 2025-11-29 07:13:13 +08:00
UI_MODULE_PHASE6_PROGRESS.md feat: Complete UIModule Phase 7 - ScrollPanel & Tooltips 2025-11-29 07:13:13 +08:00
UI_MODULE_PHASE7_COMPLETE.md feat: Complete UIModule Phase 7 - ScrollPanel & Tooltips 2025-11-29 07:13:13 +08:00
UI_RENDERING.md feat: Retained mode rendering for UIModule 2026-01-06 14:06:28 +07:00
USER_GUIDE.md Migration Gitea 2025-12-04 20:15:53 +08:00

GroveEngine Documentation

Overview

GroveEngine is a modular game engine architecture designed for distributed systems and hot-reload development. It provides a clean separation between business logic (modules) and infrastructure (engine, IO, scheduling).

Architecture Documents

Core Systems

  • Data Tree System - Unified config/data/runtime management

    • IDataNode/IDataValue/IDataTree interfaces
    • JSON backend implementation
    • Hot-reload and persistence
    • Distributed configuration synchronization
  • Modular Architecture - Module system design

    • IModule interface and constraints
    • IModuleSystem execution strategies
    • Hot-reload workflow
    • Claude Code optimization
  • Claude Code Integration - AI development workflow

    • Micro-context development
    • Hot-reload for rapid iteration
    • Module development best practices

Quick Start

Creating a Module

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

class TankModule : public IModule {
private:
    IIO* m_io;
    int m_armor;
    double m_speed;

public:
    void setConfiguration(const IDataNode& config, IIO* io, ITaskScheduler* scheduler) override {
        m_io = io;
        m_armor = config.getInt("armor", 100);
        m_speed = config.getDouble("speed", 5.0);
    }

    void process(const IDataNode& input) override {
        // Game logic here

        // Save state via IIO
        auto state = createDataNode({
            {"armor", m_armor},
            {"speed", m_speed}
        });
        m_io->publish("save:tank:state", std::move(state));
    }

    std::unique_ptr<IDataNode> getState() override {
        return createDataNode({
            {"armor", m_armor},
            {"speed", m_speed}
        });
    }

    void setState(const IDataNode& state) override {
        m_armor = state.getInt("armor", 100);
        m_speed = state.getDouble("speed", 5.0);
    }

    std::string getType() const override { return "tank"; }
};

Using the Data Tree

#include <grove/DataTreeFactory.h>

// Create tree
auto tree = DataTreeFactory::create("json", "./gamedata");

// Access configuration (read-only)
auto configRoot = tree->getConfigRoot();
auto tankConfig = configRoot->getChild("tanks")->getChild("heavy");
int armor = tankConfig->getInt("armor");

// Access persistent data (read-write)
auto dataRoot = tree->getDataRoot();
auto progress = dataRoot->getChild("campaign")->getChild("progress");
progress->setData(createDataNode({{"level", 5}}));
tree->saveData();

// Hot-reload config
if (tree->reloadIfChanged()) {
    // Config changed, refresh modules
}

Key Concepts

Module System

  • Modules: 200-300 line business logic units
  • IModuleSystem: Execution strategy (Sequential, Threaded, Distributed)
  • Hot-reload: Replace modules without restarting
  • State preservation: getState/setState for seamless updates

Data Management

  • config/: Read-only game configuration (hot-reload, distributed)
  • data/: Persistent player data (local saves)
  • runtime/: Temporary state (never saved)

Communication

  • IIO: Pub/sub messaging between modules
  • ITaskScheduler: Delegate heavy computation
  • Save pattern: Modules publish "save:*" messages, Engine persists

Distribution

  • Coordinator: Master config with hot-reload
  • Engines: Local replicas, synchronized config
  • Isolation: Each Engine has independent data/

Design Principles

  1. Interface-based: Work with abstractions (IDataNode, not JsonDataNode)
  2. Backend-agnostic: Swap implementations without code changes
  3. Minimal coupling: Modules communicate only via IIO
  4. Hot-reload first: Development optimized for instant feedback
  5. Distribution-ready: Config sync, data isolation built-in

Project Status

Implemented

  • Complete IDataNode/IDataTree system
  • JSON backend (JsonDataValue, JsonDataNode, JsonDataTree)
  • Hot-reload for config files
  • Save/load for persistent data
  • Pattern matching and property queries
  • SHA256 hashing for validation

In Progress 🚧

  • Coordinator synchronization implementation
  • Module system integration with DataTree
  • Example modules and tests

Planned 📋

  • Binary format backend
  • Database backend
  • Network synchronization protocol
  • Schema validation
  • Migration system

Contributing

When adding new features:

  1. Start with interface definition (.h file)
  2. Add documentation to this folder
  3. Implement concrete class
  4. Update architecture docs
  5. Write usage examples

Further Reading


Last Updated: 2025-10-28 Engine Version: 1.0.0