Author Topic: Triangle Rateriser.  (Read 2426 times)

0 Members and 1 Guest are viewing this topic.

Offline Shockwave

  • good/evil
  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 17409
  • Karma: 498
  • evil/good
    • View Profile
    • My Homepage
Triangle Rateriser.
« on: August 31, 2006 »
Hi, I've changed my flat shaded triangle routine, now it doesn't have the same bugs as before, flat bottomed and flat topped triangles are drawn correctly. Also the trianlges are rendered using pointer arithmetic, this seems to be a lot faster than just using a straingt forward loop.

Use it if you like..

Code: [Select]

' Triangle test by shockwave..
        option static
        option explicit
       
       
        ' To run in fullscreen comment out the line below;
       
       
        #define PTC_WIN       
        #Include Once "tinyptc.bi"

'
' Screen Resolution;
'
        CONST   XRES    =   640
        CONST   YRES    =   480
       
        CONST HALFX = XRES/2
        CONST HALFY=YRES/2
       
        dim shared as UINTEGER BUFFER (XRES * YRES)
        declare sub dbuffer()
        declare sub delta()
        dim shared as uinteger ticks
        dim shared as double newtime,oldtime
        declare sub DBFTRI(BYVAL QX1 AS integer , BYVAL QY1 AS integer ,BYVAL QX2 AS integer , BYVAL QY2 AS integer , BYVAL QX3 AS integer , BYVAL QY3 AS integer , BYVAL QCLR AS UINTEGER)
'-------------------------------------------------------------------------
' Open Screen.
'-------------------------------------------------------------------------

        If( ptc_open( "TRIANGLE TEST BY SHOCKWAVE.", XRES, YRES ) = 0 ) Then
        End -1
    End If
    dim as integer lll
do
    for lll=1 to 20
       
        dbftri (rnd*(xres-1),rnd*(yres-1),rnd*(xres-1),rnd*(yres-1),rnd*(xres-1),rnd*(yres-1),rgb(rnd*100,rnd*100,rnd*100))
    next lll
        DBUFFER()

loop until inkey$ = chr$(27)

    PTC_CLOSE
    END
   
sub DBFTRI(BYVAL QX1 AS integer , BYVAL QY1 AS integer ,BYVAL QX2 AS integer , BYVAL QY2 AS integer , BYVAL QX3 AS integer , BYVAL QY3 AS integer , BYVAL QCLR AS UINTEGER)

DIM as uinteger QFTY1  , QFTY2 ,QFTY3 , QFTX1 , QFTX2 ,QFTX3
DIM AS UINTEGER QA,QBB
dim pp as uinteger PTR


        QFTY1=QY1
        QFTY2=QY2
        QFTY3=QY3       
        QFTX1=QX1
        QFTX2=QX2
        QFTX3=QX3
'-------------------------------------------------------------------------------
'SORT POINTS INTO ORDER..
'-------------------------------------------------------------------------------

'----------------------
'       ISOLATE TOP.---
'----------------------

        IF QFTY2<QFTY1 AND QFTY2<QFTY3 THEN
                QY1=QFTY2
                QX1=QFTX2
        END IF
        IF QFTY1<QFTY2 AND QFTY1<QFTY3 THEN
                QY1=QFTY1
                QX1=QFTX1
        END IF
        IF QFTY3<QFTY2 AND QFTY3<QFTY1 THEN
                QY1=QFTY3
                QX1=QFTX3
        END IF
       
'-------------------------
'       ISOLATE MIDDLE.---
'-------------------------

        IF QFTY1>QFTY2 AND QFTY1<QFTY3 THEN
                QY2=QFTY1
                QX2=QFTX1
        END IF
        IF QFTY1<QFTY2 AND QFTY1>QFTY3 THEN
                QY2=QFTY1
                QX2=QFTX1
        END IF
        IF QFTY2>QFTY1 AND QFTY2<QFTY3 THEN
                QY2=QFTY2
                QX2=QFTX2
        END IF
        IF QFTY2<QFTY1 AND QFTY2>QFTY3 THEN
                QY2=QFTY2
                QX2=QFTX2
        END IF
        IF QFTY3>QFTY1 AND QFTY3<QFTY2 THEN
                QY2=QFTY3
                QX2=QFTX3
        END IF
        IF QFTY3<QFTY1 AND QFTY3>QFTY2 THEN
                QY2=QFTY3
                QX2=QFTX3
        END IF
       
'-------------------------       
'       ISOLATE BOTTOM;---
'-------------------------

        IF QFTY1>QFTY2 AND QFTY1>QFTY3 THEN
                QY3=QFTY1
                QX3=QFTX1
        END IF
        IF QFTY2>QFTY1 AND QFTY2>QFTY3 THEN
                QY3=QFTY2
                QX3=QFTX2
        END IF
        IF QFTY3>QFTY2 AND QFTY3>QFTY1 THEN
                QY3=QFTY3
                QX3=QFTX3
        END IF


'------------------------------------------
'Interpolation, Edge And Loop Variables;---
'------------------------------------------

                DIM QT1,QT2 AS UINTEGER:' loops.

                DIM QSTART1 AS single:'Edge 1
                DIM QSTART2 AS single:'Edge 2
                DIM QSTADD1 AS single'Interpolation 1
                DIM QSTADD2 AS single'Interpolation 2


IF QY1<QY2 THEN     
               'Set Start Points
               
                QSTART1=QX1               
                QSTART2=QX1
                'Calculate Interpolations;
               
                 QSTADD1 = (QX2-QX1) / (QY2 - QY1)                         
                 QSTADD2 = (QX3-QX1) / (QY3 - QY1)

ELSE
                QSTART1=QX1               
                QSTART2=QX2
                'Calculate Interpolations;
               
                 QSTADD1 = (QX3-QX1) / (QY3 - QY1)                         
                 QSTADD2 = (QX3-QX2) / (QY3 - QY2)
   
END IF
               

           
'-------------------------
' Draw Top Of Triangle;---
'-------------------------
IF QY1<QY2 THEN     
FOR QA=QY1 TO QY2
   
    IF QSTART1<=QSTART2 THEN
        QT1=QSTART1
        QT2=QSTART2
    ELSE
        QT1=QSTART2
        QT2=QSTART1
    END IF

    PP = @BUFFER(QT1+(QA*XRES))
    FOR QBB=QT1 TO QT2
        *pp= QCLR
        PP+= 1   
    NEXT

   
   
    QSTART1=QSTART1+QSTADD1   
    QSTART2=QSTART2+QSTADD2
       
NEXT


QSTADD1= (QX3-QSTART1) / (QY3 - QY2)   

end if

'----------------------------
' Draw Bottom Of Triangle;---
'----------------------------
IF QY3>QY2 THEN   
FOR QA=QY2 TO QY3
    IF QSTART1<=QSTART2 THEN
        QT1=QSTART1
        QT2=QSTART2
    ELSE
        QT1=QSTART2
        QT2=QSTART1
    END IF
    PP = @BUFFER(QT1+(QA*XRES))
    FOR QBB=QT1 TO QT2
        *pp= QCLR
        PP+= 1   
    NEXT
   

   
    QSTART1=QSTART1+QSTADD1
    QSTART2=QSTART2+QSTADD2
NEXT
END IF
END SUB


SUB DBUFFER()
            ptc_update@buffer(0)
         
            TICKS=TICKS+1

            ERASE BUFFER
            DELTA()
END SUB

SUB DELTA()
   
    '*** WE WILL LOOK AT HOW MANY FRAMES HAVE BEEN DRAWN EVERY 1/5TH OF A SECOND.
    '*** WE BASE OUR AVERAGE DIVISOR ON THIS.
    '*** THIS DIVISOR IS USED IN THE STARS PROCEDURE TO MOVE THE STARS.
   
    DIM LPT AS INTEGER
    DIM TST AS STRING
    dim as double bb
    bb=timer
            if  bb-oldtime >=1 then
           
           
            oldtime=timer
            newtime = ticks
            TST = str( (newtime) )
            'TST = "DELTA FACTOR: "+TST
            'print tst       
            TST = str( (newtime) )
            TST = "APPROX FPS: "+TST
            print tst       
           
            'Prevent the program getting stuck!!;
            'Progressive slowdown and eventual stop is possible without this.
           
            newtime=newtime+1
            ticks=0
           
            end if
END SUB

Shockwave ^ Codigos
Challenge Trophies Won:

Offline Shockwave

  • good/evil
  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 17409
  • Karma: 498
  • evil/good
    • View Profile
    • My Homepage
Re: Triangle Rateriser.
« Reply #1 on: August 31, 2006 »
Next thing that I am going to do is to see if asm will speed this up at all.
Shockwave ^ Codigos
Challenge Trophies Won: