Classes d’id Tech 4 (neo/framework)

Description des fichiers dans le dossier neo/framework.

  • Chaque section prend le nom des deux fichiers C++ (.h et .cpp) auquelle elle fait référence. Ainsi, Common indique les fichiers Common.h et Common.cpp.
  • Certaines sections ajouteront l'extension pour signaler un fichier unique, tel CVarSystem.h.
  • Une note « + description » indique que le fichier contient une description détaillée pour une ou plusieurs classes.
  • Une classe entre parenthèses indique qu'elle est héritée : SousClasse (ClasseDeBase).

=Common

La classe abstraite idCommon est héritée par idCommonLocal, et déclare des méthodes pour :

  • l'initialisation et la fermeture du jeu
  • la boucle du jeu : la fonction idCommon::Frame() est appelée sans arrêt dans la fonction principale (WinMain()) dans neo/sys/win32/win_main.cpp

idCommonLocal

  • idCommonLocal::DPrintf() n'affiche un message dans la console que si la CVar developer (com_developer dans le C++) a une valeur de 1.

=Console

idConsole (classe virtuelle pure) et sa sous-classe, idConsoleLocal.

Contient les commandes spéciales (Entrée, Ctrl + L, PageUp, etc.) pour la console.

=CVarSystem.h (+ description)

idCVar est la classe utilisée pour toutes les variables qu'on peut modifier avec la console.

=DeclManager (+ description)

Classes (.h) :

  • idDeclBase
  • idDecl
  • idDeclManager

Classes (.cpp) :

  • idDeclType
  • idDeclFolder
  • idDeclLocal
  • idDeclFile
  • idDeclManagerLocal

Beaucoup de fichiers ont accès à un objet de type idDeclManager nommé declManager (Game_local.cpp). Grâce à cet objet, on peut faire référence à la méthode idDeclManagerLocal::FindMaterial(), qui permet de trouver un matériel dans le dossier base.

Note : declManager est un objet idDeclManager, et sa méthode FindMaterial() est une fonction virtuelle pure. Par contre, il est initialisé avec un objet idDeclManagerLocal (DeclManager.cpp, ligne ~249), ce qui lui permet d'utiliser l'implémentation idDeclManagerLocal::FindMaterial().

Si un objet idDeclManager est initialisé avec un idDeclManagerLocal, c'est possiblement parce que certaines fonctions attendent un idDeclManager ; par contre, je n'en suis pas certain.

=DeclPDA

Classes (.h) :

  • idDeclEmail
  • idDeclVideo
  • idDeclAudio
  • idDeclPDA (idDecl) : classe principale qui regroupe toutes les fonctions du PDA. Je ne crois pas que cette classe affiche elle-même quoi que ce soit à l'écran, car il n'y a aucun objet idUserInterface ou semblable dans les fichiers DeclPDA.h/cpp.

=EventLoop

Classe : idEventLoop

idEventLoop reçoit des événements et les envoie aux parties concernées du moteur.

De plus, cette classe s'occupe des journaux. La journalisation est une méthode d'enregistrement de données : un fichier temporaire enregistre les nouvelles données et ne les transfère à leur destination finale que lorsqu'elles sont complètes. Ceci permet d'éviter les erreurs d'écriture et la corruption de données si l'application à laquelle elles appartiennent plante.

Un seul objet de type idEventLoop est créé, dans EventLoop.cpp.

idEventLoop eventLoopLocal;
idEventLoop *eventLoop = &eventLoopLocal;

Note : Ce genre de code apparaît ailleurs dans le moteur, mais habituellement, le premier objet est une occurrence d'une classe « locale » et le second, de sa classe mère, par exemple dans neo/game/Game_local.cpp :

idGameLocal gameLocal;
idGame * game = &gameLocal; // statically pointed at an idGameLocal

Par contre, dans ce dernier extrait, la classe idGame est une interface abstraite qui sert à limiter les fonctions publiques accessibles, alors que dans EventLoop.cpp, on dirait qu'eventLoopLocal est créé localement tout simplement pour être supprimé automatiquement à la fermeture du programme (il n'est pas utilisé ailleurs).

=File

Classes :

  • idFile
  • idFile_Memory (idFile)
  • idFile_BitMsg (idFile)
  • idFile_Permanent (idFile)
  • idFile_InZip (idFile)

La classe idFile représente un fichier et permet de le parcourir, y lire le contenu ou le modifier, entre autres.

=FileSystem (+ description)

Classes (.h) :

  • idFileList
  • idModList
  • idFileSystem

Classes (.cpp) :

  • idDEntry (idStrList)
  • idFileSystemLocal (idFileSystem)
  • idInitExclusions

Structures notables :

  • pack_t : contient (probablement) des informations sur un fichier .pak.
  • directory_t : deux chaînes, une pour le chemin racine de Doom (path), et l'autre pour le sous-dossier des ressources (gamedir). Ce type d'objet est utilisé presque exclusivement par la structure searchpath_s.
  • searchpath_s / searchpath_t : comme directory_t et pack_t, cette structure n'est utilisée que dans FileSystem.cpp. Elle contient deux pointeurs : un pour un objet directory_t et un autre pour un pack_t.

idFileSystemLocal

  • idFileSystemLocal::AddGameDirectory() ajoute un répertoire de ressources. Cette fonction est appelée dans idFileSystemLocal::SetupGameDirectories() pour déterminer les quatres dossiers de ressources par défaut (fs_basepath, fs_cdpath, fs_devpath et fs_savepath).

=KeyInput

Définition de toutes les touches utilisées par le jeu (enum keyNum_t). Comprend les caractères internationaux.

Toutes les méthodes d'idKeyInput sont statiques.

  • idKeyInput::SetBinding() associe une touche à une action (utilisée pour le réglage des touches).
  • idKeyInput::GetUsercmdAction() retourne l'index (int) de l'action reliée à une touche appuyée. Par exemple, la touche W signifie marcher à l'avant, la touche Espace signifie sauter...
  • idKeyInput::KeysFromBinding() retourne le nom (const char *) de l'action associée avec une touche (cette fonction est appelée plusieurs fois durant l'initialisation).

=Licensee

Ce fichier ne contient aucune classe. Il sert plutôt à déclarer des constantes qui seront utilisées partout, comme le nom du jeu (GAME_NAME), le dossier principal des ressources (CD_BASEDIR), le fichier de configuration (CONFIG_FILE), etc.

Constantes notables :

  • BASE_GAMEDIR : le dossier des ressources (base par défaut). Remarquer que Doom cherchera ce dossier dans le répertoire de l'exécutable, même si on règle la CVar fs_basepath à un autre dossier.

=Session

  • idSessionLocal::Draw() serait le frontal (front end) du moteur de rendu : elle vérifie d'ailleurs si guiTest (un objet idUserInterface) a une valeur ; si oui, elle le rend à l'écran avec l'instruction suivante :

    guiTest->Redraw( com_frameTime );

  • idSessionLocal::StartMenu() est appelée non seulement à l'affichage du menu au démarrage du jeu, mais aussi lorsqu'on met le jeu en pause (car le menu principal est aussi utilisé comme menu Pause).
  • idSessionLocal::TestGUI() est appelée quand on tape testgui dans la console ; elle règle la valeur d'un objet idUserInterface, guiTest. (Voir idSessionLocal::Draw().)

=UsercmdGen

idUsercmdGen (abstraite) et sa sous-classe, idUsercmdGenLocal.

L'énumération usercmdButton_t (dans UsercmdGen.cpp) contient les types d'action disponibles (avancer, reculer, sauter...).

La classe usercmd_t est définie UsercmdGen.h.