Compiler le SDK de Doom 3 / Quake 4 avec Visual Studio 6.0

Écrit le 17/10/2004 par Kurim
Dernière mise à jour : 06/02/2006

Introduction

D'après www.iddevnet.com, pour compiler avec Visual Studio .NET (c'est a dire 7.0 et plus), il n'y a aucun problème. Il suffit d'installer le SDK, d'ouvrir le fichier de Workspace avec Visual, puis de lancer la compilation, et on obtient en sortie un fichier gamex86.dll

Cependant, sur ce même site, on nous prévient : it may or may not work in 6.0. C'est quand même possible : je vais vous expliquer comment.

Ce qu'il nous faut

Le SDK de Doom 3, bien évidemment.
Une version 6.0 de Visual Studio, bien évidement aussi.
Le VC Toolkit 2003 qui fournit entre autre une mise à jour des en-tetes, des bibliothèques et surtout, des outils de compilation de Visual C.

Installation du Toolkit

Une fois le fichier téléchargé, installez le dans un dossier different de celui de VC de préference (Pour pas remplacer de fichier).

Lancez Visual Studio, sans ouvrir de Workspace particulier. Allez dans Tools > Options. Il va simplement s'agir de changer les chemins des applications externes (outils de compilation), et les chemins des bibliothèques et en-têtes. Prenez l'onglet "Directories", puis changez :
- dans "Executable files", ajoutez comme répertoire le dossier /Bin du Toolkit, puis déplacez le pour qu'il soit au dessus du dossier /VC98/Bin. Cela aura pour effet que si il veut utiliser un programme externe, il prendra prioritairement celui du Toolkit, mais si ce programme n'y est pas, alors il reprendra celui de VC98. (Ici ca n'est pas très utile, mais ca peut l'etre pour les en-tetes, si vous avez installé des bibliothèques supplémentaire dans les dossiers de VC, elles seront toujours accessible.
- De la même facon, ajoutez /Include et /Lib, respectivement dans les catégories "Include files" et "Library files", au dessus des dossiers /VC98/Include et /VC98/Lib.

http://www.game-lab.com/images/tuts/doom3_vcpp6/img1.jpg

Voila, avec ca vous pouvez compiler avec votre VC 6.0 tout code source qui fonctionne sous le VC 7.0. Cependant il manque encore quelque chose : VC 6.0 ne peut pas lire le format de workspace et de projet de VC 7.0. Il va falloir changer ca...

Conversion du SDK

J'ai créé moi même une version 6.0 de l'espace de travail du SDK (avec des fichiers dsw/dsp donc), téléchargez la ici, puis décompressez la dans le répertoire racine du SDK de Doom 3 que vous aurez préalablement installé dans un dossier quelquonque (pas dans le dossier du jeu !). Ce workspace n'est peut etre pas exactement fidele à celui d'ID prévu pour VC 7, mais il compile et marche ingame.

Petite mise à jour : si vous avez les erreurs qui suivent :

e:\SDK Doom 3\game\PlayerView.cpp(526) : error C2668: 'sqrt' : ambiguous call to overloaded function
        c:\Programmes\Developpement\Microsoft Visual C++ Toolkit 2003\include\math.h(626): could be 'long double sqrt(long double)'
        c:\Programmes\Developpement\Microsoft Visual C++ Toolkit 2003\include\math.h(578): or       'float sqrt(float)'
        c:\Programmes\Developpement\Microsoft Visual C++ Toolkit 2003\include\math.h(200): or       'double sqrt(double)'
        while trying to match the argument list '(int)'
e:\SDK Doom 3\game\PlayerView.cpp(662) : error C2668: 'sin' : ambiguous call to overloaded function
        c:\Programmes\Developpement\Microsoft Visual C++ Toolkit 2003\include\math.h(622): could be 'long double sin(long double)'
        c:\Programmes\Developpement\Microsoft Visual C++ Toolkit 2003\include\math.h(574): or       'float sin(float)'
        c:\Programmes\Developpement\Microsoft Visual C++ Toolkit 2003\include\math.h(196): or       'double sin(double)'
        while trying to match the argument list '(int)'

faites les changements suivants :

ligne 662

int offset =  25 + sin(gameLocal.time );

devient :

int offset =  25 + sin((double)gameLocal.time );

line 526

float shift = scale * sin( sqrt(offset ) * g_dvFrequency.GetFloat() );

devient :

float shift = scale * sin( sqrt((double) offset ) * g_dvFrequency.GetFloat() );

Merci à la communauté de Doom3world et de leurs posts sur les problèmes de compilation avec le SDK.

Notez qu'il existe deux configurations de compilation particulières : avec inlines, et avec inlines et log de memoire. Je n'ai pas trop testé mais elles doivent probablement integrer plus de fonction en inline (pour rappel, une fonction inline est une fonction dont le contenu est réécrit à tous les endroits ou on l'appelle (un peu comme un #define), au lieu d'etre appelé à un autre endroit), avec pour la seconde, possibilité de logger les allocations de memoire et autre. La dernière config pose des problèmes a l'heure actuel, il semblerait que cela viennent des fichiers du SDK et non de moi mais je n'en suis pas sur. Si j'arrive a corriger ca par le fichier projet, je metterais à jour le zip.

Voilà, meme si ce n'est pas parfait, vous avez de quoi faire des compils release et debug standard, bref tout ce qu'il faut pour commencer à modder sans changer d'IDE :)