#include <msp/gl/mesh.h>
#include <msp/gl/object.h>
#include <msp/gl/sequence.h>
+#include <msp/gl/sequencebuilder.h>
+#include <msp/gl/sequencetemplate.h>
#include <msp/gl/renderer.h>
#include <msp/gl/resources.h>
#include <msp/gl/simplescene.h>
#include <msp/gl/technique.h>
-#include <msp/gl/tests.h>
#include <msp/gl/windowview.h>
#include <msp/input/mouse.h>
#include <msp/io/print.h>
+#include <msp/strings/regex.h>
#include <msp/time/timestamp.h>
#include <msp/time/utils.h>
Input::Mouse mouse;
Resources resources;
GL::WindowView view;
- GL::Sequence sequence;
+ GL::Sequence *sequence;
GL::Renderable *renderable;
GL::AnimatedObject *anim_object;
GL::AnimationPlayer *anim_player;
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<unsigned>(m[1].str);
+ wnd_opts.height = lexical_cast<unsigned>(m[2].str);
+ }
gl_opts.gl_version_major = Graphics::GLOptions::LATEST_VERSION;
gl_opts.core_profile = true;
}
gl_ctx(window, opts.gl_opts),
mouse(window),
view(window, gl_ctx),
- sequence(view),
+ sequence(0),
renderable(0),
anim_object(0),
anim_player(0),
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;
IO::BufferedFile in(opts.renderable_name);
DataFile::Parser parser(in, opts.renderable_name);
ldr.load(parser);
- renderable = ldr.get_scene();
+ renderable = ldr.get_object();
}
else
renderable = &resources.get<GL::Scene>(opts.renderable_name);
}
+ else if(ext==".seq")
+ {
+ GL::SequenceTemplate *tmpl = load<GL::SequenceTemplate>(opts.renderable_name);
+ GL::SequenceBuilder bld(*tmpl);
+ sequence = bld.build(view);
+ }
else
throw usage_error("Unknown renderable type");
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::Sequence::Step &step = sequence.add_step(0, *renderable);
- step.set_lighting(&lighting);
- step.set_depth_test(&GL::DepthTest::lequal());
- step.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(&sequence);
+ view.set_content(sequence);
view.set_camera(&camera);
}
{
delete anim_player;
delete anim_object;
+ delete sequence;
}
int Viewer::main()