#if !defined( Ps2BaseH ) # define Ps2BaseH #include "math.h" #include #include "ps2gs.h" #include "ps2vpufile.h" #include "ps2dma.h" #include "ps2vpu.h" class Ps2Base { protected: char *g_program_name; int g_inter; int g_out_mode; int g_ff_mode; int g_resolution; int g_refresh_rate; int g_psm; int g_zpsm; int g_zbits; int g_fd_gs; ps2_vpu *g_vpu0, *g_vpu1; void usage(const char *msg1, const char *msg2, const char *MoreUsage ); ps2_gs_gparam *gp; public: Ps2Base(); void parseCommandLine(int argc, char *argv[], bool (*ParseExtraOption)( const char *option )=NULL, const char *Usage="" ); void gsEnableVcSwitch(); int release(); int acquire(); void gsStartDisplay(); virtual void doExtraAcquire(); virtual void doExtraRelease(); bool hasZBuffer() { return g_zbits != 0; } int zBufferEnd() { return (1<width, gp->height, (g_zbits == 0) ? 0 : PS2_GS_ZGREATER, g_zpsm, 1); } public: Ps2Simple() { frame = 1; } void init(int argc, char *argv[], bool (*ParseExtraOption)( const char *option )=NULL, const char *Usage="" ) { parseCommandLine( argc, argv, ParseExtraOption, Usage ); ps2_gs_vc_graphicsmode(); gsReset(); gsSetDoubleBuffer(); setRgbAq(); } void start() { doExtraAcquire(); clearBackBuffer( frame & 1 ); odev = !ps2_gs_sync_v(0); gsStartDisplay(); gsEnableVcSwitch(); ps2_gs_vc_lock(); swapBuffers( frame, odev ); } void flip() { frame++; odev = !ps2_gs_sync_v(0); ps2_gs_vc_unlock(); ps2_gs_vc_lock(); swapBuffers( frame, odev ); } u_int getFrame() { return frame; } void setRgbAq( int r=0x10, int g=0x10, int b=0x10 ) { *(__u64 *)&g_db.clear0.rgbaq = PS2_GS_SETREG_RGBAQ( r, g, b, 0x80, 0x3f800000); *(__u64 *)&g_db.clear1.rgbaq = PS2_GS_SETREG_RGBAQ( r, g, b, 0x80, 0x3f800000); } }; class TexEnv { public: ps2_giftag giftag; ps2_gsreg_test gs_test; ps2_gsreg_addr gs_test1addr; ps2_gs_alphaenv gs_alpha; ps2_gs_texenv gs_tex; void draw( ps2_image *image, int width, int height, __u64 alpha ); void draw2( ps2_image *image, int width, int height, __u64 alpha, __u64 test ); }; inline void vset( ps2_vu0_fvector vec, float x, float y, float z, float w ) { vec[0] = x; vec[1] = y; vec[2] = z; vec[3] = z; } inline float length( ps2_vu0_fvector vec ) { return sqrtf(vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2]); } #endif