void navit_draw(struct navit *this_) { transform_setup_source_rect(this_->trans); graphics_draw(this_->gra, this_->displaylist, this_->mapsets, this_->trans, this_->layouts, this_->route); this_->ready=1; }
void navit_draw(struct navit *this_) { GList *l; struct navit_vehicle *nv; transform_setup_source_rect(this_->trans); graphics_draw(this_->gra, this_->displaylist, this_->mapsets, this_->trans, this_->layouts, this_->route); l=this_->vehicles; while (l) { nv=l->data; cursor_redraw(nv->cursor); l=g_list_next(l); } this_->ready=1; }
void graphics_redraw(struct container *co) { int scale=transform_get_scale(co->trans); int i,slimit=255,tlimit=255,plimit=255; int bw[4],w[4],t[4]; struct display_list **disp=co->disp; struct graphics *gra=co->gra; #if 0 printf("scale=%d center=0x%lx,0x%lx mercator scale=%f\n", scale, co->trans->center.x, co->trans->center.y, transform_scale(co->trans->center.y)); #endif display_free(co->disp, display_end); transform_setup_source_rect(co->trans); gra->draw_mode(gra, draw_mode_begin); for (i = 0 ; i < data_window_type_end; i++) { data_window_begin(co->data_window[i]); } gra->gc_set_linewidth(gra->gc[GC_RAIL], 3); bw[0]=0; bw[1]=0; bw[2]=0; bw[3]=0; w[0]=1; w[1]=1; w[2]=1; w[3]=1; t[0]=0xf; t[1]=0xf; t[2]=0xf; t[3]=0xf; if (scale < 2) { tlimit=0xff; slimit=0xff; bw[0]=17; w[0]=15; bw[1]=19; w[1]=17; bw[2]=19; w[2]=17; bw[3]=21; w[3]=17; } else if (scale < 4) { tlimit=0xff; slimit=0xff; bw[0]=11; w[0]=9; bw[1]=13; w[1]=11; bw[2]=13; w[2]=11; bw[3]=15; w[3]=11; } else if (scale < 8) { tlimit=0xff; slimit=0xff; bw[0]=5; w[0]=3; bw[1]=11; w[1]=9; bw[2]=11; w[2]=9; bw[3]=13; w[3]=9; t[0]=0xa; t[1]=0xf; } else if (scale < 16) { tlimit=0xff; slimit=0xff; bw[1]=9; w[1]=7; bw[2]=9; w[2]=7; bw[3]=11; w[3]=7; t[0]=0x9; t[1]=0xe; } else if (scale < 32) { tlimit=0xff; slimit=0xff; bw[1]=5; w[1]=3; bw[2]=5; w[2]=3; bw[3]=5; w[3]=3; t[0]=0x8; t[1]=0xb; } else if (scale < 64) { tlimit=0xf; slimit=0x6; bw[1]=5; w[1]=3; bw[2]=5; w[2]=3; bw[3]=5; w[3]=3; t[0]=0x8; t[1]=0xa; } else if (scale < 128) { tlimit=0xc; slimit=0x6; plimit=0x1e; w[1]=3; w[2]=3; bw[3]=5; w[3]=3; t[0]=0x7; t[1]=0xa; } else if (scale < 256) { tlimit=0xb; slimit=0x5; plimit=0x1a; w[2]=3; bw[3]=5; w[3]=3; t[0]=0x7; t[1]=0x8; } else if (scale < 512) { tlimit=0x9; slimit=0x5; plimit=0x14; w[1]=0; w[2]=1; bw[3]=3; w[3]=1; t[0]=0x4; t[1]=0x7; } else if (scale < 1024) { tlimit=0x8; slimit=0x4; slimit=0x4; plimit=0x11; w[1]=0; w[2]=1; bw[3]=3; w[3]=1; t[0]=0x3; t[1]=0x5; } else if (scale < 2048) { tlimit=0x5; slimit=0x3; plimit=0x10; bw[3]=3; w[3]=1; t[0]=0x2; t[1]=0x4; } else if (scale < 4096) { bw[3]=3; w[3]=1; tlimit=0x4; slimit=0x2; plimit=0xf; t[0]=0x2; t[1]=0x3; } else if (scale < 8192) { bw[3]=3; w[3]=1; tlimit=0x3; slimit=0x2; plimit=0xf; t[0]=0x1; t[1]=0x2; } else { bw[3]=3; w[3]=1; tlimit=0x2; slimit=0x2; plimit=0xf; t[0]=0x1; t[1]=0x4; } gra->gc_set_linewidth(gra->gc[GC_STREET_SMALL], w[0]); gra->gc_set_linewidth(gra->gc[GC_STREET_NO_PASS], w[0]); gra->gc_set_linewidth(gra->gc[GC_STREET_SMALL_B], bw[0]); gra->gc_set_linewidth(gra->gc[GC_STREET_MID], w[1]); gra->gc_set_linewidth(gra->gc[GC_STREET_MID_B], bw[1]); gra->gc_set_linewidth(gra->gc[GC_STREET_BIG], w[2]); gra->gc_set_linewidth(gra->gc[GC_STREET_BIG_B], bw[2]); gra->gc_set_linewidth(gra->gc[GC_STREET_BIG2], w[3]); gra->gc_set_linewidth(gra->gc[GC_STREET_BIG2_B], bw[3]); gra->gc_set_linewidth(gra->gc[GC_STREET_ROUTE], w[3]+7+w[3]/2); profile_timer(NULL); graphics_draw(co->map_data, file_border_ply, co, display_rail, plimit, 48, poly_draw_block); graphics_draw(co->map_data, file_woodland_ply, co, display_wood, plimit, 48, poly_draw_block); graphics_draw(co->map_data, file_other_ply, co, display_other, plimit, 48, poly_draw_block); graphics_draw(co->map_data, file_town_twn, co, display_town, tlimit, 48, town_draw_block); graphics_draw(co->map_data, file_water_ply, co, display_water, plimit, 48, poly_draw_block); graphics_draw(co->map_data, file_sea_ply, co, display_sea, plimit, 48, poly_draw_block); /* todo height, tunnel, bridge, street_bti ??? */ #if 0 graphics_draw(co->map_data, file_height_ply, co, display_other1, plimit, 48, poly_draw_block); #endif if (scale < 256) { graphics_draw(co->map_data, file_rail_ply, co, display_rail, plimit, 48, poly_draw_block); } profile_timer("map_draw"); plugin_call_draw(co); profile_timer("plugin"); #if 0 draw_poly(map, &co->d_tunnel_ply, "Tunnel", 0, 11, plimit); #endif graphics_draw(co->map_data, file_street_str, co, display_street, slimit, 7, street_draw_block); display_draw(disp[display_sea], gra, gra->gc[GC_WATER_FILL], NULL); display_draw(disp[display_wood], gra, gra->gc[GC_WOOD], NULL); display_draw(disp[display_other], gra, gra->gc[GC_TOWN_FILL], gra->gc[GC_TOWN_LINE]); display_draw(disp[display_other1], gra, gra->gc[GC_BUILDING], NULL); display_draw(disp[display_other2], gra, gra->gc[GC_BUILDING_2], NULL); display_draw(disp[display_other3], gra, gra->gc[GC_PARK], NULL); display_draw(disp[display_water], gra, gra->gc[GC_WATER_FILL], gra->gc[GC_WATER_LINE]); display_draw(disp[display_rail], gra, gra->gc[GC_RAIL], NULL); street_route_draw(co); display_draw(disp[display_street_route], gra, gra->gc[GC_STREET_ROUTE], NULL); if (bw[0]) { display_draw(disp[display_street_no_pass], gra, gra->gc[GC_STREET_SMALL_B], NULL); display_draw(disp[display_street], gra, gra->gc[GC_STREET_SMALL_B], NULL); } if (bw[1]) display_draw(disp[display_street1], gra, gra->gc[GC_STREET_MID_B], NULL); if (bw[2]) display_draw(disp[display_street2], gra, gra->gc[GC_STREET_BIG_B], NULL); if (bw[3]) display_draw(disp[display_street3], gra, gra->gc[GC_STREET_BIG2_B], NULL); if (w[0]) { display_draw(disp[display_street_no_pass], gra, gra->gc[GC_STREET_NO_PASS], NULL); display_draw(disp[display_street], gra, gra->gc[GC_STREET_SMALL], NULL); } if (w[1]) display_draw(disp[display_street1], gra, gra->gc[GC_STREET_MID], gra->gc[GC_BLACK]); display_draw(disp[display_street2], gra, gra->gc[GC_STREET_BIG], gra->gc[GC_BLACK]); display_draw(disp[display_street3], gra, gra->gc[GC_STREET_BIG2], gra->gc[GC_BLACK]); if (w[3] > 1) display_draw(disp[display_street3], gra, gra->gc[GC_STREET_BIG2_L], NULL); display_draw(disp[display_poi], gra, gra->gc[GC_BLACK], NULL); profile_timer("display_draw"); if (scale < 2) { display_labels(disp[display_street], gra, gra->gc[GC_TEXT_FG], gra->gc[GC_TEXT_BG], gra->font[1]); display_labels(disp[display_street1], gra, gra->gc[GC_TEXT_FG], gra->gc[GC_TEXT_BG], gra->font[1]); } else { display_labels(disp[display_street], gra, gra->gc[GC_TEXT_FG], gra->gc[GC_TEXT_BG], gra->font[0]); display_labels(disp[display_street1], gra, gra->gc[GC_TEXT_FG], gra->gc[GC_TEXT_BG], gra->font[0]); } display_labels(disp[display_street2], gra, gra->gc[GC_TEXT_FG], gra->gc[GC_TEXT_BG], gra->font[0]); display_labels(disp[display_street3], gra, gra->gc[GC_TEXT_FG], gra->gc[GC_TEXT_BG], gra->font[0]); for (i = display_town+t[1] ; i < display_town+0x10 ; i++) display_labels(disp[i], gra, gra->gc[GC_TEXT_FG], gra->gc[GC_TEXT_BG], gra->font[0]); for (i = display_town+t[0] ; i < display_town+t[1] ; i++) display_labels(disp[i], gra, gra->gc[GC_TEXT_FG], gra->gc[GC_TEXT_BG], gra->font[1]); for (i = display_town ; i < display_town+t[0] ; i++) display_labels(disp[i], gra, gra->gc[GC_TEXT_FG], gra->gc[GC_TEXT_BG], gra->font[2]); for (i = display_town ; i < display_town+0x10 ; i++) display_draw(disp[i], gra, gra->gc[GC_BLACK], NULL); display_draw(disp[display_bti], gra, gra->gc[GC_BLACK], NULL); profile_timer("labels"); gra->draw_mode(gra, draw_mode_end); for (i = 0 ; i < data_window_type_end; i++) { data_window_end(co->data_window[i]); } #if 0 map_scrollbars_update(map); #endif }
void graphics_hud_draw(hud_t *hud, float attitude[3], float speed, float altitude, float track, float bearing, float distance, const char *waypoint) { DEBUG("graphics_hud_draw()"); assert(hud != 0); assert(attitude != 0); assert(waypoint != 0); const char *wpt_name = waypoint[0] ? waypoint : "???"; // Print labels char str[32]; snprintf(str, sizeof(str), "%.0f km/h", speed); graphics_label_set_text(hud->speed_label, str); snprintf(str, sizeof(str), "%.0f m", altitude); graphics_label_set_text(hud->altitude_label, str); snprintf(str, sizeof(str), "%s, %.1f km", wpt_name, distance); graphics_label_set_text(hud->waypoint_label, str); float hangle, vangle; // Draw static labels graphics_draw(hud->g, hud->speed_label, 10, 10, 1, 0); graphics_draw(hud->g, hud->waypoint_label, hud->g->width / 2, 10, 1, 0); graphics_draw(hud->g, hud->altitude_label, hud->g->width - 10, 10, 1, 0); // Draw horizon line vangle = -attitude[1]; vangle = vangle < M_PI ? vangle : vangle - 2 * M_PI; vangle = vangle > -M_PI ? vangle : vangle + 2 * M_PI; if(vangle < hud->vfov / -2.0) graphics_draw(hud->g, hud->horizon_alt, hud->g->width / 2, 100, 1, 0); else if(vangle > hud->vfov / 2.0) graphics_draw(hud->g, hud->horizon_alt, hud->g->width / 2, (float)hud->g->height - 100, 1, M_PI); else graphics_draw(hud->g, hud->horizon_line, hud->g->width / 2, (float)hud->g->height / 2 + (float)hud->g->height * vangle / hud->vfov, 1, -attitude[0]); // Draw compass lines graphics_draw(hud->g, hud->compass_lines, (float)hud->g->width / 2 - (float)hud->g->width * attitude[2] / hud->hfov, hud->g->height - hud->font_size - 10, 1, 0); if(attitude[2] < hud->hfov / 2) graphics_draw(hud->g, hud->compass_lines, (float)hud->g->width / 2 - (float)hud->g->width * (attitude[2] + 2 * M_PI) / hud->hfov, hud->g->height - hud->font_size - 10, 1, 0); if(attitude[2] > 2 * M_PI - hud->hfov / 2) graphics_draw(hud->g, hud->compass_lines, (float)hud->g->width / 2 - (float)hud->g->width * (attitude[2] - 2 * M_PI) / hud->hfov, hud->g->height - hud->font_size - 10, 1, 0); // Draw compass labels int i; for(i = 0; i < COMPASS_LABEL_NUM; i++) { hangle = attitude[2] - i * 2 * M_PI / COMPASS_LABEL_NUM; hangle = hangle < M_PI ? hangle : hangle - 2 * M_PI; hangle = hangle > -M_PI ? hangle : hangle + 2 * M_PI; if((hangle < hud->hfov / -2.0) || (hangle > hud->hfov / 2.0)) continue; graphics_draw(hud->g, hud->compass_labels[i], (float)hud->g->width / 2 - (float)hud->g->width * hangle / hud->hfov, hud->g->height - 3, 1, 0); } // Draw track marker hangle = track - attitude[2]; hangle = hangle < M_PI ? hangle : hangle - 2 * M_PI; hangle = hangle > -M_PI ? hangle : hangle + 2 * M_PI; if(hangle < hud->hfov / -2.0) hangle = hud->hfov / -2.0; if(hangle > hud->hfov / 2.0) hangle = hud->hfov / 2.0; graphics_draw(hud->g, hud->track_marker, (float)hud->g->width / 2 + (float)hud->g->width * hangle / hud->hfov, hud->g->height - hud->font_size - 12, 1, 0); // Draw bearing marker hangle = bearing - attitude[2]; hangle = hangle < M_PI ? hangle : hangle - 2 * M_PI; hangle = hangle > -M_PI ? hangle : hangle + 2 * M_PI; if(hangle < hud->hfov / -2.0) hangle = hud->hfov / -2.0; if(hangle > hud->hfov / 2.0) hangle = hud->hfov / 2.0; graphics_draw(hud->g, hud->bearing_marker, (float)hud->g->width / 2 + (float)hud->g->width * hangle / hud->hfov, hud->g->height - hud->font_size - 10, 1, 0); }
void application_mainloop(application_t *app) { DEBUG("application_mainloop()"); assert(app != 0); void *data; size_t length; float att[3], alt, spd, trk, brg, dst; char wpt[32]; float accsum[3]; float difftime; while(1) { // Process video if(!video_read(app->video, &data, &length)) { ERROR("Cannot read from video device"); break; } graphics_image_set_bitmap(app->image, data, length); graphics_draw(app->graphics, app->image, app->window_width / 2, app->window_height / 2, (float)app->window_width / (float)app->window_height < (float)app->video_width / (float)app->video_height ? (float)app->window_height / (float)app->video_height : (float)app->window_width / (float)app->video_width, 0); imu_get_attitude(app->imu, att); gps_get_pos(app->gps, NULL, NULL, &alt); imu_get_acceleration(app->imu, accsum, &difftime); gps_inertial_update(app->gps, accsum[0], accsum[1], accsum[2], difftime); // Draw landmarks void *iterator; float hangle, vangle, dist; drawable_t *label = gps_get_projection_label(app->gps, &hangle, &vangle, &dist, att, &iterator); while(iterator) { if((hangle > app->video_hfov / -2.0) && (hangle < app->video_hfov / 2.0) && (vangle > app->video_vfov / -2.0) && (vangle < app->video_vfov / 2.0) && (dist < app->visible_distance)) { INFO("Projecting landmark hangle = %f, vangle = %f, distance = %f", hangle, vangle, dist / 1000.0); uint32_t x = (float)app->window_width / 2 + (float)app->window_width * hangle / app->video_hfov; uint32_t y = (float)app->window_height / 2 + (float)app->window_height * vangle / app->video_vfov; graphics_draw(app->graphics, label, x, y, 1, 0); } label = gps_get_projection_label(app->gps, &hangle, &vangle, &dist, att, &iterator); } // Draw HUD overlay gps_get_track(app->gps, &spd, &trk); gps_get_route(app->gps, wpt, &dst, &brg); graphics_hud_draw(app->hud, att, spd, alt, trk, brg, dst, wpt); // Render to screen if(!graphics_flush(app->graphics, NULL)) { ERROR("Cannot draw"); break; } } }
static void pedestrian_cmd_pedestrian_rocket(struct rocket *rocket) { struct attr attr; int max=0; #if 0 int i,step=10; #endif rocket->a=2; rocket->g=1; rocket->t=100; rocket->hog=0; rocket->v=0; rocket->vscale=10; if (! navit_get_attr(rocket->navit, attr_graphics, &attr, NULL)) return; rocket->gra=attr.u.graphics; if (! navit_get_attr(rocket->navit, attr_transformation, &attr, NULL)) return; rocket->trans=attr.u.transformation; if (! navit_get_attr(rocket->navit, attr_displaylist, &attr, NULL)) return; rocket->dl=attr.u.displaylist; if (! navit_get_attr(rocket->navit, attr_mapset, &attr, NULL)) return; rocket->ms=attr.u.mapset; transform_set_hog(rocket->trans, max); transform_set_order_base(rocket->trans, 14); transform_set_scale(rocket->trans, transform_get_scale(rocket->trans)); transform_setup_source_rect(rocket->trans); graphics_overlay_disable(rocket->gra, 1); graphics_draw(rocket->gra, rocket->dl, rocket->ms, rocket->trans, rocket->layout, 0, NULL, 0); sensors_locked=1; if (!rocket->idle) rocket->idle=event_add_idle(50, rocket->callback); #if 0 while (hog >= 0) { transform_set_hog(trans, hog); #if 0 graphics_draw(gra, dl, ms, trans, layout, 0, NULL); #else graphics_displaylist_draw(gra, dl, trans, layout, 0); #endif v=v+a-g; if (t > 0) t--; else a=0; hog=hog+v/vscale; } #if 0 for (i = 0 ; i < max ; i+=step) { transform_set_hog(trans, i); graphics_displaylist_draw(gra, dl, trans, layout, 0); } for (i = max ; i >= 0 ; i-=step) { transform_set_hog(trans, i); graphics_displaylist_draw(gra, dl, trans, layout, 0); } #endif #endif }