void render_tile_points(sem_render_context* ctx, sem_coordinate coord, sem_tile* tile) { for (uint8_t i=0; i<3; i++) { sem_track* track = tile->points[i]; if (track != NULL && track != tile->track) { render_track(ctx, coord, track); } } render_track(ctx, coord, tile->track); if (!sem_track_straight(tile->track)) { render_points_highlight(ctx, coord, tile->track); } }
void render_tile_signal(sem_render_context* ctx, sem_coordinate coord, sem_tile* tile) { render_track(ctx, coord, tile->track); cairo_save(ctx->cr); cairo_set_line_width(ctx->cr, 0.05); render_tile_rotate(ctx, coord, tile->track); switch (tile->signal->type) { case MAIN_AUTO: render_signal_main(ctx, tile); break; case MAIN_MANUAL: render_signal_main_manual(ctx, tile); render_signal_main(ctx, tile); break; case SUB: render_signal_sub(ctx, tile); break; } render_track_crossbar(ctx); cairo_set_source_rgb(ctx->cr, 0.0, 0.0, 0.0); cairo_stroke(ctx->cr); cairo_restore(ctx->cr); }
void render_tile_exit(sem_render_context* ctx, sem_coordinate coord, sem_tile* tile) { render_track(ctx, coord, tile->track); render_track_path(ctx, coord, tile->track); cairo_set_source_rgb(ctx->cr, 1.0, 0.2, 0.0); cairo_set_line_width(ctx->cr, ctx->style->track_front_width); cairo_stroke(ctx->cr); }
void render_siding(sem_render_context* ctx, sem_coordinate coord, sem_track* track) { render_track_path(ctx, coord, track); cairo_set_source(ctx->cr, ctx->style->siding_color); cairo_set_line_width(ctx->cr, 1.0); cairo_stroke_preserve(ctx->cr); cairo_set_source(ctx->cr, ctx->style->track_front_color); cairo_set_line_width(ctx->cr, ctx->style->station_front_width); cairo_stroke(ctx->cr); render_track(ctx, coord, track); }
void render_tile_track(sem_render_context* ctx, sem_coordinate coord, sem_track* track) { render_track(ctx, coord, track); if (track->next != NULL) { sem_track* t = sem_track_part_horizontal(track); if (t == NULL) t = sem_track_part_vertical(track); if (t != NULL) { cairo_set_source_rgb(ctx->cr, 0.0, 0.0, 0.0); render_track_crossing(ctx, coord, t); } } }
void render_depot(sem_render_context* ctx, sem_coordinate coord, sem_track* track) { render_track_path(ctx, coord, track); cairo_set_source_rgb(ctx->cr, 0.0, 0.0, 0.0); cairo_set_line_width(ctx->cr, ctx->style->depot_back_width); cairo_stroke_preserve(ctx->cr); cairo_set_source(ctx->cr, ctx->style->canvas); cairo_set_line_width(ctx->cr, ctx->style->depot_front_width); const double dash[] = {0.233, 0.1}; cairo_set_dash(ctx->cr, dash, 2, -0.05); cairo_stroke(ctx->cr); cairo_set_dash(ctx->cr, dash, 0, 0); render_track(ctx, coord, track); }
void render_tile_buffer(sem_render_context* ctx, sem_coordinate coord, sem_tile* tile) { render_track(ctx, coord, tile->track); cairo_save(ctx->cr); cairo_translate(ctx->cr, coord.x + 0.5, coord.y + 0.5); cairo_rotate(ctx->cr, sem_compass_rotation(tile->track->start)); double buffer_size = ctx->style->buffer_size; cairo_set_line_width(ctx->cr, 0.05); cairo_rectangle(ctx->cr, -buffer_size/2.0,-buffer_size/2.0,buffer_size,buffer_size); cairo_set_source(ctx->cr, ctx->style->buffer_color); cairo_fill_preserve(ctx->cr); cairo_set_source_rgb(ctx->cr, 0.0, 0.0, 0.0); cairo_stroke(ctx->cr); cairo_restore(ctx->cr); }
void render_tile_bell(sem_render_context* ctx, sem_coordinate coord, sem_track* track) { render_track(ctx, coord, track); if (track->next == NULL) { cairo_save(ctx->cr); render_tile_rotate(ctx, coord, track); render_track_crossbar(ctx); cairo_set_line_width(ctx->cr, 0.05); cairo_set_source_rgb(ctx->cr, 1.0, 0.2, 0.0); cairo_stroke(ctx->cr); cairo_restore(ctx->cr); } else { sem_track* t = sem_track_part_horizontal(track); if (t == NULL) t = sem_track_part_vertical(track); if (t != NULL) { cairo_set_source_rgb(ctx->cr, 1.0, 0.2, 0.0); render_track_crossing(ctx, coord, t); } } }
//================================================================ void render_track_scene(Canvas* c) { if(!is_scene_bound()) return; #ifdef DEBUG printf("\n--- Rendering Track Scene %d ---\n", BoundScene); #endif if(!is_track_scene(BoundScene)) { #ifdef DEBUG printf("%d is not a Track Scene\n", BoundScene); #endif return; } if( c == NULL ) { #ifdef DEBUG printf("Canvas is NULL\n"); #endif return; } TrackScene* ts = trackscenevec[BoundScene]; #ifdef DEBUG printf("Track Scene address at 0x%x\n", ts); #endif if(!ts) return; #ifdef DEBUG printf("Going to go through zorder of size %d\n", ts->zorder.size()); #endif // render back to front int i; for( i = ts->zorder.size() - 1; i > -1; --i) { #ifdef DEBUG printf("Rendering Track %d\n", ts->zorder[i]); float x, y, z; get_camera_position(c->camera,&x,&y,&z); printf("Camera position %.2f, %.2f\n", x, y); #endif if( ts->zorder[i] > -1 && ts->trackvec[ ts->zorder[i] ] != NULL) { render_track( ts->trackvec[ ts->zorder[i] ], c); } } // draw plugin free draw rectangles, scale so x,y,w,h are in meters glPushMatrix(); float scale = 1.0 / c->dpi_x * CM_PER_INCH / 100.0f; float indep_scale = c->w / c->w0; glScalef(1.0/scale,1.0/scale,1.0/scale); for( i = 0; i < ts->freedrawvec.size(); i++) { if( is_free_draw_scale_independent(ts->freedrawvec[i])) { glScalef( indep_scale, indep_scale, 1.0f); render_free_draw(ts->freedrawvec[i]); glScalef( 1.0 / indep_scale, 1.0 / indep_scale, 1.0f); } else { render_free_draw(ts->freedrawvec[i]); } } glPopMatrix(); }