ps2sdk  1.1
A collection of Open Source libraries used for developing applications on Sony's PlayStation 2® (PS2).
main.c
Go to the documentation of this file.
1 /*
2 # _____ ___ ____ ___ ____
3 # ____| | ____| | | |____|
4 # | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5 #-----------------------------------------------------------------------
6 # (c) 2009 Lion
7 # Licenced under Academic Free License version 2.0
8 # Review ps2sdk README & LICENSE files for further details.
9 */
10 
11 #include <kernel.h>
12 #include <libgs.h>
13 
14 typedef struct
15 {
16  int x_pos; // x position of sprite
17  int y_pos; // y position of sprite
18 
19  char x_dir; // x direction 0=left,1=right
20  char y_dir; // y direction 0=up,1=down;
21 
22  char x_speed; // speed moving in x direction
23  char y_speed; // speed moving in y direction
24 
27 
28 const static char x_randspeeds[10] = {1,4,6,5,2,3,8,6,6,7};
29 
30 const static GS_RGBAQ randcolor[10] ={ {28 ,200,200,0x80,0.0f},
31  {255, 0,128,0x80,0.0f},
32  {255,128,0,0x80,0.0f},
33  {255,255,255,0x80,0.0f},
34  {0 ,128,255,0x80,0.0f},
35  {255,255,128,0x80,0.0f},
36  {128,128,255,0x80,0.0f},
37  {226,137,245,0x80,0.0f},
38  {172,177,210,0x80,0.0f},
39  {221,180,162,0x80,0.0f}
40  };
41 
42 
43 #define MAX_SPRITES 1000
44 
45 #define SCREEN_WIDTH 640
46 #define SCREEN_HEIGHT 448
47 
48 static short int ScreenOffsetX, ScreenOffsetY;
49 
50 #define GIF_PACKET_MAX 10
51 
54 
57 
58 static int InitGraphics(void);
59 static int InitSprites(void);
60 static int MoveSprites(void);
61 static int DrawSprites(GS_PACKET_TABLE *table);
62 
63 int main(int argc, char *argv[])
64 {
65  InitGraphics();
66 
69 
70  InitSprites();
71 
72  while(1)
73  {
74  GsGifPacketsClear(&giftable); // clear the area that we are going to put the sprites/triangles/....
75 
76  MoveSprites();
77  DrawSprites(&giftable); //add stuff to the packet area
78 
79  GsDrawSync(0);
80  GsVSync(0);
81  GsClearDrawEnv1(&draw_env); // clear the draw environment before we draw stuff on it
82  GsGifPacketsExecute(&giftable, 1); // set to '1' becuse we want to wait for drawing to finish. if we dont wait we will write on packets that is currently writing to the gif
83  }
84 
85  return 0;
86 }
87 
88 int InitGraphics(void)
89 {
90  unsigned int FrameBufferVRAMAddress;
91 
93 
96  //Retrieve screen offset parameters.
99  GsSetDefaultDrawEnvAddress(&draw_env, FrameBufferVRAMAddress);
100 
102  GsSetDefaultDisplayEnvAddress(&disp_env, FrameBufferVRAMAddress);
103 
104  //execute draw/display environment(s) (context 1)
107 
108  //Set common primitive-drawing settings (Refer to documentation on PRMODE and PRMODECONT registers).
109  GsOverridePrimAttributes(GS_DISABLE, 0, 0, 0, 0, 0, 0, 0, 0);
110 
111  //Set transparency settings for context 1 (Refer to documentation on TEST and TEXA registers).
112  //Alpha test = enabled, pass if >= alpha reference, alpha reference = 1, fail method = no update
114  //Enable global alpha blending
116 
117  //set transparency settings for context 2 (Refer to documentation on TEST and TEXA registers).
118  //Alpha test = enabled, pass if >= alpha reference, alpha reference = 1, fail method = no update
120  //Enable global alpha blending
122 
123  return 0;
124 }
125 
127 
128 static int InitSprites(void)
129 {
130  int i,j;
131 
132  for(i=0,j=0;i<MAX_SPRITES;i++,j++)
133  {
134  if(j>9)j=0;
135 
136  sprites[i].x_pos =i;
137  sprites[i].y_pos =i/2;
138 
139  sprites[i].x_dir =0;
140  sprites[i].y_dir =0;
141 
142  sprites[i].x_speed =i/x_randspeeds[j];
143  sprites[i].y_speed =x_randspeeds[j]+1;
144 
145  if(sprites[i].x_speed<=0)sprites[i].x_speed=2;
146  if(sprites[i].y_speed<=0)sprites[i].y_speed=1;
147 
148 
149  //set color
150  sprites[i].color = randcolor[j];
151  }
152 
153  return 0;
154 }
155 
156 static int MoveSprites(void)
157 {
158  int i;
159 
160  for(i=0;i<MAX_SPRITES;i++)
161  {
162  // mod a little
163  // sprites[i].x_speed++;
164  // sprites[i].y_speed++;
165 
166  if(sprites[i].x_speed>10)sprites[i].x_speed =sprites[i].x_speed-10;
167  if(sprites[i].y_speed>10)sprites[i].y_speed =sprites[i].y_speed-10;
168 
169  //x
170  if(sprites[i].x_dir==0)
171  {
172  sprites[i].x_pos -= sprites[i].x_speed;
173  if(sprites[i].x_pos<0)
174  {
175  sprites[i].x_pos=0;
176  sprites[i].x_dir=1;
177  }
178  }
179  else if(sprites[i].x_dir==1)
180  {
181  sprites[i].x_pos += sprites[i].x_speed;
182  if(sprites[i].x_pos>SCREEN_WIDTH)
183  {
185  sprites[i].x_dir=0;
186  }
187  }
188 
189  //y
190  if(sprites[i].y_dir==0)
191  {
192  sprites[i].y_pos -= sprites[i].y_speed;
193  if(sprites[i].y_pos<0)
194  {
195  sprites[i].y_pos=0;
196  sprites[i].y_dir=1;
197  }
198  }
199  else if(sprites[i].y_dir==1)
200  {
201  sprites[i].y_pos += sprites[i].y_speed;
202  if(sprites[i].y_pos>SCREEN_HEIGHT)
203  {
205  sprites[i].y_dir=0;
206  }
207  }
208  }
209 
210  return 0;
211 }
212 
213 static int DrawSprites(GS_PACKET_TABLE *table)
214 {
215  int i;
216  QWORD *p;
217 
218  for(i=0;i<MAX_SPRITES;i++)
219  {
220  //Use the uncached segment, to avoid needing to flush the data cache.
221  p = (QWORD*)UNCACHED_SEG(GsGifPacketsAlloc(table, 5)); //Allocate 5 qword for 1 untextured strite
222 
223  /* For this GIF packet, the EOP flag is set to 1.
224  Rightfully, it should only be set for only the final packet so that the GIF knows when it can safely switch paths,
225  but to keep things simple, it's set to 1 for every packet.
226 
227  The packets are all in the PACKED format. */
228  gs_setGIF_TAG(((GS_GIF_TAG *)&p[0]), 4,1,0,0,GS_GIF_PACKED,1,gif_rd_ad);
229  gs_setR_PRIM(((GS_R_PRIM *)&p[1]), GS_PRIM_SPRITE,0, 0, 0, 1, 0, 0, 0, 0);
230  gs_setR_RGBAQ(((GS_R_RGBAQ *)&p[2]), sprites[i].color.r, sprites[i].color.g, sprites[i].color.b, sprites[i].color.a, sprites[i].color.q);
231  gs_setR_XYZ2(((GS_R_XYZ *)&p[3]), (ScreenOffsetX+sprites[i].x_pos)<<4, (ScreenOffsetY+sprites[i].y_pos)<<4, 0x00000000);
232  gs_setR_XYZ2(((GS_R_XYZ *)&p[4]), (ScreenOffsetX+sprites[i].x_pos+10)<<4, (ScreenOffsetY+sprites[i].y_pos+10)<<4, 0x00000000);
233  }
234 
235  return 0;
236 
237 }
238 
239 /*EOF*/
int main(int argc, char **argv)
Definition: main.c:350
#define UNCACHED_SEG(x)
Definition: kernel.h:35
static GS_DRAWENV draw_env
Definition: main.c:52
static int MoveSprites(void)
Definition: main.c:156
#define SCREEN_WIDTH
Definition: main.c:45
#define GIF_PACKET_MAX
Definition: main.c:50
static int InitGraphics(void)
Definition: main.c:88
static short int ScreenOffsetY
Definition: main.c:48
static GS_PACKET_TABLE giftable
Definition: main.c:56
static int InitSprites(void)
Definition: main.c:128
#define SCREEN_HEIGHT
Definition: main.c:46
static const char x_randspeeds[10]
Definition: main.c:28
static short int ScreenOffsetX
Definition: main.c:48
static int DrawSprites(GS_PACKET_TABLE *table)
Definition: main.c:213
static MAVING_SPRITE sprites[MAX_SPRITES]
Definition: main.c:126
static GS_DISPENV disp_env
Definition: main.c:53
static const GS_RGBAQ randcolor[10]
Definition: main.c:30
static GS_GIF_PACKET packets[GIF_PACKET_MAX]
Definition: main.c:55
#define MAX_SPRITES
Definition: main.c:43
void GsDrawSync(int mode)
Definition: sync.c:18
void GsSetDefaultDrawEnvAddress(GS_DRAWENV *drawenv, u16 vram_addr)
Definition: draw.c:47
#define GS_ENABLE
Definition: libgs.h:63
@ GS_ALPHA_NO_UPDATE
Definition: libgs.h:119
QWORD * GsGifPacketsAlloc(GS_PACKET_TABLE *table, u32 num_qwords)
Definition: packets.c:20
void GsPutDisplayEnv1(GS_DISPENV *dispenv)
Definition: draw.c:201
void GsEnableAlphaTransparency2(u16 enable, u16 method, u8 alpha_ref, u16 fail_method)
Definition: primitives.c:94
void GsVSync(int mode)
Definition: sync.c:50
int GsGifPacketsExecute(GS_PACKET_TABLE *table, u16 wait)
Definition: packets.c:76
@ GS_MODE_NTSC
Definition: libgs.h:56
void GsEnableAlphaBlending2(u16 enable)
Definition: primitives.c:160
#define gs_setR_RGBAQ(p, _r, _g, _b, _a, _q)
Definition: libgs.h:1631
#define gs_setR_XYZ2(p, _x, _y, _z)
Definition: libgs.h:1651
void GsEnableAlphaTransparency1(u16 enable, u16 method, u8 alpha_ref, u16 fail_method)
Definition: primitives.c:72
#define gs_setGIF_TAG(p, _nloop, _eop, _pre, _prim, _flg, _nreg, _reg)
Definition: libgs.h:1870
#define gif_rd_ad
Definition: libgs.h:326
void GsSetDefaultDisplayEnvAddress(GS_DISPENV *dispenv, u16 vram_addr)
Definition: draw.c:164
#define GS_DISABLE
Definition: libgs.h:62
void GsSetDefaultDisplayEnv(GS_DISPENV *dispenv, u16 psm, u16 w, u16 h, u16 dx, u16 dy)
Definition: draw.c:74
void GsGifPacketsClear(GS_PACKET_TABLE *table)
Definition: packets.c:70
void GsOverridePrimAttributes(s8 override, s8 iip, s8 tme, s8 fge, s8 abe, s8 aa1, s8 fst, s8 ctxt, s8 fix)
Definition: primitives.c:23
#define GS_PIXMODE_32
Definition: libgs.h:77
#define GS_FFMD_FIELD
Definition: libgs.h:41
@ GS_GIF_PACKED
Definition: libgs.h:181
void GsSetDefaultDrawEnv(GS_DRAWENV *drawenv, u16 psm, u16 w, u16 h)
Definition: draw.c:23
#define gs_setR_PRIM(p, _prim_type, _iip, _tme, _fge, _abe, _aa1, _fst, _ctxt, _fix)
Definition: libgs.h:1627
void GsEnableAlphaBlending1(u16 enable)
Definition: primitives.c:137
@ GS_ALPHA_GEQUAL
Definition: libgs.h:111
int GsVramAllocFrameBuffer(s16 w, s16 h, s16 psm)
Definition: texture.c:105
void GsPutDrawEnv1(GS_DRAWENV *drawenv)
Definition: draw.c:169
#define GS_INTERLACED
Definition: libgs.h:38
void GsResetGraph(short int mode, short int interlace, short int omode, short int ffmode)
void GsClearDrawEnv1(GS_DRAWENV *drawenv)
Definition: draw.c:182
#define GS_INIT_RESET
Definition: libgs.h:33
@ GS_PRIM_SPRITE
Definition: libgs.h:73
u16 offset_y
Definition: libgs.h:1944
u16 offset_x
Definition: libgs.h:1942
u32 packet_count
Definition: libgs.h:2289
GS_GIF_PACKET * packets
Definition: libgs.h:2292
u8 a
Definition: libgs.h:598
u8 b
Definition: libgs.h:597
u8 g
Definition: libgs.h:596
float q
Definition: libgs.h:599
char y_dir
Definition: main.c:20
int x_pos
Definition: main.c:16
char x_dir
Definition: main.c:19
char x_speed
Definition: main.c:22
GS_RGBAQ color
Definition: main.c:25
int y_pos
Definition: main.c:17
char y_speed
Definition: main.c:23
Definition: libgs.h:333