This is just a little experiment, it's something I might develop into an intro.
Please ignore the coder colours, this is just a test to see how quick this runs on various systems - I think it should be quite quick because it's all pointers. If it's too slow I'll have to ditch the pixel pushing and switch to the hardware for this.
Code is included in case anyone wants to use any of it.
'*******************************************************************************
'*
'* Quickly made Metablob thingy by Shockwave 2011..
'* ================================================
'* Greetings to gun owners everywhere.
'*
'* Fuckings to pretentious twats who fart too high for thier own assholes.
'* If the cap fits....
'*
'* Credit to shockwave/dbfinteractive.com if used!
'*******************************************************************************
'-------------------------------------------------------------------------------
' LIBS;
'-------------------------------------------------------------------------------
#INCLUDE "TINYPTC_EXT.BI"
#INCLUDE "WINDOWS.BI"
OPTION STATIC
OPTION EXPLICIT
'-------------------------------------------------------------------------------
' 800 * 600 SCREEN AND SCREEN BUFFER.
'-------------------------------------------------------------------------------
CONST XRES = 800
CONST YRES = 600
DIM SHARED AS UINTEGER BUFFER2( XRES * YRES )
DIM SHARED AS UINTEGER BUFFER ( XRES * YRES )
'-------------------------------------------------------------------------------
' OTHER DEFINITIONS.
'-------------------------------------------------------------------------------
CONST CIRCX = 320
CONST CIRCY = 320
DIM SHARED AS UINTEGER CIRCBUFF ( CIRCX * CIRCY )
DECLARE SUB PREP_CIRCLE()
DECLARE SUB CIRC(BYVAL CX AS INTEGER , BYVAL CY AS INTEGER , BYVAL R AS INTEGER , BYVAL TC AS UINTEGER)
DECLARE SUB DRAW_METABLOB(BYVAL XX AS INTEGER,BYVAL YY AS INTEGER)
PREP_CIRCLE()
CONST STARNUM = 30
DIM SHARED AS DOUBLE STX (STARNUM)
DIM SHARED AS DOUBLE STY (STARNUM)
DIM SHARED AS DOUBLE STS (STARNUM)
DECLARE SUB SET_STAR()
DECLARE SUB DRAW_STAR()
SET_STAR()
DIM SHARED R2D AS DOUBLE
R2D=(4 * ATN ( 1 ))/180
'-------------------------------------------------------------------------------
' OPEN THE SCREEN;
'-------------------------------------------------------------------------------
PTC_ALLOWCLOSE(0)
PTC_SETDIALOG(1,"QUICK INTRO"+CHR$(13)+"FULL SCREEN?",0,1)
IF (PTC_OPEN("BY SHOCKWAVE",XRES,YRES)=0) THEN
END-1
END IF
'*******************************************************************************
'* MAIN LOOP;
'*******************************************************************************
DIM SHARED AS DOUBLE GADD,DV,OLD
WHILE(GETASYNCKEYSTATE(VK_ESCAPE)<> -32767 and PTC_GETLEFTBUTTON=FALSE)
OLD=TIMER
DRAW_STAR()
PTC_UPDATE@BUFFER(0)
ERASE BUFFER
SLEEP 1
DV=TIMER-OLD
IF DV>2 THEN DV=2
GADD=GADD+DV
WEND
'*******************************************************************************
'* EXIT.
'*******************************************************************************
EXITPROCESS(0)
'-------------------------------------------------------------------------------
' SUBROUTINES.
'-------------------------------------------------------------------------------
SUB SET_STAR()
DIM LP AS INTEGER
FOR LP=1 TO STARNUM
STX(LP)=(RND(1)*(XRES+CIRCX))-CIRCX
STY(LP)=(RND(1)*(YRES+CIRCY))-CIRCY
STS(LP)=(RND(1)*3)*100
NEXT
END SUB
SUB DRAW_STAR()
DIM LP AS INTEGER
FOR LP=1 TO STARNUM
DRAW_METABLOB(INT(STX(LP)),INT(STY(LP)+140*SIN((STX(LP)+GADD)*R2D)))
STX(LP)=STX(LP)-(STS(LP)*DV)
IF STX(LP)< -CIRCX THEN STX(LP)=STX(LP)+(XRES+CIRCX)
NEXT
END SUB
SUB DRAW_METABLOB(BYVAL XX AS INTEGER,BYVAL YY AS INTEGER)
'-------------------------------------------------------------------------
'
' DRAW A METABOB AT XX,YY
'
' CLIP TO SCREEN LIMITS.
'
'-------------------------------------------------------------------------
DIM PP AS UINTEGER PTR
DIM PP2 AS UINTEGER PTR
DIM AS INTEGER CLIPL , CLIPR , Y , LP, SLICE
'------------------------------------------------------------------------
' CLIP X TO SCREEN;
'------------------------------------------------------------------------
CLIPL=0
CLIPR=CIRCX
IF XX<0 THEN CLIPL = -XX
IF XX > (XRES-CIRCX) THEN CLIPR = CIRCX-(XX-(XRES-CIRCX))
IF CLIPL>CIRCX THEN CLIPL=0 : CLIPR=0
IF CLIPR<1 THEN CLIPL=0 : CLIPR = 0
SLICE = CLIPR-CLIPL
XX=XX+CLIPL
'------------------------------------------------------------------------
' DRAW LOOP
'------------------------------------------------------------------------
FOR Y=0 TO CIRCY-1
IF YY>=0 AND YY<YRES THEN
PP =@BUFFER (XX+(YY*XRES))
PP2=@CIRCBUFF(CLIPL+(Y*CIRCX))
FOR LP=1 TO SLICE
*PP += *PP2
PP2+=1
PP+=1
NEXT
END IF
YY+=1
NEXT
END SUB
SUB PREP_CIRCLE()
'-------------------------------------------------------------------------
'
' PRECALCULATE THE METABALL
'
' SUB IS CALLED ONCE AT THE START OF THE PROGRAM.
'
'-------------------------------------------------------------------------
DIM TC AS INTEGER
DIM LP AS INTEGER
FOR LP=150 TO 1 STEP-1
CIRC(CIRCX SHR 1,CIRCY SHR 1,LP,TC)
IF TC<255 THEN TC+=1
NEXT
END SUB
SUB CIRC(BYVAL CX AS INTEGER , BYVAL CY AS INTEGER , BYVAL R AS INTEGER , BYVAL TC AS UINTEGER)
'-------------------------------------------------------------------------
'
' FILLED CIRCLE ROUTINE
' USAGE CIRC ( CX , CY , RADIUS , R , G , B )
'
' CLIPS TO SCREEN BOUNDARIES - BY SHOCKWAVE.
' CUSTOMISED HERE TO DRAW INTO A BUFFER FOR THE METABLOBS.
'
'-------------------------------------------------------------------------
DIM AS INTEGER R2,CC,LOOPY,WW,L,CLIPL ,CLIPR,SLICE
DIM PP AS INTEGER PTR
R2=R*R
CC=-R
FOR LOOPY = CC TO R
WW = SQR(R2-LOOPY*LOOPY)
IF LOOPY+CY>=0 AND LOOPY+CY<CIRCY THEN
CLIPL = CX-WW
CLIPR = (CX+WW)-1
IF CLIPL<0 THEN CLIPL=0
IF CLIPR>CIRCX-1 THEN CLIPR = CIRCX-1
PP=@CIRCBUFF((CIRCX*(LOOPY+CY))+CLIPL)
SLICE = CLIPR - CLIPL
IF SLICE>0 THEN
ASM
MOV EAX,DWORD PTR[TC]
MOV ECX, [SLICE]
MOV EDI, [PP]
REP STOSD
END ASM
END IF
END IF
NEXT
END SUB
The thing I am going to develop this into will be quite Melon Dezign looking, all I am interested to know at this stage is if it runs smooth (especially on older systems).
Cheers folks!