Mise à jour des projets Ultimate 3D

À chaque fois qu'une nouvelle version d'Ultimate 3D est publiée, certains scripts ont changés dans cette version et d'autres peuvent avoir été ajoutés. C'est pourquoi il vous faut les changer dans votre projet si vous voulez mettre à jour un projet vers une nouvelle version d'Ultimate 3D. Ce tutorial vous guide au travers de cette procédure pour chaque version. Il vous suffit de trouver le sous-chapitre qui correspond à votre cas et de suivre les étapes. S'il vous faut mettre à jour une version vraiment ancienne, vous pouvez également enchaîner les étapes de mise à jour, pour parvenir par exemple à mettre à jour un projet Ultimate 3D 2.0 beta 3 vers Ultimate 3D 2.0 final. Etant donné que je fais de mon mieux pour garder une rétro compatibilité, la procédure de mise à jour ne dure, généralement, par plus d'un quart d'heure.

Mise à jour d'un projet Ultimate 3D final vers Ultimate 3D 2.1 beta

Ultimate 3D 2.1 a de nombreuses petites fonctionnalités nouvelles, et un nouveau système de détection de collision basique ainsi qu'un nouveau système de réponse de collision. De ce fait, de nombreux scripts doivent être ajoutés, certains doivent être modifiés et certains (liés à la détection de collision) doivent être supprimés. Vous devrez probablement réécrire l'essentiel de votre code de détection de collision et de réponse de collision, mais avec les nouvelles fonctions c'est vraiment très simple.

Voici une liste de tous les scripts qui doivent être ajoutés. Tous ces scripts sont contenus dans le fichier NewScripts.gml, qui est distribué avec le SDK d'Ultimate 3D 2.1, ainsi vous pouvez importer ce fichier de scripts pour les ajouter automatiquement. (Ndt: Menu Scripts > Import Scripts)

Voici une liste de tous les scripts qui ont besoin d'être remplacés par de nouvelles versions:

Pour certaines de ces fonctions leur utilisation a également changée. SmoothNormals(...) et AddTerrainTexture(...) on un paramètre supplémentaire désormais, mais si vous ignorez ce paramètre des valeurs par défaut raisonnables seront utilisées. SwitchWireFrameMode(...) n'active ou ne désactive plus tout les objets de la scène. Maintenant cette fonction active ou désactive le rendu en mode fil de fer pour tous les objets de la scène. Maintenant elle l'active ou le désactive uniquement pour l'objet qui appelle cette fonction. Assurez vous de bien faire attention à ces modifications d'interface, lorsque vous mettez à jour votre projet. Enfin, voici une liste des scripts qui doivent être supprimmés:

Ne soyez pas choqués par cela toutefois. Il y a toujours une fonction pour effectuer un test d'intersection ray-mesh pour tous ces types d'objets et c'est même plus souple que ces vieilles fonctions, étant donné qu'elle peut automatiquement faire le test de ray-tracing pour un ensemble d'objets solides prédéfinis. La nouvelle fonction est nommée CheckRayIntersection(...). Quoi qu'il en soit, pour la détection de collision et pour la réponse de collision, il y a une solution encore meilleure désormais. Vous pouvez en lire plus dans le chapitre réécrit du fichier d'aide à ce sujet. C'est un peu plus fiable, facile à utiliser et dans les bonnes circonstances, bien plus efficace que l'ancienne méthode. 

CoordToScreenX/Y/Z(...) a été remplacée désormais par une version basée sur les vecteurs appellée CoordToScreen(...). Plutôt que d'appeler trois fonctions différentes, vous en appellez seulement une, qui retourne désormais un vecteur.

A part tout cela, il y a quelques changements vraiments mineurs. Si vous souhaitez rendre la room zéro invisible il vous faut utiliser SetRoomVisibilityEnforcement(...) à la place de SetRoomVisibility(...) maintenant. Les height maps des terrains sont interprétées différemments désormais, pour ajouter le support des height maps 32-bit. Si votre height map de terrain n'est pas exactement en niveaux de gris vous obtiendrez des résultats indésirés. Le canal rouge de la height map a une influence très importante sur les résultats désormais. Si vos heights maps sont de parfaits niveaux de gris, vous n'aurez aucun problème avec la nouvelle façon dont les données sont interprétées.

Une dernière chose, qui doit être dite ici, est que l'ordre des matrices des tangentes inversées de l'espace a changé. Dans Ultimate 3D 2.0 final, les normales étaient écrasées par la deuxième colonne des matrices et le troisième ensemble de coordonnées de textures était écrasé par la troisième colonne. Désormais les normales sont écrasées par la troisième colonne et le troisième ensemble de coordonnées de textures est écrasé par la deuxième colonne. Le grand avantage dans tout cela, est que la troisième colonne des matrices des tangentes inversées de l'espace, égale habituellement, les normales. C'est grâce à cela que vous pouvez, désormais, avoir des matériaux qui utilisent l'éclairage par pixel et d'autres qui ne l'utilisent pas sur un même mesh en même temps. Malgré cela, vous n'êtes pas obligés d'appeler RecalculateNormals() si vous désactivez l'éclairage par pixel. Cela signifie, que si vous utilisez des vertex shaders, qui utilisent les matrices des tangentes inversées de l'espace, vous devez inverser v3 et v9. Si vous avez exporté les fichiers de modèle Ultimate 3D avec les matrices des tangentes inversées de l'espace, avec les versions récentes d'Ultimate 3D 2.0, vous devez soit, les réexporter, soit appeler AddInverseTangentSpaceMatrices() après les avoir chargés.  

Mise à jour d'un projet Ultimate 3D 2.0 RC vers Ultimate 3D 2.0 final

Etant donné qu'Ultimate 3D 2.0 final n'a aucune nouvelle fonctionnalité, les seuls scripts qu'il vous faut mettre à jour sont GetObjectTransformation() et Destroy(). Quoi qu'il en soit, il est recommandé de mettre  à jour / d'ajouter également les scripts suivants si vous utilisez Game Maker 6.0 ou plus. Cela vous permettra d'utiliser Ultimate 3D sans l'option de Game Maker "Treat uninitialized variables as value 0". Pour parvenir à cette fin, les scripts suivants devront êtres mis à jour:

Une autre mise à jour facultative inclut quelques changements au code de l'objet "control". Le code dans l'évènement destroy et dans l'évènement game end devrait être mis à jour et le code dans l'évènement room end devrait être ajouté pour permettre à Ultimate 3D de fonctionner proprement lors du changement de rooms.

Mise à jour d'un projet Ultimate 3D 2.0 beta 3 vers Ultimate 3D 2.0 RC

Ultimate 3D 2.0 RC est ce qu'Ultimate 3D 2.0 était originalement sensé être. Etant donné que le développement d'Ultimate 3D 2.0 pris beaucoup plus de temps que prévu, les versions beta furent rendues publiques avec certaines fonctionalités manquantes, dans l'idée de réduire les délai de publication. Elles ont désormais été ajoutées. Pour être à même de les utiliser, il vous faudra mettre un peu à jour votre projet Game Maker. Prenez donc cinq minutes pour lire ce chapitre, et prenez en dix autres pour faire ce qu'il dit, et vous pourrez utiliser Ultimate 3D 2.0 RC avec toutes ses nouvelles fonctionnalités.

La première chose que vous aurez à faire est de télécharger la version la plus récente du SDK sur Ultimate3D.org (Ndt: Sur http://u3d.gamemaker.fr/ vous pourrez également les retrouver). Une fois que vous l'avez, vous pouvez remplacer la dll Ultimate3D.dll de votre projet Ultimate 3D 2.0 beta 3 dans votre projet, avec celle de la version release candidate (Ndt: RC). Après cela, plus rien ne fonctionnera. D'abord vous devez remplacer un certain nombre de scripts par leur version actuelle. Ouvrez simplement le vieux BasicGM5.gmd (respectivement BasicGM6.gm6 ou BasicGM7.gmk) et votre projet Game Maker, ouvrez les scripts qui doivent être remplacés, et copiez leur nouveau contenu depuis la nouvelle version vers l'ancienne. Vous avez ici une liste de tous les scripts qui doivent être remplacés par les nouvelles versions:

Ensuite il vous faut ajouter les nouveaux scripts, pour être à même d'utiliser les nouvelles fonctionnalités. Encore une fois, en voici une liste.

Tous ces scripts sont disponibles dans un fichier de scripts Game Maker exportés, qui est livré avec le SDK. L'utiliser peut vous permettre d'économiser du temps en les ajoutants. Dependemment du fichier sur lequel vous avez basé votre travail, vous pourrez avoir besoin d'ajouter GetBoneTransformation(...), parce que ce script était manquant dans certains des fichiers Game Maker qui vinrent avec Ultimate 3D 2.0 beta 3. Aussi vous devriez supprimmer LoadAnimated3DS(), car il s'agit d'un reste obsolète de versions plus anciennes d'Ultimate 3D. Cela ne change rien, mais appellez LoadMesh() quoiqu'il en soit. Une fois que vous aurez fait toutes ces choses votre projet Ultimate 3D devrait fonctionner correctement et vous pourrez commencer à utiliser les fonctionnalités d'Ultimate 3D 2.0 RC.  

Mise à jour d'un projet Ultimate 3D 1.31 vers Ultimate 3D 2.0 beta 1

Ultimate 3D 2.0 est une refonte complète d'Ultimate 3D. Il n'y pas une seule ligne de code qui soit la même que dans Ultimate 3D 1.31. C'est pourquoi, il n'était pas possible de garder tout pareil. Il y a un ensemble de choses qui ont changées parce que les anciennes solutions, n'étaient par suffisamment ergonomique et intuitive, un ensemble de choses qui ont changées parce que les nouvelles fonctionnalités requéraient ces changements et un ensemble de choses qui ont simplement étés supprimmées pour améliorer les performances d'Ultimate 3D. Ce texte listera tous ces changements et donnera une description détaillée étape par étape, sur comment mettre à jour les projets Ultimate 3D 1.31 vers Ultimate 3D 2.0. Cela prend une heure ou deux de convertir votre projet.

En ce qui concerne les fonctionnalités qui font partie de la section novice d'Ultimate 3D, quasiment rien n'a changé. Les seuls changements sont les objets cubique qui sont définis différemments et les lumières qui sont calculées d'une manière plus naturelle. Quelques variables ont également été ajoutées pour les objets primitifs et LoadAnimated3DS() n'existe plus (c'est LoadMesh() désormais). La signification des variables rotx, roty et rotz a changé pour les objets de caméra et pour les sources de lumière. Ces variables fonctionnent désormais exactement de la même manière que les variables correspondantes des objets primitifs et de modèles. Aussi, vous ne pouvez plus utiliser de vertex shaders pour les objets primitifs, ce fut un changement nécessaire pour permettre un calcul de rendu des primitifs bein plus rapide.

La plupart des fonctionnalités de la section avancée n'existaient pas dans Ultimate 3D 1.31, donc il n'y pas grand chose qui pourrait avoir changé. Les système d'effets de particules est complètement neuf et les paramètres des fonctions de ray tracing ont un peu changées, du fait du changement des significations des variables rotx et roty pour les objets de caméra. Elles fonctionnent toutes de la même façon désormais. Cela signifie qu'une valeur de 90 pour rotx ferait pointer la caméra droit vers le bas. Mais venons en à la conversion des projets.


Première étape: Remplacer et ajouter tous les scripts

En étant bien conscient que cette partie est vraiment ennuyeuse et prendra beaucoup de temps. Mais lorsque vous en aurez fini avec cela, votre projet sera quasiment prêt pour Ultimate 3D 2.0. Je conseille d'ouvrir le nouveau BasicGM5.gmd/gm6 et votre projet Ultimate 3D 1.31 dans deux instances de Game Maker et de placer leurs deux fenêtres à la moitié gauche et à la moitié droite de l'écran. La première chose que vous avez à faire pour avoir les nouveaux script dans votre projet est de supprimmer les scripts anciens suivants qui n'existent plus désormais:  

Ensuite il vous faut renommer les scripts suivants avec les nouveaux noms donnés:

Quand vous en avez fini avec ces changements vous devriez essayer de lancer votre jeu une fois en utilisant l'ancienne dll d'Ultimate 3D 1.31, afin de voir quelles parties du programme devront êtres changées ou refaites. Si vous avez des systèmes de particule fait avec Ultimate 3D 1.31 il sera plus facile de le supprimer et de les refaire complètement. Si vous utilisez les vertex shaders pour les objets primitifs, il vous faudra trouver un moyen d'obtenir le même effet sans les shaders, ou vous devrez remplacer les objets primitifs avec des objets de modèle. Lorsque vous en avez fini avec cela, le jeu devrait fonctionner. 

Maintenant, la partie vraiment très ennuyeuse arrive. Vous devez ouvrir chacun des scripts dans le nouveau fichier BasicGM5.gmd/gm6 copier son contenu, et remplacer le contenu du script correspondant dans votre projet avec ce code. Si le script ne fait pas partie de l'ancienne version d'Ultimate 3D vous devrez le créer. Vous devriez refaire la structure des groupes également. Ce n'est pas tant de travail de les créer, et cela rendra tout un peu plus simple.

Deuxième étape: changer les objets

Lorsque vous avez fini de remplacer et d'ajouter tous les scripts vous pouvez démarrer le jeu en utilisant la nouvelle dll, mais le résultat ne sera pas très motivant. Vous ne verrez rien du tout. Mais ne vous inquiétez pas, il est très facile de résoudre ce souci. Vous devez simplement changer appels de fonction qui sont fait par l'objet de control. Dans l'évènement end-step vous trouverez un appel à MoveCamera() et un appel à la fonction Game Maker external_call(...). Il vous faut remplacer ces deux appels avec le morceau de code suivant, après avoir supprimé l'évaluation "if" qui est au dessus de ces appels:

external_call(global.u3d_transmit_controller_information,BG_r,BG_g,BG_b,show_cursor);
external_call(global.u3d_render);

Dans l'évènement begin-step, vous devez à nouveau supprimmer l'évalation "if" et vous devez remplacer l'appel à external_call(...) avec l'appel suivant:

external_call(global.u3d_present);

Vous devez également remplacer les choses de l'évènement destroy et de l'évènement game end avec le morceau de code suivant:

external_call(global.u3d_cleanup);

Quand vous en avez fini avec ces changements, vous pouvez à nouveau lancer le jeu et il devrait y avoir quelques résultats visibles. Mais certaines choses peuvent être un peu étranges. La caméra ne se comportera probablement pas de la manière désirée et les détections de collision ne fonctionneront pas correctement. Cela est dû au changement de la signification des variables rotx, roty et rotz et des paramètres de GetDistanceToModel(...) et de Move(...). Il n'y a pas de truc avec lequel je pourrai vous aider dans ce contexte. Vous devez simplement rechercher les codes qui utilisent ces variables ou ces fonctions et les corriger. Dans de nombreux cas, ajouter quelques "moins" sera tout ce que vous aurez à faire. Une autre chose que vous devez faire, consiste à mettre à jour tous les objets cubiques que vous pouvez avoir. Pour voir comment ils fonctionnent désormais, référez vous s'il vous plaît, au chapitre à propos des objets primitifs.

Il y a aussi un ensemble de très petit changements:

Quand vous en avez fini avec ces changements tout devrait fonctionner et votre projet est prêt pour être utilisé avec Ultimate 3D 2.0. S'il reste encore des problèmes, postez quelque part sur la Communauté d'Ultimate 3D.

Convertir un projet Ultimate 3D de Game Maker 5.x à Game Maker 6.0 ou supérieur

En raison du manque de rétro-compatibilité de Game Maker 6.0 vous devez mettre certains scripts à jour lorsque vous convertissez un projet Ultimate 3D de Game Maker 5.x à Game Maker 6.0 ou supérieur. Malgré que de nombreux scripts diffèrent, parce que la version Game Maker 6.0 d'Ultimate 3D est faite pour fonctionner sans l'option "Treat uninitialized variable as value 0". Cex scripts là, doivent être remplacés par les versions correctes, également. Voici une liste de tous les scripts qui doivent êtres remplacés par leur version correspondante du fichier BasicGM6.gm6 (respectivement BasicGM7.gmk): 

En outre, les quatres scripts suivants devront être ajoutés au groupe "Private functions":

Malgré cela, certains codes dans les objets devront être modifiés. Les morceaux de code dans le fichier BasicGM5.gmd qui ont besoins d'être modifiés pour fonctionner avec Game Maker 6.0 ou supérieur font partie de l'évènement room end de l'objet de contrôle et de l'évènement step de la caméra.



© Christoph Peters. Certains droits réservés. (Traduction FR 04/2008, Franck Vernel / Damien Buhl).

Creative Commons License XHTML 1.0 Transitional