Esempio n. 1
0
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);
	}
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
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);
}
Esempio n. 4
0
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);
}
Esempio n. 5
0
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);
		}
	}
}
Esempio n. 6
0
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);
}
Esempio n. 7
0
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);
}
Esempio n. 8
0
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);
		}
	}
}
Esempio n. 9
0
//================================================================
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();

}