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)); }
/* 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)); }
static void compile_cxts() { cxt_working.list_type = PVR_LIST_OP_POLY; cxt_working.gen.alpha = PVR_ALPHA_DISABLE; cxt_working.txr.env = PVR_TXRENV_MODULATE; pvr_poly_compile(&hdr_working_op, &cxt_working); cxt_working.list_type = PVR_LIST_TR_POLY; cxt_working.gen.alpha = PVR_ALPHA_ENABLE; cxt_working.txr.env = PVR_TXRENV_MODULATEALPHA; pvr_poly_compile(&hdr_working_tr, &cxt_working); cxt_working.list_type = PVR_LIST_PT_POLY; cxt_working.gen.alpha = PVR_ALPHA_ENABLE; cxt_working.txr.env = PVR_TXRENV_MODULATEALPHA; pvr_poly_compile(&hdr_working_pt, &cxt_working); }
void q3dFillerWireframeInit(q3dTypeFillerWireframe *type) { pvr_poly_cxt_col(&type->defaultCxt, PVR_LIST_OP_POLY); pvr_poly_compile(&type->defaultHeader, &type->defaultCxt); type->update = &q3dFillerWireframeUpdate; type->draw = &q3dFillerWireframeDraw; }
void setup() { pvr_poly_cxt_t cxt; pvr_init(&pvr_params); pvr_set_bg_color(0,0,0); pvr_poly_cxt_col(&cxt, PVR_LIST_OP_POLY); cxt.gen.shading = PVR_SHADE_FLAT; pvr_poly_compile(&hdr, &cxt); }
/* 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; } }
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 stars_init() { int i; pvr_poly_cxt_t tmp; if (star_x == NULL) { star_x = malloc(NS*sizeof(int)); star_y = malloc(NS*sizeof(int)); star_z = malloc(NS*sizeof(int)); } for (i=0; i<NS; i++) { star_x[i]=randnum(MAXX)-(MAXX/2); star_y[i]=randnum(MAXY)-(MAXY/2); star_z[i]=randnum(640); } pvr_poly_cxt_col(&tmp, PVR_LIST_OP_POLY); pvr_poly_compile(&stars_header, &tmp); }
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)); }
void setup_util_texture() { uint16 *vram; int x, y; pvr_poly_cxt_t cxt; util_texture = pvr_mem_malloc(256*256*2); printf("util_texture at %08x\n", util_texture); vram = (uint16 *)util_texture; /* First dump in the mouse cursor */ for (y=0; y<16; y++) { for (x=0; x<10; x++) { if (mouse1_xpm[y*10+x] == '.') *vram = 0xffff; else if (mouse1_xpm[y*10+x] == '+') *vram = 0xf000; else *vram = 0x0000; vram++; } vram += 256 - 10; } /* Now add the rest as ASCII characters */ vram = (uint16 *)util_texture; for (y=0; y<8; y++) { for (x=0; x<16; x++) { /* Skip the first (it's a mouse pointer) */ if (x != 0 || y != 0) bfont_draw(vram, 256, 0, y*16+x); vram += 16; } vram += 23*256; } /* Setup a polygon header for the util texture */ pvr_poly_cxt_txr(&cxt, PVR_LIST_TR_POLY, PVR_TXRFMT_ARGB4444 | PVR_TXRFMT_NONTWIDDLED, 256, 256, util_texture, PVR_FILTER_NONE); pvr_poly_compile(&util_txr_hdr, &cxt); }
static void MakeVideoTexture(video_txr_t *txr, int width, int height, int format, int filler) { pvr_poly_cxt_t tmp; int tw,th; for(tw = 8; tw < width ; tw <<= 1); for(th = 8; th < height; th <<= 1); txr->width = width; txr->height = height; txr->tw = tw; txr->th = th; if(txr->addr || txr->backbuf) { FreeVideoTexture(txr); } txr->backbuf = memalign(32, txr->tw * txr->height * 2); txr->addr = pvr_mem_malloc(tw * th * 2); pvr_poly_cxt_txr(&tmp, PVR_LIST_OP_POLY, format, tw, th, txr->addr, filler); pvr_poly_compile(&txr->hdr, &tmp); }
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]); } }
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; }
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; }
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; }