X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=tools%2Fviewer.cpp;h=a1853e922f19485097ee644e80900b76c9913b1f;hp=d2a384f4e0b2afc112afd7fe3ea62ac3da676237;hb=HEAD;hpb=b760fa04a65deaceb4c793ba24ca4f4e01bdbc82 diff --git a/tools/viewer.cpp b/tools/viewer.cpp index d2a384f4..36a5dc9b 100644 --- a/tools/viewer.cpp +++ b/tools/viewer.cpp @@ -5,24 +5,30 @@ #include #include #include -#include +#include +#include #include #include #include #include #include +#include +#include #include -#include #include #include #include +#include +#include +#include #include #include #include #include -#include +#include #include #include +#include #include #include @@ -32,6 +38,16 @@ using namespace Msp; class Viewer: public RegisteredApplication { private: + struct Options + { + list resource_locations; + string animation_name; + string renderable_name; + Graphics::WindowOptions wnd_opts; + + Options(int, char **); + }; + class Resources: public GL::Resources { private: @@ -45,13 +61,18 @@ private: void add_pack(const string &); }; - Graphics::SimpleGLWindow window; + Options opts; + Graphics::Display display; + Graphics::Window window; + GL::Device gl_device; Input::Mouse mouse; Resources resources; + GL::WindowView view; + GL::Sequence *sequence; GL::Renderable *renderable; GL::AnimatedObject *anim_object; GL::AnimationPlayer *anim_player; - GL::Light light; + GL::DirectionalLight light; GL::Lighting lighting; GL::Camera camera; float yaw; @@ -83,9 +104,37 @@ private: }; +Viewer::Options::Options(int argc, char **argv) +{ + string window_size; + + GetOpt getopt; + getopt.add_option('r', "resources", resource_locations, GetOpt::REQUIRED_ARG); + getopt.add_option('a', "animation", animation_name, GetOpt::REQUIRED_ARG); + getopt.add_option('w', "window-size", window_size, GetOpt::REQUIRED_ARG); + getopt.add_argument("renderable", renderable_name); + getopt(argc, argv); + + wnd_opts.width = 1024; + wnd_opts.height = 768; + if (!window_size.empty()) + { + RegMatch m = Regex("^([1-9][0-9]*)x([1-9][0-9]*)$").match(window_size); + if(!m) + throw usage_error("Invalid window size"); + + wnd_opts.width = lexical_cast(m[1].str); + wnd_opts.height = lexical_cast(m[2].str); + } +} + Viewer::Viewer(int argc, char **argv): - window(1024, 768, false), + opts(argc, argv), + window(display, opts.wnd_opts), + gl_device(window), mouse(window), + view(window), + sequence(0), renderable(0), anim_object(0), anim_player(0), @@ -96,16 +145,7 @@ Viewer::Viewer(int argc, char **argv): light_pitch(0), dragging(0) { - list resource_locations; - string animation_name; - string renderable_name; - GetOpt getopt; - getopt.add_option('r', "resources", resource_locations, GetOpt::REQUIRED_ARG); - getopt.add_option('a', "animation", animation_name, GetOpt::REQUIRED_ARG); - getopt.add_argument("renderable", renderable_name); - getopt(argc, argv); - - for(list::const_iterator i=resource_locations.begin(); i!=resource_locations.end(); ++i) + for(list::const_iterator i=opts.resource_locations.begin(); i!=opts.resource_locations.end(); ++i) { if(FS::is_dir(*i)) resources.add_directory(*i); @@ -121,22 +161,22 @@ Viewer::Viewer(int argc, char **argv): GL::Object *object = 0; - string ext = FS::extpart(renderable_name); + string ext = FS::extpart(opts.renderable_name); if(ext==".mesh") { GL::Mesh *mesh = 0; - if(FS::exists(renderable_name)) + if(FS::exists(opts.renderable_name)) { mesh = new GL::Mesh; - DataFile::load(*mesh, renderable_name); - resources.add("__"+renderable_name, mesh); + DataFile::load(*mesh, opts.renderable_name); + resources.add("__"+opts.renderable_name, mesh); } else - mesh = &resources.get(renderable_name); + mesh = &resources.get(opts.renderable_name); object = new GL::Object; GL::Technique *tech = new GL::Technique; - tech->add_pass(0); + tech->add_method(0); object->set_mesh(mesh); object->set_technique(tech); renderable = object; @@ -145,22 +185,36 @@ Viewer::Viewer(int argc, char **argv): resources.add("__.object", object); } else if(ext==".object") - renderable = load(renderable_name); + renderable = load(opts.renderable_name); else if(ext==".scene") { - GL::SimpleScene *scene = new GL::SimpleScene; - DataFile::load(*scene, renderable_name, resources); - renderable = scene; + if(FS::exists(opts.renderable_name)) + { + GL::Scene::GenericLoader ldr(resources); + IO::BufferedFile in(opts.renderable_name); + DataFile::Parser parser(in, opts.renderable_name); + ldr.load(parser); + renderable = ldr.get_object(); + } + else + renderable = &resources.get(opts.renderable_name); + } + else if(ext==".seq") + { + GL::SequenceTemplate *tmpl = load(opts.renderable_name); + GL::SequenceBuilder bld(*tmpl); + bld.set_debug_name(FS::basename(opts.renderable_name)); + sequence = bld.build(view); } else throw usage_error("Unknown renderable type"); - if(!animation_name.empty()) + if(!opts.animation_name.empty()) { if(!object) throw usage_error("Must have an object to animate"); - GL::Animation *anim = load(animation_name); + GL::Animation *anim = load(opts.animation_name); anim_player = new GL::AnimationPlayer; anim_object = new GL::AnimatedObject(*object); anim_player->play(*anim_object, *anim); @@ -172,11 +226,25 @@ Viewer::Viewer(int argc, char **argv): mouse.signal_button_release.connect(sigc::bind_return(sigc::mem_fun(this, &Viewer::button_release), false)); mouse.signal_axis_motion.connect(sigc::bind_return(sigc::mem_fun(this, &Viewer::axis_motion), false)); - light.set_position(GL::Vector4(0, 0, 1, 0)); - lighting.attach(0, light); + light.set_direction(GL::Vector3(0, 0, -1)); + lighting.attach(light); + camera.set_debug_name("Camera"); camera.set_up_direction(GL::Vector3(0, 0, 1)); update_camera(); + + if(!sequence) + { + sequence = new GL::Sequence(); + sequence->set_debug_name("Sequence"); + sequence->set_clear_enabled(true); + GL::Sequence::Step &step = sequence->add_step(0, *renderable); + step.set_lighting(&lighting); + step.set_depth_test(GL::LEQUAL); + } + + view.set_content(sequence); + view.set_camera(&camera); } template @@ -197,6 +265,7 @@ Viewer::~Viewer() { delete anim_player; delete anim_object; + delete sequence; } int Viewer::main() @@ -218,17 +287,8 @@ void Viewer::tick() anim_player->tick(dt); } - window.tick(); - - GL::Framebuffer::system().clear(GL::COLOR_BUFFER_BIT|GL::DEPTH_BUFFER_BIT); - - GL::Bind bind_depth(GL::DepthTest::lequal()); - GL::Bind bind_blend(GL::Blend::alpha()); - GL::Renderer renderer(&camera); - renderer.set_lighting(&lighting); - renderable->render(renderer); - - window.swap_buffers(); + display.tick(); + view.render(); } void Viewer::button_press(unsigned btn) @@ -310,7 +370,7 @@ void Viewer::update_light() float sy = sin(light_yaw); float cp = cos(light_pitch); float sp = sin(light_pitch); - light.set_position(GL::Vector4(-cy*cp, -sy*cp, -sp, 0)); + light.set_direction(GL::Vector3(cy*cp, sy*cp, sp)); }