Dark Bit Factory & Gravity
GENERAL => Projects => Topic started by: Shockwave on December 31, 2006
-
I'm working on a bunch of oldschool routines, done this one today, it needs to be as fast as possible I'd appreciate some fps readings (there is a console window open behind the effect), could you post fps and some specs such as processor and gfx card please? Thanks!
-
61-65fps, on P4 3ghz, 1gb ram, GeForce6600GT.
-
I got 40 to 45 with the odd 30 something. Looked perfectly smooth.
My laptop: Athlon 1700+ (1.46ghz), 16mb mobility U1 graphics card, 640MB RAM.
-
42 FPS // AMD 1.2, 512 ram //ATI Radeon 9600 w/ 256 vram
-
floats between 98 and 101, but on average about 100... P4 3.2G Dual Core (one of the early ones), G-Force FX 7800GTX
-
Hi Shockie,
about 140 fps,
AMD Athlon 64 4200+ dual core, x1900 ati (ati drivers)
-
Thanks very much or the fps+specs + karma for all of you.
v :)
-
122-125
AMD64 @2.1, radeon1650
-
very nice plasma bob thinges shock!
i get 47fps on a 512mb athlon xp2200 128mb geforce4 ti4600 rig.
-
Cheers guys, I am going to be expanding this into a proper intro :)
Working on changing it all to pointer arithmetic and implimenting faster clipping to give more scope to have more stuff happening.
-
Looking forward to the finished prod....
-
The next time you see this it will look very different and will be finished :)
For now, as it's new years and I haven't posted any source yet, here's what I've got so far. I've made a lot of optimisations.
' Highly Optimised Metaballs By Shockwave^DBF^S!P
' You can use this as long as you credit. :-)
'
'-------------------------------------------------------------------------------
OPTION STATIC
OPTION EXPLICIT
CONST XRES = 800:' SCREEN WIDTH
CONST YRES = 600:' SCREEN HEIGHT
CONST WXRES = 160:' WORK BUFFER X RES.
CONST WYRES = 120:' WORK BUFFER Y RES.
'-------------------------------------------------------------------------------
#Define PTC_WIN
'#Include "Tinyptc_ext.bi"
#include "tinyptc.bi"
'-------------------------------------------------------------------------------
DIM SHARED AS UINTEGER BUFFER ( XRES * YRES ) :' SCREEN BUFFER.
DIM SHARED AS uINTEGER WORKBUFFER ( 160 * 120 ) :' WORK BUFFER TO EXPAND TO MOSAIC.
DIM SHARED AS UINTEGER METABUFFER ( 200 * 200 )
DIM SHARED AS UINTEGER GENERAL_PALETTE ( 3000 )
DIM SHARED AS INTEGER GADD,GADD2
'-------------------------------------------------------------------------------
DECLARE SUB METABALLS()
DECLARE SUB PRECALC()
DECLARE SUB RENDER_TO_SCREEN()
DECLARE SUB DCIRCLE (BYVAL CX AS INTEGER , BYVAL CY AS INTEGER , BYVAL R AS INTEGER, BYVAL CLR AS INTEGER)
DECLARE SUB METABLOB(BYVAL MX AS INTEGER , BYVAL MY AS INTEGER)
DECLARE SUB FLAT_TRIANGLE(BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER, BYVAL X2 AS INTEGER , BYVAL Y2 AS INTEGER , BYVAL X3 AS INTEGER, BYVAL Y3 AS INTEGER , BYVAL TC AS INTEGER)
declare SUB DELTA()
DIM SHARED TICKS AS INTEGER = 0
DIM SHARED OLDTIME AS DOUBLE
'-------------------------------------------------------------------------------
' OPEN THE SCREEN;
'-------------------------------------------------------------------------------
IF ( PTC_OPEN ( "SHOCKWAVE / DBF 800 * 600 INTERLACED METABLOBS", XRES, YRES ) = 0 ) THEN
END -1
END IF
PRECALC()
'-------------------------------------------------------------------------------
' MAIN LOOP;
'-------------------------------------------------------------------------------
OLDTIME=TIMER()
WHILE(1)
GADD=GADD +1
GADD2=GADD2-1
METABALLS()
RENDER_TO_SCREEN ( )
PTC_UPDATE@BUFFER(0)
IF TIMER-OLDTIME >=1 THEN DELTA()
ERASE WORKBUFFER
TICKS=TICKS+1
WEND
SUB DELTA()
OLDTIME=TIMER
PRINT STR(TICKS)
TICKS=0
END SUB
SUB METABALLS()
DIM AS INTEGER LL , XXX,YYY , MM
FOR LL=0 TO 200 STEP 100
MM=MM+70
XXX=(40*SIN((LL+GADD2)/133))+(20*COS((MM-GADD)/23))+(30*SIN((LL-GADD)/33))
YYY=(40*COS((MM+GADD)/53))+(20*SIN((LL-GADD)/73))+(30*SIN((LL-GADD2)/33))
METABLOB ((-20)+XXX,(-30)+YYY)
NEXT LL
mm=mm+200
FOR LL=400 TO 600 STEP 100
MM=MM+70
XXX=(25*SIN((LL+GADD2)/143))+(65*COS((MM-GADD)/73))+(10*SIN((LL-GADD)/23))
YYY=(30*COS((MM+GADD)/53))+(55*SIN((LL-GADD2)/163))+(35*SIN((LL-GADD)/63))
METABLOB ((-20)+XXX,(-30)+YYY)
NEXT LL
END SUB
'-------------------------------------------------------------------------------
' REALLY FAST METABALLS CODE WITH MATHEMATICAL CLIPPING AND POINTER ARITHMETIC.
' BY SHOCKWAVE / DBF 2007.
'-------------------------------------------------------------------------------
SUB METABLOB(BYVAL MX AS INTEGER , BYVAL MY AS INTEGER)
DIM AS UINTEGER LX,LY,TY2,CCCC
DIM AS UINTEGER XCLIPL,XCLIPR,YCLIPT,YCLIPB
IF MX < 0 THEN XCLIPL = -MX ELSE XCLIPL = 0
IF MY < 0 THEN YCLIPT = -MY ELSE YCLIPT = 0
IF MX+199 > 159 THEN
XCLIPR = 199 - ((MX+199) - 159)
ELSE
XCLIPR=199
END IF
IF MY+199 > 119 THEN
YCLIPB = 199 - ((MY+199) - 119)
ELSE
YCLIPB=199
END IF
DIM PP AS UINTEGER PTR
DIM P2 AS UINTEGER PTR
FOR LY=YCLIPT TO YCLIPB
TY2=(LY+MY) * 160
CCCC=LY*200
P2 = @METABUFFER (CCCC+XCLIPL)
PP = @WORKBUFFER (TY2+MX+XCLIPL)
FOR LX=XCLIPL TO XCLIPR
*PP += *P2
P2 += 1
pp += 1
NEXT
NEXT
END SUB
SUB PRECALC()
'-------------------------------------------------------------------------------
' CREATE METABALL ;
'-------------------------------------------------------------------------------
DIM AS INTEGER SZ,CC
FOR SZ=99 TO 1 STEP-1
CC=CC+1
if sz<20 then CC=CC+2
if sz<15 then CC=CC+4
if sz<10 then CC=CC+6
if sz<5 then CC=CC+8
if sz=1 then CC=CC+20
DCIRCLE ( 100 , 100 , SZ , CC )
NEXT
'
' CREATE PALETTE
'
DIM AS DOUBLE RR,GG,BB
RR=2
GG=2
BB=2
FOR SZ=0 TO 3000
GENERAL_PALETTE(SZ) = RGB( INT(rr) , int (gg) , int (bb) )
RR=RR+.2
GG=GG+.1
BB=BB+.1
IF SZ>100 THEN
RR=RR+0.4
GG=GG+0.3
BB=BB+0.1
END IF
IF SZ>200 THEN
RR=RR+0.6
GG=GG+0.4
BB=BB+0.2
END IF
IF SZ>300 THEN
RR=RR+0.9
GG=GG+0.8
BB=BB+0.7
END IF
if rr>255 then rr=255
if gg>255 then gg=255
if bb>255 then bb=255
NEXT
END SUB
SUB DCIRCLE(BYVAL CX AS INTEGER , BYVAL CY AS INTEGER , BYVAL R AS INTEGER, BYVAL CLR AS INTEGER)
DIM as integer r2,cc,loopy,ww,l
r2=r*r
cc=-r
for loopy = cc to r
ww = Sqr(r2-loopy*loopy)
for l = CX-ww to CX+ww
METABUFFER((200*(loopy+CY))+l)=CLR
next
next
END SUB
SUB RENDER_TO_SCREEN()
DIM AS INTEGER XL,YL
DIM AS INTEGER TC,SLICE,SLICE2
DIM PP AS INTEGER PTR
'-------------------------------------------------------------------------------
' Render Mosaic ;
'-------------------------------------------------------------------------------
FOR YL=0 TO 119
FOR XL = 0 TO 159
TC = GENERAL_PALETTE(WORKBUFFER(XL+(YL*160)) )
FOR SLICE2=0 TO 4
PP = @BUFFER((XL*5)+(((YL*5)+SLICE2)*XRES))
SLICE = 5
asm
mov eax,dword ptr[TC]
mov ecx, [slice]
mov edi, [PP]
rep stosd
end asm
NEXT
NEXT
NEXT
'-------------------------------------------------------------------------------
END SUB
SUB FLAT_TRIANGLE(BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER, BYVAL X2 AS INTEGER , BYVAL Y2 AS INTEGER , BYVAL X3 AS INTEGER, BYVAL Y3 AS INTEGER , BYVAL TC AS INTEGER)
'-------------------------------------------------------------------------
' FLAT TRIANGLE RENDERER WITH ASSEMBLY LANGUAGE RASTERISING BY SHOCKWAVE ^ DBF ^ S!P 2006.
'-------------------------------------------------------------------------
'-------------------------------------------------------------------------
' WE NEED TO SORT THESE POINTS INTO ORDER FROM TOP TO BOTTOM, AN EXCHANGE SORT IS OK.
' AS WE ONLY HAVE GOT 3 POINTS TO ARRANGE.
'-------------------------------------------------------------------------
DIM AS INTEGER TEMPX,TEMPY,LO,LI
DIM AS INTEGER PX(3)
DIM AS INTEGER PY(3)
DIM TFLAG AS INTEGER
dim pp as uinteger PTR
DIM AS INTEGER IL1,IL2,SLICE
TFLAG=0
PX(1)= X1
PX(2)= X2
PX(3)= X3
PY(1)= Y1
PY(2)= Y2
PY(3)= Y3
FOR LO = 1 TO 2
FOR LI =1 TO 2
IF PY(LI+1) <= PY(LI) THEN
TEMPX = PX(LI) : TEMPY = PY(LI)
PX(LI) = PX(LI+1)
PY(LI) = PY(LI+1)
PX(LI+1) = TEMPX
PY(LI+1) = TEMPY
END IF
NEXT LI
NEXT LO
' BOOT OUT INVISIBLE TRIANGLES!
IF PX(1)<0 AND PX(2)<0 AND PX(3)< 0 THEN TFLAG=1
IF PX(1)>WXRES AND PX(2)>WXRES AND PX(3)>WXRES THEN TFLAG=1
IF PY(1)>WYRES AND PY(2)>WYRES AND PY(3)>WYRES THEN TFLAG=1
DIM AS DOUBLE XP1,XP2:' SCREEN POSITIONS.
DIM AS DOUBLE XI1,XI2:' INTERPOLATIONS.
'***
'*** REGULAR TRIANGLE (Y1<Y2 Y2<Y3)
'***
IF PY(1)<PY(2) AND PY(2)<PY(3) or (PY(2) = PY(3)) THEN
TFLAG=1
XP1 = PX(1)
XP2 = PX(1)
XI1 = (PX(1)-PX(2)) / (PY(2) - PY(1))
XI2 = (PX(1)-PX(3)) / (PY(3) - PY(1))
FOR LO = PY(1) TO PY(2)-1
IF LO>=0 AND LO<WYRES THEN
IF XP1<=XP2 THEN
IL1=XP1
IL2=XP2
ELSE
IL1=XP2
IL2=XP1
END IF
IF IL2>WXRES THEN IL2=WXRES
IF IL1<0 THEN IL1=0
SLICE = IL2-IL1
IF SLICE>0 THEN
PP = @WORKBUFFER(IL1+(LO*WXRES))
asm
mov eax,dword ptr[TC]
mov ecx, [slice]
mov edi, [PP]
rep stosd
end asm
END IF
END IF
XP1=XP1-XI1
XP2=XP2-XI2
NEXT
XI1 = (PX(2)-PX(3)) / (PY(3) - PY(2))
XP1 = PX(2)
FOR LO = PY(2) TO PY(3)
IF LO>=0 AND LO<WYRES THEN
IF XP1<=XP2 THEN
IL1=XP1
IL2=XP2
ELSE
IL1=XP2
IL2=XP1
END IF
IF IL2>WXRES THEN IL2=WXRES
IF IL1<0 THEN IL1=0
SLICE = IL2-IL1
IF SLICE>0 THEN
PP = @WORKBUFFER(IL1+(LO*WXRES))
asm
mov eax,dword ptr[TC]
mov ecx, [slice]
mov edi, [PP]
rep stosd
end asm
END IF
END IF
XP1=XP1-XI1
XP2=XP2-XI2
NEXT
END IF
'***
'*** FLAT TOPPED TRIANGLE Y1=Y2
'***
IF TFLAG=0 AND PY(1) = PY(2) THEN
TFLAG=1
XP1 = PX(1)
XP2 = PX(2)
XI1 = (PX(1)-PX(3)) / (PY(3) - PY(1))
XI2 = (PX(2)-PX(3)) / (PY(3) - PY(2))
FOR LO = PY(1) TO PY(3)
IF LO>=0 AND LO<WYRES THEN
IF XP1<=XP2 THEN
IL1=XP1
IL2=XP2
ELSE
IL1=XP2
IL2=XP1
END IF
IF IL2>WXRES THEN IL2=WXRES
IF IL1<0 THEN IL1=0
SLICE = IL2-IL1
IF SLICE>0 THEN
PP = @WORKBUFFER(IL1+(LO*WXRES))
asm
mov eax,dword ptr[TC]
mov ecx, [slice]
mov edi, [PP]
rep stosd
end asm
END IF
END IF
XP1=XP1-XI1
XP2=XP2-XI2
NEXT
END IF
END SUB
Exe attached for those without FB :)
-
17fps on my gf's laptop. pIII-750Mhz, 256mb ram. ATI mobility 128..
damn i need to get her a new laptop :P
-
Could be expensive mate. It's the processor that's killing it for you I think Mind.
This should be ok on anything above 1ghz.
-
What a beautiful effect!
I am getting 160fps on a laptop with x600 ATI (omega drivers) and CPU is 2Gig in the 800x600 mode.
-
Thanks Taj, it's startin g to take shape now, here's a quick screen grab of how it looks at the moment.
-
You would not believe how wierd this looks when it's moving....
-
are you XOR'ing the edges of those twisters, or is it just me?
looks cool though :)
-
Holy cow that looks amazing ! Wow, I mean wow - if it looks half as good animated as I think it will, you just became my hero.
-
I got smooth 65 FPS here -> P4 2.8GHZ Geforce 6600GT
-
Lubbly Jubbly :)
I get 56-58 fps on my setup which is:
Windows XP w/ SP2.
P4 2.66ghz w/ 512MB Ram.
GeForce 5500 w/ 128 MB
-
Effect looks nice here @ 64/65 fps
P4 2.8 Ghz, Radeon 9800 ME XPSP2
-
Needs music mate :)
-
Yip, i'll start it. ;D
-
Thanks mate :)