Bonjour à tous et à toutes.
Le projet
Je suis entrain de développez un moteur de jeux vidéo et une interface graphique pour éditer des niveaux avec le moteur pour créer mon propre jeux vidéo depuis plus de 15 ans maintenant.
Le dépôt git se trouve ici https://github.com/LaurentDuroisin7601/ODFAEG
Dans le dossier Demo se trouve l'éditeur de niveau et le jeux que je suis entrain de développer.
Je veux un moteur de jeux qui soit très complet et qui me permettra de créer n'importe quel type de jeux facilement, étant donné que je n'ai pas assez d'expérience pour utiliser un moteur de jeux existant tel que unity ou unreal engine mais que j'ai beaucoup d'expérience en c++ et en opengl, j'ai décidé de créer mon propre moteur de jeux, ça me permet de savoir mieux comment l'utiliser et de ne pas être obligé de lire des pages ou lire des vidéos que je ne comprend absolument pas pour utiliser un moteur de jeux vidéo existant. Le moteur de jeux est divisé en plusieurs parties :
Le module core : contient toutes les fonctionnalités de bases du moteur.
Le module math : contient toutes les classes qui gèrent la librairie mathématique.
Le module window : contient toutes les classes qui gèrent le fenêtrage. (Fenêtre windows, linux, sfml, glfw pour vulkan, etc...)
Le module graphique : contient toutes les classes qui gèrent l'affichage. (Rendereurs pour dessiner les entités, les ombres, les lumières, la réflection et la réfraction ,etc...)
Le module physique : contient toutes les classes qui gèrent la physique. (Volumes englobants pour les collisions, les particules, etc...)
Le module audio : gère le son. (La spatialisation du son, jouer de la musique ou des effets sonores, etc...)
La structure du moteur de jeux.
Vous avez d'abord l'application qui contient tout (le monde, les renderers, les fenêtres, les composants guis, les scènes, etc...)
Ensuite vous avez le monde qui contient les scènes et les systèmes pour mettre à jour la scène courante. (Une seule scène peut être active en même temps)
Ensuite vous avez les scènes qui contiennent toutes les entités des différents niveau. (une scène par niveau)
Vous avez les systèmes qui remettent à jour la scène. (Transformation d'une entité, chargement des entités du monde qui sont visibles sur les rendereurs, etc...)
Il y a deux types de systèmes, les timers qui remettent à jour les entités tous les x temps et les workers qui remettent à jour les entités à chaque appel à la fonction update.
Vous avez les rendereurs qui eux affichent les entités. (Affichage des ombres, des lumières, de la réflexion/réfraction, etc...)
Vous avez les entités. Ce sont tout les objets du jeux qui sont affichable sauf les guis et les entités "sfml-like" qui sont à part et qui sont juste des entités Transformable et Drawable. (J'ai utiliser une classe de base Entity dont hérite tout les types d'entités) mais j'ai aussi commencé un système ECS avec entt que j'ai dû laisser tomber car je devais modifier tout le code source des projets utilisant le moteur et je n'ai pas eu de gain au niveaux des performances par rapport à l'héritage alors j'ai laissé tombé le système ECS pour les démos cependant j'ai fait une démo qui utilise entt (ODFAEGDemoEcs) ou l'on peut utiliser un système ECS, on a donc le choix entre utiliser un système ECS ou l'héritage.
Les entités peuvent avoir un partent et des entités enfants, cela implique que les entités enfants héritent des propriétés des entités enfants.
Il y a différents types d'entités. (Les tiles, les mesh, les animations, les lumières, les grandes tiles contenant plusieurs tiles comme la heightmap, un système de particule, etc...)
Après les entités vous avez les hiérarchies de volumes englobants, il y a plusieurs types de volumes englobants : (Les AABB, les OBB, les Sphères, les ellipsoïdes, etc...) les hiérarchies de volumes englobants permettent de faire des tests plus précis de manière plus rapide.
Vous avez le conteneur de renderers qui contient tout les renderes et les guis.
Vous avez aussi les fenêtres qui sont les fenêtres du jeux et les textures de rendus qui sont les textures de rendus du jeux pour le rendu hors écran.
Vous avez les guis comme par exemple les combos box, les boutons, etc... (Mais je dois encore améliorer le look and field des guis parce que c'est moche xd.)
Vous avez également toutes les formes simples de la SFML (les ConvexShape, les CircleShape, les RectangleShape) ceux-ci ne peuvent pas être ajouté à la scènes car ils servent à créer des jeux simples qui ne nécessitent pas forcément l'utilisation d'un framework comme avec la SFML.
Il y a le conteneur qui contient toutes les guis et les rendereurs, il y a deux types de composant de rendus, les composants légé (les guis) et les composants lourds (les rendereurs). La différence entre les deux est que les composants lourds dessinent tout ce qui est complexe et plus long à dessiner tandis que les composants légés tout ce qui est simple à dessiner comme par exemple les guis.
Le Network : gère le réseau. (envoie de paquets, démarrage du serveurs et du client, etc...)
Les users : les utilisateurs réseaux.
Vous avez également les packet, il y a les paquets encryptés avec encyptage non symétrique (RSA) et encryptage symétrique (AES).
Les AudioStreams pour charger et lire des effets sonores ou des musique ainsi que toutes les classes SFML pour la spatialisation du son.
Vous avez les resources managers pour charger des fichiers tels que des images, du sons, des polices de caractère, etc...
Vous avez aussi des archives pour la sauvegarde et le système de sérialisation.
Ce qui est implémenté.
-Possibilité de créer ses propres entités en héritant de la classe Entity.
-Possibilité de créer ses propres types de rendereurs si on veut utiliser ses propres shaders pour rendre les entités et pas ceux du moteur de jeux.
-Possibilité de créer ses propre scènes en héritant de la classe scène manager si par exemple on ne veut pas utiliser la grille virtuelle du moteur de jeux, mais des octrees ou des quadtrees ou une combinaison de ceux-ci, mais pour moi, la grille suffit.
-Possibilité de créer ses propres systèmes, en héritant de la classe Worker ou Timer.
Bien sûr il y a des méthodes à redéfinir impérativement et qui sont appelées par le moteur de jeux.
-Chargement de ressources externes. (textures, sons, polices de caractères, etc...)
-La sérialisation d'objets dans des fichiers textes.
-Récupération d'un chemin (une ligne brisée) entre un point de la souris et le personnage.
-Récupération de la position du personnage sur un chemin en fonction du temps.
-Séparation des chaînes de caractères à l'aide d'un séparateur.
-Calculs de vecteurs de flottants (à 2, 3 ou 4 dimensions). (Produit scalaire, produit en croix, etc...)
-Calculs de matrices de flottants (à 2, 3 ou 4 dimensions). (Déterminant, inverse, etc...)
-Matrices de projection, de transformation et de vue.
-Gestion des textures.
-Gestion des rendus dans des textures. (Textures 2D ou cubemaps)
-Gestion de la lumière. (Lumières ponctuelles seulement pour l'instant avec calcul de l'atténuation en fonction de la distance et de la normale)
-Gestion des ombres. (Shadow mapping avec la lumière du soleil seulement pour l'instant)
-Gestion de la réfraction de de la réflexion. (Dynamic Environment mapping)
-Gestion de la transparence. (Per pixel linked lists)
-Génération de terrains en 2D ou en 3D. (Récupération de la hauteur du terrain à une position x et z pour la 3D)
-Collisions sur les cases de la grille virtuelle. (Si on peut passer dessus ou pas)
-Récupération des entités du monde qui sont visible.
-Tests des collisions entre hiérarchies de volumes englobant.
-Gestions des animations. (interpolation de sommets)
-Index de l'animation courante si une entités possède plusieurs animations.
-Chargements de modèles 3D dans de nombreux formats grâce à la librairie assimp.
-Affichage de modèles 3D.
-Gestion de la caméra.
-Possibilité de dessiner les entités en mode normal ou en mode instanced.
-Affichage de formes simples et du texte à l'écran.
-Affichage de composants GUIS.
-Gestion des évènements avec la possibilité de stocker des fonctions de callback de n'importe quel type de fonctions et de paramètres de fonctions. (fonctions non membres, fonctions membres, fonctions lambda et passage des paramètres par valeurs, par références ou par placeholders)
-Gestion des actions. (Evènements clavier, souris pouvant être combinés avec les opérateurs ou, et, ou exclusif ou le non)
-Lecture du son.
-Spatialisation du son grâce à la SFML.
-Transfert sur le réseau en TCP pour les données importantes (encryptage, plus lent) ou en UDP pour les données moins importantes mais plus fréquentes. (sans encryptage, plus rapide)
-Possibilité de récupérer le temps client pour chaque utilisateurs connecté au réseau.
-Collision de la lumière avec la physique.
-Gestion de particules. (Emitteurs, affecteurs)
-Billboarding. (Transformation des systèmes de particules pour les afficher face à la caméra.)
Optimisations
Indirect rendering. (Pour réduire les drawCalls)
Bindless texturing. (Pour réduire les drawCalls)
Batching pour récupérer tout les tableaux de sommets utilisant les mêmes matériaux et le même type de primitives pour réduire les drawsCalls.
Dereffered shading. (Calculer la lumière seulement à l'endroit ou c'est éclairé)
Voilà ce qui est implémenté et testé.
Implémenté mais encore à tester ou à améliorer.
-Finir l'implémentation Vulkan. (j'ai déjà implémenté vulkan pour le rendu de formes simples avec les classes "RenderTarget et RenderTexture" mais je dois encore le faire pour la gestion de la transparence, les ombres, les lumières et la réfraction)
-Le bump mapping.
-Les composantes spéculaire.
-Tester les collisions avec tout les types de volumes englobants.
-Le raytracing. (Problème de performance (rendu trop long), affichage des ombres et de la réfraction, ok pour dessiner la heightmap (Quads) mais crash du driver pour dessiner un modèle 3D (Triangles)).
-Les lumières directionnelles.
-La génération de labyrinthes en 2D et en 3D.
-La génération de terrain avec des murs autour en 3D.
-Gestion de la physique (escalader, tomber, sauter, voler, etc...)
-L'éditeur de niveau. (Amélioration du look and field des guis, édition de niveaux en 3D, ...)
Pas encore implémenté du tout.
-Gestion d'une map de voxels. (MineCraft)
-Chargement et lecture de vidéos. (Pour les cinématiques du jeux)
-Portage androïd.
-Gestion du joystick.
Avancement du projet
Voir ma chaîne youtube : https://www.youtube.com/channel/UCao...8nWNhpSMz6PQfw
Je recherche actuellement pour le moteur de jeux.
Un développeur Vulkan.
Celui-ci aura pour tâche de finir l'implémentation Vulkan du moteur de jeux, c'est à dire ajouter le code source Vulkan des rendereurs pour les per pixels linked lists, le shadow mapping, le dynamic environement mapping et le lightmapping.
Un UI Designer.
Pour améliorer l'interface graphique de l'éditeur de niveau. (ODFAEG Creator)
Je recherche actuellement pour le jeux.
Un scènériste/game designer.
Pour concevoir l'histoire du jeux et définir le gameplay.
Un dessinateur/graphiste 2D.
Faire tous les graphismes en 2D. (Les items, les guis, etc...)
Un modeleur 3D.
Faire les personnages, les ennemis, les objets et les rendre en 3D iso et faire les tilesets.
Un développeur web.
Créer le site web du jeux, téléchargement du jeux, inscription des nouveaux joueurs, etc...
Un webdesigner.
Design du site web.
Un sound designer.
Sons du jeux, musique, ambiance.
Des développeurs c++.
M'aider à créer le jeux, fait le patcher pour le téléchargements des mises à jour, etc...
Rémunération ?
J'ai fais un système de don mais malheureusement je n'ai pas encore trouvé de donateurs si vous voulez être rémunéré il faudra faire un projet vendable, être sûr d'avoir la motivation jusqu'au bout du projet, je fait ce projet dans le but de gagner plus d'argent pour plus tard.
Voilà c'est tout pour l'instant pour toute personne souhaitant m'aider, vous pouvez me mp en me communiquant votre motivation.
Partager