void CubeRenderer::render(const Matrix4& matrix)
{
	//ZENIC_ASSERT_DESC(m_started, "Begin hasent been called");

	m_dmaChain.addSrcCntTag(VIF_STCYCL(1, 1), VIF_UNPACKR(zenic::ps2::vif::V4_32, 4, 0));

	const float* matrixData = matrix.matrix();

	for (uint i = 0; i < 16 ; ++i)
		m_dmaChain.addFloat(*matrixData++);

	m_dmaChain.endPacket();

	// ..

	m_dmaChain.addSrcCntTag(VIF_STCYCL(1, 1), VIF_UNPACKR(zenic::ps2::vif::V4_32, 1, 4));

	m_dmaChain.add64(GIFTAG(12, 1, 1, GS_PRIM(gs::Triangle, gs::Flat, 0, 0, 0, 0, 0, 
											 gs::Context1, 0), gif::Packed, 4));
	m_dmaChain.add64(0x5551);

	m_dmaChain.add32(VIF_NOP());
	m_dmaChain.add32(VIF_NOP());
	m_dmaChain.add32(VIF_FLUSH());
	m_dmaChain.add32(VIF_MSCNT());

	m_dmaChain.endPacket();
}
void CubeRenderer::beginShadow()
{
	ZENIC_ASSERT(m_shadowModel);

	if (!m_shadowModel)
		return;

	//m_renderer.beginRenderModels();

	// Override the default gifchain with alpha enabled.

	m_dmaChain.addSrcCntTag(VIF_STCYCL(1, 1), VIF_UNPACK(zenic::ps2::vif::V4_32, 1, 20));

	m_dmaChain.add64(GIFTAG(0, 0, 1, GS_PRIM(gs::Tristrip, gs::Gouraud, gs::Texturing, 0, gs::Blend, 0, gs::Stq, 
										   gs::Context1, 0), gif::Packed, 3));
	m_dmaChain.add64(0x512);

	m_dmaChain.endPacket();

	// Set alpha

	m_dmaChain.addSrcCntTag(0, VIF_DIRECT(2));
	m_dmaChain.add128(GIFTAG(1, gif::Eop, 0, 0, gif::Packed, 1),gif::A_D);
	m_dmaChain.add128(GS_ALPHA(1, 0, 2, 2, 0x80),GS_REG(ALPHA_1));
	m_dmaChain.endPacket();

}
Exemple #3
0
/*
=============================
Textured Quad Render Function
=============================
*/
void PS2TexQuad::Render( void ) const {
	VIFDynamicDMA.StartDirect();
	/* Add the GIFTag */
	VIFDynamicDMA.Add128( GS_GIFTAG_BATCH(	mNumOfVerts,				    // NLOOP
											1,							    // EOP
											1,							    // PRE
											GS_PRIM( PRIM_TRI_STRIP, 	    // PRIM
												PRIM_IIP_FLAT, 
												PRIM_TME_ON,
												PRIM_FGE_OFF, 
												PRIM_ABE_ON, 
												PRIM_AA1_OFF, 
												PRIM_FST_UV, 
												PRIM_CTXT_CONTEXT1, 
												PRIM_FIX_NOFIXDDA ),
											GIF_FLG_PACKED,				    // FLG
											GS_BATCH_3(	GIF_REG_RGBAQ,
														GIF_REG_UV, 
														GIF_REG_XYZ2 ) ) ); // BATCH	
	for( int i = 0; i < mNumOfVerts; i++ ) {
		/* Add the colour */
		VIFDynamicDMA.Add128( PACKED_RGBA( pVertColours[ i ].mR, pVertColours[ i ].mG, pVertColours[ i ].mB, pVertColours[ i ].mA ) );
		/* Add UV texture coordinates */ 
		VIFDynamicDMA.Add128( PACKED_UV( ( ( ( int )pTexVerts[ i ].x ) << 4 ), ( ( ( int )pTexVerts[ i ] .y ) << 4 ) ) );
		/* Add the position */  
		VIFDynamicDMA.Add128( PACKED_XYZ2( ( int )( ( 2048.0f + mX + pVerts[ i ].x ) * 16.0f ), 
										   ( int )( ( 2048.0f + mY + pVerts[ i ].y ) * 16.0f ),  
										   ( int )mZ, 
										   0 ) );
	}
	VIFDynamicDMA.EndDirect();
}
Exemple #4
0
/*
==============
Render Polygon
==============
*/ 
void PS2Polygon::Render( void ) const {
	VIFDynamicDMA.StartDirect();
	/* Add the GIFTag */
	VIFDynamicDMA.Add128( GS_GIFTAG_BATCH(	mNumOfVerts,				    // NLOOP 
											1,							    // EOP
											1,							    // PRE
											GS_PRIM( PRIM_TRI_FAN, 	        // PRIM (TRIANGLE FAN)
												PRIM_IIP_GOURAUD,           // GOURAUD SHADING
												PRIM_TME_OFF,
												PRIM_FGE_OFF, 
												PRIM_ABE_OFF, 
												PRIM_AA1_OFF,               
												PRIM_FST_UV, 
												PRIM_CTXT_CONTEXT1, 
												PRIM_FIX_NOFIXDDA ),
											GIF_FLG_PACKED,				    // FLG
											GS_BATCH_2(	GIF_REG_RGBAQ, 
														GIF_REG_XYZ2 ) ) ); // BATCH	
	for( int i = 0; i < mNumOfVerts; i++ ) {
		/* Add the colour */ 
		VIFDynamicDMA.Add128( PACKED_RGBA( pVertColours[ i ].mR, pVertColours[ i ].mG, pVertColours[ i ].mB, pVertColours[ i ].mA ) );			
		/* Add the position */
		VIFDynamicDMA.Add128( PACKED_XYZ2( ( int )( ( 2048.0f + mX + pVerts[ i ].x ) * 16.0f ), 
										   ( int )( ( 2048.0f + mY + pVerts[ i ].y ) * 16.0f ),  
										   ( int )mZ, 
										   0 ) );
	}
	VIFDynamicDMA.EndDirect();
}
Exemple #5
0
//---------------------------------------------------------------------------
void g2_fill_rect(s16 x0, s16 y0, s16 x1, s16 y1)
{
	x0 += gs_origin_x;
	y0 += gs_origin_y;
	x1 += gs_origin_x;
	y1 += gs_origin_y;

	BEGIN_GS_PACKET(gs_dma_buf);
	GIF_TAG_AD(gs_dma_buf, 4, 1, 0, 0, 0);

	GIF_DATA_AD(gs_dma_buf, prim,
		GS_PRIM(PRIM_SPRITE, 0, 0, 0, 0, 0, 0, 0, 0));

	GIF_DATA_AD(gs_dma_buf, rgbaq,
		GS_RGBAQ(g2_fill_r, g2_fill_g, g2_fill_b, 0x80, 0));

	GIF_DATA_AD(gs_dma_buf, xyz2, GS_XYZ2(x0<<4, y0<<4, 0));

	// It looks like the default operation for the SPRITE primitive is to
	// not draw the right and bottom 'lines' of the rectangle refined by
	// the parameters. Add +1 to change this.
	GIF_DATA_AD(gs_dma_buf, xyz2, GS_XYZ2((x1+1)<<4, (y1+1)<<4, 0));

	SEND_GS_PACKET(gs_dma_buf);
}
Exemple #6
0
bool Image2D::Render()
{
	Debug ("Image2D::Render called.");
	
	if (!m_active) return true;
	
	// Place texture in buffer (as needed)
	AssetManager::GetSingleton().LoadTexture(m_texture);
	
	// Render the "model" in the correct location
	
	// Determine where to render the image
	int left		= m_x - m_width/2;
	int right		= m_x + m_width/2;
	int top			= m_y - m_height/2;
	int bottom		= m_y + m_height/2;

	// Start DIRECT mode transfer
	VIFDynamicDMA.StartDirect();
									
	// Add the GIFTag
	VIFDynamicDMA.Add128(GS_GIFTAG_BATCH(	1,							// NLOOP
											1,							// EOP
											1,							// PRE
											GS_PRIM(PRIM_SPRITE, 		//PRIM
													PRIM_IIP_FLAT, 
													PRIM_TME_ON,
													PRIM_FGE_OFF, 
													PRIM_ABE_ON, 
													PRIM_AA1_OFF, 
													PRIM_FST_UV, 
													PRIM_CTXT_CONTEXT1, 
													PRIM_FIX_NOFIXDDA),					
											GIF_FLG_PACKED,				//FLG
											GS_BATCH_5(	GIF_REG_RGBAQ, 	//BATCH
														GIF_REG_UV, 
														GIF_REG_XYZ2, 
														GIF_REG_UV, 
														GIF_REG_XYZ2)));				
	// Add Vertex data
	VIFDynamicDMA.Add128(PACKED_RGBA(m_r, m_g, m_b, m_a));
	VIFDynamicDMA.Add128(PACKED_UV(0<<4, 0<<4));
	VIFDynamicDMA.Add128(PACKED_XYZ2(	(left + 2048)<< 4, 
										(top + 2048)<< 4, 
										m_depth, 
										0));						
	VIFDynamicDMA.Add128(PACKED_UV((255<<4), (255<<4)));	
	VIFDynamicDMA.Add128(PACKED_XYZ2(	(right + 2048)<< 4, 
										(bottom + 2048)<< 4, 
										m_depth, 
										0));
			
	
	// End the direct mode
	VIFDynamicDMA.EndDirect();
	
	return true;
}
Exemple #7
0
//---------------------------------------------------------------------------
void g2_put_image(s16 x, s16 y, s16 w, s16 h, u32 *data)
{
	x += gs_origin_x;
	y += gs_origin_y;

	// - Call this to copy the texture data from EE memory to GS memory.
	// - The g2_texbuf_addr variable holds the byte address of the
	//   'texture buffer' and is setup in g2_init() to be just after
	//   the frame buffer(s). When only the standard resolutions are
	//   used this buffer is guaranteed to be correctly aligned on 256
	//   bytes.
	gs_load_texture(0, 0, w, h, (u32)data, g2_texbuf_addr, g2_max_x+1);

	BEGIN_GS_PACKET(gs_dma_buf);
	GIF_TAG_AD(gs_dma_buf, 6, 1, 0, 0, 0);

	// Setup the Texture Buffer register. Note the width and height! They
	// must both be a power of 2.
	GIF_DATA_AD(gs_dma_buf, tex0_1,
		GS_TEX0(
			g2_texbuf_addr/256,	// base pointer
			(g2_max_x+1)/64,	// width
			0,					// 32bit RGBA
			gs_texture_wh(w),	// width
			gs_texture_wh(h),	// height
			1,					// RGBA
			TEX_DECAL,			// just overwrite existing pixels
			0,0,0,0,0));

	GIF_DATA_AD(gs_dma_buf, prim,
		GS_PRIM(PRIM_SPRITE,
			0,			// flat shading
			1, 			// texture mapping ON
			0, 0, 0,	// no fog, alpha, or antialiasing
			1, 			// use UV register for coordinates.
			0,
			0));

	// Texture and vertex coordinates are specified consistently, with
	// the last four bits being the decimal part (always X.0 here).

	// Top/Left, texture coordinates (0, 0).
	GIF_DATA_AD(gs_dma_buf, uv,    GS_UV(0, 0));
	GIF_DATA_AD(gs_dma_buf, xyz2,  GS_XYZ2(x<<4, y<<4, 0));

	// Bottom/Right, texture coordinates (w, h).
	GIF_DATA_AD(gs_dma_buf, uv,    GS_UV(w<<4, h<<4));
	GIF_DATA_AD(gs_dma_buf, xyz2,  GS_XYZ2((x+w)<<4, (y+h)<<4, 0));

	// Finally send the command buffer to the GIF.
	SEND_GS_PACKET(gs_dma_buf);
}
Exemple #8
0
s32 Branch::beginRender(Dma& dmaChain)
{
	s32 start = 0;
#ifndef PS2_EMU
	Vu1::instance()->clearCache();
	start = Vu1::instance()->getProgram(dmaChain, ps2::Vu1::BranchRenderer, 
										&Render_Branch_CodeStart, 
										&Render_Branch_CodeEnd);
#endif
	dmaChain.addSrcCntTag();

	dmaChain.add32(0);
	dmaChain.add32(0);

	dmaChain.add32(VIF_STCYCL(1, 1));
	dmaChain.add32(VIF_UNPACK(vif::V4_32, 2,  22));

	dmaChain.add64(GIFTAG(0, 0, gif::Pre, GS_PRIM(gs::Tristrip, gs::Gouraud, 0, 0, 0, 0, gs::Stq, gs::Context1, 0), 
						  gif::Packed, 1));
	dmaChain.add64(0x5);

	dmaChain.add64(GIFTAG(0, 0, gif::Pre, GS_PRIM(gs::Tristrip, gs::Gouraud, 0, 0, 0, 0, gs::Stq, gs::Context1, 0), 
						  gif::Packed, 1));
	dmaChain.add64(0x5);

	dmaChain.add32(VIF_BASE(24));
	dmaChain.add32(VIF_OFFSET(524));
	dmaChain.add32(0);
	dmaChain.add32(VIF_DIRECT(2));
	dmaChain.add128(GIFTAG(1, gif::Eop, 0, 0, gif::Packed, 1), gif::A_D);
	dmaChain.add128(GS_RGBAQ(0, 0, 0, 0, 0.0f), GS_REG(RGBAQ));

	dmaChain.endPacket();

	return start;
}
Exemple #9
0
//---------------------------------------------------------------------------
void g2_set_font_color(u8 red, u8 green, u8 blue)
{
u64 x0;
u64 y0;
u64 x1;
u64 y1;

	x0 = gs_origin_x-10;
	y0 = gs_origin_y-10;
	x1 = g2_fontbuf_w + gs_origin_x;
	y1 = g2_fontbuf_h + gs_origin_y;

	BEGIN_GS_PACKET(gs_dma_buf);
	GIF_TAG_AD(gs_dma_buf, 6, 1, 0, 0, 0);

	// Restore the frame buffer to the current active frame buffer.
	GIF_DATA_AD(gs_dma_buf, frame_1,
		GS_FRAME(
			g2_fontbuf_addr/8192,
			cur_mode->width/64,
			cur_mode->psm,
			0));

	// Draw the colored rectangle over the entire Font Bitmap.
	GIF_DATA_AD(gs_dma_buf, prim,
		GS_PRIM(PRIM_LINE, 0, 0, 0, 0, 0, 0, 0, 0));
//		GS_PRIM(PRIM_SPRITE, 0, 0, 0, 0, 0, 0, 0, 0));

	GIF_DATA_AD(gs_dma_buf, rgbaq,
		GS_RGBAQ(red, green, blue, 0x80, 0));

	GIF_DATA_AD(gs_dma_buf, xyz2, GS_XYZ2(x0<<4, y0<<4, 0));
	GIF_DATA_AD(gs_dma_buf, xyz2, GS_XYZ2(x1<<4, y1<<4, 0));

	// Restore the frame buffer to the current active frame buffer.
	GIF_DATA_AD(gs_dma_buf, frame_1,
		GS_FRAME(
			g2_frame_addr[g2_active_frame]/8192,
			cur_mode->width/64,
			cur_mode->psm,
			0));

	SEND_GS_PACKET(gs_dma_buf);
}
Exemple #10
0
//---------------------------------------------------------------------------
void g2_line(s16 x0, s16 y0, s16 x1, s16 y1)
{
	x0 += gs_origin_x;
	y0 += gs_origin_y;
	x1 += gs_origin_x;
	y1 += gs_origin_y;

	BEGIN_GS_PACKET(gs_dma_buf);
	GIF_TAG_AD(gs_dma_buf, 4, 1, 0, 0, 0);

	GIF_DATA_AD(gs_dma_buf, prim,
		GS_PRIM(PRIM_LINE, 0, 0, 0, 0, 0, 0, 0, 0));

	GIF_DATA_AD(gs_dma_buf, rgbaq,
		GS_RGBAQ(g2_col_r, g2_col_g, g2_col_b, 0x80, 0));

	GIF_DATA_AD(gs_dma_buf, xyz2, GS_XYZ2(x0<<4, y0<<4, 0));
	GIF_DATA_AD(gs_dma_buf, xyz2, GS_XYZ2(x1<<4, y1<<4, 0));

	SEND_GS_PACKET(gs_dma_buf);
}
Exemple #11
0
//---------------------------------------------------------------------------
void g2_put_pixel(s16 x, s16 y)
{
	x += gs_origin_x;
	y += gs_origin_y;

	BEGIN_GS_PACKET(gs_dma_buf);
	GIF_TAG_AD(gs_dma_buf, 4, 1, 0, 0, 0);

	GIF_DATA_AD(gs_dma_buf, prim,
		GS_PRIM(PRIM_POINT, 0, 0, 0, 0, 0, 0, 0, 0));

	GIF_DATA_AD(gs_dma_buf, rgbaq,
		GS_RGBAQ(g2_col_r, g2_col_g, g2_col_b, 0x80, 0));

	// The XYZ coordinates are actually floating point numbers between
	// 0 and 4096 represented as unsigned integers where the lowest order
	// four bits are the fractional point. That's why all coordinates are
	// shifted left 4 bits.
	GIF_DATA_AD(gs_dma_buf, xyz2, GS_XYZ2(x<<4, y<<4, 0));

	SEND_GS_PACKET(gs_dma_buf);
}
Exemple #12
0
//---------------------------------------------------------------------------
void g2_out_text(s16 x, s16 y, char *str)
{
char	c;				// current character
u16	*tc;			// current texture coordinates [4]
u16	x0, y0, x1, y1;	// rectangle for current character
u16	w, h;			// width and height of above rectangle

	x += gs_origin_x;
	y += gs_origin_y;

	c = *str;
	while(c)
	{
		// Read the texture coordinates for current character
		tc = &g2_font_tc[c*4];
		x0 = *tc++;
		y0 = *tc++;
		x1 = *tc++;
		y1 = *tc++;
		w  = x1-x0+1;
		h  = y1-y0+1;

		// Draw a sprite with current character mapped onto it
		BEGIN_GS_PACKET(gs_dma_buf);
		GIF_TAG_AD(gs_dma_buf, 6, 1, 0, 0, 0);

		GIF_DATA_AD(gs_dma_buf, tex0_1,
			GS_TEX0(
				g2_fontbuf_addr/256,		// base pointer
				(g2_fontbuf_w)/64,			// width
				0,							// 32bit RGBA
				gs_texture_wh(g2_fontbuf_w),// width
				gs_texture_wh(g2_fontbuf_w),// height
				1,							// RGBA
				TEX_DECAL,					// just overwrite existing pixels
				0,0,0,0,0));
/*
		GIF_DATA_AD(gs_dma_buf, tex1_1,
			GS_TEX1(
				0, 0,
				FILTER_LINEAR,
				FILTER_LINEAR,
				0, 0, 0));

		GIF_DATA_AD(gs_dma_buf, clamp_1, 0x05);
*/
		GIF_DATA_AD(gs_dma_buf, prim,
			GS_PRIM(PRIM_SPRITE,
				0,			// flat shading
				1, 			// texture mapping ON
				0, 1, 0,	// no fog or antialiasing, but use alpha
				1, 			// use UV register for coordinates.
				0,
				0));

		GIF_DATA_AD(gs_dma_buf, uv,    GS_UV(x0<<4, y0<<4));
		GIF_DATA_AD(gs_dma_buf, xyz2,  GS_XYZ2(x<<4, y<<4, 0));
		GIF_DATA_AD(gs_dma_buf, uv,    GS_UV((x1+1)<<4, (y1+1)<<4));
		GIF_DATA_AD(gs_dma_buf, xyz2,  GS_XYZ2(
				(x+w*g2_font_mag)<<4, (y+h*g2_font_mag)<<4, 0));

		SEND_GS_PACKET(gs_dma_buf);

		// Advance drawing position
		x += (w + g2_font_spacing) * g2_font_mag;

		// Get next character
		str++;
		c = *str;
	}
}
Exemple #13
0
// Load the cube data into static DMA memory
void Cube::LoadCubeData(void)
{
	// Check if data already loaded - return if it is.
	// We only need the cube data loaded once.
	if(Cube::iStaticAddr)return;
	
	const int iDraw = 0;
	const int iDontDraw = 1;
		
	const float fDraw = *((float *)&iDraw);
	const float fDontDraw = *((float *)&iDontDraw);
		
	printf("Loading Cube Data\n");
	
	// Get the address of static data that we can call to later.
	Cube::iStaticAddr = VIFStaticDMA.GetPointer();
	
	VIFStaticDMA.Add32(FLUSH);			// Make sure VU1 isn't busy
	VIFStaticDMA.Add32(STCYCL(1,1));	// Unpack linearly, i.e. don't skip any spaces
	VIFStaticDMA.Add32(BASE(32));		// The double buffers start at VU1 address 32 (giving us 32 QW to store data that won't change)
	VIFStaticDMA.Add32(OFFSET(496));	// The size of each buffer.


	// The first face draws two triangle
	// Next faces draw four triangles
	// Five triangles needed for last face
	// Some triangles are "zero" area and will be culled by GS
	int iTriangles = 12;
	int iVerts = iTriangles * 3;
	
	// We want to unpack 3 quad words of misc data, and then 3QW per vertex starting at
	// VU mem location 32 (we will upload the matrices to the first 16QW per frame).
	VIFStaticDMA.AddUnpack(V4_32, 0, 2 + iVerts * 3, 1);
	
	// VU32 iVerts is in position "x" LSWord of the qword
	VIFStaticDMA.Add128(iVerts*3);
	
	// Add the GIFTag VU33
	VIFStaticDMA.Add128(GS_GIFTAG_BATCH(	iVerts,						// NLOOP
	 										1,							// EOP
	 										1,							// PRE
	 										GS_PRIM(PRIM_TRI,		 	// PRIM
													PRIM_IIP_GOURAUD, 
													PRIM_TME_ON,
													PRIM_FGE_OFF, 
													PRIM_ABE_ON, 
													PRIM_AA1_OFF, 
													PRIM_FST_STQ, 
													PRIM_CTXT_CONTEXT1, 
													PRIM_FIX_NOFIXDDA),					
	 										GIF_FLG_PACKED,				// FLG
	 										GS_BATCH_3(	GIF_REG_ST,
	 													GIF_REG_RGBAQ, 	// BATCH
	 													GIF_REG_XYZ2)));
	
	// Front face
	VIFStaticDMA.AddVector(Vector4(0, 0, 1, fDraw));			// TexCoord (STQ)	
	VIFStaticDMA.AddVector(Vector4( 0, 0, 1, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(-1.0f, 1.0f, 1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(1, 0, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4( 0, 0, 1, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(1.0f,  1.0f, 1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(0, 1, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4( 0, 0, 1, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(-1.0f,-1.0f, 1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(0, 1, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4( 0, 0, 1, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(-1.0f,-1.0f, 1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(1, 0, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4( 0, 0, 1, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(1.0f,  1.0f, 1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(1 , 1, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4( 0, 0, 1, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(1.0f, -1.0f, 1.0f, 1.0f));	// Vert (xyzw)

	// Right face
	VIFStaticDMA.AddVector(Vector4(0, 0, 1, fDraw));			// TexCoord (STQ)	
	VIFStaticDMA.AddVector(Vector4( 1, 0, 0, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(1.0f, 1.0f, 1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(1, 0, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4( 1, 0, 0, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(1.0f,  1.0f, -1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(0, 1, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4( 1, 0, 0, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(1.0f,-1.0f, 1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(0, 1, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4( 1, 0, 0, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(1.0f,-1.0f, 1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(1, 0, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4( 1, 0, 0, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(1.0f, 1.0f, -1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(1 , 1, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4( 1, 0, 0, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(1.0f, -1.0f, -1.0f, 1.0f));	// Vert (xyzw)

	// Back face
	VIFStaticDMA.AddVector(Vector4(1, 0, 1, fDraw));			// TexCoord (STQ)	
	VIFStaticDMA.AddVector(Vector4( 0, 0,-1, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(-1.0f, 1.0f, -1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(1, 1, 1, 0));				// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4( 0, 0,-1, fDraw));			// Normal
	VIFStaticDMA.AddVector(Vector4(-1.0f,-1.0f, -1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(0, 0, 1, 0));				// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4( 0, 0,-1, fDraw));			// Normal
	VIFStaticDMA.AddVector(Vector4(1.0f,  1.0f, -1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(1, 1, 1, 0));				// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4( 0, 0,-1, fDraw));			// Normal
	VIFStaticDMA.AddVector(Vector4(-1.0f,-1.0f, -1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(0 , 1, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4( 0, 0,-1, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(1.0f, -1.0f, -1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(0, 0, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4( 0, 0,-1, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(1.0f,  1.0f, -1.0f, 1.0f));	// Vert (xyzw)

	// Left face
	VIFStaticDMA.AddVector(Vector4(1, 0, 1, fDraw));			// TexCoord (STQ)	
	VIFStaticDMA.AddVector(Vector4(-1, 0, 0, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(-1.0f, 1.0f, 1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(0, 0, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4(-1, 0, 0, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(-1.0f,  1.0f, -1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(1, 1, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4(-1, 0, 0, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(-1.0f,-1.0f, 1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(1, 1, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4(-1, 0, 0, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(-1.0f,-1.0f, 1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(0, 0, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4(-1, 0, 0, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(-1.0f, 1.0f, -1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(0 , 1, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4(-1, 0, 0, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(-1.0f, -1.0f, -1.0f, 1.0f));	// Vert (xyzw)
	
	// Top face
	VIFStaticDMA.AddVector(Vector4(1, 0, 1, fDraw));			// TexCoord (STQ)	
	VIFStaticDMA.AddVector(Vector4(0, 1, 0, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(1.0f, 1.0f, 1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(0, 0, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4(0, 1, 0, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(1.0f,  1.0f, -1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(1, 1, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4(0, 1, 0, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(-1.0f, 1.0f, 1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(1, 1, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4(0, 1, 0, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(-1.0f, 1.0f, 1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(0, 0, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4(0, 1, 0, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(1.0f, 1.0f, -1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(0 , 1, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4(0, 1, 0, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(-1.0f,  1.0f, -1.0f, 1.0f));	// Vert (xyzw)
	
	// Bottom face
	VIFStaticDMA.AddVector(Vector4(0, 0, 1, fDraw));			// TexCoord (STQ)	
	VIFStaticDMA.AddVector(Vector4(0, -1, 0, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(1.0f, -1.0f, 1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(1, 0, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4(0, -1, 0, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(1.0f,  -1.0f, -1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(0, 1, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4(0, -1, 0, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(-1.0f,-1.0f, 1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(0, 1, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4(0, -1, 0, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(-1.0f,-1.0f, 1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(1, 0, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4(0, -1, 0, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(1.0f, -1.0f, -1.0f, 1.0f));	// Vert (xyzw)
	VIFStaticDMA.AddVector(Vector4(1 , 1, 1, fDraw));			// TexCoord (STQ)
	VIFStaticDMA.AddVector(Vector4(0, -1, 0, 0));				// Normal
	VIFStaticDMA.AddVector(Vector4(-1.0f, -1.0f, -1.0f, 1.0f));	// Vert (xyzw)

	
	// Flush to make sure VU1 isn't doing anything.
	VIFStaticDMA.Add32(FLUSH);
	// Then run the microcode.
	VIFStaticDMA.Add32(MSCALL(0));

	// Return back to the dynamic chain (note that we aren't aligned on a QWORD boundary, but
	// it doesn't matter because the packet class will sort that out for us).
	VIFStaticDMA.DMARet();
}