Пример #1
0
void marching_cubes_update() {

  int size[3] = {width, height, depth};
  
  /* Update volumes */
  
  kernel_memory_gl_aquire(metaball_positions);
  kernel_memory_gl_aquire(vertex_positions_buffer);
  kernel_memory_gl_aquire(vertex_normals_buffer);
  
  kernel_set_argument(write_metaballs, 1, sizeof(cl_int3), &size);
  kernel_set_argument(write_metaballs, 2, sizeof(kernel_memory), &metaball_positions);
  kernel_set_argument(write_metaballs, 3, sizeof(cl_int), &num_metaballs);
  kernel_run(write_metaballs, width * height * depth);
  
  /* End */
  
  int zero = 0;
  kernel_memory_write(vertex_index, sizeof(int), &zero);
  
  const int num_workers = (width-1) * (height-1) * (depth-1);
  
  kernel_set_argument(construct_surface, 0, sizeof(kernel_memory), &volume);
  kernel_set_argument(construct_surface, 1, sizeof(cl_int3), &size);
  kernel_set_argument(construct_surface, 2, sizeof(kernel_memory), &vertex_positions_buffer);
  kernel_set_argument(construct_surface, 3, sizeof(kernel_memory), &vertex_index);
  kernel_run(construct_surface, num_workers);
  
  kernel_memory_read(vertex_index, sizeof(cl_int), &num_verts);
  
  /* Generate Normals */
  
  if (num_verts > 0) {
    kernel_set_argument(generate_normals_smooth, 0, sizeof(kernel_memory), &vertex_positions_buffer);
    kernel_set_argument(generate_normals_smooth, 1, sizeof(kernel_memory), &vertex_normals_buffer);
    kernel_set_argument(generate_normals_smooth, 2, sizeof(kernel_memory), &metaball_positions);
    kernel_set_argument(generate_normals_smooth, 3, sizeof(cl_int), &num_metaballs);
    kernel_run(generate_normals_smooth, num_verts);
  }
  
  /*
  kernel_set_argument(generate_normals, 0, sizeof(kernel_memory), &vertex_positions_buffer);
  kernel_set_argument(generate_normals, 1, sizeof(kernel_memory), &vertex_normals_buffer);
  kernel_run(generate_normals, num_verts/3);
  */
  
  kernel_memory_gl_release(vertex_positions_buffer);
  kernel_memory_gl_release(vertex_normals_buffer);
  kernel_memory_gl_release(metaball_positions);
  
  kernel_run_finish();
  
}
Пример #2
0
int main(void)
{
    TASK *cdc_demo_task_cb;

    /* Initialize scheduler. */
    scheduler_init();

    /* Initialize memory. */
    mem_init();

    /* Initialize file system. */
    fs_init();

    /* Initialize USB stack. */
    usb_init();

    /* Initialize serial. */
    serial_init();

    /* Create a task for CDC demo. */
    cdc_demo_task_cb = (TASK *)mem_static_alloc(sizeof(TASK) + 4096);
    task_create(cdc_demo_task_cb, P_STR("CDCDEMO"), (uint8_t *)(cdc_demo_task_cb + 1), 4096, &cdc_demo_task, (void *)(NULL));
    scheduler_task_add(cdc_demo_task_cb, 5);

    /* Run scheduler. */
    kernel_run();

    return (0);

}
Пример #3
0
void run_scheduler_speed_test() {
  char* name = "Scheduler Speed Test";
  start_test(name);

  kernel_add_task(VLOW_PRI, &first);

  kernel_run();

  end_test(name);
}
Пример #4
0
void run_train_test() {
  char* name = "Train Test";
  start_test(name);

  kernel_add_task(MED_PRI, &user_task);

  kernel_run();

  end_test(name);
}
Пример #5
0
void marching_cubes_point(int x, int y, int z, float value) {

  if ((x >= width) || (y >= height) || (z >= depth) || (x < 0) || (y < 0) || (z < 0)) {
    error("Point (%i, %i, %i) outside of volume", x, y, z);
  }

  kernel_set_argument(write_point, 1, sizeof(int), &x);
  kernel_set_argument(write_point, 2, sizeof(int), &y);
  kernel_set_argument(write_point, 3, sizeof(int), &z);
  kernel_set_argument(write_point, 7, sizeof(float), &value);
  kernel_run(write_point, 1);
}
Пример #6
0
void run_basic_test() {
  char* name = "Basic Test";
  start_test(name);
  flag = 0;
  did_run = 0;

  kernel_add_task(MED_PRI, &user_task);

  kernel_run();

  assert_int_equals(1, did_run, "Basic Test: User Program Never Ran");

  end_test(name);
}
Пример #7
0
//! Kernel entry point.
// --------------------------------
void kernel_main(void* info, void* page_dir)
{
	if(arch_init() != 0)
	{
		return;
	}
	if(kernel_init() != 0)
	{
		return;
	}
	if(kernel_run() != 0)
	{
		kernel_done();
		arch_done();
	}
}
Пример #8
0
int main(void)
{
    TASK *task_cb;

    /* Initialize scheduler. */
    scheduler_init();

    /* Initialize memory. */
    mem_init();

    /* Initialize file system. */
    fs_init();

    /* Create a task for CDC demo. */
    task_cb = (TASK *)mem_static_alloc(sizeof(TASK) + 4096);
    task_create(task_cb, P_STR("STATS"), (uint8_t *)(task_cb + 1), 4096, &parser_demo_task, (void *)(NULL), 0);
    scheduler_task_add(task_cb, 5);

    /* Run scheduler. */
    kernel_run();

    return (0);

}
Пример #9
0
void marching_cubes_render(bool wireframe, camera* c, light* l) {
  
  const int full_size = width * height * depth;
  
  kernel_memory_gl_aquire(point_color_buffer);
  kernel_run(write_point_color_back, full_size);
  kernel_memory_gl_release(point_color_buffer);
  
  /* Before we do the metaballs lets just do a rendering based upon volume data */
  
  /*
  
  glPointSize(1.0f);
  
  glBindBuffer(GL_ARRAY_BUFFER, point_positions);
  glVertexPointer(4, GL_FLOAT, 0, (void*)0);
  glEnableClientState(GL_VERTEX_ARRAY);
  
  glBindBuffer(GL_ARRAY_BUFFER, point_colors);
  glColorPointer(4, GL_FLOAT, 0, (void*)0);
  glEnableClientState(GL_COLOR_ARRAY);
  
  glDrawArrays(GL_POINTS, 0, full_size);
  
  glBindBuffer(GL_ARRAY_BUFFER, 0);
  glDisableClientState(GL_VERTEX_ARRAY);
  glDisableClientState(GL_COLOR_ARRAY);
  glPointSize(1.0f);
  
  */
  
  /* Then Draw Triangles */
  if (wireframe) {
    glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
  }
  
  
  material* metaballs_mat = asset_get_load(P("./shaders/metaballs.mat"));
  
  shader_program* metaballs = material_get_entry(metaballs_mat, 0)->program;
  GLuint NORMALS = glGetAttribLocation(*metaballs, "normals");
  
  glUseProgram(*metaballs);
  
  GLint light_position_u = glGetUniformLocation(*metaballs, "light_position");
  glUniform3f(light_position_u, l->position.x, l->position.y, l->position.z);
  
  GLint camera_position_u = glGetUniformLocation(*metaballs, "camera_position");
  glUniform3f(camera_position_u, c->position.x, c->position.y, c->position.z);
  
  mat4 lviewm = light_view_matrix(l);
  mat4 lprojm = light_proj_matrix(l);
  
  mat4_to_array(lviewm, lview_matrix);
  mat4_to_array(lprojm, lproj_matrix);
  
  GLint lproj_matrix_u = glGetUniformLocation(*metaballs, "light_proj");
  glUniformMatrix4fv(lproj_matrix_u, 1, 0, lproj_matrix);
  
  GLint lview_matrix_u = glGetUniformLocation(*metaballs, "light_view");
  glUniformMatrix4fv(lview_matrix_u, 1, 0, lview_matrix);
  
  
  texture* env_map = asset_get_load(P("./resources/metaballs_env.dds"));
  glActiveTexture(GL_TEXTURE0 + 0 );
  glBindTexture(GL_TEXTURE_2D, *env_map);
  glEnable(GL_TEXTURE_2D);
  glUniform1i(glGetUniformLocation(*metaballs, "env_map"), 0);
  
  texture* shadow_map = shadow_mapper_depth_texture();
  glActiveTexture(GL_TEXTURE0 + 1);
  glBindTexture(GL_TEXTURE_2D, *shadow_map);
  glEnable(GL_TEXTURE_2D);
  glUniform1i(glGetUniformLocation(*metaballs, "shadow_map"), 1);
  
  glBindBuffer(GL_ARRAY_BUFFER, vertex_positions);
  glVertexPointer(4, GL_FLOAT, 0, (void*)0);
  glEnableClientState(GL_VERTEX_ARRAY);
  
  glBindBuffer(GL_ARRAY_BUFFER, vertex_normals);
  glVertexAttribPointer(NORMALS, 4, GL_FLOAT, GL_FALSE, 0, (void*)0);
  glEnableVertexAttribArray(NORMALS);
  
    glDrawArrays(GL_TRIANGLES, 0, num_verts);
  
  glDisableClientState(GL_VERTEX_ARRAY);
  glDisableVertexAttribArray(NORMALS);
  
  glActiveTexture(GL_TEXTURE0 + 1 );
  glDisable(GL_TEXTURE_2D);
  
  glActiveTexture(GL_TEXTURE0 + 0 );
  glDisable(GL_TEXTURE_2D);
  
  glUseProgram(0);
  
  if (wireframe) {
    glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
  }
  
}
Пример #10
0
void marching_cubes_clear() {
  kernel_run(write_clear, width * height * depth);
}
Пример #11
0
void particles_update(float timestep) {
  
  int random = rand();
  
#ifndef CPU_ONLY
  
  #ifndef OPEN_GL_CPU
    kernel_memory_gl_aquire(k_particle_positions);
    kernel_memory_gl_aquire(k_particle_velocities);
    kernel_memory_gl_aquire(k_particle_lifetimes);
    kernel_memory_gl_aquire(k_particle_randoms);
  #endif
    
      kernel_set_argument(k_update, 6, sizeof(cl_float), &timestep);
      kernel_set_argument(k_update, 7, sizeof(cl_int), &reset);
      kernel_set_argument(k_update, 8, sizeof(cl_int), &random);
      kernel_run(k_update, particle_count);
      
      reset = 0;
    
  #ifndef OPEN_GL_CPU
    kernel_memory_gl_release(k_particle_positions);
    kernel_memory_gl_release(k_particle_velocities);
    kernel_memory_gl_release(k_particle_lifetimes);
    kernel_memory_gl_release(k_particle_randoms);
  #endif
    
    kernel_run_finish();
  
#else
  
  for(int i = 0; i < particle_count; i++) {
  
    particle_lifetimes[i] = particle_lifetimes[i] + timestep;
    
    if ((particle_lifetimes[i] > 60.0) || ( v4_length(particle_velocities[i]) < 0.5 )) {
      
      particle_lifetimes[i] = 0.0;
      
      particle_positions[i] = v4(32,15,32,1);
      
      int random_index = (random + i) % particle_count;
      float rx = particle_randoms[random_index].x;
      float ry = particle_randoms[random_index].y;
      float rz = particle_randoms[random_index].z;
      particle_velocities[i] = v4_mul(v4(rx, ry, rz, 0), 5);
    
    } else {
    
      /* Update positions and velocity */
      particle_positions[i].x = particle_positions[i].x + (particle_velocities[i].x * timestep);
      particle_positions[i].y = particle_positions[i].y + (particle_velocities[i].y * timestep);
      particle_positions[i].z = particle_positions[i].z + (particle_velocities[i].z * timestep);
      
      particle_velocities[i].y = particle_velocities[i].y - (9.81 * timestep);
      
      /* Bounce on floors */
      if (particle_positions[i].y < 15.0) {
        particle_velocities[i].x = particle_velocities[i].x * 0.75;
        particle_velocities[i].y = particle_velocities[i].y * 0.75;
        particle_velocities[i].z = particle_velocities[i].z * 0.75;
        particle_velocities[i].y = -particle_velocities[i].y;
      }
    }
  }

#endif
  
}