void App::render(CL_GraphicContext &gc) { gc.clear(CL_Colorf(0.0f, 0.0f, 0.0f, 1.0f)); scene.gs->image_grid.draw(gc, 420.0f, 120.0f); // Draw a grid in the backgound gc.set_map_mode(cl_user_projection); CL_Rect viewport_rect(0, 0, CL_Size(gc.get_width(), gc.get_height())); gc.set_viewport(viewport_rect); gc.set_projection(scene.gs->camera_projection); CL_BufferControl buffer_control; buffer_control.set_depth_compare_function(cl_comparefunc_lequal); buffer_control.enable_depth_write(true); buffer_control.enable_depth_test(true); buffer_control.enable_stencil_test(false); buffer_control.enable_color_write(true); gc.set_buffer_control(buffer_control); gc.clear_depth(1.0f); CL_Mat4f modelview_matrix = scene.gs->camera_modelview; scene.Draw(modelview_matrix, gc); gc.reset_program_object(); }
void App::render_from_lightsource(CL_GraphicContext &gc, CL_FrameBuffer &framebuffer) { CL_PrimitivesArray prim_array(gc); gc.set_frame_buffer(framebuffer); gc.set_map_mode(cl_user_projection); CL_Rect viewport_rect2(0, 0, CL_Size(scene.gs->texture_shadow.get_width(), scene.gs->texture_shadow.get_height())); gc.set_viewport(viewport_rect2); CL_Mat4f perp = CL_Mat4f::perspective(67.0f, 1.0f, 0.1f, 1000.0f); gc.set_projection(scene.gs->light_projection); CL_BufferControl buffer_control; buffer_control.set_depth_compare_function(cl_comparefunc_lequal); buffer_control.enable_depth_write(true); buffer_control.enable_depth_test(true); buffer_control.enable_stencil_test(false); buffer_control.enable_color_write(false); gc.set_buffer_control(buffer_control); gc.clear_depth(1.0f); CL_Mat4f modelview_matrix = scene.gs->light_modelview; scene.Draw(modelview_matrix, gc, true); gc.reset_program_object(); gc.set_modelview(CL_Mat4f::identity()); gc.set_map_mode(CL_MapMode(cl_map_2d_upper_left)); gc.reset_frame_buffer(); }
void App::set_user_projection(CL_GraphicContext &gc, CL_Sizef &area_size, Options *options) { gc.set_viewport(CL_Rectf(0, 0, area_size)); float lens_zoom = 3.2f; float lens_near = 0.1f; float lens_far = 10000.0f; float lens_aspect = 1.0f; float fov = 2.0f * atan2(1.0f, lens_zoom); float aspect = 1.0f; aspect = ( area_size.width * lens_aspect) / area_size.height; fov = (fov * 180.0f) / CL_PI; CL_Mat4f projection_matrix = CL_Mat4f::perspective( fov, aspect, lens_near, lens_far); gc.set_projection(projection_matrix); CL_Mat4f modelview_matrix = CL_Mat4f::identity(); modelview_matrix.scale_self(1.0f, 1.0f, -1.0f); // So positive Z goes into the screen modelview_matrix.translate_self(-1.0f, 1.0, lens_zoom); modelview_matrix = modelview_matrix.multiply(CL_Mat4f::rotate(CL_Angle((float) -options->grid_angle, cl_degrees), 1.0f, 0.0f, 0.0f, false)); modelview_matrix.scale_self(2.0f / area_size.width, -2.0f / area_size.height, 1.0f); modelview_matrix.translate_self(cl_pixelcenter_constant,cl_pixelcenter_constant, 0.0f); gc.set_modelview(modelview_matrix); }
void App::render_depth_buffer(CL_GraphicContext &gc) { gc.set_map_mode(cl_user_projection); gc.set_viewport(scene.gs->texture_depth.get_size()); gc.set_projection(scene.gs->camera_projection); CL_BufferControl buffer_control; buffer_control.set_depth_compare_function(cl_comparefunc_lequal); buffer_control.enable_depth_write(true); buffer_control.enable_depth_test(true); buffer_control.enable_stencil_test(false); buffer_control.enable_color_write(false); gc.set_buffer_control(buffer_control); CL_Mat4f modelview_matrix = scene.gs->camera_modelview; scene.Draw(modelview_matrix, gc); gc.reset_program_object(); }