Exemple #1
0
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; 
}
Exemple #2
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));
}
Exemple #3
0
/* 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));
}
Exemple #4
0
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));
}
Exemple #5
0
/* 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));
}
Exemple #6
0
	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);
	}