X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=demos%2Fdesertpillars%2Fsource%2Fdesertpillars.cpp;h=41d150b0a8e6c7bffd0b8fb62722ec0df653e9d3;hp=c138d65a6cdb428718212ebb6e2d112ebc04afea;hb=HEAD;hpb=fea00edfb3b4274cb87e131743415e1fd22d0c1a diff --git a/demos/desertpillars/source/desertpillars.cpp b/demos/desertpillars/source/desertpillars.cpp index c138d65a..bfb25f30 100644 --- a/demos/desertpillars/source/desertpillars.cpp +++ b/demos/desertpillars/source/desertpillars.cpp @@ -1,7 +1,9 @@ #include +#include +#include #include +#include #include -#include #include #include #include "desertpillars.h" @@ -13,58 +15,60 @@ DesertPillars::Options::Options() { wnd_opts.width = 1920; wnd_opts.height = 1080; - gl_opts.gl_version_major = Graphics::GLOptions::LATEST_VERSION; - gl_opts.core_profile = true; } DesertPillars::DesertPillars(int, char **): window(display, opts.wnd_opts), - gl_ctx(window, opts.gl_opts), + gl_device(window), keyboard(window), - view(window, gl_ctx), - camera(resources.get("Camera.camera")), - sphere(resources.get("sphere_phong.object")), + resources(&res_mgr), + view(window), + lighting(resources.get("Desert.lightn")), + sphere(resources.get("Sphere.object")), sphere_morph(0.0f), sphere_frozen(false), sphere_stopped(false), + sun(resources.get("Sun.light")), + sun_angle(Geometry::Angle::from_turns(0.1f)), + wisp(resources.get("Wisp.light")), + flare(resources.get("Flare.object"), lighting.find_light_index(wisp)), camera_stopped(false) { window.set_title("Desert Pillars"); window.signal_close.connect(sigc::bind(sigc::mem_fun(this, &DesertPillars::exit), 0)); keyboard.signal_button_press.connect(sigc::bind_return(sigc::mem_fun(this, &DesertPillars::key_press), false)); - const GL::Light &sun = resources.get("Sun.light"); - sky = make_unique(resources, content, sun); - - unsigned shadow_size = 8192; - shadow_seq = make_unique(shadow_size, shadow_size); - GL::Sequence::Step *step = &shadow_seq->add_step("shadow", content); - step->set_depth_test(&GL::DepthTest::lequal()); - - shadow_map = make_unique(resources, shadow_size, *sky, sun, *shadow_seq); - shadow_map->set_darkness(0.9f); - shadow_map->set_target(GL::Vector3(0.0f, 0.0f, 0.0f), 20.0f); - GL::SequenceBuilder seq_bld(resources.get("Desert.seq")); - seq_bld.set_renderable("content", *shadow_map); + seq_bld.set_renderable("content", content); + seq_bld.set_debug_name("Main sequence"); sequence.reset(seq_bld.build(view)); - unsigned env_size = 256; - env_seq = make_unique(env_size, env_size); - step = &env_seq->add_step("", *shadow_map); - step->set_lighting(&resources.get("Desert.lightn")); - step->set_depth_test(&GL::DepthTest::lequal()); + GL::SequenceBuilder env_bld(resources.get("Desert_environment.seq")); + env_bld.set_renderable("content", *sequence->get_steps().front().get_renderable()); + env_bld.set_debug_name("Environment sequence"); + env_seq.reset(env_bld.build()); - env_map = make_unique(resources, 256, sphere, *env_seq); + env_map = make_unique(256, GL::RGBA16F, 7, sphere, *env_seq); + env_map->set_debug_name("Environment map"); sphere.set_matrix(GL::Matrix::translation(GL::Vector3(0.0f, 0.0f, 3.3f))); content.add(resources.get("Background.scene")); content.add(*env_map); + content.add(flare); + + camera.copy_parameters(resources.get("Camera.camera")); + camera.set_debug_name("Main camera"); view.set_content(sequence.get()); view.set_camera(&camera); + const GL::Vector3 &sun_direction = sun.get_direction(); + sun_node = normalize(GL::Vector3(sun_direction.y, -sun_direction.x, 0.0f)); + sun_axis = normalize(cross(sun_direction, sun_node)); + + wisp_base_color = wisp.get_color(); + const GL::Vector3 &cam_pos = camera.get_position(); camera_distance = cam_pos.norm(); camera_angle = Geometry::atan2(cam_pos.y, cam_pos.x); @@ -105,7 +109,19 @@ void DesertPillars::tick() camera.set_look_direction(-cam_dir); } + sun_angle += Geometry::Angle::from_degrees(4*dt/Time::sec); + sun.set_direction(GL::Matrix::rotation(sun_angle, sun_axis)*-sun_node); + + wisp_angle += Geometry::Angle::from_degrees(6*dt/Time::sec); + float r = 3.1f+1.1f*cos(4.0f*wisp_angle); + GL::Vector3 p(cos(wisp_angle)*r, sin(wisp_angle)*r, 3.6f+0.4f*sin(1.6f*wisp_angle)); + wisp.set_position(p); + float twilight = 0.8f-min(max(sin(sun_angle), -0.05f), 0.2f)*4.0f; + wisp.set_color(wisp_base_color*((3.0f-2.0f*twilight)*twilight*twilight)); + flare.set_matrix(GL::Matrix::translation(p)); + display.tick(); + res_mgr.tick(); view.render(); } @@ -122,13 +138,15 @@ void DesertPillars::key_press(unsigned key) } -DesertPillars::Resources::Resources() +DesertPillars::Resources::Resources(GL::ResourceManager *rm) { FS::Path base_dir = FS::get_sys_data_dir()/"demos"/"desertpillars"/"data"; source.add_directory(base_dir); source.add_directory(base_dir/"textures"); source.add_directory(base_dir/"exported"); add_source(source); + + set_resource_manager(rm); } @@ -142,3 +160,16 @@ void DesertPillars::MorphSphere::setup_render(GL::Renderer &renderer, GL::Tag ta ObjectInstance::setup_render(renderer, tag); renderer.add_shader_data(shdata); } + + +DesertPillars::LightFlare::LightFlare(const GL::Object &o, unsigned i): + ObjectInstance(o) +{ + shdata.uniform("flare_light_index", static_cast(i)); +} + +void DesertPillars::LightFlare::setup_render(GL::Renderer &renderer, GL::Tag tag) const +{ + ObjectInstance::setup_render(renderer, tag); + renderer.add_shader_data(shdata); +}