// PSX sprite file viewer // Coded by Scott Evans 9/5/97 // Last modified 10/5/97 // View PSX sprites on Playstation and can edit colours // Use Joypad for following // SELECT - Quit // START - restore original palette settings // UP - view next sprite // DOWN - view previous sprite // RIGHT - select next colour in palette // LEFT - select previous colour in palette // TRIANGLE - toggle RED, GREEN, BLUE component of colour // SQUARE - increase RGB // CIRCLE - decrease RGB // L1 - Zoom in // L2 - Zoom out // R1 - Increase brightness // R2 - decrease brightness // PSX header file #include // My header files #include #include #include #include #include <2dgfx.h> #include // Screen width and height (PAL) #define SCRW 320 #define SCRH 240 // Location of CLUTs #define CLUTX 576 #define CLUTY 0 // Address of sprites #define SpriteBank 0x80090000 // very crude way to slow down joypad button repeat void pause(void) { int i; for(i=0;i<4;i++,VSync(0)); } // Variables int activeBuff,fid,i; short padMask; SprHeader *sprhdr=(SprHeader *)SpriteBank; SprPblk *sprpblk; _word sprno=0; RECT r; GsSPRITE sp,clutsp; _word tpage,nosp,tx,ty,n; _word *CLUT,oldCLUT[16]; _byte cno=0,cval=0; char *col[]={"Red","Green","Blue"}; char rgb=0,cr,cg,cb; // Sprite data to make up palette sprites (one of each colour) _long clutdata[]={0x00000000,0x11111111,0x22222222,0x33333333,0x44444444, 0x55555555,0x66666666,0x77777777,0x88888888,0x99999999, 0xaaaaaaaa,0xbbbbbbbb,0xcccccccc,0xdddddddd,0xeeeeeeee, 0xffffffff}; GsBOXF box; int main(void) { PACKET packetBuff[2][1000*24]; GsOT mainOT[2]; GsOT_TAG OTtags[2][2]; SprImgOff frames[_GetNoSpr(sprhdr)]; // Set up ordering table stuff mainOT[0].length=mainOT[1].length=1; mainOT[0].org=OTtags[0]; mainOT[1].org=OTtags[1]; // Start up graphics stuff InitGraphics(MODE_PAL,SCRW,SCRH,GsOFSGPU|GsNONINTER,0,0); GsSetOrign(8,0); // Sort out controller buffers _InitControllers; printf("Number of sprites %d\n",nosp=_GetNoSpr(sprhdr)); printf("CLUT offset %d bytes\n",sprhdr->paloff); printf("Pblk offset %d bytes\n",sprhdr->pblkoff); // Load sprite image data tx=SCRW,ty=0; sprpblk=(SprPblk *)_GetSprPblks(sprhdr); n=LoadSprites(sprpblk,_GetNoSpr(sprhdr),&tx,&ty,frames); printf("Number of sprites loaded %d at %d %d\n",n,tx,ty); // Load CLUTs CLUT=(_word *)_GetCLUT(sprhdr); // Save original palette memcpy(oldCLUT,CLUT,32); Load4bitCLUT(sprhdr,CLUTX,CLUTY); // Load sprites for palette for(i=0;i<16;i++) { setRECT(&r,SCRW,70+i,2,1); LoadImage(&r,&clutdata[i]); } // Get texture page of sprites tpage=GetTPage(0,0,tx,ty); // Set up sprite parameters _SetSPRITE(&sp,noEffects,SCRW>>1,SCRH>>1,sprpblk->w,sprpblk->h,tpage,0,0,CLUTX,CLUTY,128,128,128,sprpblk->w>>1,sprpblk->h>>1,ONE,ONE,0); _SetSPRITE(&clutsp,noEffects,0,1,8,1,tpage,0,70,CLUTX,CLUTY,128,128,128,0,1,ONE,ONE*8,0); // Sort out the font FntLoad(640,0); fid=FntOpen(0,SCRH-16,SCRW,16,1,50); sprno=cno=0; cval=CLUT[cno]; // Use a transparent box to highlight current colour in palette box.attribute=pixelQAdd; box.x=0; box.y=0; box.w=10; box.h=10; box.r=box.g=box.b=255; // Keep looping until SELECT is pressed while((padMask=_PadStatus(pad1))&PADselect) { GsSetWorkBase((PACKET *)packetBuff[activeBuff=GsGetActiveBuff()]); GsClearOt(0,0,&mainOT[activeBuff]); // Register sprite and box GsSortBoxFill(&box,&mainOT[activeBuff],0); GsSortSprite(&sp,&mainOT[activeBuff],0); // Register sprites used for palette for(i=0;i<16;i++) { clutsp.v=70+i; clutsp.x=1+i*10; GsSortSprite(&clutsp,&mainOT[activeBuff],0); } // Display next sprite in bank if(!(padMask&PADup)) if(sprnow; sp.h=sprpblk->h; sp.u=frames[sprno].u; sp.v=frames[sprno].v; sp.cy=_GetSprCLUTy(sprhdr,sprno,CLUTY); clutsp.cy=_GetSprCLUTy(sprhdr,sprno,CLUTY); pause(); } // Display previous sprite if(!(padMask&PADdown)) if(sprno>0) { sprno--; sp.u=frames[sprno].u; sp.v=frames[sprno].v; sprpblk=(SprPblk *)_GetSprPblk(sprhdr,sprno); sp.w=sprpblk->w; sp.h=sprpblk->h; sp.cy=_GetSprCLUTy(sprhdr,sprno,CLUTY); clutsp.cy=_GetSprCLUTy(sprhdr,sprno,CLUTY); pause(); } // Move along colours in palete if(!(padMask&PADleft)) if(cno>0) box.x-=10,cno--,cr=CLUT[cno]&0x1f,cg=(CLUT[cno]>>5)&0x1f,cb=(CLUT[cno]>>10)&0x1f,pause(); if(!(padMask&PADright)) if(cno<15) box.x+=10,cno++,cr=CLUT[cno]&0x1f,cg=(CLUT[cno]>>5)&0x1f,cb=(CLUT[cno]>>10)&0x1f,pause(); // Cycle through red, green, blue part of colour if(!(padMask&PADtriangle)) rgb=(rgb+1)%3,pause(); // Increase selected component of colour if(!(padMask&PADsquare)) { switch(rgb) { case 0: if(cr<31) cr++; break; case 1: if(cg<31) cg++; break; case 2: if(cb<31) cb++; break; } CLUT[cno]=cr|cg<<5|cb<<10|0x8000; setRECT(&r,CLUTX,CLUTY,16,1); LoadImage(&r,(_long *)CLUT); pause(); } // decrease value of colour component if(!(padMask&PADcircle)) { switch(rgb) { case 0: if(cr>0) cr--; break; case 1: if(cg>0) cg--; break; case 2: if(cb>0) cb--; break; } CLUT[cno]=cr|cg<<5|cb<<10|0x8000; setRECT(&r,CLUTX,CLUTY,16,1); LoadImage(&r,(_long *)CLUT); pause(); } // Restore palette if(!(padMask&PADstart)) { for(i=0;i<16;CLUT[i]=oldCLUT[i++]); setRECT(&r,CLUTX,CLUTY,16,1); LoadImage(&r,(_long *)CLUT); cr=CLUT[cno]&0x1f,cg=(CLUT[cno]>>5)&0x1f,cb=(CLUT[cno]>>10)&0x1f; } // Zoom in sprite if(!(padMask&PADl1)) if(sp.scalexONE) sp.scalex=sp.scaley-=ONE,pause(); // Alter brightness of sprite if(!(padMask&PADr1)) sp.r++,sp.g++,sp.b++; if(!(padMask&PADr2)) sp.r--,sp.g--,sp.b--; DrawSync(0); VSync(0); GsSwapDispBuff(); GsSortClear(0x0,0x0,0x0,&mainOT[activeBuff]); GsDrawOt(&mainOT[activeBuff]); FntPrint(fid,"(%2d) Colour %2d : R=%2d G=%2d B=%2d (%s)",sprno,cno,cr,cg,cb,col[rgb]); FntFlush(fid); } ResetGraph(0); return(0); }