/// Convenience function for calculating statistics not required by int Dataset::calculate_extra_stats(){ calculate_ellipses(); calculate_surface(); return 1; }
/* * Initialization of buffers and EduRaster structures. */ static void setup(){ /* Allocate depth buffer */ depth_buffer = (float*)malloc(window_width*window_height*sizeof(float)); if(depth_buffer == NULL){ fprintf(stderr, "Unable to create depth buffer. Out of memory\n"); quit(); } /* Allocate color buffer */ color_buffer = (unsigned int*)malloc(window_width*window_height*sizeof(unsigned int)); if(color_buffer == NULL){ fprintf(stderr, "Unable to create color buffer. Out of memory\n"); quit(); } /* Init EduRaster */ if(er_init() != 0) { fprintf(stderr, "Unable to init eduraster: %s\n", er_get_error_string(er_get_error())); quit(); } er_viewport(0, 0, window_width, window_height); /* Set Perspective Projection */ er_matrix_mode(ER_PROJECTION); er_load_identity(); er_perspective(60.0f, (float)window_width / (float)window_height, 2.0f, 50.0f); er_matrix_mode(ER_MODELVIEW); /* Allocate buffer for vertex data */ points = (float *)malloc(sizeof(float) * 6 * samples_t * samples_s); if(points == NULL){ fprintf(stderr, "Unable to create vertex data for surface. Out of memory\n"); quit(); } /* Allocate buffer for indices */ index_size = (samples_s - 1) * (samples_t - 1) * 6; index_data = (unsigned int*)malloc( index_size * sizeof(unsigned int)); if(index_data == NULL){ fprintf(stderr, "Unable to create indices for surface. Out of memory\n"); quit(); } /* Calculate indices */ int width = (samples_t-1) * 6, i ,j; for(i = 0; i < samples_s - 1; i++){ for(j = 0; j < samples_t - 1; j++){ // Up Triangle index_data[i*width + j*6 ] = i * samples_t + j; index_data[i*width + j*6 + 1] = (i+1) * samples_t + j; index_data[i*width + j*6 + 2] = i * samples_t + (j + 1); // Down Triangle index_data[i*width + j*6 + 3] = i * samples_t + (j+1); index_data[i*width + j*6 + 4] = (i+1) * samples_t + j; index_data[i*width + j*6 + 5] = (i+1) * samples_t + (j+1); } } /* Evaluate surface equations */ calculate_surface(); /* Create vertex array for surface */ va = er_create_vertex_array(); if(va == NULL){ fprintf(stderr, "Unable to create vertex array: %s\n", er_get_error_string(er_get_error())); quit(); } er_use_vertex_array(va); er_vertex_pointer(va, 6, 3, points ); er_normal_pointer(va, 6, &points[3] ); er_enable_attribute_array(va, ER_VERTEX_ARRAY, ER_TRUE); er_enable_attribute_array(va, ER_NORMAL_ARRAY, ER_TRUE); /* Create program for surface lighting */ program_surface_light = er_create_program(); if(program_surface_light == NULL){ fprintf(stderr, "Unable to create eduraster program: %s\n", er_get_error_string(er_get_error())); quit(); } er_use_program(program_surface_light); er_varying_attributes(program_surface_light, 6); er_load_fragment_shader(program_surface_light, fragment_shader_light); er_load_vertex_shader(program_surface_light, vertex_shader_light); er_load_homogeneous_division(program_surface_light, homogeneous_division_light); er_uniformf(program_surface_light, 0, 0.5773503f); er_uniformf(program_surface_light, 1, 0.5773503f); er_uniformf(program_surface_light, 2, 0.5773503f); /* Create program for axis */ program_axis = er_create_program(); if(program_axis == NULL){ fprintf(stderr, "Unable to create eduraster program: %s\n", er_get_error_string(er_get_error())); quit(); } er_use_program(program_axis); er_varying_attributes(program_axis, 4); er_load_fragment_shader(program_axis, fragment_shader_axis); er_load_vertex_shader(program_axis, vertex_shader_axis); er_load_homogeneous_division(program_axis, homogeneous_division_axis); /* Create program for surface color */ program_surface_color = er_create_program(); if(program_surface_color == NULL){ fprintf(stderr, "Unable to create eduraster program: %s\n", er_get_error_string(er_get_error())); quit(); } er_use_program(program_surface_color); er_varying_attributes(program_surface_color, 3); er_load_fragment_shader(program_surface_color, fragment_shader_color); er_load_vertex_shader(program_surface_color, vertex_shader_color); er_load_homogeneous_division(program_surface_color, homogeneous_division_color); /* Default program */ current_surface_program = program_surface_light; }