Logicielsmoto.com

Nous sommes le 28 Mar 2024, 18:25

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 3 messages ] 
Auteur Message
MessagePosté: 02 Juil 2022, 12:36 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
Salut,

Je m'intéresse un peu au rendu de polygones en ce moment.

J'ai commencé par écrire une routine pour dessiner une ligne horizontale (sera utilisée dans la routine de fill par la suite).
J'ai choisi le mode 320x200x16 (avec contrainte donc).
Pour le moment je n'ai pas implémenté de règle particulière pour gérer la priorité en cas de color clash.
Quand on dessine un bloc de 8px on le fait avec la couleur 0.
quand on a une écriture partielle de bloc on utilise la couleur 1.
J'ai quelques idées pour améliorer ça, on verra plus tard ...

Voila ce que ça donne, (le code a été testé, mais je n'ai pas forcément cherché d'optim pour le moment, c'est un premier jet).
Si vous connaissez déjà des routines pour 6809 pour le tracé de polygones (n sommets) je suis preneur ...

update: quelques optims vite fait

Code:
* ---------------------------------------------------------------------------
; Draw an horizontal line for 320x200x16 mode
; -------------------------------------------
; p0: x MSB
; p1: x LSB
; p2: y
; p3: nb of pixels to draw MSB
; p4: nb of pixels to draw LSB
; p5: color 0 (s0000bvr)
; p6: color 1 (0sbvr000)
* ---------------------------------------------------------------------------

p0          equ   dp_engine
p1          equ   dp_engine+1
p2          equ   dp_engine+2
p3          equ   dp_engine+3
p4          equ   dp_engine+4
p5          equ   dp_engine+5
p6          equ   dp_engine+6
dhl_routine equ   dp_engine+7

DrawHLine
        ldb   p2                       ; load y pos
        lda   #40
        mul
        addd  #$A000                   ; set u at RAMA line (pixel def)
        tfr   d,u

        ldd   p0                       ; load x pos / 8
        _asrd
        _asrd
        _asrd
        leau  d,u                      ; u point to first byte to write in RAMB (color)

        anda  #0
        sta   DHL_lnl
        ldb   p1
        andb  #%00000111               ; get offset in 8px chunk
        beq   DHL_Center

DHL_Left
        stb   @b
        lda   #8
        suba  #0                       ; a contains max len in chunk
@b      equ   *-1
        sta   DHL_lnl
        ldx   p3
        cmpx  #0
DHL_lnl equ   *-1
        bls   DHL_Left_Only
        ldx   #left_px
        asla
        ldx   a,x                      ; load table for a len of px
        lda   b,x                      ; load pixel pattern from pos
        sta   $2000,u                  ; update pixels on screen

        ldb   ,u
        andb  #%10000111               ; clear color 1
        orb   p6                       ; apply color 1
        stb   ,u+       

DHL_Center
        ldd   p3
        subd  DHL_lnl-1                ; compute nb of remaining pixels to draw
        _asrd
        asrb
        asrb                           ; number of 8px groups
        beq   DHL_Right
        cmpb  #1
        bne   @fast
        lda   #0
        ldb   p5
        sta   $2000,u                  ; draw one plain chunk
        stb   ,u+
        bra   DHL_Right
@fast   leau  b,u
        stu   @u
        leau  $2000,u
        aslb
        ldx   #DHL_pshu
        ldx   b,x                      ; load compiled draw routine
        stx   dhl_routine
        ldd   #0
        ldx   #0
        leay  ,x
        jsr   [dhl_routine]
        ldu   #0
@u      equ   *-2
        lda   p5
        ldb   p5
        tfr   d,x
        leay  ,x
        jsr   [dhl_routine]
        ldu   @u

        ; draw right chunk
DHL_Right
        ldb   p4
        subb  DHL_lnl
        andb  #%00000111
        beq   @end
        ;
        ldx   #right_px
        lda   b,x                      ; load pixel pattern from len
        sta   $2000,u                  ; update pixels on screen
        ;
        ldb   ,u
        andb  #%10000111               ; clear color 1
        orb   p6                       ; apply color 1
        stb   ,u       
@end    rts
       
DHL_Left_Only
        lda   p4                       ; need to draw only one Chunk
        asla
        ldx   #left_px
        ldx   a,x                      ; load table for a len of px
        lda   b,x                      ; load pixel pattern from pos
        sta   $2000,u                  ; update pixels on screen
        ;
        ldb   ,u
        andb  #%10000111               ; clear color 1
        orb   p6                       ; apply color 1
        stb   ,u       
        rts
       
left_px
        fdb   0                        ; unused
        fdb   left_px_1
        fdb   left_px_2
        fdb   left_px_3
        fdb   left_px_4
        fdb   left_px_5
        fdb   left_px_6
        fdb   left_px_7

left_px_1
        fcb   %10000000
        fcb   %01000000
        fcb   %00100000
        fcb   %00010000
        fcb   %00001000
        fcb   %00000100
        fcb   %00000010
        fcb   %00000001
       
left_px_2
        fcb   %11000000
        fcb   %01100000
        fcb   %00110000
        fcb   %00011000
        fcb   %00001100
        fcb   %00000110
        fcb   %00000011

left_px_3
        fcb   %11100000
        fcb   %01110000
        fcb   %00111000
        fcb   %00011100
        fcb   %00001110
        fcb   %00000111

left_px_4
        fcb   %11110000
        fcb   %01111000
        fcb   %00111100
        fcb   %00011110
        fcb   %00001111

left_px_5
        fcb   %11111000
        fcb   %01111100
        fcb   %00111110
        fcb   %00011111

left_px_6
        fcb   %11111100
        fcb   %01111110
        fcb   %00111111

left_px_7
        fcb   %11111110
        fcb   %01111111

right_px
        fcb   %00000000                ; unused
        fcb   %10000000
        fcb   %11000000
        fcb   %11100000
        fcb   %11110000
        fcb   %11111000
        fcb   %11111100
        fcb   %11111110

DHL_pshu
        fdb   0                        ; unused
        fdb   @l1
        fdb   @l2
        fdb   @l3
        fdb   @l4
        fdb   @l5
        fdb   @l6
        fdb   @l7
        fdb   @l8
        fdb   @l9
        fdb   @l10
        fdb   @l11
        fdb   @l12
        fdb   @l13
        fdb   @l14
        fdb   @l15
        fdb   @l16
        fdb   @l17
        fdb   @l18
        fdb   @l19
        fdb   @l20
        fdb   @l21
        fdb   @l22
        fdb   @l23
        fdb   @l24
        fdb   @l25
        fdb   @l26
        fdb   @l27
        fdb   @l28
        fdb   @l29
        fdb   @l30
        fdb   @l31
        fdb   @l32
        fdb   @l33
        fdb   @l34
        fdb   @l35
        fdb   @l36
        fdb   @l37
        fdb   @l38
        fdb   @l39
        fdb   @l40
@l35    pshu  d,x,y
@l29    pshu  d,x,y
@l23    pshu  d,x,y
@l17    pshu  d,x,y
@l11    pshu  d,x,y
@l5     pshu  a,x,y
        rts
@l36    pshu  d,x,y
@l30    pshu  d,x,y
@l24    pshu  d,x,y
@l18    pshu  d,x,y
@l12    pshu  d,x,y
@l6     pshu  d,x,y
        rts
@l37    pshu  d,x,y
@l31    pshu  d,x,y
@l25    pshu  d,x,y
@l19    pshu  d,x,y
@l13    pshu  d,x,y
@l7     pshu  d,x,y
@l1     pshu  a
        rts
@l38    pshu  d,x,y
@l32    pshu  d,x,y
@l26    pshu  d,x,y
@l20    pshu  d,x,y
@l14    pshu  d,x,y
@l8     pshu  d,x,y
@l2     pshu  d
        rts
@l39    pshu  d,x,y
@l33    pshu  d,x,y
@l27    pshu  d,x,y
@l21    pshu  d,x,y
@l15    pshu  d,x,y
@l9     pshu  d,x,y
@l3     pshu  a,x 
        rts
@l40    pshu  d,x,y
@l34    pshu  d,x,y
@l28    pshu  d,x,y
@l22    pshu  d,x,y
@l16    pshu  d,x,y
@l10    pshu  d,x,y
@l4     pshu  d,x 
        rts


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 09 Juil 2022, 13:51 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 366
Salut

Je suppose que c'est pour créer des truc du genre CAO ou 3 D ?

As-tu vu ce qui existait déjà sur Thomson ?
- 3D Kit (Loriciels 1985)
- C.A.O. (Loriciels 1985)
- Anima 3D (Laurent Hiriard 1991)

Ce dernier logiciel freeware de Laurent H. est fantastique pour des thomson.

Ca pourrait t'inspirer...


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 10 Juil 2022, 16:37 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
C'est juste pour dessiner des polygones "2D" (comme dans Another World ou flashback).
Merci pour les liens.


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 3 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 42 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages
Vous ne pouvez pas joindre des fichiers

Rechercher:
Aller à:  
cron
Développé par phpBB® Forum Software © phpBB Group
Traduction par phpBB-fr.com