X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=tools%2Fviewer.cpp;h=4c7b01e8ac71172d4f23e272dc6de276f5dba58c;hp=05f85de2430c5f2854ac40c9fc6e2015d6d48a64;hb=d4e380914f02800b7d915a8748ac9ccd7029bc3b;hpb=4bc50a3c977af89ab4a79aa777bb99322cda053d diff --git a/tools/viewer.cpp b/tools/viewer.cpp index 05f85de2..4c7b01e8 100644 --- a/tools/viewer.cpp +++ b/tools/viewer.cpp @@ -16,15 +16,17 @@ #include #include #include -#include +#include +#include +#include #include #include #include #include -#include #include #include #include +#include #include #include @@ -39,6 +41,8 @@ private: list resource_locations; string animation_name; string renderable_name; + Graphics::WindowOptions wnd_opts; + Graphics::GLOptions gl_opts; Options(int, char **); }; @@ -57,11 +61,13 @@ private: }; Options opts; - Graphics::SimpleGLWindow window; + Graphics::Display display; + Graphics::Window window; + Graphics::GLContext gl_ctx; Input::Mouse mouse; Resources resources; GL::WindowView view; - GL::Pipeline pipeline; + GL::Sequence *sequence; GL::Renderable *renderable; GL::AnimatedObject *anim_object; GL::AnimationPlayer *anim_player; @@ -99,19 +105,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); + } + gl_opts.gl_version_major = Graphics::GLOptions::LATEST_VERSION; + gl_opts.core_profile = true; } Viewer::Viewer(int argc, char **argv): opts(argc, argv), - window(1024, 768, false), + window(display, opts.wnd_opts), + gl_ctx(window, opts.gl_opts), mouse(window), - view(window, window.get_gl_context()), - pipeline(view), + view(window, gl_ctx), + sequence(0), renderable(0), anim_object(0), anim_player(0), @@ -165,9 +189,22 @@ Viewer::Viewer(int argc, char **argv): renderable = load(opts.renderable_name); else if(ext==".scene") { - GL::SimpleScene *scene = new GL::SimpleScene; - DataFile::load(*scene, opts.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_scene(); + } + else + renderable = &resources.get(opts.renderable_name); + } + else if(ext==".seq") + { + GL::SequenceTemplate *tmpl = load(opts.renderable_name); + GL::SequenceBuilder bld(*tmpl); + sequence = bld.build(view); } else throw usage_error("Unknown renderable type"); @@ -190,17 +227,21 @@ Viewer::Viewer(int argc, char **argv): 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); + lighting.attach(light); camera.set_up_direction(GL::Vector3(0, 0, 1)); update_camera(); - GL::Pipeline::Pass &pass = pipeline.add_pass(0, *renderable); - pass.set_lighting(&lighting); - pass.set_depth_test(&GL::DepthTest::lequal()); - pass.set_blend(&GL::Blend::alpha()); + if(!sequence) + { + sequence = new GL::Sequence(); + GL::Sequence::Step &step = sequence->add_step(0, *renderable); + step.set_lighting(&lighting); + step.set_depth_test(GL::LEQUAL); + step.set_blend(GL::Blend(GL::SRC_ALPHA, GL::ONE_MINUS_SRC_ALPHA)); + } - view.set_content(&pipeline); + view.set_content(sequence); view.set_camera(&camera); } @@ -222,6 +263,7 @@ Viewer::~Viewer() { delete anim_player; delete anim_object; + delete sequence; } int Viewer::main() @@ -243,7 +285,7 @@ void Viewer::tick() anim_player->tick(dt); } - window.tick(); + display.tick(); view.render(); }