/// Convenience function for calculating statistics not required by 
int Dataset::calculate_extra_stats(){
	calculate_ellipses();
    calculate_surface();
	return 1;
}
Example #2
0
/*
* 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;
}