Snowstorm Engine

Snowstorm est mon moteur de jeu expérimental.

Il est actuellement dans un stade peu avance avec seulement quelques modules fonctionnels. Il n'a absolument pas pour vocation a être prêt pour la production, d'autres moteurs sont plus aboutis et plus performants.

J'ai commencé le projet après qu'Unreal m'est corrompu un fichier une énième fois (parce que j'ai renommé une classe). J'ai décidé de concevoir un moteur expérimental afin de se rapprocher le plus possible du moteur parfait selon moi:

Caractéristiques


Le moteur est codé en C++ et utilise CMake pour la compilation. CMake est un excellent outil pour les développeurs C++, malgre des défauts évidents (La syntaxe horrible !!!). Meson était un bon candidat, moins complet, avec une excellente syntaxe mais sans possibilité de créer ses propres functions (Les développeurs expliquent que cela rendrait le language "Turing-complete").

Le moteur se divise en plusieurs parties:

Le moteur de rendu utilisera Bullet3. Le moteur son utilisera OpenAL. Les modèles 3D seront gérés grace à Assimp afin de supporter plusieurs formats facilement.

Les sources ne sont actuellement pas accessibles.

Fonctionnalités expérimentales


Génération de code

Le moteur est prévu pour utilise la réflexion. Le C++ étant dépourvu d’une telle fonctionnalité, j’ai dû crée un générateur de code pour compléter facilement les classes. Ce genre de procédé est très utilisé, par exemple par Unreal Engine ou Qt. J’ai choisi de m’inspirer sur Unreal Engine car le fonctionnement du Header Tool permet de choisir les éléments capables d’utiliser la réflexion. Cela permet d’éviter de générer beaucoup de code inutile. J’utilise donc des macros semblables a ceux d’Unreal: SECLASS, SESTRUCT, SEENUM, SEPARAM, SEPROPERTY et SEFUNCTION.

Voici un exemple d'utilisation pour rendre une classe réflective:

namespace snowstorm
{
    SECLASS(Abstract, DisplayName = "Actor")
    class AActor : public SEObject
    {
        ...

        SEPROPERTY(EditAnywhere, Help = "Actor velocity")
        float Speed = 10.0f;

        SEFUNCTION(Getter = "Speed")
        void SetSpeed(float InSpeed);

        ...
    };
}

Les macros utilisent un DSL proche de celui d'Unreal. Cependant, celui du SnowStorm Engine est strict et sensible a la casse. Par exemple, avec Unreal, UCLASS(DisplayName = "Actor") et UCLASS(DisplayName = Actor) sont équivalents. Avec SnowStorm, l'absence de guillemets (SECLASS(DisplayName = Actor)) est une erreur de syntaxe. C'est un choix de design afin de garder une homogénéité dans le code.

L'implémentation du SnowStorm Header Tool utilise les bibliothèques fournies par Clang pour analyser le code C++. Grace a cette technique, je peux utiliser plus de fonctionnalités du C++ qu’Unreal, notamment les namespaces. Plus particulièrement, l'outil récupère les classes, les structures, les énumérations, les attributs, les méthodes et les paramètres marqués avec annotations C++ (cad [[annotate("...")]]). Je récupère ensuite la chaine de caractères dans l'annotation que j'analyse avec mon parser DSL écrit avec Flex et Bison. Puis il génère le code.

Le Snow Storm Engine étant conçu pour être modulaire, le Header Tool est extensible. Chaque module peut alors rajouter des spécifieurs et générer du code. Cela permet d'éviter d'hardcoder l'outil et offre des possibilités pour créer des outils spécifiques a des projets. Par exemple, un module rajoutant des appels RPC pourra ajouter les spécifieurs RpcClient, RpcClient et RpcBoth et générer le code des appels.

Moteur de rendu multiplateforme

Le moteur de rendu interne sera base sur bgfx. Il sera multiplateforme et supportera Vulkan, Metal et DX11/12.

Le choix du langage de shader n'est pour l'instant pas encore décidé. Cependant, un transpileur sera utilisé. Il existe heureusement des transpileurs tels que SPIRV-Cross ou ShaderConductor pour passer d’un langage a un autre.

Compilation des scènes en C++

Lors de la compilation, les scènes initialement structures format XML seront transformés en code C++. Celui-ci sera alors compile en une bibliothèque partagée. Cette méthode devrait permettre un chargement plus rapide des scènes. Cependant, les performances de cette méthode sont purement théoriques.

Gestion des dépendances

Le SnowStorm Engine utilise le gestionnaire de paquets C++ Conan pour gérer les dépendances. Conan est un excellent outil car il offre une vision "project-centric" (chaque projet a ses propres dépendances) contrairement a VCPKG qui a une vision "system-centric". Cela permet d’éviter a l’utilisateur d’installer lui-même les dépendances et les mauvaises versions. d'avoir une excellente intégration avec CMake et de pouvoir créer ses propres paquets (le principal defaut de Hunter et VCPKG).

Conan a aussi une excellente intégration avec CMake et permet de créer facilements ses propres paquets (C'est le principal défaut de Hunter et VCPKG). Il dispose aussi d'un excellent catalogue de bibliothèques officiellement supportées.

Système de fichier virtuel

Le SnowStorm Engine utilise le CFS. Pour plus d'informations à propos du CFS, vous pouvez consulter cette page.

Gestion des assets

Le SnowStorm Engine a deux termes pour designer les assets.

Le processus d'importation d'asset se rapproche beaucoup d’Unity3D. L'utilisateur doit placer les assets dans le dossier Content. Il doit ensuite les importer manuellement (via un outil dans l’interface). Le moteur va ensuite associer un fichier. meta a chaque asset. Le fichier meta permet au moteur de transformer un asset en ressource. Il contient l’ID de la ressource ainsi que divers paramètres d’importation (Ces paramètres varient selon le type d’asset que l’on importe). A chaque fois qu'un asset importé est modifié, le moteur convertit automatiquement l'asset en ressource.