Le moteur 3d ECO


image réalisée avec OskyAstro
ECO est un moteur 3d en c++ pour OpenGL, ouvert. Vous y trouverez tout un tas de techniques que vous pouvez librement télécharger et utiliser (le site est remis à jour chaque premier dimanche du mois).
J'ai cherché à comprendre comment se faisaient les choses, les dll's sont donc limitées à FreeType pour décoder les polices ttf et otf, Fmodex pour les sons, et Glew32 car je suis sous Windows.
Si votre souhait est seulement de programmer un jeu, sans vous soucier de ce qui se passe en interne, il vaut mieux vous tourner vers Unity, Unreal Engine, ou autre.
Je développe depuis très longtemps, en basic, puis en C, puis en C++, passant à openGL 2 puis openGL 3.
J'ai fait mes bases sur les incontournables Casse-brique, Tetris, Packman, etc. Très utile pour apprendre à programmer, et ordonner son code !
Mode d'emploi
Mes repères sont 1 pour 1 mètre, z pour la verticale. Notez que mes matrices sont "horizontales".
Pour bouger la caméra, utilisez le pavé numérique.
Vous trouverez un exécutable dans les exemples, base.exe, qui est le fichier compilé sous Windows.
shader et matrice
si votre matrice est horizontale, remplacez (dans vos shaders, setMVP, setVP, setModel ... ) :
glUniformMatrix4fv(m_vp, 1, GL_TRUE, vp.getFv());
par :
glUniformMatrix4fv(m_vp, 1, GL_FALSE, (accès aux valeurs));
Les mises à jour
prochaine mise à jour : éditeur de donjon (plutôt fin juin)
mise à jour du 05/2025
* OMesh_gltf : on préfèrera passer par getJointOfPart() plutôt que par getJoint_ref(). La fonction est dupliquée pour un nom plus compréhensible.
* OUtils : L'état des lumières est « normalisé », avec LIGHT_NULL, LIGHT_OFF, LIGHT_ON, LIGHT_ALWAYS plutôt que LUM_DETRUIT, LUM_ETEINT, LUM_ALLUME
* ORteNurd a une nouvelle fonction : getNode(int idx =-1), qui permet de récupérer plus facilement l'emplacement d'un nœud de la ligne (et surtout le dernier). Rappelons qu'il était possible d'accéder à ces données car lst_noeud est publique.
* ORteBezier : idem
mise à jour du 04/2025
* Une fonction ECO_strRemove a été ajoutée pour supprimer les caractères d'une chaîne (espace le plus souvent), (prend en compte les caractères accentués)
* Une fonction ECO_strReplace(std::string chaine, std::string car_in, std::string car_out) a été ajoutée (elle prend en compte les caractères accentués)
* OScrollH et OScrollV ont été modifiés : en cliquant sur la barre on récupère la position du curseur (pourquoi cela n'était-il pas le cas avant ? mystère :) ).
* STB_image (dans le dossier Tiny) remplace LodePng et autres
* SURTOUT OMesh_gltf a été amélioré : les parties animées par un axe, tels que les équipements des personnages, sont prises en compte. De même pour les meshs n'ayant pas de squelette, animés par une déformation des axes (typiquement, les coffres). Reste donc encore les « morph targets » à traiter.
les transformations ne sont pas encore prises en compte :
> définissez le point d'origine (Blender > point orangé)
> appliquez toutes les transformations (Blender > menu Objet>Appliquer>Toutes...)
> nettoyez les données (Blender > menu Fichier>Nettoyer>Bloc...)
mise à jour du 01/2025
* un bug a été corrigé sur OButtonLst : la fonction clear ne remettait pas à zéro la liste.
* un bug a été corrigé sur OMesh_gltf (surement pas le dernier!) : il faut mettre partout la suite de lignes :
glBindBuffer(GL_ARRAY_BUFFER, 0); (parfois manquantes)
glBindVertexArray(0);
* OListBox, OListGrid et OListImage reçoivent une nouvelle fonction, getItem_src, pour récupérer la position d'un label ou image (et positionner un OEdit facilement). OLstBox reçoit une nouvelle fonction, setItemText(idx, str), pour remplacer un texte (choix de langage).
* Le OExplorer (ECO/systeme) a été révisé.
* OShLight_pbr a été corrigé (le tuto source était bogué). J'en ai profité pour mettre les paramètres usuels (ambient, lightDir et lightColor) pour faciliter son utilisation.