示例#1
0
void C_BspNode::DistributePointsAlongPartitionPlane(void)
{
   C_Vertex min , max , tmp;
   min.x = min.y = min.z = GREATEST_FLOAT;
   max.x = max.y = max.z = SMALLEST_FLOAT;

   vector<C_Vertex> intersectionPoints = FindBBoxPlaneIntersections(&bbox , &partitionPlane);

   float maxU , maxV , minU , minV;
   float tmpU , tmpV;
   maxU = maxV = SMALLEST_FLOAT;
   minU = minV = GREATEST_FLOAT;
//	dist = SMALLEST_FLOAT;

   for(USHORT i = 0 ; i < intersectionPoints.size() ; i++) {
      CalculateUV(&partitionPlane , &intersectionPoints[i] , &tmpU , &tmpV);

      if(tmpU > maxU) { maxU = tmpU; }
      if(tmpV > maxV) { maxV = tmpV; }
      if(tmpU < minU) { minU = tmpU; }
      if(tmpV < minV) { minV = tmpV; }
   }

   float stepU = abs(maxU - minU) / NPOINTS_U;
   float stepV = abs(maxV - minV) / NPOINTS_V;

   C_Vector3 P;
   C_Vector3 A(&partitionPlane.points[0]);
   C_Vector3 B(&partitionPlane.points[1]);
   C_Vector3 C(&partitionPlane.points[2]);
   C_Vector3 v0 = C - A;
   C_Vector3 v1 = B - A;

   for(float uu = minU ; uu < maxU ; uu += stepU) {
      for(float vv = minV ; vv < maxV ; vv += stepV) {
         P = A + v0 * uu + v1 * vv;
         tmp.x = P.x; tmp.y = P.y; tmp.z = P.z;
         pointSet.push_back(tmp);
      }
   }
}
示例#2
0
btSoftBody*		btSoftBodyHelpers::CreatePatchUV(btSoftBodyWorldInfo& worldInfo,
												 const btVector3& corner00,
												 const btVector3& corner10,
												 const btVector3& corner01,
												 const btVector3& corner11,
												 int resx,
												 int resy,
												 int fixeds,
												 bool gendiags,
												 float* tex_coords)
{

	/*
	*
	*  corners:
	*
	*  [0][0]     corner00 ------- corner01   [resx][0]
	*                |                |
	*                |                |
	*  [0][resy]  corner10 -------- corner11  [resx][resy]
	*
	*
	*
	*
	*
	*
	*   "fixedgs" map:
	*
	*  corner00     -->   +1
	*  corner01     -->   +2
	*  corner10     -->   +4
	*  corner11     -->   +8
	*  upper middle -->  +16
	*  left middle  -->  +32
	*  right middle -->  +64
	*  lower middle --> +128
	*  center       --> +256
	*
	*
	*   tex_coords size   (resx-1)*(resy-1)*12
	*
	*
	*
	*     SINGLE QUAD INTERNALS
	*
	*  1) btSoftBody's nodes and links,
	*     diagonal link is optional ("gendiags")
	*
	*
	*    node00 ------ node01
	*      | .              
	*      |   .            
	*      |     .          
	*      |       .        
	*      |         .      
	*    node10        node11
	*
	*
	*
	*   2) Faces:
	*      two triangles,
	*      UV Coordinates (hier example for single quad)
	*      
	*     (0,1)          (0,1)  (1,1)
	*     1 |\            3 \-----| 2
	*       | \              \    |
	*       |  \              \   |
	*       |   \              \  |
	*       |    \              \ |
	*     2 |-----\ 3            \| 1
	*     (0,0)    (1,0)       (1,0)
	*
	*
	*
	*
	*
	*
	*/

#define IDX(_x_,_y_)	((_y_)*rx+(_x_))
	/* Create nodes		*/ 
	if((resx<2)||(resy<2)) return(0);
	const int	rx=resx;
	const int	ry=resy;
	const int	tot=rx*ry;
	btVector3*	x=new btVector3[tot];
	btScalar*	m=new btScalar[tot];

	int iy;

	for(iy=0;iy<ry;++iy)
	{
		const btScalar	ty=iy/(btScalar)(ry-1);
		const btVector3	py0=lerp(corner00,corner01,ty);
		const btVector3	py1=lerp(corner10,corner11,ty);
		for(int ix=0;ix<rx;++ix)
		{
			const btScalar	tx=ix/(btScalar)(rx-1);
			x[IDX(ix,iy)]=lerp(py0,py1,tx);
			m[IDX(ix,iy)]=1;
		}
	}
	btSoftBody*	psb=new btSoftBody(&worldInfo,tot,x,m);
	if(fixeds&1)		psb->setMass(IDX(0,0),0);
	if(fixeds&2)		psb->setMass(IDX(rx-1,0),0);
	if(fixeds&4)		psb->setMass(IDX(0,ry-1),0);
	if(fixeds&8)		psb->setMass(IDX(rx-1,ry-1),0);
	if(fixeds&16)		psb->setMass(IDX((rx-1)/2,0),0);
	if(fixeds&32)		psb->setMass(IDX(0,(ry-1)/2),0);
	if(fixeds&64)		psb->setMass(IDX(rx-1,(ry-1)/2),0);
	if(fixeds&128)		psb->setMass(IDX((rx-1)/2,ry-1),0);
	if(fixeds&256)		psb->setMass(IDX((rx-1)/2,(ry-1)/2),0);
	delete[] x;
	delete[] m;


	int z = 0;
	/* Create links	and faces	*/ 
	for(iy=0;iy<ry;++iy)
	{
		for(int ix=0;ix<rx;++ix)
		{
			const bool	mdx=(ix+1)<rx;
			const bool	mdy=(iy+1)<ry;

			int node00=IDX(ix,iy);
			int node01=IDX(ix+1,iy);
			int node10=IDX(ix,iy+1);
			int node11=IDX(ix+1,iy+1);

			if(mdx) psb->appendLink(node00,node01);
			if(mdy) psb->appendLink(node00,node10);
			if(mdx&&mdy)
			{
				psb->appendFace(node00,node10,node11);
				if (tex_coords) {
					tex_coords[z+0]=CalculateUV(resx,resy,ix,iy,0);
					tex_coords[z+1]=CalculateUV(resx,resy,ix,iy,1);
					tex_coords[z+2]=CalculateUV(resx,resy,ix,iy,0);
					tex_coords[z+3]=CalculateUV(resx,resy,ix,iy,2);
					tex_coords[z+4]=CalculateUV(resx,resy,ix,iy,3);
					tex_coords[z+5]=CalculateUV(resx,resy,ix,iy,2);
				}
				psb->appendFace(node11,node01,node00);
				if (tex_coords) {
					tex_coords[z+6 ]=CalculateUV(resx,resy,ix,iy,3);
					tex_coords[z+7 ]=CalculateUV(resx,resy,ix,iy,2);
					tex_coords[z+8 ]=CalculateUV(resx,resy,ix,iy,3);
					tex_coords[z+9 ]=CalculateUV(resx,resy,ix,iy,1);
					tex_coords[z+10]=CalculateUV(resx,resy,ix,iy,0);
					tex_coords[z+11]=CalculateUV(resx,resy,ix,iy,1);
				}
				if (gendiags) psb->appendLink(node00,node11);
				z += 12;
			}
		}
	}
	/* Finished	*/ 
#undef IDX
	return(psb);
}
示例#3
0
void GridScrollTest()
{
	int 			done = 0, speed = 1, acc = 1, x = 0, y = 0, pause = 0, direction = 0;
	int				angle = 0;
	u32			    pressed;		
	ImagePtr		back, backsquares, backdiag;
		
	backdiag = LoadImage(DIAGONALIMG, 1);
	if(!backdiag)
		return;  
	backsquares = LoadImage(CIRCLESGRIDIMG, 1);
	if(!backsquares)
	{
		FreeImage(&backdiag);  
		return;  
	}
		
	backsquares->x = -0.5*dW;
	backsquares->y = -0.5*dH;
	back = backsquares;
	
	while(!done && !EndProgram) 
	{	
		Mtx m;
		
		StartSceneMtx(&m);

		if(speed > 5)
			speed = 5;

		if(speed < 1)
			speed = 1;

		if(!pause)
		{
			if(direction)
				x += speed * acc;
			else
				y += speed * acc;
		}	
				
		CalculateUV(x, y, dW*2, dH*2, back);    
		DrawImageRotate(back, angle, &m);
	
		EndScene();

		ControllerScan();
				
        pressed = Controller_ButtonsDown(0);
		if (pressed & PAD_TRIGGER_R)
		{
			if(angle)
				angle = 0;
			else
			{
				angle = 45;
				back = backsquares;
			}
		}
		
		if (pressed & PAD_TRIGGER_L)
		{
			if(back == backsquares)
			{
				back = backdiag;
				if(angle)
					angle = 0;
			}
			else
				back = backsquares;
		}

		if (pressed & PAD_BUTTON_UP)
			speed ++;

		if (pressed & PAD_BUTTON_DOWN)
			speed --;

		if (pressed & PAD_BUTTON_B)
			done = 1;

		if (pressed & PAD_BUTTON_A)
			pause = !pause;

		if (pressed & PAD_BUTTON_X)
			acc *= -1;

		if (pressed & PAD_BUTTON_Y)
			direction = !direction;
		
		if ( pressed & PAD_BUTTON_START ) 		
		{
			DrawMenu = 1;					
			HelpData = GRIDSCROLL;
		}							
	}
	FreeImage(&backsquares); 
	FreeImage(&backdiag);   
	return;
}
示例#4
0
void ScrollTest()
{
	int 	done = 0, speed = 1, acc = 1, x = 0, y = 0, pause = 0, vertical = 0;
	int		oldvmode = vmode, i = 0, currentsonic = 0, currentframe = 0;
	u32		pressed;		
	ImagePtr	sonicback[4], overlay, kiki;	
	
	sonicback[0] = LoadImage(SONICBACK1IMG, 0);
	if(!sonicback[0])
		return;
	sonicback[1] = LoadImage(SONICBACK2IMG, 0);
	if(!sonicback[1])
		return;
	sonicback[2] = LoadImage(SONICBACK3IMG, 0);
	if(!sonicback[2])
		return;
	sonicback[3] = LoadImage(SONICBACK4IMG, 0);
	if(!sonicback[3])
		return;

	overlay = LoadImage(SONICFLOORIMG, 0);
	if(!overlay)
		return;
		
	kiki = LoadImage(KIKIBACKIMG, 0);
	if(!kiki)
		return;

	for(i = 0; i < 4; i++)
		sonicback[i]->y = (dH - 240)/2;
	overlay->y = (dH - 240)/2;
	
	for(i = 0; i < 4; i++)
		IgnoreOffset(sonicback[i]);
	IgnoreOffset(overlay);
	kiki->x = (dW-256)/2;
	IgnoreOffset(kiki);

	while(!done && !EndProgram) 
	{		
		if(oldvmode != vmode)
		{
			for(i = 0; i < 4; i++)	
				sonicback[i]->y = (dH - 240)/2;
			overlay->y = (dH - 240)/2;
			if(offsetY)  // center in PAL modes
			{
				for(i = 0; i < 4; i++)	
					sonicback[i]->y -= offsetY;
				overlay->y -= offsetY;
			}
			kiki->x = (dW-256)/2;
			oldvmode = vmode;
		}
		
		StartScene();

		if(speed > 15)
			speed = 15;

		if(speed < 1)
			speed = 1;

		if(!pause)
		{
			if(!vertical)
				x += speed * acc;
			else
				y -= speed * acc;
		}

		if(!vertical)
		{
			if(x > overlay->tw)
				x = 1;

			if(x < -1*overlay->tw)
				x = -1;
				
			CalculateUV(x, 0, dW, 240, sonicback[currentsonic]);
			CalculateUV(x*2, 0, dW, 240, overlay);
			DrawImage(sonicback[currentsonic]);
			DrawImage(overlay);
		}
		else
		{
			if(y > kiki->th)
				y = 1;

			if(y < -1*kiki->th)
				y = -1;
				
			CalculateUV(0, y, 256, dH, kiki);
			DrawImage(kiki);
		}
		
		EndScene();

		ControllerScan();

        pressed = Controller_ButtonsDown(0);
		
		if (pressed & PAD_BUTTON_UP)
			speed ++;

		if (pressed & PAD_BUTTON_DOWN)
			speed --;

		if (pressed & PAD_BUTTON_B)
			done = 1;

		if (pressed & PAD_BUTTON_A)
			pause = !pause;

		if (pressed & PAD_BUTTON_X)
			acc *= -1;
			
		if (pressed & PAD_BUTTON_Y)
			vertical = !vertical;

		if ( pressed & PAD_BUTTON_START ) 		
		{
			DrawMenu = 1;					
			HelpData = SCROLL;
		}	

		if(!vertical)
		{
			currentframe ++;
			if(currentframe > 10)
			{
				currentsonic++;
				if(currentsonic > 3)
					currentsonic = 0;
				currentframe = 0;
			}
		}			
	}
	for(i = 0; i < 4; i++)
		FreeImage(&sonicback[i]);
	FreeImage(&overlay);
	FreeImage(&kiki);
}
示例#5
0
void DropShadowTest()
{
	char		msg[50];
	int		    done = 0, x = dW/2, y = dH/2, invert = 0, frame = 0, text = 0, selback = 0, sprite = 0;
	int			oldvmode = vmode, i = 0, currentsonic = 0, currentframe = 0;
	u32		    pressed, held, reload = 0;		
	ImagePtr	back[4], sonicback[4], ssprite, shadow, buzz, buzzshadow, overlay;	

	sonicback[0] = LoadImage(SONICBACK1IMG, 0);
	if(!sonicback[0])
		return;
	sonicback[1] = LoadImage(SONICBACK2IMG, 0);
	if(!sonicback[1])
		return;
	sonicback[2] = LoadImage(SONICBACK3IMG, 0);
	if(!sonicback[2])
		return;
	sonicback[3] = LoadImage(SONICBACK4IMG, 0);
	if(!sonicback[3])
		return;

	for(i = 0; i < 4; i++)
		back[i] = NULL;
		
	back[1] = sonicback[0];
	if(!back[1])
		return;
	
	overlay = LoadImage(SONICFLOORIMG, 0);
	if(!overlay)
		return;
	
	reload = 1;
		
	ssprite = LoadImage(SHADOWIMG, 0);	
	if(!ssprite)
		return;
	buzz = LoadImage(BUZZBOMBERIMG, 0);
	if(!buzz)
		return;
	buzzshadow = LoadImage(BUZZBOMBERSHADOWIMG, 0);
	if(!buzzshadow)
		return;
	
	srand((int)(time(0)));
	sprite = rand() % 2;
	if(sprite == 0)
		shadow = ssprite;
	else
		shadow = buzzshadow;
	
	while(!done && !EndProgram) 
	{
		if(reload || oldvmode != vmode)
		{
			FreeImage(&back[0]);
			FreeImage(&back[2]);
			FreeImage(&back[3]);

			back[2] = LoadImage(CHECKPOSIMG, 1);
			if(!back[2])
				return;
			back[3] = LoadImage(STRIPESPOSIMG, 1);
			if(!back[3])
				return;
			
			if(vmode != VIDEO_480P && vmode != VIDEO_480I &&
				vmode != VIDEO_576I)
			{		
				back[0] = LoadImage(MOTOKOIMG, 0);
				if(!back[0])
					return;
				
				for(i = 0; i < 4; i++)
					sonicback[i]->scale = 1;
				back[0]->scale = 1;
				overlay->scale = 1;
				
				for(i = 0; i < 4; i++)
					sonicback[i]->y = 0;
				overlay->y = 0;
			}
			else
			{	
				back[0] = LoadImage(MOTOKO480IMG, 0);
				if(!back[0])
					return;
				
				back[0]->scale = 0;
				overlay->scale = 0;
				for(i = 0; i < 4; i++)
				{
					sonicback[i]->scale = 0;
					sonicback[i]->y = (dH - 240)/2;
				}

				overlay->y = (dH - 240)/2;
				if(offsetY)  // center in PAL modes
				{
					for(i = 0; i < 4; i++)
						sonicback[i]->y -= offsetY;
					overlay->y -= offsetY;
				}
			}
			reload = 0;
			oldvmode = vmode;
		}
		
		if(selback == 1)
		{
			CalculateUV(x, 0, dW, 240, back[selback]);
			CalculateUV(x*2, 0, dW, 240, overlay);
		}	
		
		StartScene();
		DrawImage(back[selback]);
		if(selback == 1)
			DrawImage(overlay);

		if(text)
		{
			if(vmode != VIDEO_480P)
				DrawStringB(140, 30, 0, 0xff, 0, msg);
			else
				DrawStringB(450, 40, 0, 0xff, 0, msg);
			text --;
		}

		if(frame == invert)
		{
			shadow->x = x;
			shadow->y = y;
			DrawImage(shadow);
			frame = !frame;
		}
		else
			frame = !frame;
				
		if(sprite == 1)
		{
			buzz->x = x - 20;
			buzz->y = y - 20;
			DrawImage(buzz);
		} 			
		EndScene();
		
		ControllerScan();
		
		held = Controller_ButtonsHeld(0);		
				
		if (held & PAD_BUTTON_UP)
			y --;
	
		if (held & PAD_BUTTON_DOWN)
			y ++;
	
		if (held & PAD_BUTTON_LEFT)
		{
			x --;
			FlipH(buzz, 0);
			FlipH(buzzshadow, 0);
		}
	
		if (held & PAD_BUTTON_RIGHT)
		{
			x ++;
			FlipH(buzz, 1);
			FlipH(buzzshadow, 1);
		}
		
        pressed = Controller_ButtonsDown(0);
		if (pressed & PAD_BUTTON_B)
			done =	1;

		if (pressed & PAD_BUTTON_X)
		{
			invert = !invert;
			if(invert)
				sprintf(msg, "Shadow on odd frames");				
			else
				sprintf(msg, "Shadow on even frames");
			text = 60;
		}
			
		if (pressed & PAD_BUTTON_A)
		{
			if(selback < 3)
				selback ++;
			else
				selback = 0;
		}
	
		if (pressed & PAD_BUTTON_Y)
		{
			if(sprite == 0)
			{
				shadow = buzzshadow;
				sprite = 1;
			}
			else
			{
				shadow = ssprite;
				sprite = 0;
			}
		}

		if ( pressed & PAD_BUTTON_START ) 		
		{
			DrawMenu = 1;					
			HelpData = DROPSHADOW;
		}	

		if(x < back[selback]->x)
			x = back[selback]->x;
		if(y < back[selback]->y)
			y = back[selback]->y;
		if(x > back[selback]->w + back[selback]->x - shadow->w)
			x = back[selback]->w + back[selback]->x - shadow->w;
		if(y > back[selback]->h + back[selback]->y - shadow->h)
			y = back[selback]->h + back[selback]->y - shadow->h;

		currentframe ++;
		if(currentframe > 10)
		{
			currentsonic++;
			if(currentsonic > 3)
				currentsonic = 0;
			currentframe = 0;
			back[1] = sonicback[currentsonic];
		}
	}
	FreeImage(&back[0]);
	for(i = 0; i < 4; i++)
		FreeImage(&sonicback[i]);
	FreeImage(&back[2]);
	FreeImage(&back[3]);
	FreeImage(&overlay);
	FreeImage(&ssprite);
	FreeImage(&buzz);
	FreeImage(&buzzshadow);
}
示例#6
0
void StripedSpriteTest()
{	
	int		    done = 0, x = dW/2, y = dH/2, selback = 0;
	int			oldvmode = vmode, currentsonic = 0, currentframe = 0, i;
	u32		    pressed, held, reload = 0;	
	ImagePtr	back[4], sonicback[4], striped, overlay;	

	sonicback[0] = LoadImage(SONICBACK1IMG, 0);
	if(!sonicback[0])
		return;
	sonicback[1] = LoadImage(SONICBACK2IMG, 0);
	if(!sonicback[1])
		return;
	sonicback[2] = LoadImage(SONICBACK3IMG, 0);
	if(!sonicback[2])
		return;
	sonicback[3] = LoadImage(SONICBACK4IMG, 0);
	if(!sonicback[3])
		return;
	
	for(i = 0; i < 4; i++)
		back[i] = NULL;
		
	back[1] = sonicback[0];
	if(!back[1])
		return;
	
	overlay = LoadImage(SONICFLOORIMG, 0);
	if(!overlay)
		return;
	
	reload = 1;
	striped = LoadImage(STRIPEDIMG, 0);
	if(!striped)
		return;
			
	while(!done && !EndProgram) 
	{	
		if(reload || oldvmode != vmode)
		{
			FreeImage(&back[0]);
			FreeImage(&back[2]);
			FreeImage(&back[3]);
				
			back[2] = LoadImage(CHECKPOSIMG, 1);
			if(!back[2])
				return;
			back[3] = LoadImage(STRIPESPOSIMG, 1);
			if(!back[3])
				return;
				
			if(vmode != VIDEO_480P && vmode != VIDEO_480I && 
				vmode != VIDEO_576I)
			{	
				back[0] = LoadImage(MOTOKOIMG, 0);
				if(!back[0])
					return;
					
				for(i = 0; i < 4; i++)
					sonicback[i]->scale = 1;
				back[0]->scale = 1;
				overlay->scale = 1;
				
				for(i = 0; i < 4; i++)
					sonicback[i]->y = 0;
				overlay->y = 0;
			}
			else
			{	
				back[0] = LoadImage(MOTOKO480IMG, 0);
				if(!back[0])
					return;
	
				back[0]->scale = 0;
				overlay->scale = 0;
				for(i = 0; i < 4; i++)
				{
					sonicback[i]->scale = 0;
					sonicback[i]->y = (dH - 240)/2;
				}

				overlay->y = (dH - 240)/2;
				if(offsetY)  // center in PAL modes
				{
					for(i = 0; i < 4; i++)
						sonicback[i]->y -= offsetY;
					overlay->y -= offsetY;
				}
			}
			reload = 0;
			oldvmode = vmode;
		}
	
		StartScene();
		if(selback == 1)
		{
			CalculateUV(x, 0, dW, 240, back[selback]);
			CalculateUV(x*2, 0, dW, 240, overlay);
		}
		DrawImage(back[selback]);
		if(selback == 1)
			DrawImage(overlay);

		striped->x = x;
		striped->y = y;
		DrawImage(striped);

		EndScene();
		
		ControllerScan();
		
		held = Controller_ButtonsHeld(0);		

		if (held & PAD_BUTTON_UP)
			y --;
	
		if (held & PAD_BUTTON_DOWN)
			y ++;

		if (held & PAD_BUTTON_LEFT)
			x --;

		if (held & PAD_BUTTON_RIGHT)
			x ++;
			

		pressed = Controller_ButtonsDown(0);
		if (pressed & PAD_BUTTON_B)
			done =	1;
					
		if (pressed & PAD_BUTTON_A)
		{
			if(selback > 0)
				selback --;
			else
				selback = 3;
		}
		
		if ( pressed & PAD_BUTTON_START ) 		
		{
			DrawMenu = 1;					
			HelpData = STRIPED;
		}			

		if(x < back[selback]->x)
			x = back[selback]->x;
		if(y < back[selback]->y)
			y = back[selback]->y;
		if(x > back[selback]->w + back[selback]->x - striped->w)
			x = back[selback]->w + back[selback]->x - striped->w;
		if(y > back[selback]->h + back[selback]->y - striped->h)
			y = back[selback]->h + back[selback]->y - striped->h;
			
		currentframe ++;
		if(currentframe > 10)
		{
			currentsonic++;
			if(currentsonic > 3)
				currentsonic = 0;
			currentframe = 0;
			back[1] = sonicback[currentsonic];
		}
	}
	FreeImage(&back[0]);
	for(i = 0; i < 4; i++)
		FreeImage(&sonicback[i]);
	FreeImage(&back[2]);
	FreeImage(&back[3]);
	FreeImage(&overlay);
	FreeImage(&striped);
}
示例#7
0
void Alternate240p480i()
{
	int 		frames = 0, seconds = 0, minutes = 0, hours = 0, done =  0, current = 0, res = 0, status = 0;
	timecode	times[20];
	u32		    pressed, oldvmode = vmode;		
	char 		buffer[20];
	ImagePtr	back;
	
	if(IsPAL)
	{
		if(vmode != VIDEO_288P)
		{			
			SetVideoMode(VIDEO_288P);				
			SetupGX();
		}

	}
	else
	{
		if(vmode != VIDEO_240P)
		{		
			SetVideoMode(VIDEO_240P);				
			SetupGX();
		}
	}
	
	back = LoadImage(WHITEIMG, 1);
	if(!back)
		return;
		
	back->r = 0x00;
	back->g = 0x00;
	back->b = 0x00;
	CalculateUV(0, 0, dW, dH, back);

	ChangeVideoEnabled = 0;
	
	while(!done && !EndProgram) 
	{
		frames ++;

		if(IsPAL)
		{
			if(frames > 49)
			{
				frames = 0;
				seconds ++;
			}
		}
		else
		{
			if(frames > 59)
			{
				frames = 0;
				seconds ++;
			}
		}

		if(seconds > 59)
		{
			seconds = 0;
			minutes ++;
		}

		if(minutes > 59)
		{
			minutes = 0;
			hours ++;
		}

		if(hours > 99)
			hours = 0;

		StartScene();

		DrawImage(back);
		DrawString(32, 8, 0, 0xff, 0, "Current Resolution:");
		DrawString(140, 8, 0, 0xff, 0, res == 0 ? (IsPAL ? "288p" : "240p") : (IsPAL ? "576i" : "480i"));

		sprintf(buffer, "%02d:%02d:%02d:%02d", hours, minutes, seconds, frames);
		DrawString(32, 32, 0xff, 0xff, 0xff, "Elapsed Timer:");
		DrawString(140, 32, 0xff, 0xff, 0xff, buffer);

		if(current)
		{
			int i = 0;
			for(i = 0; i < current; i++)
			{
				if(times[i].type == 0)
				{
					DrawString(32,      40+i*8, 0xff, 0xff, 0.0, "Switched to");
					DrawString(32+12*5, 40+i*8, 0xff, 0xff, 0.0, 
							times[i].res == 0 ? (IsPAL ? "288p" : "240p") : (IsPAL ? "576i" : "480i"));
					DrawString(32+16*5, 40+i*8, 0xff, 0xff, 0.0, " at:");
				}
				else
					DrawString(32, 40+i*8, 0.0, 0xff, 0.0, "Viewed at:");
				sprintf(buffer, "%02d:%02d:%02d:%02d", times[i].hours, times[i].minutes, times[i].seconds, times[i].frames);
				DrawString(140, 40+i*8, 0xff, 0xff, 0xff, buffer);
				if(times[i].type != 0 && i >= 1 && i <= 19)
				{
					u16 		framesA = 0, framesB = 0, res = 0;
					timecode 	len;

					framesB = ConvertToFrames(&times[i]);
					framesA = ConvertToFrames(&times[i - 1]);
					res = framesB - framesA;
					ConvertFromFrames(&len, res);
					sprintf(buffer, "%02d:%02d:%02d:%02d", len.hours, len.minutes, len.seconds, len.frames);
					DrawString(200, 40+i*8, 0xff, 0.0, 0.0, buffer);
				}
			}
		}

		EndScene();


		ControllerScan();
        pressed = Controller_ButtonsDown(0);
					
		if ( pressed & PAD_BUTTON_START ) 		
		{			
			DrawMenu = 1;		
			HelpData = ALTERNATE;
		}													

		if (pressed & PAD_BUTTON_B)
			done =	1;				
					
		if (pressed & PAD_BUTTON_A)
		{
			if(current <= 19)
				current ++;
			else
				current = 1;

			times[current - 1].frames = frames;
			times[current - 1].minutes = minutes;
			times[current - 1].seconds = seconds;
			times[current - 1].hours = hours;

			status ++;
			if(status == 1)
			{
				times[current - 1].type = 0;
				res = !res;
				times[current - 1].res = res;	
				if(!res)
					SetVideoMode(IsPAL ? VIDEO_288P : VIDEO_240P);
				else
					SetVideoMode(IsPAL ? VIDEO_576I_A264 : VIDEO_480I_A240);
				CalculateUV(0, 0, dW, dH, back);
				SetupGX();
			}
			if(status == 2)
			{
				times[current - 1].type = 1;
				times[current - 1].res = res;
				status = 0;
			}
		}
	}	
	
	ChangeVideoEnabled = 1;
	
	SetVideoMode(oldvmode);				
	SetupGX();
	FreeImage(&back);
}