void deferred_renderer_render_light(light* l) { matrix_4x4 viewm = camera_view_matrix(CAMERA); matrix_4x4 projm = camera_proj_matrix(CAMERA, graphics_viewport_ratio() ); vector4 light_pos = v4(l->position.x, l->position.y, l->position.z, 1); light_pos = m44_mul_v4(viewm, light_pos); light_pos = m44_mul_v4(projm, light_pos); light_pos = v4_div(light_pos, light_pos.w); glUseProgram(shader_program_handle(PROGRAM_UI)); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(0, graphics_viewport_width(), graphics_viewport_height(), 0, -1, 1); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); float top = ((-light_pos.y + 1) / 2) * graphics_viewport_height() - 8; float bot = ((-light_pos.y + 1) / 2) * graphics_viewport_height() + 8; float left = ((light_pos.x + 1) / 2) * graphics_viewport_width() - 8; float right = ((light_pos.x + 1) / 2) * graphics_viewport_width() + 8; texture* lightbulb = asset_load_get("$CORANGE/ui/lightbulb.dds"); glActiveTexture(GL_TEXTURE0 + 0 ); glBindTexture(GL_TEXTURE_2D, texture_handle(lightbulb)); glEnable(GL_TEXTURE_2D); glUniform1i(glGetUniformLocation(shader_program_handle(PROGRAM_UI), "diffuse"), 0); glUniform1f(glGetUniformLocation(shader_program_handle(PROGRAM_UI), "alpha_test"), 0.5); glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex3f(left, top, -light_pos.z); glTexCoord2f(0.0f, 1.0f); glVertex3f(left, bot, -light_pos.z); glTexCoord2f(1.0f, 1.0f); glVertex3f(right, bot, -light_pos.z); glTexCoord2f(1.0f, 0.0f); glVertex3f(right, top, -light_pos.z); glEnd(); glActiveTexture(GL_TEXTURE0 + 0 ); glDisable(GL_TEXTURE_2D); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); glUseProgram(0); }
void particles_render() { #ifdef OPEN_GL_CPU #ifndef CPU_ONLY kernel_memory_read(k_particle_positions, sizeof(vector4) * particle_count, particle_positions); #endif glBindBuffer(GL_ARRAY_BUFFER, positions_buffer); glBufferData(GL_ARRAY_BUFFER, sizeof(vector4) * particle_count, particle_positions, GL_DYNAMIC_COPY); #ifndef CPU_ONLY kernel_memory_read(k_particle_randoms, sizeof(vector4) * particle_count, particle_randoms); #endif glBindBuffer(GL_ARRAY_BUFFER, randoms_buffer); glBufferData(GL_ARRAY_BUFFER, sizeof(vector4) * particle_count, particle_randoms, GL_DYNAMIC_COPY); #endif camera* cam = entity_get("camera"); matrix_4x4 viewm = camera_view_matrix(cam); matrix_4x4 projm = camera_proj_matrix(cam, graphics_viewport_ratio() ); m44_to_array(viewm, view_matrix); m44_to_array(projm, proj_matrix); glMatrixMode(GL_MODELVIEW); glLoadMatrixf(view_matrix); glMatrixMode(GL_PROJECTION); glLoadMatrixf(proj_matrix); glBindBuffer(GL_ARRAY_BUFFER, positions_buffer); glVertexPointer(4, GL_FLOAT, 0, (void*)0); glEnableClientState(GL_VERTEX_ARRAY); glBindBuffer(GL_ARRAY_BUFFER, randoms_buffer); glColorPointer(4, GL_FLOAT, 0, (void*)0); glEnableClientState(GL_COLOR_ARRAY); glDrawArrays(GL_POINTS, 0, particle_count); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); }
static void deferred_renderer_setup_camera() { matrix_4x4 viewm = camera_view_matrix(CAMERA); matrix_4x4 projm = camera_proj_matrix(CAMERA, graphics_viewport_ratio() ); m44_to_array(viewm, VIEW_MATRIX); m44_to_array(projm, PROJ_MATRIX); glMatrixMode(GL_MODELVIEW); glLoadMatrixf(VIEW_MATRIX); glMatrixMode(GL_PROJECTION); glLoadMatrixf(PROJ_MATRIX); matrix_4x4 lviewm = light_view_matrix(SHADOW_LIGHT); matrix_4x4 lprojm = light_proj_matrix(SHADOW_LIGHT); m44_to_array(lviewm, LIGHT_VIEW_MATRIX); m44_to_array(lprojm, LIGHT_PROJ_MATRIX); }
mat4 camera_view_proj_matrix(camera* c, float aspect_ratio) { mat4 view = camera_view_matrix(c); mat4 proj = camera_proj_matrix(c, aspect_ratio); return mat4_mul_mat4(view, proj); }
mat4 camera_view_proj_matrix(camera* c) { mat4 view = camera_view_matrix(c); mat4 proj = camera_proj_matrix(c); return mat4_mul_mat4(view, proj); }
int main(int argc, char **argv) { #ifdef _WIN32 FILE* ctt = fopen("CON", "w" ); FILE* fout = freopen( "CON", "w", stdout ); FILE* ferr = freopen( "CON", "w", stderr ); #endif corange_init("../../assets_core"); graphics_viewport_set_title("Teapot"); graphics_viewport_set_size(1280, 720); camera* cam = entity_new("camera", camera); cam->position = vec3_new(5, 5, 5); cam->target = vec3_new(0, 0, 0); teapot_shader = asset_hndl_new_load(P("./assets/teapot.mat")); teapot_object = asset_hndl_new_load(P("./assets/teapot.obj")); int running = 1; SDL_Event e = {0}; while(running) { frame_begin(); camera* cam = entity_get("camera"); while(SDL_PollEvent(&e)) { switch(e.type){ case SDL_KEYDOWN: case SDL_KEYUP: if (e.key.keysym.sym == SDLK_ESCAPE) { running = 0; } if (e.key.keysym.sym == SDLK_PRINTSCREEN) { graphics_viewport_screenshot(); } if (e.key.keysym.sym == SDLK_r && e.key.keysym.mod == KMOD_LCTRL) { asset_reload_all(); } break; case SDL_QUIT: running = 0; break; } camera_control_orbit(cam, e); ui_event(e); } ui_update(); glClearColor(0.25, 0.25, 0.25, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); shader_program* shader = material_first_program(asset_hndl_ptr(&teapot_shader)); shader_program_enable(shader); shader_program_set_mat4(shader, "world", mat4_id()); shader_program_set_mat4(shader, "view", camera_view_matrix(cam)); shader_program_set_mat4(shader, "proj", camera_proj_matrix(cam)); shader_program_set_texture(shader, "cube_beach", 0, asset_hndl_new_load(P("$CORANGE/water/cube_sea.dds"))); shader_program_set_vec3(shader, "camera_direction", camera_direction(cam)); renderable* r = asset_hndl_ptr(&teapot_object); for(int i=0; i < r->num_surfaces; i++) { renderable_surface* s = r->surfaces[i]; int mentry_id = min(i, ((material*)asset_hndl_ptr(&r->material))->num_entries-1); material_entry* me = material_get_entry(asset_hndl_ptr(&r->material), mentry_id); glBindBuffer(GL_ARRAY_BUFFER, s->vertex_vbo); shader_program_enable_attribute(shader, "vPosition", 3, 18, (void*)0); shader_program_enable_attribute(shader, "vNormal", 3, 18, (void*)(sizeof(float) * 3)); //shader_program_enable_attribute(shader, "vTangent", 3, 18, (void*)(sizeof(float) * 6)); //shader_program_enable_attribute(shader, "vBinormal", 3, 18, (void*)(sizeof(float) * 9)); //shader_program_enable_attribute(shader, "vTexcoord", 2, 18, (void*)(sizeof(float) * 12)); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, s->triangle_vbo); glDrawElements(GL_TRIANGLES, s->num_triangles * 3, GL_UNSIGNED_INT, (void*)0); shader_program_disable_attribute(shader, "vPosition"); shader_program_disable_attribute(shader, "vNormal"); //shader_program_disable_attribute(shader, "vTangent"); //shader_program_disable_attribute(shader, "vBinormal"); //shader_program_disable_attribute(shader, "vTexcoord"); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glBindBuffer(GL_ARRAY_BUFFER, 0); } shader_program_disable(shader); glDisable(GL_DEPTH_TEST); ui_render(); graphics_swap(); frame_end(); } corange_finish(); return 0; }