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