La grande Saga de la 3D - 3ème épisode

Assem Bhleur et le charme de Gouro

 

Tremblez, mortels ! Rixed le Chroniqueur va vous narrer les aventures du très terrible Chevalier Assem Bhleur au royaume du redoutable tyran Divaïd Hairor, il y a de cela très longtemps, in a galaxy far, far away.

 

Résumé des épisodes précédents

Après son terrible combat contre les redoutables soldats Cybers de la redoutable planète Interactivia de la redoutable galaxie Miltimidia (l'auteur entend améliorer le taux de compression Lempel-Ziff en utilisant toujours les mêmes adjectifs), qui s'est soldé par la retentissante déroute des imposteurs dont résonne encore la galaxie des lamentations de pitié et dont au sujet de laquelle il ne faut pas non plus oublier qu'il paraîtrait, mais il reste des sceptiques pour mettre en doute ces affirmations, qu'il ne faut jamais mélanger son KetchUp avec son Coca-Cola avant d'écrire un article.

Après bien des péripéties, le grand Chevalier Bhleur réussit toutefois à atterrir de justesse sur une planète résolument hostile, après il est vrai un soupir de soulagement. "Pfff, je ne mélangerai plus jamais mes aliments, pensa t-il".

Tout-à-coup, il songa/songi/songu/se mit à penser à sa fiancée retenue prisonnière loin d'ici par le terrible seigneur Divaïd Hairor. Soudain, le vizir apparut tout-à-coup et lui dit : " Chevalier Assem, ton courage est grand mais pour m'affronter, il te faudra réunir plusieurs items magiques, dont, pour commencer, et sans vouloir être désobligeant, le charme magique de Gouro qui transformera ton armure flat toute moche en une resplendissante armure +3 contre les runtimes errors."

"C'est vrai que mon armure manque de classe, se mis à songer Assem le preux Chevalier, et que je me verrais bien en dégradés de couleurs en fonction de la position de la source de lumière..."

 

Souvenirs de Polygones flats

Avant de reprendre sa route, le chevalier considéra amèrement les plaques de son armure... Celles-ci étaient tracées à la va-vite, chacune d'une couleur distincte mais unique, comme vu dans le précédent épisode, mais comme revu plus en détail dans celui-ci car je ne suis pas payé pour raconter ces délires mais pour parler de 3d, la preuve en est, du tout, que je ne suis pas payé du reste. A moins que ce ne soit le contraire.

Quoiqu'il en soit, pour tracer chaque polygone à n côtés qui compose son armure resplendissante, mais, il est vrai, tristounette vis-à-vis de la comparaison qu'il a pu en faire avec les récentes armures des chevaliers disciples du grand Matt Moissa, sur la planète Demo II, il procédait de la sorte :

A partir de la liste des coordonnées 2D des n points composant la face, dans un ordre connu, disons l'ordre de ces antiques aiguilles des montres sans cristaux liquides, il recherchait tout d'abord le point le plus haut. Certains contestataires contestèrent que l'on pouvait tout aussi bien chercher le point le plus bas et faire tout le contraire de ce qui va suivre, ce qui revient au même, mais il est toutefois bon de garder à l'esprit le sort qu'aimait leur réserver Assem Bhleur, à savoir leur poquer des "JMP $" dans la ROM principale. Ceux qui ont subit cette exaction ne s'en vantent pas.

Une fois le point le plus haut trouvé, il est établi que le point à gauche de ce point à l'écran est celui qui le précède dans la liste, et le suivant celui qui le suit (certes), tout ceci moyenant un savant modulo des familles, dont un dessin explique tout aussi bien que ce charabia le divin fonctionnement :

                             Point Le plus haut
                               X----
                             --     -----X  Point suivant dans la liste
                           --            -
       Point précédent   X-              -
        dans la liste      ---            -
                              ----         X  Point suivant, etc...
                                   ----   --
                                       X--
                                Point le plus bas


       (en m'excusant auprès du comité de soutient des dessins ASCII)

Pour se rendre d'un point à l'autre, il lui fallait se déplacer sur l'axe des X de (X2-X1)/(Y2-Y1) à chaque ligne, et ceci de chaque coté du polygone, afin de pouvoir tracer un segment horizontal de la couleur souhaitée entre deux points opposés du polygone...

Prenons l'exemple trivial du triangle :

       liste de points :

       NbrDePts      DW 3
       Pt0           DW 290,180          ; X,Y
       Pt1           DW 20,110
       Pt2           DW 150,15

Vous remarquerez que les points sont effectivements dans l'ordre des aiguilles d'une montre.

Le programme remarque que le point le plus haut (Y minimal) est Pt2. Il initialise donc aussitôt un pointeur sur l'écran à l'adresse (150,15), adresse de Pt2, et il sait qu'il va falloir, en partant de ce point, atteindre d'un côté le point Pt0, et de l'autre Pt1. Il sait de plus que le point de droite sera Pt0 (après Pt2 - n'oubliez pas le modulo !), et le point sur la gauche Pt1, grace à l'ordre des points.

Il va donc calculer, pour la droite de gauche (et non pas la gauche de droite, ce qui, sorti d'un contexte strictement politique, ne signifie rien), l'incrément

       ðXg=(XPt1-XPt2)/(YPt1-YPt2),

incrément qu'il va prendre garde de multiplier par une puissance de 2, mettons 256, pour avoir une partie décimale (de 8 bits ici), en plus d'une partie entière. On a donc en fait :

       ðXg'=(256*(XPt1-XPt2))/(YPt1-YPt2)

(remarquez qu'il avait bien pensé à multiplier par 256 AVANT de diviser, bien sur ! - n'est pas Chevalier Assem Bhleur qui veux).

Idem pour la ligne à droite, on a:

       ðXd'=(256*(XPt0-XPt2))/(YPt0-YPt2)

Après avoir initialisé Xd et Xg à XPt2, il ne reste plus pour la routine qu'à boucler de YPt2 à Min(YPt0,YPt1) (=YPt1 ici), en faisant à chaque fois :

       * Tracer le segment de Xg à Xd de la couleur du polygone
       * Xg' += ðXg'

Notez que Xg' est une variable dont la moitié haute est Xg et la moitié basse est la partie décimale de Xg. Par exemple, ici, puisqu'on a multiplié ðXg par 256, on aura :

       Xg'    LABEL WORD
              DB 0   ; la partie décimale
       Xg     DB ?   ; la partie entière

       * Xd' += ðXd'  (Même chose)
       * Tant que Y < Min(YPt0,YPt1) GOTO Toulaho

Une fois arrivé à Min(YPt0,YPt1), il convient de recalculer le coeficient ðX' concerné (sans toutefois modifier Xg', comme de bien entendu).

On voyait alors s'afficher les célèbres polygones flats qui avaient fait sa renomée, quelques anes et un paravent (oulala, bon courage !)

Mais, depuis ce temps, les frères perfides Inge et Nieur Duntel (planète Pintiôme, dite aussi "de la FIDIV mortelle") avaient méchamment accélérés leurs processeurs, et dorénavent sa flamboyante armure de jadis ne lui valait plus que les railleries et collibets des jeunes élèves du maître Cobol...

 

La mise au point du charme de Gouro

Tandis qu'il déambulait dans la jungle pleine d'affreuses grosses bêtes, Assem se demandait bien comment invoquer le charme du Gouro qu'il devait s'approprier avant de pouvoir quitter cette planète maudite entre toutes. Son armure en polygones flats, sans couleurs, lui faisait honte. Il n'oserait pas se présenter à la plus ringuarde des codings party de la galaxie avant d'avoir mis des couleurs dans sa texture...

Pour ce faire, il pensa tout d'abord à un vieux système qu'il avait jadis rencontré alors qu'il survolait une région primitive de la galaxie. La ruse était simple : tracer les segments de polygone d'une couleur qui était fonction de Y. Le résultat était de faire apparaître des dégradés de couleurs horizontaux. Mais cet artifice ne trompait plus personne depuis des générations de processeurs...

Le preux Chevalier Assem Bhleur s'assit au pied d'un arbre pour méditer, quand soudain la vue de la chute d'un oeuf trop mûr sortit son esprit de la torpeur qui s'installe toujours dans les esprits à ce moment de n'importe quel scénario de la trempe de celui-ci.

L'Oeuf était rond. Enfin, plus ou moins, mais nous allons supposer que si, sans quoi le récit s'en trouverait compliqué à un point que personne ne peut anticiper. Et donc, puisqu'il était rond, la lumière du soleil mutée de force dans ce coin de la galaxie se réflétait de manière diffuse sur sa coquille.

On eut dit que chaque rayon de soleil laissait à sa surface une lumière proportionnelle au produit scalaire entre le vecteur normal à la surface en ce point et ledit rayon lumineux, que, pour simplifier, nous supposerons venir de l'infini et donc être constant tout autour de l'oeuf ; ce qui, en considération de la taille de l'oeuf, de la taille du soleil, de sa distance avec la planète, et de l'heure tardive, est une approximation tout à fait acceptable.

Le vaillant Assem Bhleur se mit à imaginer ce que pourrait donner pareils reflets sur son armure : "Je vais octroyer à chaque point de mon armure (à chaque sommet des polygones, en somme), un vecteur normal à l'armure en ce point. Ceci me permettra de calculer la couleur de chaque point, en calculant le produit scalaire entre ce vecteur et les rayons lumineux incidents... Puis lorsque je tracerai les polygones, je n'aurai plus alors qu'à interpoler les couleurs entre chaque sommet des polygones, exactement comme je le faisais déjà pour les coordonnées X, pour avoir les couleurs du début et de fin de chaque segments à tracer. Il ne restera plus alors qu'à tracer les segments en interpolant une troisième fois entre ces deux couleurs !"

Chevalier Assem Bhleur venait à l'instant de reconstituer une version simplifiée du charme suprême du Gouro ! Il prononça alors le charme, "Interpolare Linearitatum Nostrum, Poilorum" et la formule apparu :

       ðX'=(256*(XPt1-XPt0))/(YPt1-YPt0)

pour interpoler les coordonnées X de XPt0 à XPt1 (comme tout à l'heure, ca ne change pas)

       ðC'=(256*(CPt1-CPt0))/(YPt1-YPt0)

pour interpoler la couleur du bord des segments horizontaux entre la couleur CPt0 (Pour le point 0) et CPt1 (pour le point 1).

       ðCh'=(256*(Cd'-Cg'))/(Xg-Xd)

pour interpoler le long du segment horizontal, entre les couleurs Cg et Cd (couleurs du bord gauche et droit, respectivement) des points Xg et Xd (coordonnées X de gauche et de droite).

Ces interpolations se font toujours de la même manière en cumulant partie décimale et partie entière.

Cependant, Assem se rendit compte sans plus attendre que le coefficient était constant sur toute la surface du polygone. Et lorsqu'il se rendit compte que certaines personnes arrivaient à comprendre ce texte, il entreprit d'expliquer pourquoi : "En fait, ce polygone en deux dimensions peut en fait être considéré comme la projection orthogonale d'un polygone à trois dimensions sur l'écran, une troisième dimension représentant la couleur pour les points. Ainsi, le principe de l'interpolation linéaire montre que le triangle en 3d est plat (heureusement d'ailleurs sinon ce ne serait pas un vrai triangle de chez Triangles & co.). En conséquence, il est évident que lorsque l'on promène un vecteur sur sa surface la coordonnée Z (ou C, pour la couleur) reste constante avec les deux autres coordonnées. Et comme le triangle 2d est une projection plane, cela signifie ni plus ni moins que l'on peut se promener d'un vecteur constant dans le triangle 2d, quelque soit la direction de la promenade, en gardant un incrément constant pour la couleur, qui ne dépend que des coordonnées X et Y du vecteur-promenade."

Pour calculer l'incrément de couleur entre deux points situés consécutivement sur la même horizontale, Assem Blheur appliqua donc la formule :

       ColorInc = (ðC2-ðC1)/(ðX2-ðX1).

Assem fit aussitôt une version plus sompteuse, en suivant ce vieil adage venu de la nuit des temps : "Plus y'a de normales, et plus c'est realiste !". Il songea donc qu'il n'était sans aucun doute plus nécessaire de considérer des polygones à n cotés mais uniquement des triangles, ceci afin d'améliorer le rendu ; car les triangles, sauf peut-être en plein coeur de trou-noirs spacio-interdimentionnels, là où diverses dimensions parallèles se rejoignent, se nouent et s'entortillent pour former un puissant rien du tout, et donc là où il est plutôt rare d'organiser des codings party, sont partout ailleurs les figures en géométrie 3d qui utilisent le moins de sommets (les objets sont donc plus complexes au sens où ils comportent plus de normales).

 

Confrontation avec Divaïd Hairor

C'est tandis que Chevalier Bhleur contemplait sa toute nouvelle armure que tonna le ciel et gronda le sol. Il faut dire qu'une porte spacio-temporelle venait de s'ouvrir devant lui, laissant la place à l'innégrotingnolant Divaïd Hairor, dont la félonie mérite bien à elle seule qu'on lui invente un adjectif réservé à son usage propre.

Divaïd Hairor se dressa un instant, laissant Assem estimer son équipement. Il portait une tenue de combat spacio-temporel mappée et shaddée à la perfection, sur laquelle on pouvait lire des greetz à profusion tournants à la demie-VBL.

Bhleur blémit, alors qu'il esquivait de justesse une quiche empoisonnée que venait de lui projetter Divaïd. Sa table d'interruptions fit aussi un soudain écart par décalage d'IDTR pour éviter la seconde attaque de Hairor, qui consistait en un peu subtil null pointer assigment.

Voyant toutes ses attaques contrées, Divaïd Hairor se résigna à employer l'un de ces plus terribles pouvoirs. D'un geste, il remplaça le processeur d'Assem Bhleur par un vieux 386sx16 !

Celui-ci, aussitôt, sentit sa nouvelle armure, dont il était si fier dix minutes auparavant, saccader sa démarche habituellement fluide.

Il fallait ruser. Assem Bhleur repensa tout à coup qu'il se faisait tard, et que depuis quelques lignes l'article n'avancait plus beaucoup. Alors, pour se sortir de ce pétrin, il imagina un subtil stratagème pour accélerer sa démarche chancelante.

Au lieu de tracer les segments horizontaux en interpolant la couleur dans une boucle, il coda plutôt une longue suite de :

       MOV [DI-319],AH
       ADD AX,BX
       MOV [DI-318],AH
       ADD AX,BX
       MOV [DI-317],AH
       ADD AX,BX
       ...
       MOV [DI-3],AH
       ADD AX,BX
       MOV [DI-2],AH
       ADD AX,BX
       MOV [DI-1],AH
       ADD AX,BX
       MOV [DI],AH
       ADD AX,BX

dans laquelle il sautait avec grace et délicatesse en fonction de la longueur du segment.

Ce subterfuge décupla sa vitesse, et Divaïd Hairor le terrible sultan ne put que se résigner à la défaite et à rendre au Chevalier sa dulciné. Compatissant, le Chevalier lui jetta : "Fuis, avant que je ne te détourne l'IRQ 0 sur l'INT 13h de ton beau SCSI".

Divaïd Hairor s'enfuit donc par la porte spacio-machinchose qui se referma derrière lui, tandis qu'Assem Bhleur rejoignit son formidable vaisseau pour quitter cette planète qui venait d'être témoin d'un des plus formidable afrontement que l'univers n'ai connu depuis le dernier épisode et en attendant le prochain.

 

The End

(but to be continued dans le Rep'9)
(ou 10)
(si je suis pas viré d'ici là)
===============================================================

Ne manquez pas le prochain épisode :

"Assem Blheur contre Docteur Fong"

==========[ Mais que me veulent ces ambulanciers ? ]===========