1 #include <msp/fs/dir.h>
2 #include <msp/gl/sequencebuilder.h>
3 #include <msp/gl/renderer.h>
4 #include <msp/gl/tests.h>
5 #include <msp/input/keys.h>
6 #include <msp/time/utils.h>
7 #include "desertpillars.h"
12 DesertPillars::Options::Options()
14 wnd_opts.width = 1920;
15 wnd_opts.height = 1080;
16 gl_opts.gl_version_major = Graphics::GLOptions::LATEST_VERSION;
17 gl_opts.core_profile = true;
21 DesertPillars::DesertPillars(int, char **):
22 window(display, opts.wnd_opts),
23 gl_ctx(window, opts.gl_opts),
26 camera(resources.get<GL::Camera>("Camera.camera")),
27 sphere(resources.get<GL::Object>("Sphere.object")),
30 sphere_stopped(false),
33 window.set_title("Desert Pillars");
34 window.signal_close.connect(sigc::bind(sigc::mem_fun(this, &DesertPillars::exit), 0));
35 keyboard.signal_button_press.connect(sigc::bind_return(sigc::mem_fun(this, &DesertPillars::key_press), false));
37 GL::Light &sun = resources.get<GL::Light>("Sun.light");
38 sky = make_unique<GL::Sky>(content, sun);
39 sky->set_debug_name("Sky");
41 shadow_seq = make_unique<GL::Sequence>();
42 shadow_seq->set_debug_name("Shadow sequence");
43 GL::Sequence::Step *step = &shadow_seq->add_step("shadow", content);
44 step->set_depth_test(GL::LEQUAL);
46 shadow_map = make_unique<GL::ShadowMap>(8192, *sky, sun, *shadow_seq);
47 shadow_map->set_debug_name("Shadow map");
48 shadow_map->set_target(GL::Vector3(0.0f, 0.0f, 0.0f), 20.0f);
50 GL::SequenceBuilder seq_bld(resources.get<GL::SequenceTemplate>("Desert.seq"));
51 seq_bld.set_renderable("content", *shadow_map);
52 seq_bld.set_debug_name("Main sequence");
53 sequence.reset(seq_bld.build(view));
55 env_seq = make_unique<GL::Sequence>();
56 env_seq->set_debug_name("Environment sequence");
57 step = &env_seq->add_step("", *shadow_map);
58 step->set_lighting(&resources.get<GL::Lighting>("Desert.lightn"));
59 step->set_depth_test(GL::LEQUAL);
61 env_map = make_unique<GL::EnvironmentMap>(256, GL::RGB16F, 7, sphere, *env_seq);
62 env_map->set_debug_name("Environment map");
63 sphere.set_matrix(GL::Matrix::translation(GL::Vector3(0.0f, 0.0f, 3.3f)));
65 content.add(resources.get<GL::Scene>("Background.scene"));
66 content.add(*env_map);
68 camera.set_debug_name("Main camera");
70 view.set_content(sequence.get());
71 view.set_camera(&camera);
73 const GL::Vector3 &cam_pos = camera.get_position();
74 camera_distance = cam_pos.norm();
75 camera_angle = Geometry::atan2(cam_pos.y, cam_pos.x);
76 camera_base_height = Geometry::atan2(cam_pos.z, cam_pos.slice<2>(0).norm());
79 int DesertPillars::main()
82 return Application::main();
85 void DesertPillars::tick()
87 Time::TimeStamp t = Time::now();
88 Time::TimeDelta dt = (last_tick ? t-last_tick : Time::zero);
93 sphere_morph += dt/Time::sec;
94 sphere.set_morph(sphere_morph);
99 sphere_angle += Geometry::Angle<float>::from_degrees(36*dt/Time::sec);
100 sphere.set_matrix(GL::Matrix().translate(GL::Vector3(0.0f, 0.0f, 3.3f))
101 .rotate(sphere_angle, GL::Vector3(0.0f, 0.0f, 1.0f)).rotate(sphere_angle*0.5f, GL::Vector3(1.0f, 0.0f, 0.0f)));
106 camera_angle += Geometry::Angle<float>::from_degrees(12*dt/Time::sec);
107 Geometry::Angle<float> cam_height = camera_base_height+Geometry::Angle<float>::from_degrees(15.0f*cos(camera_angle*1.5f));
108 GL::Vector3 cam_dir(cos(camera_angle)*cos(cam_height), sin(camera_angle)*cos(cam_height), sin(cam_height));
109 camera.set_position(GL::Vector3(0.0f, 0.0f, 2.0f)+cam_dir*camera_distance);
110 camera.set_look_direction(-cam_dir);
117 void DesertPillars::key_press(unsigned key)
119 if(key==Input::KEY_ESC)
121 else if(key==Input::KEY_SPACE)
122 camera_stopped = !camera_stopped;
123 else if(key==Input::KEY_F)
124 sphere_frozen = !sphere_frozen;
125 else if(key==Input::KEY_S)
126 sphere_stopped = !sphere_stopped;
130 DesertPillars::Resources::Resources()
132 FS::Path base_dir = FS::get_sys_data_dir()/"demos"/"desertpillars"/"data";
133 source.add_directory(base_dir);
134 source.add_directory(base_dir/"textures");
135 source.add_directory(base_dir/"exported");
140 void DesertPillars::MorphSphere::set_morph(float m)
142 shdata.uniform("morph", m);
145 void DesertPillars::MorphSphere::setup_render(GL::Renderer &renderer, GL::Tag tag) const
147 ObjectInstance::setup_render(renderer, tag);
148 renderer.add_shader_data(shdata);