void Draw_Bump(Quad *qd){ int i; pvr_poly_cxt_txr(&p_cxt,PVR_LIST_TR_POLY,qd->mat.bumpmap.fmt,qd->mat.bumpmap.w,qd->mat.bumpmap.w,qd->mat.bumpmap.txt,PVR_FILTER_BILINEAR); p_cxt.gen.specular = PVR_SPECULAR_ENABLE; pvr_poly_compile(&p_hdr,&p_cxt); //p_hdr.cmd |= 4; /* Average out the light source positions */ static Vector3 D; static Vector3 G; if(LIGHTS > 1){ G.x =0; G.y = 0; G.z = 0; for(i = 0; i < LIGHTS;i++){ G.x += Lights[i].x; G.y += Lights[i].y; G.z += Lights[i].z; } G.x /= LIGHTS; G.y /= LIGHTS; G.z /= LIGHTS; D.x = (qd->verts[0].p.x+16) - G.x; D.y = (qd->verts[0].p.y+16) - G.y; D.z = (qd->verts[0].p.z) - G.z; }else{ D.x = (qd->verts[0].p.x+16) - Lights[0].x; D.y = (qd->verts[0].p.y+16) - Lights[0].y; D.z = (qd->verts[0].p.z) - Lights[0].z; } /* Calculate Spherical elevation and rotation angles */ float T = (frsqrt(fipr_magnitude_sqr(D.x,D.y,D.z,0.0)))*PI2; float Q = (fast_atan2f(D.y,D.x)); pvr_prim(&p_hdr,sizeof(pvr_poly_hdr_t)); /* Pack bump paramters, 1.0 is the "bumpiness" */ Uint32 oargb = pvr_pack_bump(1.0,T,Q); qd->verts[0].trans.argb = 0xff000000; qd->verts[0].trans.oargb = oargb; pvr_prim(&qd->verts[0].trans,sizeof(pvr_vertex_t)); qd->verts[1].trans.oargb = oargb; qd->verts[1].trans.argb = 0xff000000; pvr_prim(&qd->verts[1].trans,sizeof(pvr_vertex_t)); qd->verts[2].trans.oargb = oargb; qd->verts[2].trans.argb = 0xff000000; pvr_prim(&qd->verts[2].trans,sizeof(pvr_vertex_t)); qd->verts[3].trans.oargb = oargb; qd->verts[3].trans.argb = 0xff000000; pvr_prim(&qd->verts[3].trans,sizeof(pvr_vertex_t)); }
inline void Draw_Quad(Quad* qd){ qd->verts[0].trans.argb = PVR_PACK_COLOR(0.0,qd->verts[0].FinalColor.x,qd->verts[0].FinalColor.y,qd->verts[0].FinalColor.z); pvr_prim(&qd->verts[0].trans,sizeof(pvr_vertex_t)); qd->verts[0].FinalColor.x = 0; qd->verts[0].FinalColor.y = 0; qd->verts[0].FinalColor.z = 0; qd->verts[1].trans.argb = PVR_PACK_COLOR(0.0,qd->verts[1].FinalColor.x,qd->verts[1].FinalColor.y, \ qd->verts[1].FinalColor.z);; pvr_prim(&qd->verts[1].trans,sizeof(pvr_vertex_t)); qd->verts[1].FinalColor.x = 0; qd->verts[1].FinalColor.y = 0; qd->verts[1].FinalColor.z = 0; qd->verts[2].trans.argb = PVR_PACK_COLOR(0.0,qd->verts[2].FinalColor.x,qd->verts[2].FinalColor.y, \ qd->verts[2].FinalColor.z);; pvr_prim(&qd->verts[2].trans,sizeof(pvr_vertex_t)); qd->verts[2].FinalColor.x = 0; qd->verts[2].FinalColor.y = 0; qd->verts[2].FinalColor.z = 0; qd->verts[3].trans.argb = PVR_PACK_COLOR(0.0,qd->verts[3].FinalColor.x,qd->verts[3].FinalColor.y, \ qd->verts[3].FinalColor.z);; pvr_prim(&qd->verts[3].trans,sizeof(pvr_vertex_t)); qd->verts[3].FinalColor.x = 0; qd->verts[3].FinalColor.y = 0; qd->verts[3].FinalColor.z = 0; }
/* draw a box (used by cursor and border, etc) (at 1.0f z coord) */ static void draw_box(float x, float y, float w, float h, float a, float r, float g, float b) { pvr_poly_cxt_t cxt; pvr_poly_hdr_t poly; pvr_vertex_t vert; pvr_poly_cxt_col(&cxt, PVR_LIST_TR_POLY); pvr_poly_compile(&poly, &cxt); pvr_prim(&poly, sizeof(poly)); vert.flags = PVR_CMD_VERTEX; vert.x = x; vert.y = y + h; vert.z = 1.0f; vert.u = vert.v = 0.0f; vert.argb = PVR_PACK_COLOR(a, r, g, b); vert.oargb = 0; pvr_prim(&vert, sizeof(vert)); vert.y -= h; pvr_prim(&vert, sizeof(vert)); vert.y += h; vert.x += w; pvr_prim(&vert, sizeof(vert)); vert.flags = PVR_CMD_VERTEX_EOL; vert.y -= h; pvr_prim(&vert, sizeof(vert)); }
void do_frame() { pvr_modifier_vol_t mod; int i; pvr_wait_ready(); pvr_scene_begin(); pvr_list_begin(list); pvr_prim(&phdr, sizeof(phdr)); for(i = 0; i < NUM_POLYS; ++i) { pvr_prim(&verts[i * 4], sizeof(verts[i * 4])); pvr_prim(&verts[i * 4 + 1], sizeof(verts[i * 4 + 1])); pvr_prim(&verts[i * 4 + 2], sizeof(verts[i * 4 + 2])); pvr_prim(&verts[i * 4 + 3], sizeof(verts[i * 4 + 3])); } pvr_list_finish(); pvr_list_begin(list + 1); pvr_prim(&mhdr, sizeof(mhdr)); mod.flags = PVR_CMD_VERTEX_EOL; mod.ax = mx; mod.ay = my + 50.0f; mod.az = 150.0f; mod.bx = mx; mod.by = my; mod.bz = 150.0f; mod.cx = mx + 50.0f; mod.cy = my + 50.0f; mod.cz = 150.0f; mod.d1 = mod.d2 = mod.d3 = mod.d4 = mod.d5 = mod.d6 = 0; pvr_prim(&mod, sizeof(mod)); pvr_prim(&mhdr2, sizeof(mhdr2)); mod.flags = PVR_CMD_VERTEX_EOL; mod.ax = mx; mod.ay = my; mod.az = 150.0f; mod.bx = mx + 50.0f; mod.by = my + 50.0f; mod.bz = 150.0f; mod.cx = mx + 50.0f; mod.cy = my; mod.cz = 150.0f; mod.d1 = mod.d2 = mod.d3 = mod.d4 = mod.d5 = mod.d6 = 0; pvr_prim(&mod, sizeof(mod)); pvr_list_finish(); pvr_scene_finish(); }
/* Draw one font character (6x12) */ static void draw_char(float x1, float y1, float z1, float a, float r, float g, float b, int c) { pvr_vertex_t vert; int ix, iy; float u1, v1, u2, v2; if (c == ' ') return; // assert( c > ' ' && c < 127 ); if (!( c > ' ' && c < 127 )) return; ix = (c % 16) * 16; iy = (c / 16) * 24; u1 = ix * 1.0f / 256.0f; v1 = iy * 1.0f / 256.0f; u2 = (ix+12) * 1.0f / 256.0f; v2 = (iy+24) * 1.0f / 256.0f; vert.flags = PVR_CMD_VERTEX; vert.x = x1; vert.y = y1 + CONIO_FONT_HEIGHT; vert.z = z1; vert.u = u1; vert.v = v2; vert.argb = PVR_PACK_COLOR(a, r, g, b); vert.oargb = 0; pvr_prim(&vert, sizeof(vert)); vert.x = x1; vert.y = y1; vert.u = u1; vert.v = v1; pvr_prim(&vert, sizeof(vert)); vert.x = x1 + CONIO_FONT_WIDTH; vert.y = y1 + CONIO_FONT_HEIGHT; vert.u = u2; vert.v = v2; pvr_prim(&vert, sizeof(vert)); vert.flags = PVR_CMD_VERTEX_EOL; vert.x = x1 + CONIO_FONT_WIDTH; vert.y = y1; vert.u = u2; vert.v = v1; pvr_prim(&vert, sizeof(vert)); }
void plx_cxt_send(int type) { switch (type) { case PVR_LIST_OP_POLY: pvr_prim(&hdr_working_op, sizeof(pvr_poly_hdr_t)); break; case PVR_LIST_TR_POLY: pvr_prim(&hdr_working_tr, sizeof(pvr_poly_hdr_t)); break; case PVR_LIST_PT_POLY: pvr_prim(&hdr_working_pt, sizeof(pvr_poly_hdr_t)); break; default: assert_msg( 0, "List type not handled by plx_cxt_send" ); } }
static void RenderVideoTexture(video_txr_t *txr, int x, int y, int w, int h, int color) { pvr_vertex_t v; pvr_prim(&txr->hdr, sizeof(txr->hdr)); float u0,v0,u1,v1; float x0,y0,x1,y1; u0 = 0; v0 = 0; u1 = (float)txr->width/txr->tw; v1 = (float)txr->height/txr->th; x0 = x; y0 = y; x1 = x + w; y1 = y + h; v.flags = PVR_CMD_VERTEX; v.argb = color; v.oargb = 0; v.z = 512; v.x = x0; v.y = y0; v.u = u0; v.v = v0; pvr_prim(&v,sizeof(v)); v.x = x1; v.y = y0; v.u = u1; v.v = v0; pvr_prim(&v,sizeof(v)); v.x = x0; v.y = y1; v.u = u0; v.v = v1; pvr_prim(&v,sizeof(v)); v.flags = PVR_CMD_VERTEX_EOL; v.x = x1; v.y = y1; v.u = u1; v.v = v1; pvr_prim(&v,sizeof(v)); }
void stars_one_frame() { int i, x1, y1, xn, yn, zn, c; /* Send polygon header to the TA using store queues */ pvr_prim(&stars_header, sizeof(stars_header)); /* Calculate each star's position and plot it on screen */ for (i=0; i<NS; i++) { /* Calculate star perspective */ xn = star_x[i]; yn = star_y[i]; zn = star_z[i]; x1 = xn*zk / (zn + zk); y1 = yn*zk / (zn + zk); if (x1>-320 && y1>-240 && x1<320 && y1<240) { c = (zn * 256/640) & 0xff; poly_pnt(x1+320, y1+240, 1.0f, 4.0f, 255-c); } else { star_z[i] = 640; } /* Move star's Z coord to show motion inward */ star_z[i]-=28; } }
void glKosModVolume9f(GLfloat ax, GLfloat ay, GLfloat az, GLfloat bx, GLfloat by, GLfloat bz, GLfloat cx, GLfloat cy, GLfloat cz) { assert_msg(0,"not implemented"); vol_vbuf.flags = PVR_CMD_VERTEX_EOL; vol_vbuf.ax = ax; vol_vbuf.ay = ay; vol_vbuf.az = az; vol_vbuf.bx = bx; vol_vbuf.by = by; vol_vbuf.bz = bz; vol_vbuf.cx = cx; vol_vbuf.cy = cy; vol_vbuf.cz = cz; mat_transform((vector_t*)&vol_vbuf.ax, (vector_t*)&vol_xbuf.ax, 3, sizeof(vector_t)); /* Can't use the alternating store queues cuz we're sending * 64 bytes at once with this vertex type */ vol_xbuf.flags = vol_vbuf.flags; vol_xbuf.d1 = vol_xbuf.d2 = vol_xbuf.d3 = 0; vol_xbuf.d4 = vol_xbuf.d5 = vol_xbuf.d6 = 0; pvr_prim(&vol_xbuf, sizeof(pvr_modifier_vol_t)); //printf("[%2.2f, %2.2f]\n", cz, vol_xbuf.cz); }
static void draw_texture (void) { pvr_poly_cxt_t cxt; pvr_poly_hdr_t poly; pvr_vertex_t vert; float slice_width = 127.0; pvr_poly_cxt_txr (&cxt, PVR_LIST_TR_POLY, PVR_TXRFMT_RGB565 | PVR_TXRFMT_NONTWIDDLED, 1024, 512, warp_texture[1 - warp_active], PVR_FILTER_NONE); cxt.blend.src = PVR_BLEND_ONE; cxt.blend.dst = PVR_BLEND_INVDESTCOLOR; cxt.txr.env = PVR_TXRENV_MODULATE; pvr_poly_compile (&poly, &cxt); pvr_prim (&poly, sizeof (poly)); vert.flags = PVR_CMD_VERTEX; vert.x = 320.0f - slice_width; vert.y = 480.0f; vert.z = flame_pos_xformed[2]; vert.u = (320.0f - slice_width) / 1024.0f; vert.v = 480.0f / 512.0f; vert.argb = 0xffffffff; vert.oargb = 0; pvr_prim (&vert, sizeof (vert)); vert.x = 320.0f - slice_width; vert.y = 0.0f; vert.u = (320.0f - slice_width) / 1024.0f; vert.v = 0.0; pvr_prim (&vert, sizeof (vert)); vert.x = 320.0f + slice_width; vert.y = 480.0f; vert.u = (320.0f + slice_width) / 1024.0f; vert.v = 480.0f / 512.0f; pvr_prim (&vert, sizeof (vert)); vert.flags = PVR_CMD_VERTEX_EOL; vert.x = 320.0f + slice_width; vert.y = 0.0f; vert.u = (320.0f + slice_width) / 1024.0f; vert.v = 0.0f; pvr_prim (&vert, sizeof (vert)); }
void q3dFillerWireframeDrawLine(pvr_vertex_t *p1, pvr_vertex_t *p2, float thickness) { // create lineVector q3dTypeVector lineVector; q3dVectorSet3f(&lineVector, p1->x - p2->x, p1->y - p2->y, p1->z - p2->z); q3dVectorNormalize(&lineVector); // rotate 90 degrees float tmp = lineVector.y; lineVector.y = lineVector.x; lineVector.x = -tmp; // apply thickness lineVector.x *= thickness/2; lineVector.y *= thickness/2; // draw pvr_vertex_t vert; vert.argb = PVR_PACK_COLOR(1, 0, 0, 0); // top left vert.flags = PVR_CMD_VERTEX; vert.x = p1->x - lineVector.x; vert.y = p1->y - lineVector.y; vert.z = p1->z; pvr_prim(&vert, sizeof(pvr_vertex_t)); // bottom left vert.x = p1->x + lineVector.x; vert.y = p1->y + lineVector.y; vert.z = p1->z; pvr_prim(&vert, sizeof(pvr_vertex_t)); // top right vert.x = p2->x - lineVector.x; vert.y = p2->y - lineVector.y; vert.z = p2->z; pvr_prim(&vert, sizeof(pvr_vertex_t)); // bottom right; vert.flags = PVR_CMD_VERTEX_EOL; vert.x = p2->x + lineVector.x; vert.y = p2->y + lineVector.y; vert.z = p2->z; pvr_prim(&vert, sizeof(pvr_vertex_t)); }
void do_frame() { pvr_vertex_t vert; int x, y, z; int size; int i, col; vid_border_color(0, 0, 0); pvr_wait_ready(); vid_border_color(255, 0, 0); pvr_scene_begin(); pvr_list_begin(PVR_LIST_OP_POLY); pvr_prim(&hdr, sizeof(hdr)); x = rand() % 640; y = rand() % 480; z = rand() % 100 + 1; col = rand () % 256; vert.flags = PVR_CMD_VERTEX; vert.x = x; vert.y = y; vert.z = z; vert.u = vert.v = 0.0f; vert.argb = col | (col << 8) | (col << 16) | 0xff000000; vert.oargb = 0; pvr_prim(&vert, sizeof(vert)); for (i=0; i<polycnt; i++) { x = (x + ((rand() % 50) - 25)) % 640; y = (y + ((rand() % 50) - 25)) % 480; col = rand () % 256; vert.x = x; vert.y = y; vert.argb = col | (col << 8) | (col << 16) | 0xff000000; if (i == (polycnt-1)) vert.flags = PVR_CMD_VERTEX_EOL; pvr_prim(&vert, sizeof(vert)); } pvr_list_finish(); pvr_scene_finish(); vid_border_color(0, 255, 0); }
static void draw_backdrop (void) { pvr_poly_cxt_t cxt; pvr_poly_hdr_t poly; pvr_vertex_t vert; pvr_poly_cxt_txr (&cxt, PVR_LIST_OP_POLY, PVR_TXRFMT_RGB565 | PVR_TXRFMT_TWIDDLED, 512, 256, backdrop_texture, PVR_FILTER_BILINEAR); pvr_poly_compile (&poly, &cxt); pvr_prim (&poly, sizeof (poly)); vert.flags = PVR_CMD_VERTEX; vert.x = 0.0f; vert.y = 480.0f; vert.z = 0.001f; vert.u = 0.0f; vert.v = 1.0f; vert.argb = 0xff505050; vert.oargb = 0; pvr_prim (&vert, sizeof (vert)); vert.x = 0.0f; vert.y = 0.0f; vert.u = 0.0f; vert.v = 0.0f; pvr_prim (&vert, sizeof (vert)); vert.x = 640.0f; vert.y = 480.0f; vert.u = 1.0f; vert.v = 1.0f; pvr_prim (&vert, sizeof (vert)); vert.flags = PVR_CMD_VERTEX_EOL; vert.x = 640.0f; vert.y = 0.0f; vert.u = 1.0f; vert.v = 0.0f; pvr_prim (&vert, sizeof (vert)); }
/* Draws a point using a triangle strip */ void poly_pnt(int x, int y, float z, float size, int color) { pvr_vertex_t vert; vert.flags = PVR_CMD_VERTEX; vert.x = x; vert.y = y + size; vert.z = z; vert.u = vert.v = 0.0f; vert.argb = PVR_PACK_COLOR(1.0f, color / 256.0f, color / 256.0f, color / 256.0f); vert.oargb = 0; pvr_prim(&vert, sizeof(vert)); vert.y = y; pvr_prim(&vert, sizeof(vert)); vert.flags = PVR_CMD_VERTEX_EOL; vert.x = x + size; vert.y = y + size; pvr_prim(&vert, sizeof(vert)); }
/* draw len chars at string */ static void draw_string(float x, float y, float z, float a, float r, float g, float b, char *str, int len) { int i; pvr_poly_cxt_t cxt; pvr_poly_hdr_t poly; pvr_poly_cxt_txr(&cxt, PVR_LIST_TR_POLY, PVR_TXRFMT_ARGB1555 | PVR_TXRFMT_NONTWIDDLED, 256, 256, font_texture, PVR_FILTER_NONE); pvr_poly_compile(&poly, &cxt); pvr_prim(&poly, sizeof(poly)); for (i = 0; i < len; i++) { draw_char(x, y, z, a, r, g, b, str[i]); x += CONIO_FONT_WIDTH; } }
void send_mod_hdr(void) { mod_hdr.cmd = PVR_CMD_MODIFIER; mod_hdr.mode1 = (mod_type << PVR_TA_PM1_MODIFIERINST_SHIFT) & PVR_TA_PM1_MODIFIERINST_MASK; switch(gl_active_list) { case GL_LIST_OPAQUE_MOD: mod_hdr.cmd |= (PVR_LIST_OP_MOD << PVR_TA_CMD_TYPE_SHIFT) & PVR_TA_CMD_TYPE_MASK; break; case GL_LIST_TRANS_MOD: mod_hdr.cmd |= (PVR_LIST_TR_MOD << PVR_TA_CMD_TYPE_SHIFT) & PVR_TA_CMD_TYPE_MASK; break; default: assert_msg(0, "wrong list specified"); break; } pvr_prim(&mod_hdr, sizeof(pvr_poly_hdr_t)); }
static void end_quads() { int i, j, order[4] = {3, 0, 2, 1}; /* Should be four points in the buffer */ assert_msg(gl_vbuf_top == 4, "Wrong number of vertices."); gl_vbuf[order[3]].flags = PVR_CMD_VERTEX_EOL; /* mat_transform((vector_t*)&gl_vbuf[0].x, (vector_t*)&gl_xbuf[0].x, 4, sizeof(pvr_vertex_t)); */ for (i=0; i<4; i++) { float x = gl_vbuf[i].x, y = gl_vbuf[i].y, z = gl_vbuf[i].z, w = 1.0f; mat_trans_single4(x, y, z, w); gl_xbuf[i].x = x; gl_xbuf[i].y = y; if (w == 1.0f) gl_xbuf[i].z = ((gl_viewport_scale[2] * z) + gl_viewport_offset[2]); else gl_xbuf[i].z = w; } /* Throw it all to the TA using direct render */ if (check_w(gl_xbuf, 4)) for (i=0; i<4; i++) { j = order[i]; vert_xbuf.flags = gl_vbuf[j].flags; vert_xbuf.x = gl_xbuf[j].x; vert_xbuf.y = gl_xbuf[j].y; vert_xbuf.z = gl_xbuf[j].z; vert_xbuf.u0 = gl_vbuf[j].u; vert_xbuf.v0 = gl_vbuf[j].v; vert_xbuf.argb0 = gl_vbuf[j].argb; vert_xbuf.oargb0 = gl_vbuf[j].oargb; vert_xbuf.u1 = 0.0f; vert_xbuf.v1 = 0.0f; vert_xbuf.argb1 = 0xff00ff00; vert_xbuf.oargb1 = 0xffff0000; pvr_prim(&vert_xbuf, sizeof(pvr_vertex_tpcm_t)); } }
void Draw_Layer(){ int i; int z; i = LAYER_SIZE; while(i--){ Transform_Quad(&Layer[i]); } i = LAYER_SIZE; while(i--){ z = LIGHTS; while(z--){ LightQuad(&Layer[i],&Lights[z]); } } i = LAYER_SIZE; while(i--){ pvr_poly_cxt_txr(&p_cxt,PVR_LIST_OP_POLY,GlobalTex.fmt,GlobalTex.w,GlobalTex.h,GlobalTex.txt,PVR_FILTER_BILINEAR); p_cxt.gen.shading = PVR_SHADE_GOURAUD; pvr_poly_compile(&p_hdr,&p_cxt); pvr_prim(&p_hdr,sizeof(p_hdr)); Draw_Quad(&Layer[i]); } }
void do_frame() { pvr_vertex_t * vert; int x, y, z; int i, col; int seed = oldseed; pvr_dr_state_t dr_state; #define nextnum() seed = seed * 1164525 + 1013904223; #define getnum(mn) (seed & ((mn) - 1)) vid_border_color(0, 0, 0); pvr_wait_ready(); vid_border_color(255, 0, 0); pvr_scene_begin(); pvr_list_begin(PVR_LIST_OP_POLY); pvr_prim(&hdr, sizeof(hdr)); pvr_dr_init(dr_state); x = getnum(1024); nextnum(); y = getnum(512); nextnum(); z = getnum(128) + 1; nextnum(); col = getnum(256); nextnum(); vert = pvr_dr_target(dr_state); vert->flags = PVR_CMD_VERTEX; vert->x = x; vert->y = y; vert->z = z; vert->u = vert->v = 0.0f; vert->argb = col | (col << 8) | (col << 16) | 0xff000000; vert->oargb = 0; pvr_dr_commit(vert); for(i = 0; i < polycnt; i++) { x = (x + ((getnum(64)) - 32)) & 1023; nextnum(); y = (y + ((getnum(64)) - 32)) % 511; nextnum(); col = getnum(256); nextnum(); vert = pvr_dr_target(dr_state); vert->flags = PVR_CMD_VERTEX; vert->x = x; vert->y = y; vert->z = z; vert->u = vert->v = 0.0f; vert->argb = col | (col << 8) | (col << 16) | 0xff000000; vert->oargb = 0; if(i == (polycnt - 1)) vert->flags = PVR_CMD_VERTEX_EOL; pvr_dr_commit(vert); } pvr_list_finish(); pvr_scene_finish(); vid_border_color(0, 255, 0); oldseed = seed; }
static void draw_cooler (void) { pvr_poly_cxt_t cxt; pvr_poly_hdr_t poly; pvr_vertex_t vert; pvr_poly_cxt_txr (&cxt, PVR_LIST_TR_POLY, PVR_TXRFMT_ARGB4444 | PVR_TXRFMT_TWIDDLED, COOL_X, COOL_Y, cooling_texture, PVR_FILTER_BILINEAR); pvr_poly_compile (&poly, &cxt); pvr_prim (&poly, sizeof (poly)); vert.flags = PVR_CMD_VERTEX; vert.x = 0.0f; vert.y = 480.0f; vert.z = COOLING_DEPTH; vert.u = 0.0f; vert.v = cooling_offset / 512.0f; vert.argb = 0xffffffff; vert.oargb = 0; pvr_prim (&vert, sizeof (vert)); vert.x = 0.0f; vert.y = 0.0f; vert.v = (cooling_offset + 480.0f) / 512.0f; pvr_prim (&vert, sizeof (vert)); vert.x = 640.0f; vert.y = 480.0f; vert.u = 640.0f / 1024.0f; vert.v = cooling_offset / 512.0f; pvr_prim (&vert, sizeof (vert)); vert.flags = PVR_CMD_VERTEX_EOL; vert.x = 640.0f; vert.y = 0.0f; vert.u = 640.0f / 1024.0f; vert.v = (cooling_offset + 480.0f) / 512.0f; pvr_prim (&vert, sizeof (vert)); /* Draw the flame bit too! */ { pvr_poly_cxt_t cxt; pvr_poly_hdr_t hdr; int i; pvr_poly_cxt_txr (&cxt, PVR_LIST_TR_POLY, PVR_TXRFMT_RGB565 | PVR_TXRFMT_TWIDDLED, 256, 256, flame_texture, PVR_FILTER_BILINEAR); cxt.blend.src = PVR_BLEND_ONE; cxt.blend.dst = PVR_BLEND_ONE; cxt.txr.env = PVR_TXRENV_MODULATE; pvr_poly_compile (&hdr, &cxt); pvr_prim (&hdr, sizeof (hdr)); for (i = 0; i < 20; i++) { float ang = (float) i * 2 * M_PI / 20.0f; float ang1 = (float) (i + 1) * 2 * M_PI / 20.0f; float amp = audio_amplitude (66); vert.flags = PVR_CMD_VERTEX; vert.x = flame_pos_xformed[0]; vert.y = flame_pos_xformed[1]; vert.z = SEED_DEPTH; vert.u = vert.v = 0.5; vert.argb = 0xffffffff; vert.oargb = 0x0; pvr_prim (&vert, sizeof (vert)); vert.flags = PVR_CMD_VERTEX; vert.x = flame_pos_xformed[0] + fcos (ang) * (40 + amp * 10); vert.y = flame_pos_xformed[1] - 30 + fsin (ang) * 60; vert.u = 0.5 + fcos (rot1) * 0.5; vert.v = 0.5 + fsin (rot1) * 0.5; pvr_prim (&vert, sizeof (vert)); vert.flags = PVR_CMD_VERTEX_EOL; vert.x = flame_pos_xformed[0] + fcos (ang1) * (40 + amp * 10); vert.y = flame_pos_xformed[1] - 30 + fsin (ang1) * 60; pvr_prim (&vert, sizeof (vert)); } } cooling_offset -= 3; if (cooling_offset < 0) cooling_offset += 512; }
static void draw_box (void) { pvr_poly_cxt_t cxt; pvr_poly_hdr_t poly; pvr_vertex_t vert; int x, y; int ox, oy; float offset[21][16][2]; pvr_poly_cxt_txr (&cxt, PVR_LIST_OP_POLY, PVR_TXRFMT_RGB565 | PVR_TXRFMT_NONTWIDDLED, 1024, 512, warp_texture[1 - warp_active], PVR_FILTER_BILINEAR); pvr_poly_compile (&poly, &cxt); for (oy = 0; oy <= 15; oy++) for (ox = 0; ox <= 20; ox++) { offset[ox][oy][0] = 2.0 * perlin_noise_2D (ox, oy + perlin_phase, 2); offset[ox][oy][1] = -4.0 - 2.0 * perlin_noise_2D (ox + 40, oy + perlin_phase, 2); } for (oy = 0, y = 0; y < 480; oy++, y += 32) { pvr_prim (&poly, sizeof (poly)); vert.flags = PVR_CMD_VERTEX; vert.x = offset[0][oy + 1][0]; vert.y = y + 32 + offset[0][oy + 1][1]; vert.z = DISTORT_DEPTH; vert.u = 0.0f; vert.v = (float) (y + 32) / 512.0f; vert.argb = 0xffffffff; vert.oargb = 0; pvr_prim (&vert, sizeof (vert)); vert.x = offset[0][oy][0]; vert.y = y + offset[0][oy][1]; vert.v = (float) y / 512.0f; pvr_prim (&vert, sizeof (vert)); for (ox = 1, x = 32; x < 640; ox++, x += 32) { int is_last = (x == 640 - 32); vert.x = x + offset[ox][oy + 1][0]; vert.y = y + 32 + offset[ox][oy + 1][1]; vert.u = (float) x / 1024.0f; vert.v = (float) (y + 32) / 512.0f; pvr_prim (&vert, sizeof (vert)); if (is_last) vert.flags = PVR_CMD_VERTEX_EOL; vert.x = x + offset[ox][oy][0]; vert.y = y + offset[ox][oy][1]; vert.v = (float) y / 512.0f; pvr_prim (&vert, sizeof (vert)); } } rot1 += 0.005; if (rot1 > 2 * M_PI) rot1 -= 2 * M_PI; perlin_phase += 0.03; }
int main(int argc,char** argv){ pvr_vertex_t v; Texture spr; pvr_poly_cxt_t p_cxt; pvr_poly_hdr_t p_hdr; Init(); Load_VQTexture("/rd/billy.kmg",&spr); sndoggvorbis_start("/rd/billy.ogg",-1); int q = 0; while(q == 0){ vid_border_color(255,0,0); pvr_wait_ready(); vid_border_color(0,255,0); pvr_scene_begin(); pvr_list_begin(PVR_LIST_OP_POLY); pvr_list_finish(); pvr_list_begin(PVR_LIST_TR_POLY); pvr_poly_cxt_txr(&p_cxt,PVR_LIST_TR_POLY,spr.fmt,spr.w,spr.h,spr.txt,PVR_FILTER_BILINEAR); pvr_poly_compile(&p_hdr,&p_cxt); pvr_prim(&p_hdr,sizeof(p_hdr)); // submit header v.x = 0.0; v.y = 0.0; v.z = 1.0; v.u = 0.0; v.v = 0.0; v.argb = 0xffffffff; v.oargb = 0; v.flags = PVR_CMD_VERTEX; pvr_prim(&v,sizeof(v)); v.x = 640.0; v.y = 0.0; v.u = 1.0; v.v = 0.0; pvr_prim(&v,sizeof(v)); v.x = 0.0; v.y = 480.0; v.u = 0.0; v.v = 1.0; pvr_prim(&v,sizeof(v)); v.x = 640.0; v.y = 480.0; v.u = 1.0; v.v = 1.0; v.flags = PVR_CMD_VERTEX_EOL; pvr_prim(&v,sizeof(v)); pvr_list_finish(); pvr_scene_finish(); vid_border_color(0,0,255); MAPLE_FOREACH_BEGIN(MAPLE_FUNC_CONTROLLER, cont_state_t, st); if(st->buttons & CONT_START) q = 1; MAPLE_FOREACH_END(); } DeleteTexture(&spr); sndoggvorbis_stop(); pvr_shutdown(); sndoggvorbis_shutdown(); return 0; }