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é.


fantasia.png
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 ?