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(); }
/* ============================= 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(); }
/* ============== 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(); }
//--------------------------------------------------------------------------- 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); }
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; }
//--------------------------------------------------------------------------- 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); }
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; }
//--------------------------------------------------------------------------- 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); }
//--------------------------------------------------------------------------- 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); }
//--------------------------------------------------------------------------- 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); }
//--------------------------------------------------------------------------- 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; } }
// 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(); }