void App::render(GraphicContext &gc) { gc.clear(Colorf(0.0f, 0.0f, 0.0f, 1.0f)); Rect viewport_rect(0, 0, Size(gc.get_width(), gc.get_height())); gc.set_viewport(viewport_rect); gc.clear_depth(1.0f); Mat4f modelview_matrix = scene.gs->camera_modelview; scene.Draw(modelview_matrix, gc); gc.reset_program_object(); }
void LightsourceSimplePass::render(GraphicContext &gc, GPUTimer &timer) { ScopeTimeFunction(); //timer.begin_time(gc, "light(simple)"); gc.set_frame_buffer(fb); gc.set_viewport(viewport->get_size()); gc.set_depth_range(0.0f, 0.9f); gc.set_uniform_buffer(0, uniforms); gc.set_texture(0, light_instance_texture); gc.set_texture(1, normal_z_gbuffer.get()); gc.set_texture(2, diffuse_color_gbuffer.get()); gc.set_texture(3, specular_color_gbuffer.get()); gc.set_texture(4, specular_level_gbuffer.get()); gc.set_texture(5, shadow_maps.get()); gc.set_texture(6, self_illumination_gbuffer.get()); gc.set_blend_state(blend_state); gc.clear(); // To do: use icosahedron for smaller lights and when the camera is not inside the light influence sphere // To do: combine multiple lights into the same rect pass to reduce overdraw penalty gc.set_depth_stencil_state(rect_depth_stencil_state); gc.set_rasterizer_state(rect_rasterizer_state); gc.set_program_object(rect_light_program); gc.set_primitives_array(rect_prim_array); gc.draw_primitives_array_instanced(type_triangles, 0, 6, std::max(lights.size(), (size_t)1)); gc.reset_primitives_array(); /* gc.set_depth_stencil_state(icosahedron_depth_stencil_state); gc.set_rasterizer_state(icosahedron_rasterizer_state); gc.set_program_object(icosahedron_light_program); gc.set_primitives_array(icosahedron_prim_array); gc.draw_primitives_elements_instanced(type_triangles, icosahedron->num_elements, icosahedron->elements, 0, lights.size()); gc.reset_primitives_array(); */ gc.set_depth_stencil_state(icosahedron_depth_stencil_state); gc.set_rasterizer_state(icosahedron_rasterizer_state); gc.set_program_object(icosahedron_light_program); gc.set_primitives_array(icosahedron_prim_array); gc.draw_primitives_elements_instanced(type_triangles, icosahedron->num_elements, icosahedron->elements, 0, lights.size()); gc.reset_primitives_array(); //timer.end_time(gc); //timer.begin_time(gc, "light(simple)"); gc.reset_texture(6); gc.reset_texture(5); gc.reset_texture(4); gc.reset_texture(3); gc.reset_texture(2); gc.reset_texture(1); gc.reset_texture(0); gc.reset_uniform_buffer(0); //timer.end_time(gc); }
int App::start(const std::vector<std::string> &args) { OpenGLWindowDescription description; description.set_title("UniformBlock Shader"); //description.set_version(3, 1, false); description.set_size(Size(1024, 768), true); DisplayWindow window(description); InputDevice keyboard = window.get_ic().get_keyboard(); GraphicContext gc = window.get_gc(); Slot slot_input_up = (window.get_ic().get_keyboard()).sig_key_up().connect(this, &App::on_input_up); Slot slot_window_close = window.sig_window_close().connect(this, &App::window_close); // Load and link shaders ProgramObject shader = ProgramObject::load(gc, "Resources/vertex_shader.glsl", "Resources/fragment_shader.glsl"); shader.bind_attribute_location(0, "Position"); if (!shader.link()) throw Exception("Unable to link shader program: Error:" + shader.get_info_log()); int block_size = shader.get_uniform_block_size("TestBlock"); const int num_blocks = 16; ProgramUniformBlock block(gc, block_size * num_blocks); std::vector<float> data_to_upload; data_to_upload.resize((num_blocks * block_size) / sizeof(float) ); float test_colour = 1.0f; for (int cnt=0; cnt<num_blocks; cnt++) { int offset = cnt * block_size / sizeof(float) ; data_to_upload[offset + 0] = test_colour; data_to_upload[offset + 1] = 0.5f; data_to_upload[offset + 2] = 1.0f; test_colour -= 0.05f; } block.upload_data(0, &data_to_upload[0], block_size * num_blocks); quit = false; Font font(gc, "tahoma", 32); clan::ubyte64 startTime = System::get_time(); //// Test code //GLuint uniform_index = -1; //const char *names[] = {"src_color"}; //glGetUniformIndices(handle, 1, names, &uniform_index); //if (uniform_index >=0) //{ // GLint offset; // GLint singleSize; // GLint uniform_type; // glGetActiveUniformsiv(handle, 1, &uniform_index, GL_UNIFORM_TYPE, &uniform_type); // glGetActiveUniformsiv(handle, 1, &uniform_index, GL_UNIFORM_OFFSET, &offset); // glGetActiveUniformsiv(handle, 1, &uniform_index, GL_UNIFORM_SIZE, &singleSize); // if ((uniform_type != GL_FLOAT_VEC3) || (offset !=0) || (singleSize != 1)) // { // throw Exception("well it seems it does not work"); // } //} while (!quit) { gc.clear(Colorf(0.1f, 0.1f, 0.2f)); OpenGL::check_error(); for (int test_run_y=0; test_run_y < 16; test_run_y++) { shader.set_uniform_block("TestBlock", block, test_run_y*block_size); for (int test_run_x=0; test_run_x < 16; test_run_x++) { Vec2f positions[3]; float size = 32.0f; positions[0].x = test_run_x * size; positions[0].y = test_run_y * size + size; positions[1].x = test_run_x * size + size; positions[1].y = test_run_y * size + size; positions[2].x = test_run_x * size + size; positions[2].y = test_run_y * size; PrimitivesArray prim_array(gc); prim_array.set_attributes(0, positions); gc.set_program_object(shader, cl_program_matrix_modelview_projection); gc.draw_primitives(cl_triangles, 3, prim_array); gc.reset_program_object(); } } font.draw_text(gc, 32, 200, "Hello World"); window.flip(1); KeepAlive::process(); } return 0; }
virtual int main(const std::vector<std::string> &args) { DisplayWindowDescription desc; desc.set_size(Size(800,600), true); desc.set_title("Span Layout Test"); DisplayWindow window(desc); Canvas canvas(window); GraphicContext gc = window.get_gc(); FontDescription font_desc1; font_desc1.set_typeface_name("Verdana"); font_desc1.set_height(-13); Font font1(canvas, font_desc1); Image smiley(canvas, "smiley.png"); SpanLayout span; span.add_text(" This is a ", font1, Colorf::white, 1); span.add_text("red", font1, Colorf::red, 2); span.add_text(" text! ", font1, Colorf::white, 3); span.add_text("And this complete text is green with non-blocking space..", font1, Colorf::green, 4); span.add_image(smiley, 10, 5); span.add_text("This is a really long descriptive and interesting text. ", font1, Colorf::yellow, 6); span.add_text("[", font1, Colorf::black, 7); span.add_text("15:35", font1, Colorf::white, 8); span.add_text("]", font1, Colorf::black, 9); span.add_image(smiley, 0, 10); span.add_image(smiley, 2, 11); span.add_text("kthxbye!", font1, Colorf::blue, 12); span.layout(gc, 200); span.set_position(Point(10, 10)); while (!window.get_ic().get_keyboard().get_keycode(keycode_escape)) { gc.clear(Colorf::gray70); span.draw_layout(canvas); Point mouse_pos = window.get_ic().get_mouse().get_position(); SpanLayout::HitTestResult result = span.hit_test(gc, mouse_pos); std::string type; switch(result.type) { case SpanLayout::HitTestResult::no_objects_available: type = "no_objects_available"; break; case SpanLayout::HitTestResult::outside_top: type = "outside_top"; break; case SpanLayout::HitTestResult::outside_left: type = "outside_left"; break; case SpanLayout::HitTestResult::outside_right: type = "outside_right"; break; case SpanLayout::HitTestResult::outside_bottom: type = "outside_bottom"; break; case SpanLayout::HitTestResult::inside: type = "inside"; break; } std::string result_text = string_format("HitTestResult: Type:%1 ID:%2 Offset:%3", type, result.object_id, result.offset); font1.draw_text(canvas, 10, 300, result_text); window.flip(); KeepAlive::process(); System::sleep(50); } return 0; }
// The start of the Application int App::start(const std::vector<std::string> &args) { try { DisplayWindowDescription win_desc; win_desc.set_allow_resize(true); win_desc.set_title("HDR Example"); win_desc.set_size(Size( 600, 630 ), false); DisplayWindow window(win_desc); Slot slot_quit = window.sig_window_close().connect(this, &App::on_window_close); Slot slot_input_up = (window.get_ic().get_keyboard()).sig_key_up().connect(this, &App::on_input_up); GraphicContext gc = window.get_gc(); // Load and link shaders ProgramObject shader = ProgramObject::load(gc, "Resources/vertex_shader.glsl", "Resources/fragment_shader.glsl"); shader.bind_attribute_location(0, "Position"); shader.bind_attribute_location(2, "TexCoord0"); if (!shader.link()) throw Exception("Unable to link shader program: Error:" + shader.get_info_log()); const float dynamic_range_start = -1.5f; const float dynamic_range_end = 1.5f; const Size image_size(gc.get_width() - 64, 128); Texture image_rgb32f = create_rgb32f(gc, image_size, dynamic_range_start, dynamic_range_end); Font font(gc, "Tahoma", 20); clan::ubyte64 time_last = System::get_time(); bool direction = false; while (!quit) { clan::ubyte64 time_now = System::get_time(); time_delta = ((float) time_now - time_last) / 1000.0f; time_last = time_now; if (direction) { color_offset.r += time_delta * 1.0f; if (color_offset.r > 2.0f) { color_offset.r = 2.0f; direction = false; } } else { color_offset.r -= time_delta * 1.0f; if (color_offset.r < -2.0f) { color_offset.r = -2.0f; direction = true; } } color_offset.g = color_offset.r; color_offset.b = color_offset.r; gc.clear(Colorf(0.2f,0.2f,0.5f)); font.draw_text(gc, 32, 50, "Showing Texture RGB values from " + StringHelp::float_to_text(dynamic_range_start) + " to " + StringHelp::float_to_text(dynamic_range_end)); draw_image(gc, image_rgb32f, 32.0f, 100.0f, shader, Vec4f(0.0f, 0.0f, 0.0f, 0.0f)); font.draw_text(gc, 32, 350, "Showing Texture with an offset to the floating point color component"); draw_image(gc, image_rgb32f, 32.0f, 400.0f, shader, color_offset); KeepAlive::process(0); window.flip(1); } } catch(Exception &exception) { // Create a console window for text-output if not available ConsoleWindow console("Console", 80, 160); Console::write_line("Exception caught: " + exception.get_message_and_stack_trace()); console.display_close_message(); return -1; } return 0; }