Moteur de jeu 2D/3D en Java 11 (LWJGL 3.3.6, OpenGL 3.3 core, GLFW, OpenAL, STB, Assimp ; JOML, org.json, JBox2D). src/io/github/mightycode/mightylib = la bibliothèque, src/io/github/mightycode/mightylibdemo = la démo qui sert de banc d'essai. Objectif : en faire une bibliothèque réutilisable (jar) pour les futurs jeux et logiciels de l'utilisateur.
docs/current.md: seul le gros point en cours (API : corrections urgentes, à commencer par le chargement de modèles par Assimp).docs/later.md: feuille de route globale, gros points suivants dans l'ordre (gamma, tests, bibliothèque réutilisable avec modèle d'extension et modding, effets 2D, physique 2D, entités et scripts Lua, thème, rendu 2D, SVG, entrées, son, console, plateformes).docs/techniquegraphique.md: suite delater.md, techniques de rendu 2D/3D de LearnOpenGL (Blinn-Phong, skybox, culling, ombres, normal mapping, animation squelettique, HDR/bloom…).docs/futur-discussion.md: sujets à discuter un jour, sans ordre (l'utilisateur décide quand).docs/decisions.md: décisions de conception durables (pas de Lombok, packagenetworkconservé…).docs/architecture.md: structure, démarrage, boucle, cycle de vie des scènes, ressources CPU/GPU, rendu, entrées, temps, pièges connus.docs/debug-tools.md: commandes, serveur de debug, simulation d'entrées, traque des fuites, profilage (JFR, RenderDoc).
- La 2D est prioritaire (rendu 2D, tilemaps, texte, GUI, Camera2D, animations, physique 2D).
- La 3D est secondaire : ne pas l'étendre ni la refactorer sans demande, mais ne pas la casser (
Shape/Renderer/Shadersont communs ; les scènesTest3D*doivent rester fonctionnelles).
- Maven avec
sourceDirectory=src, tests JUnit 5 danstest/(mêmes packages que le code testé, pour accéder au package-private). Compiler après chaque modification :- Linux :
mvn/java(JDK 21) sont dans le PATH :mvn -o -q compile. - Windows :
mvn/javane sont pas dans le PATH, utiliser les outils d'IntelliJ :JAVA_HOME="$HOME/.jdks/ms-21.0.9" "/d/Program Files/JetBrains/IntelliJ IDEA Community Edition 2024.2.3/plugins/maven/lib/maven3/bin/mvn" -o -q compile
- Tests : même commande avec
testau lieu decompile(quelques secondes, sans fenêtre ni GL). scenario.pychoisit ces chemins selon l'OS (surchargeables parMIGHTY_JAVA,MIGHTY_MVN,MIGHTY_MAVEN_JDK). Sur une nouvelle machine, lancer une foismvn -q compile(sans-o) pour télécharger les dépendances.
- Linux :
- Tests automatisés, à chaque modification : se demander si elle touche du code couvert par les tests (aujourd'hui :
resources/,main/MainThread,main/Workers) ; si oui, relancermvn -o -q testavant de commiter. Se demander aussi si elle entre dans ce que les tests peuvent couvrir (logique sans GL : états, références, files, parsing, maths…) ; si oui, ajouter ou compléter le test, et pour un bug corrigé, un test qui le reproduit. Un bug connu non corrigé reste en test@Disabledavec sa raison, pas supprimé. - Vérifier en jeu avec un seul appel :
python tools/scenario.py "scene Test2DScene" wait-loaded "?gl summary" "input ENTER"(compile, lance le jeu, enchaîne les commandes, résume en texte, ferme le jeu ; une fenêtre s'ouvre chez l'utilisateur : le prévenir). Détails :python tools/scenario.py --helpetdocs/debug-tools.md. - Répertoire de travail = racine du dépôt (ressources lues depuis
resources/). Point d'entrée :io.github.mightycode.mightylibdemo.main.Main.
- Penser à long terme, à l'échelle d'un vrai jeu (des milliers de ressources, chargement en continu, nombreuses scènes, mods, projets tiers), pas à celle de la démo : une solution qui suffit à la démo mais ne tiendra pas à cette échelle doit être signalée comme telle, avec la cible durable, et inscrite dans
docs/current.mdoudocs/later.md. Préférer corriger le modèle qui produit les bugs plutôt qu'empiler des pansements. - Économiser les tokens : lire des extraits (Grep, Read avec offset/limit) plutôt que des fichiers entiers ; filtrer les journaux ; réponses courtes ; pas de capture d'écran sauf rendu impossible à vérifier autrement (une seule à la fois, et seulement la zone utile avec
screenshot rect x y largeur hauteuroucorners x y x2 y2quand on sait où regarder ; cadrer avec la commandecamera) ; si une information manque, ajouter une commande qui la renvoie en texte/JSON. - Ne jamais importer
io.github.mightycode.mightylibdemo.*depuismightylib(passer les IDs en paramètre). - Tout code GL s'exécute sur le thread principal (y revenir par
MainThread.execute) ; les tâches deWorkers(dont les workers deResources) ne font que de l'I/O/CPU. Pas denew Threadpour une tâche courte : utiliserWorkers. Toujours créer/détruire les objets GL viaGenDeleteResources. - Toute ressource GL créée dans une scène est libérée dans
unload()(ce quelauncha créé) ourelease()(ce queinita créé :unloadn'est pas appelé si la scène est quittée pendant son chargement) ; vérifier l'état CPU des ressources avec la commanderesources; vérifier les fuites avec l'étapeleakcheck <Scène>descenario.py(voirdocs/debug-tools.md). - Fins de ligne normalisées par
.gitattributes(LF dans le dépôt) :git addnormal. Ne pas réécrire de fichier source avecsed(utiliser Edit). - Git : travailler sur une branche, un commit par changement logique, avec la ligne
Co-Authored-Bydemandée par le système. Ne pas modifier/commitertarget/ni.idea/workspace.xml. - Avant de commencer un gros point (passage de
later.mdàcurrent.md), en discuter avec l'utilisateur pour s'assurer que tout est prévu. - Décrire comment vérifier manuellement ce qui n'a pas pu l'être (quelle scène, quoi observer).
- Java 11 (pas de
record, ni deswitchexpression). Accolades K&R, 4 espaces, commentaires en anglais, peu de Javadoc. - Enums préfixées
E, interfaces préfixéesI; utilitaires statiques souvent en PascalCase (GenDeleteResources.GenBuffers,Logger.CheckOpenGLError). - Appel GL sensible suivi de
Logger.CheckOpenGLError("message"); dans le code appelé à chaque dessin, l'entourer deif (Logger.DO_CHECK). - Logs moteur :
System.out/err.printlnavec préfixe--. - Pour tester une fonctionnalité, ajouter une scène
Test*plutôt que modifier une existante.