#include #include #include #include #include #include #include #include #include #include #include #include #include "include/camera.h" #include "include/segment.h" #include "parameters.h" #include "include/circuit.h" #include "include/drawstuff.h" //extern bopti_image_t car1, car2, car3, car4, car5, car6, car7, car8; std::vector circuit; camera *cam; bool stop = false; bool record = false; bool screenshot = false; uint16_t currentcurve=0; uint8_t shiftcolor=0; float speed = 0; float maxspeedforward = 8; float maxspeedbackward = 4; int direction = 1; bool speedcontrol = false; static void get_inputs( float dt ) { key_event_t ev; while((ev = pollevent()).type != KEYEV_NONE) { } speedcontrol = false; if(keydown(KEY_LEFT)) cam->decX(25.0); if(keydown(KEY_RIGHT)) cam->incX(25.0); if(keydown(KEY_SHIFT)) { if (direction==-1 && speed > 0) { direction = -1; speed -= 0.5; if (speed<0) speed=0; cam->decZ(speed*dt); } else { direction = 1; speed+=0.05; if (speed>maxspeedforward) speed=maxspeedforward; cam->incZ(speed*dt); } speedcontrol = true; } if(keydown(KEY_ALPHA)) { if (direction==1 && speed > 0) { direction = 1; speed -= 0.5; if (speed<0) speed=0; cam->incZ(speed*dt); } else { direction = -1; speed+=0.025; if (speed>maxspeedbackward) speed=maxspeedbackward; cam->decZ(speed*dt); } speedcontrol = true; } //if(keydown(KEY_7)) cam->incY(10.0); //if(keydown(KEY_1)) cam->decY(10.0); //if(keydown(KEY_MENU)) gint_osmenu(); if(keydown(KEY_EXIT)) stop = true; if(keydown(KEY_F6)) record = !record; if(keydown(KEY_F4)) screenshot = true; if (speedcontrol==false) { speed-=0.3; if (speed<0) speed=0; if (direction==1) cam->incZ(speed*dt); else cam->decZ(speed*dt); } } int main(void) { __printf_enable_fp(); __printf_enable_fixed(); usb_interface_t const *interfaces[] = { &usb_ff_bulk, NULL }; usb_open(interfaces, GINT_CALL_NULL); prof_t perf_create, perf_project, perf_render; uint32_t time_create=0, time_project=0, time_render=0; prof_init(); int nbInterestingSegments = (MAX_RENDER_DISTANCE / SEGMENT_LENGTH) + 10; // the number of segments to be projected considering the rendering distance //-------------- initData( ); //-------------- perf_create = prof_make(); prof_enter(perf_create); createCircuit(); prof_leave(perf_create); time_create = prof_time(perf_create); //-------------- int indexstart = 0; uint32_t maxDistance = (MAX_SEGMENT-nbInterestingSegments-5)*SEGMENT_LENGTH; uint32_t dt=0; uint16_t l=0; while (!stop) { get_inputs( dt ); dt = ((float) (time_render+time_project) / 1000.0); //-------------- if (fround(cam->cZ)<=0) cam->cZ=fixdouble(0.0); if (fround(cam->cZ)>=maxDistance) cam->cZ=fixdouble(maxDistance); indexstart = (fround(cam->cZ) - 400) / SEGMENT_LENGTH; // there is an offset equals to 400 on z position // this is to compute the first index of segment to be projected to screen if (indexstart<0) indexstart=0; if (indexstart>MAX_SEGMENT-nbInterestingSegments-5-1) indexstart=MAX_SEGMENT-nbInterestingSegments-5-1; //-------------- perf_project = prof_make(); prof_enter(perf_project); for (int k=indexstart; kcX ) ); dprint( 300, 15, C_WHITE, "CamY= %d", fround( cam->cY ) ); dprint( 300, 29, C_WHITE, "CamZ= %d", fround( cam->cZ ) ); dprint( 280, 55, C_WHITE, "Dir = %d", direction ); dprint( 280, 69, C_WHITE, "Spd = %.1f", speed ); dprint( 280, 83, C_WHITE, "Dz = %.1f", speed*dt ); dprint( 280, 97, C_WHITE, "dt = %.3D ms", dt ); //r61524_display(gint_vram, 0, DHEIGHT, R61524_DMA_WAIT); dupdate(); prof_leave(perf_render); time_render = prof_time(perf_render); if (screenshot && usb_is_open()) { usb_fxlink_screenshot(true); screenshot = false; } if(record && usb_is_open()) { usb_fxlink_videocapture(false); } l++; } prof_quit(); usb_close(); circuit.clear(); delete cam; return 1; }