Le rotozoomer de la Fantasia
Par Thomas Reiss le jeudi 27 décembre 2007, 19:16 - Oldschool - Lien permanent
Il était une fois un codeur dont le nom de scène est Oxbab, alors encore membre de Diamond Design. Ce groupe était actif sur Atari ST et a notamment collaboré avec Oxygene avant de ne faire qu'un avec ce dernier sur Amiga AGA, puis sur PC.
Diamond Design avait sorti en 1992 une démo appelé Brace. La démo était distribuée sous la forme d'une disquette normale sur laquelle se trouvait différents programmes TOS. Cette disquette était venue à point nommé lorsqu'il fallait coder un effet de rotozoom pour la Fantasia...
Le père Oxbab avait en effet laissé les symbôles de debug dans son rotozoom, ce qui m'a finalement servi de base pour coder le rotozoom tel qu'il apparait dans la Fantasia. Bien entendu, l'effet a été largement optimisé, pour passer d'un effet un plan à un effet quatre plans, soit de 2 à 16 couleurs. Toutefois, un petit bout de code original d'Oxbab était resté... Eh oui, le rotozoom de la Fantasia est donc en partie rippé... Bouh, quelle honte ! Bon, pour ma défense, le code qui est resté était bien écrit et n'avait pas besoin d'être repris, et il a été assimilé (sinon les déplacements seraient identiques), et tout le code de dessin a été complètement refait et optimisé.

Pour les curieux du pourquoi du comment, cliquez
ici pour des explications sur l'effet lui-même, je compte en effet ne
m'attarder que sur le petit bout de code 68000 qui change tout...
La partie refaite s'appuie sur une routine de conversion chunky to plannar 4x4, celle-ci ayant besoin d'une table de 512 Ko pour être vraiment optimale. La macro rotate est le petit bout de code assez optimisé pour arriver au résultat :
rotate macro
moveq #0,d0
move.b "Du"(a0),d0
or.b "ne"(a1),d0
add.w d0,d0 ; alignement sur word
move.w (a6,d0.w),d0 ; on décale en gagnant 4 cycles
move.b "Du"(a0),d0
or.b "ne"(a1),d0
lsl.l d2,d0 ; #3, alignement sur 8 octets
move.l a2,a3
add.l d0,a3
move.l (a3)+,(a4)+
move.l (a3),(a4)+
endm
Cette macro est répété plusieurs fois dans une boucle
(_rotate_me_the_face) destinée à remplir l'écran, avec les
déplacements (offsets) "Du" et "ne" par défaut - ces déplacements étant des
déplacements en X et en Y dans la texture, réalisant l'effet de rotozoom.
Les déplacements sont calculés à partir des tables DELTA et TAB_TAIL dans la
routine calc_zoomer, qui provient du code original d'Oxbab puis le
code est auto-modifié par la macro modif qui est répétée 12 fois,
soit autant de fois qu'apparait la macro rotate dans la boucle
_rotate_me_the_face.
On notera encore la routine init_zoomer qui remplit la table de
conversion Chunky to Plannar c2p_table.
Voilà, je dépoussière mes archives, j'espère que ça pourra aider quelqu'un...
Mes remerciements pour cet effet vont évidemment à :
- Cyclone, pour nos échanges pour optimiser encore et encore le code ;
- Mic, pour avoir apporté sa touche si caractère et transformé un effet quelconque en effet magnifique (le logo zoomé est vraiment pour beaucoup) ;
- Chuck et ses doigts magiques, pour m'avoir botter les fesses pour finir cet effet ;
- ST Ghost, pour nous avoir pondu une superbe init et pour ses précieux conseils ;
- et bien sûr Oxbab pour avoir laissé les symbôles et ainsi me fournir une bonne base pour continuer ^^
Sinon, coder un rotozoomer aura-t-il encore un quelconque intérêt en 2008 ?





Commentaires
Salut,
c'est Oxbab. Je ne me souvenais meme plus comment j'avais ecris ce rotozoom!!! Je trouve qu'il n'y a aucun mal a "ripper", c'est un tres bon moyen d'apprendre. C'est comme ca que j'ai mes debuts aussi :)
Christophe
Salut,
Ben ça alors, ça fait plaisir de te voir écrire ici :)
En tout cas merci d'avoir oublié les symbôles ;)
"Sinon, coder un rotozoomer aura-t-il encore un quelconque intérêt en 2008 ?"
oui, parce que moi qui ne suis qu'un "regardeur", j'aime regarder.. donc... continuer :)
"Sinon, coder un rotozoomer aura-t-il encore un quelconque intérêt en 2008 ?"
Il semble que oui oui et oui :)
http://pouet.net/prod.php?which=519...
Vu le bruit autour de cette demo, les rotozooms et les plasmas ne sont pas morts...
Ben il y a un truc qui devrait te faire plaisir ;-)
:p