int drawsprite(struct render_buffer *rb, struct sprite *s, struct sprite_trans * ts) { struct sprite_trans temp; struct matrix temp_matrix; struct sprite_trans *t = sprite_trans_mul(&s->t, ts, &temp, &temp_matrix); switch (s->type) { case TYPE_PICTURE: return drawquad(rb, s->s.pic, t); case TYPE_POLYGON: return drawpolygon(rb, s->s.poly, t); case TYPE_ANIMATION: { struct pack_animation *ani = s->s.ani; int frame = s->frame % s->total_frame; if (frame < 0) { frame += s->total_frame; } frame += s->start_frame; struct pack_frame * pf = OFFSET_TO_POINTER(struct pack_frame, s->pack, ani->frame); pf = &pf[frame]; int i; for (i=0; i<pf->n; i++) { struct pack_part *pp = OFFSET_TO_POINTER(struct pack_part, s->pack, pf->part); pp = &pp[i]; int index = pp->component_id; struct sprite * child = s->data.children[index]; if (child == NULL || (child->flags & SPRFLAG_INVISIBLE)) { continue; } struct sprite_trans temp2; struct matrix temp_matrix2; struct sprite_trans *ct = sprite_trans_mul2(s->pack, &pp->t, t, &temp2, &temp_matrix2); int r = drawsprite(rb, child, ct); if (r) return r; } return 0; } case TYPE_LABEL: if (s->data.rich_text) { // don't support draw label to renderbuffer return -1; } return 0; case TYPE_ANCHOR: if (s->data.anchor->ps) { return -1; } anchor_update(s, t); return 0; case TYPE_PANNEL: if (s->data.scissor) { return -1; } else { return 0; } } return -1; }
void engine_draw_frame(void) { float h2=(float)height/2.25f; if(display==NULL) return; if(fTime>(1.0f/20.0f)) { float iTimeFull; PullData(); iTimeFull=(MSDat.iTimeX*65536)+ShortSwap(MSDat.iTime); RPM=iTimeFull>0?(60000000*2.0f)/(iTimeFull*4):0; //0 to 8000 CLT=cltTable[MSDat.cltADC]; //-115 to 430 TPS=tpsTable[MSDat.tpsADC]; //-11 to 128 BAT=(float)MSDat.batADC/255.0f*30.0f; //7 to 21 MAP=(float)MSDat.mapADC; //0 to 255 MAT=matTable[MSDat.matADC]; //-85 to 430 AFR=10+(MSDat.egoADC*0.039216); //10 to 19.4 ADV=(MSDat.advance*0.352)-10; //50 to -10 fTime=0.0f; } glClear(GL_COLOR_BUFFER_BIT); glUseProgram(Objects[GLSL_GAUGE_SHADER]); glUniform1i(Objects[GLSL_GAUGE_TEX], 0); glUniform1f(Objects[GLSL_GAUGE_WIDTH], (float)width); glUniform1f(Objects[GLSL_GAUGE_HEIGHT], (float)height); glActiveTexture(GL_TEXTURE0); glUniform1f(Objects[GLSL_GAUGE_AMOUNT], RPM/8000.0f); glBindTexture(GL_TEXTURE_2D, Objects[TEXTURE_RPM]); drawquad(0.0f, h2, h2); glUniform1f(Objects[GLSL_GAUGE_AMOUNT], (CLT+40)/(250+40)); glBindTexture(GL_TEXTURE_2D, Objects[TEXTURE_CLT]); drawquad(h2, h2, h2); glUniform1f(Objects[GLSL_GAUGE_AMOUNT], TPS/100); glBindTexture(GL_TEXTURE_2D, Objects[TEXTURE_TPS]); drawquad(h2+h2, h2, h2); glUniform1f(Objects[GLSL_GAUGE_AMOUNT], (BAT-7)/(21-7)); glBindTexture(GL_TEXTURE_2D, Objects[TEXTURE_BAT]); drawquad(h2+h2+h2, h2, h2); glUniform1f(Objects[GLSL_GAUGE_AMOUNT], MAP/255.0f); glBindTexture(GL_TEXTURE_2D, Objects[TEXTURE_MAP]); drawquad(0.0f, 0.0f, h2); glUniform1f(Objects[GLSL_GAUGE_AMOUNT], (MAT+40)/(220+40)); glBindTexture(GL_TEXTURE_2D, Objects[TEXTURE_MAT]); drawquad(h2, 0.0f, h2); glUniform1f(Objects[GLSL_GAUGE_AMOUNT], (AFR-10)/(19-10)); glBindTexture(GL_TEXTURE_2D, Objects[TEXTURE_AFR]); drawquad(h2+h2, 0.0f, h2); glUniform1f(Objects[GLSL_GAUGE_AMOUNT], (ADV+10)/(50+10)); glBindTexture(GL_TEXTURE_2D, Objects[TEXTURE_IGN]); drawquad(h2+h2+h2, 0.0f, h2); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); Font_Print(0+100, h2+75, "%0.2f", RPM); Font_Print(h2+100, h2+75, "%0.2f", CLT); Font_Print(h2+h2+100, h2+75, "%0.2f", TPS); Font_Print(h2+h2+h2+100, h2+75, "%0.2f", BAT); Font_Print(0+100, 0+75, "%0.2f", MAP); Font_Print(h2+100, 0+75, "%0.2f", MAT); Font_Print(h2+h2+100, 0+75, "%0.2f", AFR); Font_Print(h2+h2+h2+100, 0+75, "%0.2f", ADV); Font_Print(0, 0, "FPS %0.3f\n%s", FPS, MSVer); glDisable(GL_BLEND); eglSwapBuffers(display, surface); }