|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Aujourd'hui, nous allons nous intéresser à la capacité que possède le Blitter à tracer des droites. Mais cette fois ce n'est pas tout simple, c'est même plutôt ardu au premier abord. Comme d'habitude, c'est l'initialisation de BLTSIZE qui fera démarrer le Blitter. La valeur dans ce registre informe le Blitter de la longueur de la droite, c'est-à-dire du nombre de points allumés composants celle-ci. Si BLTSIZE est initialisé avec la valeur 0, on aura la longueur maximum de 1024 points ce qui tombe on ne peut mieux car les largeurs et hauteurs maximum d'un plan de bits sont également de 1024 points. Peut-être pensez-vous qu'une longueur de 1024 points est insuffisante si la droite est en diagonale dans un super-plan de bits ? Observez bien l'aspect d'une droite tracée par un ordinateur : ce n'est pas une droite ! En effet l'emplacement théorique d'un point d'une droite quelconque ne correspond généralement pas exactement à la position d'un pixel sur l'écran, ce qui fait qu'un ordinateur (en fait dans un Amiga le Blitter) doit se contenter d'allumer un des pixels les plus proches. Le Blitter, qui est une personne très ordonnée, n'allume pas les pixels les plus proches n'importe comment, mais remplace de petites portions de la droite à tracer par des "marches d'escalier". Quelques essais permettraient de constater les choses suivantes :
Généralisation Si cette méthode peut à la rigueur convenir pour préparer le tracé d'une droite, elle est insupportable pour un nombre élevé de droites. Voici comment il est possible de généraliser. On appelle x1,y1 les coordonnées du point de départ de la droite et x2,y2 les coordonnées du point d'arrivée de la droite. On appelle dx la valeur absolue de la différence des abscisses c'est-à-dire |x2-x1| et dy la valeur absolue de la différence des ordonnées c'est-à-dire |y2-y1|. On a alors les relations suivantes :
Une routine pratique Toutes ces relations ne sont en fait intéressantes que si elles sont utilisées dans un programme. Comme ma bonté n'a pas de limite, vous trouverez dans le listing d'exemple une routine nommée "recherche_octant" et qui en fait renvoie le code de l'octant concerné. Cette routine peut être utilisée dans vos programmes personnels sans problème. Son principe est simple : le programme comporte un tableau des codes d'octants. La routine effectue les comparaisons des relations ci-dessus et fait un décalage du drapeau X dans le registre D4 à chaque comparaison. A la fin, D4 sert d'index pointant sur l'élément du tableau recherché. La routine effectue également un petit travail supplémentaire : elle regarde qui de dx et de dy est le plus grand puis range le résultat selon le cas dans les labels PDelta et GDelta ce qui sera utilisé pour l'initialisation de certains registres. En effet, tous les registres du Blitter doivent être initialisés pour un tracé de droite. Le moins que l'on puisse dire est que les valeurs d'initialisation sont quelquefois bizarroïdes. Voyons tout cela méthodiquement : Registre BLTBDAT Il doit contenir la valeur $8000. C'est-à-dire que seul le bit 15 est mis. Ce bit doit être décalé par le Blitter selon ses besoins puis l'envoyer en sortie dans BLTDDAT pour allumer les points. Registre BLTBDAT Il doit contenir la valeur de texture de la droite. Il faut comprendre que ce registre doit contenir une valeur de masque. Si la valeur est $ffff la droite est on ne peut plus complète et normale. La valeur $0000 peut servir à tracer par effacement dans une surface colorée. La valeur $ff00 peut servir à tracer des pointillés. N'hésitez pas à essayer différentes valeurs pour ce registre, les résultats sont parfois amusants. Registre BLTAFWM Ce registre doit obligatoirement contenir la valeur $ffff. Registre BLTALWM Comme le précédent, ce registre doit contenir la valeur $ffff. Registre BLTAMOD Il doit contenir la valeur 4*PDelta-4*GDelta : vous avez bien lu 4 et non pas 2. Même si dans un certain livre qui n'en est pas à une bêtise près (Bible de l'Amiga) c'est 2*PDelta-2*GDelta qui est indiqué alors que 4*PDelta-4*GDelta est donné par l'Amiga ROM Kernel Manual. Il faut bien reconnaître que la valeur donnée par la Bible semble dans ce cas convenir également. Mais une fois n'est pas coutume et l'expérience montre d'une manière générale qu'il faut toujours faire confiance aux Amiga ROM Kernel Manual et pas aux autres si vous voulez que vos programmes fonctionnent convenablement. Registre BLTBMOD Il doit contenir la valeur 4*PDelta. Registre BLTCMOD Il doit contenir la largeur du plan de bits exprimée en octets. Pour un écran de 320 points de large, il faut utiliser la valeur 40. Registre BLTDMOD Lui aussi doit contenir la largueur du plan de bits exprimée en octets. Registre BLTAPTH Il doit contenir la valeur 4*PDelta-2*GDelta. De plus, si cette valeur est négative, il faudra placer le bit à 1 le bit SIGN du registre BLTCON1. Registre BLTBPTH Ce registre n'est pas utilisé pour le tracé de droite. Registre BLTCPTH Il doit contenir l'adresse du point de départ de la droite. Là encore, méfiez-vous de formules frelatées et utilisez celle-ci :
A titre indicatif, la Bible de l'Amiga donne :
Record battu ! Quand je vous disais qu'il valait mieux se méfier. Registre BLTCON0 Ce registre doit être initialisé comme suit :
Registre BLTCON1 ce registre doit être initialisé comme suit :
Registre BLTSIZE Ce registre doit être initialisé en dernier : c'est le signal de départ pour le Blitter. Le contenu est donné par la formule : (GDelta+1)*64+2 Pour comprendre la raison du 64 et du 2, reportez-vous aux articles précédents. Certaines documentations peu sérieuses donnent la formule GDelta*64+2. Qu'en est-il exactement ? Voyons un exemple : x1=100 y1=100 x2=110 y2=110. Ceci défini une droite à 45° (le Blitter placera donc un point par "escalier"). Comme le point x1,y1 fait partie de la droite, la droite comportera 11 points, il faut donc bien ajouter 1. Autre exemple : dans un super plan de bits x1=0 y1=0 x2=1023 y2=1023, 1023 est la valeur maximum pour une coordonnée. GDelta=1023-0=1023. Il faut donc bien ajouter 1 pour obtenir 1024 points. Il ne vous reste plus qu'à essayer le programme. Je me suis attaché à vous fournir un listing facile à comprendre. Pour cette raison, il n'est pas du tout optimisé. Il est possible par exemple de remplacer les instructions muls et divs par les instructions de décalage de bits appropriées afin de gagner en rapidité si la routine doit être appelée de nombreuses fois. Il est aussi possible de passer d'autres instructions avec une programmation astucieuse. Mais je laisse tout cela à votre sagacité car je le répète mon but était de vous fournir un listing clair. On a vu qu'il faut finalement beaucoup de travail pour programmer le tracé d'une pauvre petite droite. Il est peut-être plus judicieux de se contenter d'utiliser les routines de la graphics.library dans la plupart des cas. Une programmation directe du Blitter ne pouvant se justifier que pour un nombre très important de droites ou pour se faire plaisir lors de la programmation d'une Mégadémo. Voilà, tout est dit sur le Blitter. J'aurai le plaisir de vous retrouver le mois prochain avec un petit programme amusant sur un tout autre sujet : les lecteurs de disquette.
|