|
||||||||||||||||||||||||||||||||||||||||||||||
|
C'est quoi ? Wazp3D est une réimplémentation de la bibliothèque bien connue Warp3D. C'est-à-dire que Wazp3D a été réécrit à partir des spécifications de la documentation développeur de Warp3D. Ainsi, les fonctions ont les mêmes noms, les mêmes paramètres et sont censées (ou au moins essayent de) fonctionner à l'identique. Donc on peut dire que c'est comme Mesa vis-à-vis d'OpenGL : pas un portage "officiel" mais vu de l'utilisateur ou du programmeur, c'est censé fonctionner à l'identique (compatible au niveau des binaires). Pourquoi cette bibliothèque ? Avec l'équipe de Tales Of Tamar, j'ai essayé de programmer une carte 3D (dite "TOT3D") pour ce jeu de stratégie, cela résultait un peu comme un jeu d'échec en 3D. C'était basé sur OpenGL et je voulais le porter sur Amiga/Warp3D. En 2006, à cause de difficultés personnelles et familiales, Arkadius Zielinski (concepteur 3D) et moi (programmeur) ne faisions plus beaucoup avancer TOT3D. Ainsi, les personnages 3D ne sont toujours pas tous faits et il faudrait de nouveau un programmeur pour intégrer TOT3D au reste du projet "Tales of Tamar" (pour l'instant TOT3D est un programme séparé qui sait lire/afficher des fichiers cartes). En fait, on est plus très sûr que ce projet ne soit jamais fini et je ne peux décemment le diffuser puisque j'ai reçu de Martin Wolf (inventeur de Tales of Tamar) un peu d'argent pour le développer. Bref, n'ayant plus trop l'envie de programmer sur TOT3D, je me suis lancé dans la finalisation de ma bibliothèque : ajouter le restant des fonctions Warp3D, notamment celles que je n'utilisais pas. Cela paraît énorme de réécrire les 88 fonctions mais heureusement beaucoup de fonctions se ressemblent : une pour tracer un triangle/une autre une série de triangles, une pour lire un point de Zbuffer/une pour écrire une ligne de Zbuffer, etc. En fait, c'est assez bourrin de faire la plupart des fonctions qui sont surtout du copier/coller ; le plus difficile c'est de vérifier que cela fonctionne correctement (paramètres, retour d'erreur, etc.), c'est d'ailleurs pour cela qu'il y a un débogueur intégré. ;-) En fait, il y a vraiment que trois gros morceaux dans Wazp3D :
C'est basé sur un moteur de rendu logiciel (un rasterizer) que j'avais commencé à écrire il y a plusieurs années (SOFT3D). Et en fait tout les appels Warp3D sont convertis finalement en appels vers SOFT3D qui, lui, trace les triangles. Car, à la base, toute carte 3D ne trace que des triangles 3D c'est-à-dire une surface reliant trois points avec des coordonnées X Y Z. Le Z donne la profondeur : des triangles peuvent donc se superposer selon leur Z, si le brouillard commence en Z=0,5 et que le triangle est entre 0,0 et 1,0 il sera "brouillardé", etc. Un triangle n'est jamais que des lignes horizontales de pixels reliant un côté à l'autre : tracer ces segments c'est la rastérisation et c'est juste tracer des pixels les uns après les autres. Idem avec de la couleur les points ont alors des valeurs de couleur RGBA. Si le début du segment est rouge et la fin blanche, alors il suffit de calculer le "pas" (blanc-rouge)/distance et de l'ajouter à chaque pixel pour linéariser le calcul des pixels. Cela reste vrai avec une texture car les points ont alors des coordonnées dites U V sur la texture. J'appelle ce pas "Xdelta" et, en gros, rastériser c'est à partir du premier point obtenir les suivants ainsi : z=z + Xdelta.z ; u=u + Xdelta.u ; v=v + Xdelta.v ; R=R + Xdelta.R ; G=G + Xdelta.G ; B=B + Xdelta.B ; A=A + Xdelta.A ; A est la composante alpha des couleurs ou des textures, c'est leur transparence. Pour une texture (ou une couleur simple) avec Alpha=255 c'est opaque donc on affiche le pixel de la texture =facile. Avec Alpha=0 c'est la transparence totale, là c'est facile aussi, on affiche le pixel du fond. Pour les autres valeurs Alpha donne le ratio de transparence, donc généralement le résultat=(alpha/255)*Texture+(1-Alpha/255)*Fond, cette fonction de "blending" est appelée W3D_ONE_MINUS_SRC_ALPHA, c'est la seule de Wazp3D. Le Zbuffer, pour la gestion des faces cachées, est un tableau de la taille de l'écran où se stockent les valeurs de Z des triangles tracés. Au moment du tracé du triangle suivant, si les pixels ont des valeurs Z inférieures (s'ils sont devants), alors ils s'affichent. Le "culling" n'affiche que les polygones vus de face dont les points sont dans l'ordre "ClockWise" et donc cache les polygones vus de dos (les faces cachées). En gros Warp3D (ou Wazp3D) est capable de tracer des primitives : des lignes, des points, de gros points, des triangles, des séries de triangles (tristrip, trifan) d'une couleur unie ou dégradée (Gouraud) ou avec une texture, un brouillard ou même texturé et coloré ensemble (blending) : ceci donne la base d'un modèle d'éclairage avec, par exemple, un côté d'un triangle teinté d'un dégradé de rouge (<=> éclairé par une lampe rouge). Parmi les choses que Wazp3D ne sait pas faire (mais Warp3D si) :
Et en pratique ? Si vous avez déjà Warp3D, vous pouvez le sauvegarder avec la commande suivante :
On installe Wazp3D ainsi :
Wazp3D est très lent, chaque pixel est calculé par le 68040. Il faut donc une grande puissance processeur, idéalement un UAE avec un JIT très rapide pour atteindre une dizaine de FPS. La plupart des programmes 3D utilisant Warp3D disponibles sur Aminet sont désormais compatibles avec Wazp3D : aminet.net/search?readme=warp3D&arch[]=m68k-amigaos. De même, les programmes utilisant MiniGL ou StormMesa sont désormais compatibles (environ 200 démos disponibles). Mais StormMesa a besoin de l'installation de ces propres bibliothèques pour fonctionner (agl.library, agle.library, aglu.library, aglut.library, aglsmap.library). Il existe une autre émulation de Warp3D, c'est QuarkTex qui est une belle extension de WinUAE (mais qui ne fonctionnait pas sur toutes les configurations PC). Il a besoin de WinUAE, d'OpenGL et d'une carte 3D. QuarkTex est bien plus rapide car il utilise le matériel 3D du PC et s'il fonctionne bien pour vous ainsi, alors n'essayez même pas Wazp3D. Warp3D : Programme 3D --> Warp3D --> AmigaOS --> Pilote --> Carte 3D. QuarkTex : Programme 3D --> Warp3D --> AmigaOS --> WinUAE (Windows) --> Warp3D.alib --> OpenGL --> Pilote --> Carte 3D. Wazp3D : Programme 3D --> Warp3D --> AmigaOS --> 68040. Quelle compatibilité ? Wazp3D n'est pas limité à WinUAE, il peut tourner sur n'importe quel Amiga à base de 68040, c'est juste la vitesse qui lui manque. Donc il faut effectivement un UAE (quelconque) mais très rapide. Ainsi, il a été utilisé avec succès sur Amithlon. Et comme les sources sont là, alors si vous savez faire une "library" vous pouvez le porter sur n'importe quel système compatible AmigaOS, sur n'importe quel processeur (Pegasos, Amiga PowerPC, etc.). Ainsi, il a déjà été porté sur AROS et fait désormais partie du CD AROS pour x86 :-D. Enfin, le débogueur intégré permet des trucs impossibles avec Warp3D comme tracer un programme, recopier le contenu ("dumper") ou changer les textures, etc. Warp3D trace directement dans une bitmap mais Warp3D trace lui toujours dans un tampon RGBA 32 bits de la taille de la bitmap. Aussi Wazp3D doit trouver le meilleur moment pour copier ce tampon dans la bitmap (=Update), il y arrive plus ou moins bien selon les programmes 3D d'où quelques légères incompatibilités. Le programme 3D peut également modifier la bitmap (l'effacer, écrire dedans) grâce à AmigaOS sans que la partie Warp3D ne soit au courant. Pour corriger au cas par cas ces incompatibilités, le programme Wazp3D-Settings permet de modifier les paramètres de la bibliothèque (notamment l'Update, l'effacement de la bitmap ou du tampon). Voir sur thellier.free.fr/Wazp3D.htm toutes les options possibles. Malgré son imperfection, Wazp3D permet des trucs impossibles avec Warp3D comme tracer le déroulement d'un programme, recopier le contenu ou changer les textures, ou encore recopier le contenu de ce qui a été tracé sous forme de fichier texte au format .OBJ/.MTL (un format très répandu dans les programmes 3D). On peut développer pour Wazp3D en utilisant l'archive développeur standard de Warp3D (Warp3Ddev-4.2a.lha) notamment en partant de l'exemple WarpTest.c mais la gestion des bitmap/écran/souris demeure fastidieuse (surtout avec ce programme d'exemple qui n'est pas parfait). Donc le plus simple est peut-être de programmer en OpenGL avec StormMesa qui inclut GLUT (gestion des fenêtres/souris) en utilisant uniquement les supers fonctions glDrawArrays() ou glDrawElements() qui permettent de tracer une série de triangles (c'est-à-dire un objet) en une seule passe. L'approvisionnement en objets 3D (presque) près à tracer pouvant alors se faire avec certaines extensions d'applications 3D qui exportent du format .OBJ ou du format .RTG. Parmi les programmes fonctionnant le mieux avec Wazp3D citons les petits jeux AlyBox, Bzone ou glSokoban ou les démos comme GlutMech et Atlantis (de StormMesa), Engine (de Warp3D) ou le magazine The Vague. Mise à jour : Wazp3D a été porté sur AmigaOS 4.x en juillet 2011 et sur MorphOS en janvier 2014.
|