Open-source terminal rendering engine

🟢 En développement C++20/23 UTF-8 v0.4.1 11 Modules

Un moteur modulaire de rendu et d'interface terminal — widgets dynamiques, animations fluides, langage .widg

Scroll

01 / Présentation

Le terminal comme
canvas graphique

11
Modules
3
Render systems
0.4.1
Version
5
Itérations

Terminal-Renderer est une bibliothèque C++ visant à fournir une infrastructure complète de rendu et d'interaction dans le terminal — widgets textuels dynamiques, animations fluides, langage XML propriétaire, sans dépendances graphiques externes.

Tous les objets sont hiérarchisés selon du polymorphisme partant de trObject, avec la recréation de weak pointers custom pour une gestion mémoire précise et sans dépendance externe.

L'objectif de performance est constant : faire tourner le moteur même sur un grille-pain. Chaque optimisation compte.

"Quand le terminal devient ton canvas, chaque caractère compte."

Rendu multi-couches

Rafraîchissement partiel des zones modifiées — aucun redessin complet inutile. Pipeline optimisé pour tourner même sur matériel limité.

Delta Time

Animations et transitions synchronisées indépendamment du framerate. Déplacements fluides et effets de surbrillance dynamiques.

Langage .widg

Format XML propriétaire pour décrire, charger et prévisualiser des widgets en live sans recompilation.

Précompilateur Python

Détecte automatiquement les classes héritant de trActor et insère les macros REGISTER_TYPE sans intervention manuelle.

02 / Architecture

Architecture
modulaire

Core
Structures internes, types fondamentaux — trPair, trMulti, trMap
🟢 Stable
Engine
Cœur du moteur, logique principale, communication inter-modules
🟢 Stable
Render
Pipeline de rendu, positionnement, superposition multi-couches
🟢 Fonctionnel
UI
Système hiérarchique des widgets, focus, masquage (hide/show)
🟢 Fonctionnel
Components
Composants de base — boutons, textes, conteneurs, barres de progression
🟢 Fonctionnel
InputModule
Gestion des entrées clavier, tampon multithread, mode non-bloquant
🟢 Stable
World
Contexte global, gestion de scène et logique environnementale
🟢 Fonctionnel
LoadModule
Parsing des fichiers .widg (XML propriétaire), prévisualisation live
🟡 En cours
Tool
Boîte à outils mathématique, algorithmique et utilitaires divers
🟡 En cours
AudioModule
Gestion des sons et notifications audio dans le terminal
🟡 À développer
PrintModule
Impression texte et gestion couleurs ANSI complète
🔴 Instable

03 / Langage .widg

Format XML
propriétaire

Chaque widget peut être décrit via un fichier .widg utilisant un XML personnalisé avec des balises avancées. Ces balises permettent de définir les propriétés, la position, le contenu et les couleurs d'un widget.

L'un des atouts majeurs du format : la modification en direct. En appuyant sur F5/F6/F8/F9/F10 dans l'aperçu, les changements effectués dans le fichier XML apparaissent immédiatement — sans recompiler.

Édition live · Animations · Séquences d'échappement · Couleurs ANSI par intervalle

Chargement dynamique

Ouvrir et visualiser n'importe quel fichier .widg seul avec toutes ses animations et couleurs, en isolation complète.

Débogage en temps réel

Modifier le XML et voir les changements instantanément — idéal pour les widgets animés complexes.

Animations frame-by-frame

Chaque widget trText supporte des conteneurs d'animations avec frames horodatées et transitions automatiques.

🛠 Outil interactif
Prévisualisez et créez vos fichiers .widg
directement dans le navigateur
Import de fichiers .widg, éditeur en direct, générateur XML — sans installation.
Élément XML Attribut(s) Type C++ Description
trObjecttypetrObject*Définit le type de l'objet à créer via trObjectFactory
trObjectnametrActor*Nom de l'objet (s'applique si c'est un acteur/pawn)
trPawntrPawn*Objet de type Pawn, utilisé pour la position et le type de position relative
Positionx, yintPosition du pawn à l'écran en colonnes / lignes
RelativePositionTypeRpTypeenumAncrage relatif : TopLeft, MiddleCenter, BottomRight…
trWidgettrWidget*Widget pouvant contenir du texte ou des couleurs
Sizeheight, widthintTaille du widget en colonnes / lignes
Colorforeground, backgrounduint8_t R,G,B,ACouleur globale du texte et/ou du fond du widget (#RRGGBBAA)
CaseColorunordered_mapDéfinition de couleurs ANSI sur des intervalles de caractères — permet de colorier des portions distinctes du texte
CaseStart, End, foreground, backgroundint / uint8_tIntervalle [Start, End] avec couleur fg/bg indépendante. Préfixer l'attribut par _ pour le désactiver (ex. _background)
Contentstd::wstringContenu textuel du widget (peut être multi-lignes)
LineContentstd::wstringLigne de texte normale (UTF-8)
LineRawContentstd::wstringLigne avec séquences d'échappement (\n, \t, \b…)
trTexttrText*Texte animé ou statique, supporte Animation, RawFrame et FrameAdd
Animationvector<trPair>Conteneur de frames animées horodatées
RawFramenumber, timeintFrame brute avec durée en millisecondes — peut contenir Content + CaseColor
FrameAddnumber, time, onLastFrameint / boolAjout de frame sur le texte existant ou en fin d'animation
OldContentstd::wstringTexte existant avant ajout ou effacement
AddpositionintPosition où insérer du texte dans OldContent
EraseStart, EndintSupprime un intervalle de texte dans OldContent
<?xml version="1.0" encoding="utf-8"?>
<trObject type="trWidget" name="Hello1">
  <Properties>
    <Property name="Activate" type="bool">true</Property>
    <Property name="Protected" type="bool">false</Property>
  </Properties>
  <trPawn>
    <Position x="0" y="0" />
    <RelativePositionType RpType="MiddleCenter" />
  </trPawn>
  <trWidget>
    <Size width="22" height="5" />
    <Content>
      <Line Content=" _   _      _ _" />
      <Line Content="| | | | ___| | | ___" />
      <Line Content="| |_| |/ _ \ | |/ _ \" />
      <Line Content="|  _  |  __/ | | (_) |" />
      <Line Content="|_| |_|\___|_|_|\___/" />
    </Content>
    <Color foreground="#9cf493ff" background="#052d0aff" />
    <!-- CaseColor : colorie des intervalles de caractères -->
    <CaseColor>
      <Case Start="0" End="7" foreground="#ffb6c1ff" _background="#ffffffff"/>
      <Case Start="7" End="22" foreground="#91e6f1ff" background="#09598eff"/>
    </CaseColor>
  </trWidget>
</trObject>
Hello1.widg — aperçu
_ _ _ _ | | | | ___| | | ___ | |_| |/ _ \ | |/ _ \ | _ | __/ | | (_) | |_| |_|\___|_|_|\___/
Rendu terminal simulé
⚠️ Le tableau n'est pas complet — le format .widg est encore en développement actif. Contacter l'auteur pour plus d'informations sur les balises avancées et les fonctionnalités à venir.

04 / Caractères spéciaux

Gestion des
séquences

Le moteur gère nativement un ensemble de séquences d'échappement et de caractères spéciaux. Chacun peut avoir des effets visuels imprévisibles selon le terminal cible — leur comportement est documenté et maîtrisé dans le pipeline de rendu.

La gestion de ces cas est particulièrement critique dans le mode RENDER_SYSTEM où tout le rendu passe par un buffer complet avant affichage — les séquences sont résolues en pré-affichage.

Compatibilité Windows / Linux testée — comportements OS-dépendants identifiés et gérés.
\n
Saut de ligne — peut casser la mise en forme si non maîtrisé
\r
Retour chariot — peut écraser une ligne existante selon l'OS
\t
Tabulation horizontale — espacement variable selon le terminal
\b
Retour arrière — effet visuel imprévisible, à surveiller
\v
Tabulation verticale — peut désaligner le rendu
\f
Saut de page — rarement utilisé mais géré
\0x
Caractère vide — à surveiller dans les buffers
\\
Barre oblique inversée — doit être correctement échappée

05 / Moteur de rendu

Trois systèmes
de rendu

Direct System

Lent

Chaque caractère écrit directement sur le terminal. Simple mais très lent — provoque lag et bugs visuels à grande échelle.

Buffer System

Moyen

Tout est écrit dans un ostringstream tampon avant affichage. Fluide pour peu d'actions, instable avec de nombreux changements simultanés.

Render System

Optimal

Buffer complet sans toucher directement au terminal. Le plus performant — gestion complète des positions, superpositions et modifications pré-affichage.

Le moteur supporte un système de couleurs ANSI complet — foreground, background, surbrillance, transitions dynamiques — sur tous les widgets.

Un précompilateur Python parcourt automatiquement les fichiers .h/.cpp pour détecter les classes héritant de trActor et insérer les macros REGISTER_TYPE sans intervention manuelle. Il évite les duplications et signale les erreurs de configuration.

Le système de collision entre widgets permet de récupérer les intersections et de définir les réactions souhaitées — overlap, rebond, masquage prioritaire.

Édition de widgets en live via F5 / F6 / F8 / F9 / F10 — sans recompilation.

06 / Roadmap

Prochaines
étapes

Système souris

Détection des positions, clics et événements hover directement dans le terminal.

API Audio

Effets sonores et notifications audio intégrés au moteur de widgets via AudioModule.

Projets exemples

Simulation de fractales, jeu T-Rex, mini UI complète avec widgets interactifs.

Dépôt template

Repo clé en main pour démarrer son propre projet Terminal-Renderer en quelques minutes.

Documentation

Documentation interne complète Doxygen + Markdown détaillé pour chaque module et balise .widg.

Profilage mémoire

Système de profilage mémoire et CPU intégré pour diagnostiquer les points chauds en production.

La vision long terme est de devenir un moteur complet de rendu console open-source, modulable et extensible — inspiré des architectures d'Unreal Engine mais conçu pour un environnement purement texte.

L'objectif de performance reste constant : faire tourner le moteur même sur un grille-pain. Chaque optimisation compte, chaque allocation est mesurée.

Le module ContentReorganisation() est en cours d'optimisation pour réduire les recalculs inutiles lors de mises à jour partielles du buffer.

by MOHAMED.B — C++20/23 — UTF-8 — v0.4.1 🚧
Terminal-Renderer — v0.4.1 — MOHAMED.B