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)); }
/* 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 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)); }
/* 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)); }
void Font::printVl(frenda::System *sys, float x, float y, float z, int start, int printLen, const char *fmt, va_list vl) { unsigned char buf[1024]; vsnprintf((char*)buf, sizeof(buf), fmt, vl); if(start == -1) start = 0; if(printLen == -1) printLen = strlen((char*)buf); sys->pvr->setTexture(PVR_LIST_TR_POLY, texture); sys->pvr->sendPolygonHeader(PVR_LIST_TR_POLY); sys->pvr->beginPrimitives(PVR_LIST_TR_POLY); float cr = colorR, cg = colorG, cb = colorB, ca = colorA; float cx = x, cy = y; // TODO alpha not applied during rendering?! for(int i = start; i < start + printLen; i++) { if((buf[i] == '{' && buf[i + 1] == 'n') || buf[i] == '\n') { cx = x; cy += getScaledHeight(); if(buf[i] != '\n') i += 2; } else if(buf[i] == '{') { if(buf[i + 1] == 'c') { if(buf[i + 2] == '}') { cr = colorR; cg = colorG; cb = colorB; i += 2; } else { int r, g, b; sscanf((char*)&buf[i + 2], "%02x%02x%02x", &r, &g, &b); cr = ((unsigned char)r) / 255.0f; cg = ((unsigned char)g) / 255.0f; cb = ((unsigned char)b) / 255.0f; i += 8; } } else if(buf[i + 1] == 'a') { if(buf[i + 2] == '}') { ca = colorA; i += 2; } else { int a; sscanf((char*)&buf[i + 2], "%02x", &a); ca = ((unsigned char)a) / 255.0f; i += 4; } } else if(buf[i + 1] == 'p') { break; } } else { CharacterDataStruct *chdata = NULL; for(uint32 j = 0; j < characterList.characterCount; j++) { if(characterList.characters[j].characterCode == (uint32)buf[i]) { chdata = &characterList.characters[j]; break; } } if(chdata) { if(chdata->characterCode != 0x20) { float w = chdata->characterWidth, h = chdata->characterHeight; float u1 = (chdata->fontXCoord / texture->w); float u2 = ((chdata->fontXCoord + w) / texture->w); float v1 = (chdata->fontYCoord / texture->h); float v2 = ((chdata->fontYCoord + h) / texture->h); w *= scale; h *= scale; uint32 col = PVR_PACK_COLOR(ca, cr, cg, cb); sys->pvr->sendVertex03(PLX_VERT, cx, cy, z, u1, v1, col, 0); sys->pvr->sendVertex03(PLX_VERT, cx, cy + h, z, u1, v2, col, 0); sys->pvr->sendVertex03(PLX_VERT, cx + w, cy, z, u2, v1, col, 0); sys->pvr->sendVertex03(PLX_VERT_EOS, cx + w, cy + h, z, u2, v2, col, 0); cx += w; } else cx += (chdata->characterWidth * scale); } else cx += (12.0f * scale); } } sys->pvr->endPrimitives(); sys->pvr->setTexture(PVR_LIST_TR_POLY, NULL); sys->pvr->sendPolygonHeader(PVR_LIST_TR_POLY); }