示例#1
0
void makestuff(void) {
  int i;
  Gfx *gl1;
  Gfx *gl2;
  Gfx *gl1a;

  gl1 = &(dlist1[0]);
  gl1a = gl1;
  gl2 = &(dlist2[0]);

  /*
   * Check for array size problems
   */
#ifdef DEBUG
  if (tricnt > VCNT) {
    osSyncPrintf("Uh Oh -- tricnt > VCNT\n");
  }
#endif

  /*
   * Loop over triangles
   */
  for (i=0; i<tricnt; i++) {
    /*
     * For display list #1...
     *
     * Texture
     */
    gDPLoadTextureBlock(gl1++, &(texture[tindex1[i*3+0]]),
			G_IM_FMT_RGBA,			
			G_IM_SIZ_32b,
		        tindex1[i*3+1], tindex1[i*3+2], /* width, height */
			0,
			0, 0,                     /* clamp,wrap,mirror flags */
			G_TX_NOMASK, G_TX_NOMASK, /* Mask for s,t */
			G_TX_NOLOD, G_TX_NOLOD);  /* Shift for s,t */
    gDPSetTileSize(gl1++,
		   G_TX_RENDERTILE, /* tile # */
		   tcoords1[i][0] << 2,  /* uls, 10.2 */
		   tcoords1[i][1] << 2,  /* ult, 10.2 */
		   tcoords1[i][2] << 2,  /* lrs, 10.2 */
		   tcoords1[i][3] << 2   /* lrt, 10.2 */
		   );
    /*
     * Load verticies and render
     * (Note: Vertex loading could be more efficient)
     */
    gSPVertex(gl1++, &(rsp_dynamic.tvface1[trilist[3*i]]), 1, 0);
    gSPVertex(gl1++, &(rsp_dynamic.tvface1[trilist[3*i+1]]), 1, 1);
    gSPVertex(gl1++, &(rsp_dynamic.tvface1[trilist[3*i+2]]), 1, 2);
    gSP1Triangle(gl1++, 0, 1, 2, 0);

    /*
     * For display list #2...
     *
     * Texture
     */
    gDPLoadTextureBlock(gl2++, &(texture[tindex2[i*3+0]]),
			G_IM_FMT_RGBA,			
			G_IM_SIZ_32b,
			tindex2[i*3+1], tindex2[i*3+2],  /* width, height */
			0,
			0, 0,
			G_TX_NOMASK, G_TX_NOMASK,
			G_TX_NOLOD, G_TX_NOLOD);
    gDPSetTileSize(gl2++, 0,
		   tcoords2[i][0] << 2,  /* uls, 10.2 */
		   tcoords2[i][1] << 2,  /* ult, 10.2 */
		   tcoords2[i][2] << 2,  /* lrs, 10.2 */
		   tcoords2[i][3] << 2   /* lrt, 10.2 */
		   );
    /*
     * Load verticies and render
     * (Note: Vertex loading could be more efficient)
     */
    gSPVertex(gl2++, &(rsp_dynamic.tvface2[trilist[3*i]]), 1, 0);
    gSPVertex(gl2++, &(rsp_dynamic.tvface2[trilist[3*i+1]]), 1, 1);
    gSPVertex(gl2++, &(rsp_dynamic.tvface2[trilist[3*i+2]]), 1, 2);
    gSP1Triangle(gl2++, 0, 1, 2, 0);

    /*
     * Check for close to overrun
     */
    if ((gl1-gl1a) + 50 > DLSIZE) {
#ifdef DEBUG
      osSyncPrintf("Overflowed display list in makestuff -- truncating\n");
#endif
      gSPEndDisplayList(gl1++);
      gSPEndDisplayList(gl2++);
      return;
    }
      

  } /* for i */

  gSPEndDisplayList(gl1++);
  gSPEndDisplayList(gl2++);
} /* makestuff */
示例#2
0
void F3D_Vtx( u32 w0, u32 w1 )
{
	gSPVertex( w1, _SHIFTR( w0, 20, 4 ) + 1, _SHIFTR( w0, 16, 4 ) );
}
示例#3
0
void F3DEX2_Vtx( u32 w0, u32 w1 )
{
    u32 n = _SHIFTR( w0, 12, 8 );

    gSPVertex( w1, n, _SHIFTR( w0, 1, 7 ) - n );
}
示例#4
0
void F3DWRUS_Vtx( u32 w0, u32 w1 )
{
   gSPVertex( w1, _SHIFTR( w0, 9, 7 ), _SHIFTR( w0, 16, 8 ) / 5 );
}