Dark Bit Factory & Gravity

GENERAL => Projects => Topic started by: Shockwave on December 31, 2006

Title: Specs/Readings please!
Post 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!
Title: Re: Specs/Readings please!
Post by: zawran on December 31, 2006
61-65fps, on P4 3ghz, 1gb ram, GeForce6600GT.
Title: Re: Specs/Readings please!
Post by: mike_g on December 31, 2006
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.
Title: Re: Specs/Readings please!
Post by: Ghost^BHT on December 31, 2006
42 FPS // AMD 1.2, 512 ram //ATI Radeon 9600 w/ 256 vram
Title: Re: Specs/Readings please!
Post by: MrP on January 01, 2007
floats between 98 and 101, but on average about 100... P4 3.2G Dual Core (one of the early ones), G-Force FX 7800GTX
Title: Re: Specs/Readings please!
Post by: taj on January 01, 2007
Hi Shockie,

about 140 fps,
AMD Athlon 64 4200+ dual core, x1900 ati (ati drivers)
Title: Re: Specs/Readings please!
Post by: Shockwave on January 01, 2007
Thanks very much or the fps+specs + karma for all of you.
v :)
Title: Re: Specs/Readings please!
Post by: Stonemonkey on January 01, 2007
122-125

AMD64 @2.1, radeon1650
Title: Re: Specs/Readings please!
Post by: ninogenio on January 01, 2007
very nice plasma bob thinges shock!

i get 47fps on a 512mb athlon xp2200 128mb geforce4 ti4600 rig.
Title: Re: Specs/Readings please!
Post by: Shockwave on January 01, 2007
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.
Title: Re: Specs/Readings please!
Post by: MrP on January 01, 2007
Looking forward to the finished prod....
Title: Re: Specs/Readings please!
Post by: Shockwave on January 02, 2007
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.

Code: [Select]
' 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 :)
Title: Re: Specs/Readings please!
Post by: mind on January 02, 2007
17fps on my gf's laptop. pIII-750Mhz, 256mb ram. ATI mobility 128..

damn i need to get her a new laptop :P
Title: Re: Specs/Readings please!
Post by: Shockwave on January 02, 2007
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.
Title: Re: Specs/Readings please!
Post by: taj on January 02, 2007
What a beautiful effect!
I am getting 160fps on a laptop with x600 ATI (omega drivers) and CPU is 2Gig in the 800x600 mode.
Title: Re: Specs/Readings please!
Post by: Shockwave on January 02, 2007
Thanks Taj, it's startin g to take shape now, here's a quick screen grab of how it looks at the moment.
Title: Re: Specs/Readings please!
Post by: Shockwave on January 02, 2007
You would not believe how wierd this looks when it's moving....
Title: Re: Specs/Readings please!
Post by: mind on January 02, 2007
are you XOR'ing the edges of those twisters, or is it just me?

looks cool though :)
Title: Re: Specs/Readings please!
Post by: taj on January 02, 2007
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.
Title: Re: Specs/Readings please!
Post by: Rbz on January 02, 2007
I got smooth 65 FPS here -> P4 2.8GHZ Geforce 6600GT
Title: Re: Specs/Readings please!
Post by: Clyde on January 02, 2007
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
Title: Re: Specs/Readings please!
Post by: Roly on January 03, 2007
Effect looks nice here @ 64/65 fps

P4 2.8 Ghz, Radeon 9800 ME XPSP2
Title: Re: Specs/Readings please!
Post by: Shockwave on January 03, 2007
Needs music mate :)
Title: Re: Specs/Readings please!
Post by: Roly on January 03, 2007
Yip, i'll start it.  ;D
Title: Re: Specs/Readings please!
Post by: Shockwave on January 03, 2007
Thanks mate :)