home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 2
/
goldfish_vol2_cd1.bin
/
files
/
util
/
blank
/
gblanker
/
source
/
blankers
/
star
/
blank.c
next >
Wrap
C/C++ Source or Header
|
1994-10-08
|
4KB
|
221 lines
/*
* Copyright (c) 1994 Michael D. Bayne.
* All rights reserved.
*
* Please see the documentation accompanying the distribution for distribution
* and disclaimer information.
*/
#include <exec/types.h>
#include <exec/memory.h>
#include <intuition/intuition.h>
#include <dos/dos.h>
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/graphics_protos.h>
#include <clib/alib_protos.h>
#include "/Garshnelib/Garshnelib_protos.h"
#include "/Garshnelib/Garshnelib_pragmas.h"
#include "Star.h"
#include "//defs.h"
#include "/main.h"
#define DE 200
#define de 1000
#define WRITEPIXEL( r, x, y ) { if(( x >= 0 )&&( x < Wid )&&( y >= 0 )&&( y < Hei )) WritePixel( r, x, y ); }
struct ModulePrefs
{
LONG Mode;
LONG Stars;
LONG Speed;
};
struct pt_3d
{
LONG x;
LONG y;
LONG z;
LONG speed;
};
struct pt_2d
{
LONG x;
LONG y;
};
extern struct ModulePrefs nP;
struct pt_3d *tab_pt_3d;
struct pt_2d *tab_old;
void new_star( struct pt_3d *p, LONG speed )
{
p->x = 1500 - ( LONG )RangeRand( 3000 );
p->y = 1000 - ( LONG )RangeRand( 2000 );
p->z = 1000 + ( LONG )RangeRand( 2000 );
p->speed = ( LONG )RangeRand( 10 ) + speed;
}
LONG Blank( VOID *Prefs )
{
struct ModulePrefs *mP;
struct RastPort *Rast;
struct Screen *Scr;
struct Window *Wnd;
struct pt_3d *p;
struct pt_2d *p2;
LONG ToFrontCount = 0, Wid, Hei, i, x, y, Stars, Speed, RetVal = OK;
if( StarWnd )
mP = &nP;
else
mP = ( struct ModulePrefs * )Prefs;
Stars = mP->Stars;
Speed = mP->Speed;
tab_pt_3d = AllocVec( Stars * sizeof( struct pt_3d ), MEMF_CLEAR );
tab_old = AllocVec( Stars * sizeof( struct pt_2d ), MEMF_CLEAR );
Scr = OpenScreenTags( 0L, SA_Depth, 2, SA_Overscan, OSCAN_STANDARD,
SA_DisplayID, mP->Mode, SA_Quiet, TRUE, SA_Behind,
TRUE, TAG_DONE );
if( tab_pt_3d && tab_old && Scr )
{
Wid = Scr->Width;
Hei = Scr->Height;
Rast = &( Scr->RastPort );
SetRast( Rast, 0 );
for( i = 0; i < 4; i++ )
SetRGB4(&( Scr->ViewPort ), i, 4 * i, 4 * i, 4 * i );
for( i = 0; i < Stars; i++ )
{
new_star( &tab_pt_3d[i], Speed );
tab_old[i].x = 0;
tab_old[i].y = 0;
}
Wnd = BlankMousePointer( Scr );
ScreenToFront( Scr );
while( RetVal == OK )
{
WaitTOF();
if(!( ++ToFrontCount % 60 ))
ScreenToFront( Scr );
p2 = tab_old;
p = tab_pt_3d;
for( i = 0; i < Stars; i++ )
{
x = p2->x;
y = p2->y;
SetAPen( Rast, 0 );
if( p->z > 1000 )
{
WRITEPIXEL( Rast, x, y );
}
else
{
if( p->z > 200 )
{
WRITEPIXEL( Rast, x, y );
WRITEPIXEL( Rast, x+1, y );
}
else
{
WRITEPIXEL( Rast, x, y );
WRITEPIXEL( Rast, x+1, y );
WRITEPIXEL( Rast, x, y+1 );
WRITEPIXEL( Rast, x+1, y+1 );
}
}
p->z -= p->speed;
if( p->z <= -de )
new_star( p, Speed );
x = Wid/2 + ( DE * p->x ) / ( p->z + de );
y = Hei/2 + ( DE * p->y ) / ( p->z + de );
if(( x < 0 )||( x >= Wid )||( y < 0 )||( y >= Hei ))
{
new_star( p, Speed );
p2->x = 0;
p2->y = 0;
}
else
{
p2->x = x;
p2->y = y;
if( p->z > 2000 )
{
SetAPen( Rast, 1 );
WRITEPIXEL( Rast, x, y );
}
else
{
if( p->z > 1500 )
{
SetAPen( Rast, 2 );
WRITEPIXEL( Rast, x, y );
}
else
{
if( p->z > 1000 )
{
SetAPen( Rast, 3 );
WRITEPIXEL( Rast, x, y );
}
else
{
if( p->z > 200 )
{
SetAPen( Rast, 3 );
WRITEPIXEL( Rast, x, y );
WRITEPIXEL( Rast, x+1, y );
}
else
{
SetAPen( Rast, 3 );
WRITEPIXEL( Rast, x, y );
WRITEPIXEL( Rast, x+1, y );
WRITEPIXEL( Rast, x, y+1 );
WRITEPIXEL( Rast, x+1, y+1 );
}
}
}
}
}
p2++;
p++;
}
if(!( ToFrontCount % 5 ))
RetVal = ContinueBlanking();
}
UnblankMousePointer( Wnd );
}
else
RetVal = FAILED;
if( Scr )
CloseScreen( Scr );
if( tab_pt_3d )
FreeVec( tab_pt_3d );
if( tab_old )
FreeVec( tab_old );
return RetVal;
}