Here is a simple graphics program that produces an image of a three dimensional polygon and line, and a two dimensional pixel block.
/*------------------------------------------------------ example_graphics.c This program demonstrates the use of the BIC Graphics Library by creating a window and displaying some objects through a simple interaction mechanism. ------------------------------------------------------ */ #include <graphics.h> #define LIGHT_INDEX 0 int main( int argc, char *argv[] ) { Status status; window_struct *window, *event_window; text_struct text; lines_struct lines; polygons_struct polygons; pixels_struct pixels; static Surfprop spr = { 0.2, 0.5, 0.5, 20.0, 1.0 }; Point point; Vector normal, light_direction; Event_types event_type; BOOLEAN update_required, done; int key_pressed; int x_position, y_position, x_size, y_size; int i, j, pixels_x_size, pixels_y_size; static Point origin = { 0.0, 0.0, 2.0 }; static Vector up_direction = { 0.0, 1.0, 0.0 }; static Vector line_of_sight = { 0.0, 0.0, -1.0 }; /* ------- create a graphics window ------ */ status = G_create_window( "Test Window", -1, -1, -1, -1, &window ); /*--- define the 3D view */ G_set_3D_view( window, &origin, &line_of_sight, &up_direction, 0.01, 4.0, ON, 2.0, FALSE, 0.0, 2.0, 2.0 ); /* -------- define text to be drawn (text.string will be filled in later) ----- */ fill_Point( point, 10.0, 10.0, 0.0 ); initialize_text( &text, &point, make_Colour(255,0,255), SIZED_FONT, 14.0 ); text.string[0] = (char) 0; /* ------------ define line to be drawn ------------- */ initialize_lines( &lines, make_Colour(255,255,0) ); lines.n_points = 4; ALLOC( lines.points, 4 ); fill_Point( lines.points[0], 0.0, 0.0, 0.0 ); fill_Point( lines.points[1], 1.0, 1.0, 0.0 ); fill_Point( lines.points[2], -0.3, 1.0, -1.0 ); fill_Point( lines.points[3], 0.5, 0.4, 0.0 ); lines.n_items = 3; ALLOC( lines.end_indices, lines.n_items ); lines.end_indices[0] = 2; lines.end_indices[1] = 4; lines.end_indices[2] = 5; ALLOC( lines.indices, lines.end_indices[lines.n_items-1] ); lines.indices[0] = 0; lines.indices[1] = 1; lines.indices[2] = 0; lines.indices[3] = 2; lines.indices[4] = 3; /* ------------ define pixels to be drawn ------------- */ pixels_x_size = 256; pixels_y_size = 256; x_position = 10; y_position = 10; initialize_pixels( &pixels, x_position, y_position, pixels_x_size, pixels_y_size, 1.0, 1.0, RGB_PIXEL ); for_less( i, 0, pixels_x_size ) { for_less( j, 0, pixels_y_size ) { PIXEL_RGB_COLOUR(pixels,i,j) = make_Colour( i % 256, j % 256, 0 ); } } /* ------------ define polygons to be drawn ------------- */ initialize_polygons( &polygons, make_Colour(0,255,255), &spr ); start_new_polygon( &polygons ); fill_Point( point, -0.3, -0.3, 0.0 ); fill_Vector( normal, 0.0, 0.0, 1.0 ); add_point_to_polygon( &polygons, &point, &normal ); fill_Point( point, 0.3, -0.3, 0.0 ); add_point_to_polygon( &polygons, &point, &normal ); fill_Point( point, 0.3, 0.3, 0.0 ); add_point_to_polygon( &polygons, &point, &normal ); fill_Point( point, -0.3, 0.3, 0.0 ); add_point_to_polygon( &polygons, &point, &normal ); /* ------------ define a directional light from over the left shoulder ----------------- */ fill_Vector( light_direction, 1.0, 1.0, -1.0 ); G_define_light( window, LIGHT_INDEX, DIRECTIONAL_LIGHT, make_Colour(255,255,255), &light_direction, (Point *) 0, 0.0, 0.0 ); G_set_light_state( window, LIGHT_INDEX, ON ); G_set_lighting_state( window, ON ); /* --------------------------------------- */ /* ------------ do main loop ------------- */ /* --------------------------------------- */ update_required = TRUE; print( "Hit left mouse button to exit\n" ); done = FALSE; do { /* ----- get events until none found ------- */ do { event_type = G_get_event( &event_window, &key_pressed ); if( event_window == window ) { switch( event_type ) { case KEY_DOWN_EVENT: print( "Key pressed: \"%c\"\n", key_pressed ); break; case KEY_UP_EVENT: print( "Key released: \"%c\"\n", key_pressed ); break; case LEFT_MOUSE_DOWN_EVENT: print( "Left mouse DOWN\n" ); done = TRUE; break; case WINDOW_REDRAW_EVENT: print( "Window will be redrawn.\n" ); update_required = TRUE; break; case WINDOW_RESIZE_EVENT: G_get_window_position( window, &x_position, &y_position ); G_get_window_size( window, &x_size, &y_size ); print( "Window resized, " ); print( " new position: %d %d\n", x_position, y_position ); print( " new size: %d %d\n", x_size, y_size ); update_required = TRUE; break; } } } /* break to do update when no events */ while( event_type != NO_EVENT ); /* ------- if one or more events caused an update, redraw the screen */ if( update_required ) { /* ----- clear the window */ G_clear_window( window ); /* ----- draw the objects */ G_draw_pixels( window, &pixels ); G_set_view_type( window, MODEL_VIEW ); G_draw_lines( window, &lines ); G_draw_polygons( window, &polygons ); G_set_view_type( window, PIXEL_VIEW ); G_draw_text( window, &text ); /* ----- finished drawing scene, now update */ G_update_window( window ); update_required = FALSE; } } while( !done ); /* ----- delete drawing objects and window (text does not need to be deleted */ delete_lines( &lines ); delete_polygons( &polygons ); delete_pixels( &pixels ); status = G_delete_window( window ); G_terminate(); return( status != OK ); }