void scotland_update() { camera* cam = entity_get("camera"); light* sun = entity_get("sun"); static_object* skydome = entity_get("skydome"); landscape* world = entity_get("world"); sun_orbit += frame_time() * 0.01; sun->position.x = 512 + sin(sun_orbit) * 512; sun->position.y = cos(sun_orbit) * 512; sun->position.z = 512; sun->target = v3(512, 0, 512); if (w_held || s_held) { vector3 cam_dir = v3_normalize(v3_sub(cam->target, cam->position)); float speed = 0.5; if (!freecam) speed = 0.05; if (w_held) { cam->position = v3_add(cam->position, v3_mul(cam_dir, speed)); } if (s_held) { cam->position = v3_sub(cam->position, v3_mul(cam_dir, speed)); } if (!freecam) { float height = terrain_height(world->terrain, v2(cam->position.x, cam->position.z)); cam->position.y = height + 1; } cam->target = v3_add(cam->position, cam_dir); } Uint8 keystate = SDL_GetMouseState(NULL, NULL); if(keystate & SDL_BUTTON(1)){ float a1 = -(float)mouse_x * 0.005; float a2 = (float)mouse_y * 0.005; vector3 cam_dir = v3_normalize(v3_sub(cam->target, cam->position)); cam_dir.y += -a2; vector3 side_dir = v3_normalize(v3_cross(cam_dir, v3(0,1,0))); cam_dir = v3_add(cam_dir, v3_mul(side_dir, -a1)); cam_dir = v3_normalize(cam_dir); cam->target = v3_add(cam->position, cam_dir); } mouse_x = 0; mouse_y = 0; ui_button* framerate = ui_elem_get("framerate"); ui_button_set_label(framerate, frame_rate_string()); }
vec3_t anm_get_scaling(struct anm_node *node, anm_time_t tm) { vec3_t s, ps; s = anm_get_node_scaling(node, tm); if(!node->parent) { return s; } ps = anm_get_scaling(node->parent, tm); return v3_mul(s, ps); }
void sea_event(SDL_Event event) { camera* cam = entity_get("camera"); light* sun = entity_get("sun"); switch(event.type) { case SDL_KEYUP: if (event.key.keysym.sym == SDLK_SPACE) { char ball_name[20]; sprintf(ball_name, "ball_%i", ball_count); ball_count++; physics_object* ball = entity_new(ball_name, physics_object); ball->renderable = asset_get("./resources/ball.obj"); ball->collision_body = collision_body_new_sphere(sphere_new(v3_zero(), 1)); ball->position = cam->position; ball->scale = v3(0.5, 0.5, 0.5); ball->velocity = v3_mul(v3_normalize(v3_sub(cam->target, cam->position)), 75); } case SDL_MOUSEBUTTONDOWN: if (event.button.button == SDL_BUTTON_WHEELUP) { cam->position = v3_sub(cam->position, v3_normalize(cam->position)); } if (event.button.button == SDL_BUTTON_WHEELDOWN) { cam->position = v3_add(cam->position, v3_normalize(cam->position)); } break; case SDL_MOUSEMOTION: mouse_x = event.motion.xrel; mouse_y = event.motion.yrel; break; } }
void sea_init() { graphics_viewport_set_dimensions(1280, 720); graphics_viewport_set_title("Sea"); camera* cam = entity_new("camera", camera); cam->position = v3(50.0, 50.0, 50.0); cam->target = v3(0, 5, 0); cam->near_clip = 0.1; light* sun = entity_new("sun", light); light_set_type(sun, light_type_spot); sun->position = v3(20,23,16); sun->ambient_color = v3(0.5, 0.5, 0.5); sun->diffuse_color = v3(1.0, 0.894, 0.811); sun->specular_color = v3_mul(v3(1.0, 0.894, 0.811), 4); sun->power = 5; light* backlight = entity_new("backlight", light); light_set_type(backlight, light_type_point); backlight->position = v3(-22,10,-13); backlight->ambient_color = v3(0.2, 0.2, 0.2); backlight->diffuse_color = v3(0.729, 0.729, 1.0); backlight->specular_color = v3_mul(v3(0.729, 0.729, 1.0), 1); backlight->power = 2; shadow_mapper_init(sun); forward_renderer_init(); forward_renderer_set_camera(cam); forward_renderer_set_shadow_light(sun); forward_renderer_set_shadow_texture( shadow_mapper_depth_texture() ); forward_renderer_add_light(sun); forward_renderer_add_light(backlight); load_folder("./resources/"); texture* noise1 = asset_get("./resources/noise1.dds"); texture* noise2 = asset_get("./resources/noise2.dds"); texture* noise3 = asset_get("./resources/noise3.dds"); texture* noise4 = asset_get("./resources/noise4.dds"); texture* noise5 = asset_get("./resources/noise5.dds"); texture* skydome_tex = asset_get("./resources/skybox_cloud_10.dds"); texture* water_calm = asset_get("./resources/water_calm.dds"); texture* water_foam = asset_get("./resources/water_foam.dds"); material* seaplane_mat = asset_get("./resources/seaplane.mat"); material_set_property(seaplane_mat, "tex_noise1", noise1, mat_type_texture); material_set_property(seaplane_mat, "tex_noise2", noise2, mat_type_texture); material_set_property(seaplane_mat, "tex_noise3", noise3, mat_type_texture); material_set_property(seaplane_mat, "tex_noise4", noise4, mat_type_texture); material_set_property(seaplane_mat, "tex_noise5", noise5, mat_type_texture); material_set_property(seaplane_mat, "tex_skybox", skydome_tex, mat_type_texture); material_set_property(seaplane_mat, "tex_calm_water", water_calm, mat_type_texture); material_set_property(seaplane_mat, "tex_foam_water", water_foam, mat_type_texture); renderable* r_seaplane = asset_get("./resources/seaplane.obj"); renderable_set_material(r_seaplane, seaplane_mat); static_object* s_seaplane = entity_new("seaplane", static_object); s_seaplane->renderable = r_seaplane; s_seaplane->scale = v3(3,1,3); static_object* skydome = entity_new("skydome", static_object); skydome->renderable = asset_get("./resources/skydome.obj"); renderable_set_material(skydome->renderable, asset_get("./resources/skydome.mat")); skydome->position = v3(0, -512, 0); skydome->scale = v3(1024, 1024, 1024); load_folder("./resources/corvette/"); renderable* r_corvette = asset_get("./resources/corvette/corvette.obj"); multi_material* m_corvette = asset_get("./resources/corvette/corvette.mmat"); renderable_set_multi_material(r_corvette, m_corvette); static_object* s_corvette = entity_new("corvette", static_object); s_corvette->renderable = r_corvette; s_corvette->collision_body = collision_body_new_mesh(asset_get("./resources/corvette/corvette.col")); s_corvette->scale = v3(1.5, 1.5, 1.5); s_corvette->position = v3(0, 0.5, 0); static_object* center_sphere = entity_new("center_sphere", static_object); center_sphere->position = v3(0, 5, 0); center_sphere->renderable = asset_get("./resources/ball.obj"); center_sphere->collision_body = collision_body_new_sphere(sphere_new(v3_zero(), 1.0f)); ui_button* framerate = ui_elem_new("framerate", ui_button); ui_button_move(framerate, v2(10,10)); ui_button_resize(framerate, v2(30,25)); ui_button_set_label(framerate, "FRAMERATE"); ui_button_disable(framerate); }
void light_set_type(light* l, int type) { if(type == light_type_directional) { l->type = light_type_directional; l->power = 1; l->falloff = 0; l->enabled = true; l->cast_shadows = false; l->orthographic = true; l->ortho_width = -1; l->ortho_height = -1; l->fov = -1; l->aspect_ratio = -1; l->shadow_color = v3_zero(); l->shadow_map_width = -1; l->shadow_map_height = -1; } else if (type == light_type_point) { l->type = light_type_point; l->power = 5; l->falloff = 0.5; l->enabled = true; l->cast_shadows = false; l->orthographic = false; l->ortho_width = -1; l->ortho_height = -1; l->fov = -1; l->aspect_ratio = -1; l->shadow_color = v3_zero(); l->shadow_map_width = -1; l->shadow_map_height = -1; } else if (type == light_type_sun) { l->type = light_type_sun; l->position = v3(0,512,0); l->target = v3(512, 0, 512); l->ambient_color = v3_mul(v3(0.8, 0.93, 1.0), 0.6); l->diffuse_color = v3(1.0, 0.937, 0.8); l->specular_color = v3(1.0, 0.894, 0.811); l->power = 1.5; l->falloff = 0; l->enabled = true; l->cast_shadows = true; l->orthographic = true; l->ortho_width = 128; l->ortho_height = 128; l->fov = -1; l->aspect_ratio = -1; l->shadow_color = v3_zero(); l->shadow_map_width = 2048; l->shadow_map_height = 2048; } else if (type == light_type_spot) { l->type = light_type_spot; l->power = 5; l->falloff = 0.5; l->enabled = true; l->cast_shadows = true; l->orthographic = false; l->ortho_width = -1; l->ortho_height = -1; l->fov = DEFAULT_FOV; l->aspect_ratio = 1.0; l->shadow_color = v3_zero(); l->shadow_map_width = 1024; l->shadow_map_height = 1024; } }
void particles_init() { particle_positions = malloc(sizeof(vector4) * particle_count); particle_velocities = malloc(sizeof(vector4) * particle_count); particle_lifetimes = malloc(sizeof(float) * particle_count); particle_randoms = malloc(sizeof(vector4) * particle_count); srand(time(NULL)); for(int i = 0; i < particle_count; i++) { particle_lifetimes[i] = 999; particle_positions[i] = v4(0,0,0,0); particle_velocities[i] = v4(0,0,0,0); float rx = ((float)rand() / RAND_MAX) * 2 - 1; float ry = ((float)rand() / RAND_MAX) * 2 + 0.5; float rz = ((float)rand() / RAND_MAX) * 2 - 1; float rm = (float)rand() / RAND_MAX; vector3 rand = v3_mul(v3_normalize(v3(rx, ry, rz)), rm * 2); particle_randoms[i] = v4(rand.x, rand.y, rand.z, 0); } glGenBuffers(1, &positions_buffer); glBindBuffer(GL_ARRAY_BUFFER, positions_buffer); glBufferData(GL_ARRAY_BUFFER, sizeof(vector4) * particle_count, particle_positions, GL_DYNAMIC_COPY); glGenBuffers(1, &velocities_buffer); glBindBuffer(GL_ARRAY_BUFFER, velocities_buffer); glBufferData(GL_ARRAY_BUFFER, sizeof(vector4) * particle_count, particle_velocities, GL_DYNAMIC_COPY); glGenBuffers(1, &lifetimes_buffer); glBindBuffer(GL_ARRAY_BUFFER, lifetimes_buffer); glBufferData(GL_ARRAY_BUFFER, sizeof(float) * particle_count, particle_lifetimes, GL_DYNAMIC_COPY); glGenBuffers(1, &randoms_buffer); glBindBuffer(GL_ARRAY_BUFFER, randoms_buffer); glBufferData(GL_ARRAY_BUFFER, sizeof(vector4) * particle_count, particle_randoms, GL_DYNAMIC_COPY); #ifdef OPEN_GL_CPU #ifndef CPU_ONLY k_particle_positions = kernel_memory_allocate(sizeof(vector4) * particle_count); k_particle_velocities = kernel_memory_allocate(sizeof(vector4) * particle_count); k_particle_lifetimes = kernel_memory_allocate(sizeof(float) * particle_count); k_particle_randoms = kernel_memory_allocate(sizeof(vector4) * particle_count); kernel_memory_write(k_particle_positions, sizeof(vector4) * particle_count, particle_positions); kernel_memory_write(k_particle_velocities, sizeof(vector4) * particle_count, particle_velocities); kernel_memory_write(k_particle_lifetimes, sizeof(float) * particle_count, particle_lifetimes); kernel_memory_write(k_particle_randoms, sizeof(vector4) * particle_count, particle_randoms); #endif #else k_particle_positions = kernel_memory_from_glbuffer(positions_buffer); k_particle_velocities = kernel_memory_from_glbuffer(velocities_buffer); k_particle_lifetimes = kernel_memory_from_glbuffer(lifetimes_buffer); k_particle_randoms = kernel_memory_from_glbuffer(randoms_buffer); #endif kernel_program* program = asset_get("./kernels/particles.cl"); float max_life = 60.0; float min_velocity = 0.5; #ifndef CPU_ONLY k_update = kernel_program_get_kernel(program, "particle_update"); kernel_set_argument(k_update, 0, sizeof(kernel_memory), &k_particle_positions); kernel_set_argument(k_update, 1, sizeof(kernel_memory), &k_particle_velocities); kernel_set_argument(k_update, 2, sizeof(kernel_memory), &k_particle_lifetimes); kernel_set_argument(k_update, 3, sizeof(kernel_memory), &k_particle_randoms); kernel_set_argument(k_update, 4, sizeof(cl_float), &max_life); kernel_set_argument(k_update, 5, sizeof(cl_float), &min_velocity); kernel_set_argument(k_update, 9, sizeof(cl_int), &particle_count); #endif }
void metaballs_init() { graphics_viewport_set_title("Metaballs"); graphics_viewport_set_dimensions(1280, 720); graphics_set_multisamples(16); #ifdef OPEN_GL_CPU kernels_init_with_cpu(); #else kernels_init_with_opengl(); #endif asset_manager_handler(kernel_program, "cl", cl_load_file, kernel_program_delete); load_folder("./kernels/"); particles_init(); load_folder("./resources/podium/"); load_folder("./resources/particles/"); renderable* r_podium = asset_get("./resources/podium/podium.obj"); renderable_set_material(r_podium, asset_get("./resources/podium/podium.mat")); static_object* s_podium = entity_new("podium", static_object); s_podium->renderable = r_podium; s_podium->position = v3(32, 10, 32); camera* cam = entity_new("camera", camera); cam->position = v3(50, 50, 50); cam->target = v3(32, 20, 32); light* sun = entity_new("sun", light); sun->position = v3(50,40,50); sun->ambient_color = v3(0.5, 0.5, 0.5); sun->diffuse_color = v3_mul(v3_one(), 2); sun->specular_color = v3_mul(v3_one(), 5); light_set_type(sun, light_type_spot); ui_button* framerate = ui_elem_new("framerate", ui_button); ui_button_move(framerate, v2(10,10)); ui_button_resize(framerate, v2(30,25)); ui_button_set_label(framerate, ""); ui_button_disable(framerate); ui_button* score = ui_elem_new("score", ui_button); ui_button_move(score, v2(50, 10)); #ifdef VOLUME_RENDERER ui_button_resize(score, v2(125, 25)); ui_button_set_label(score, "Volume Renderer"); #endif #ifdef MARCHING_CUBES ui_button_resize(score, v2(120, 25)); ui_button_set_label(score, "Marching Cubes"); #endif #ifndef VOLUME_RENDERER #ifndef MARCHING_CUBES ui_button_resize(score, v2(80, 25)); ui_button_set_label(score, "Particles"); #endif #endif ui_button_disable(score); #ifdef VOLUME_RENDERER volume_renderer_init(); volume_renderer_set_camera(cam); volume_renderer_set_light(sun); #endif #ifdef MARCHING_CUBES shadow_mapper_init(sun); forward_renderer_init(); forward_renderer_set_camera(cam); forward_renderer_set_shadow_light(sun); forward_renderer_set_shadow_texture( shadow_mapper_depth_texture() ); forward_renderer_add_light(sun); marching_cubes_init(); #endif }