X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fstage.cpp;h=b6c456e96c479a6330060733b97ac2afd5533832;hb=94151737f2983ca7cade5be0e20c98fbc6f11eea;hp=94782add256f16ddc7cd2ed5c06905ae3dd4fd54;hpb=7857d6ec5961f94bc926b1a969f2c841713f9650;p=libs%2Fdemoscene.git diff --git a/source/stage.cpp b/source/stage.cpp index 94782ad..b6c456e 100644 --- a/source/stage.cpp +++ b/source/stage.cpp @@ -3,10 +3,13 @@ #include "stage.h" using namespace std; -using namespace Msp; + +namespace Msp { +namespace DemoScene { Stage::Stage(): - pipeline(0) + pipeline(0), + last_view(0) { } Stage::~Stage() @@ -14,6 +17,19 @@ Stage::~Stage() delete pipeline; } +void Stage::add_things(Demo::ThingMap &things, const string &prefix) +{ + things[prefix+"camera"] = static_cast(&camera); +} + +void Stage::set_camera(const GL::Camera &c) +{ + camera.set_object_matrix(c.get_object_matrix()); + camera.set_up_direction(c.get_up_direction()); + camera.set_field_of_view(c.get_field_of_view()); + camera.set_depth_clip(c.get_near_clip(), c.get_far_clip()); +} + Stage::UseInView::UseInView(): view(0), @@ -35,11 +51,43 @@ void Stage::UseInView::validate() const void Stage::UseInView::start(float, float) { - view->set_camera(&stage->camera_control.get_camera()); + if(!stage->pipeline || view!=stage->last_view) + { + stage->create_pipeline(*view); + if(!stage->pipeline) + throw logic_error("null pipeline"); + stage->last_view = view; + } + + view->set_camera(&stage->camera); view->set_content(stage->pipeline); } +Stage::SetCamera::SetCamera(): + stage(0), + camera(0) +{ } + +Stage::SetCamera::SetCamera(Stage &s, const GL::Camera &c): + stage(&s), + camera(&c) +{ } + +void Stage::SetCamera::validate() const +{ + if(!stage) + throw logic_error("null stage"); + if(!camera) + throw logic_error("null camera"); +} + +void Stage::SetCamera::start(float, float) +{ + stage->set_camera(*camera); +} + + Stage::UseInView::Loader::Loader(UseInView &u, Demo &d): DataFile::DerivedObjectLoader(u, d) { @@ -56,3 +104,24 @@ void Stage::UseInView::Loader::view(const string &n) { obj.view = &demo.get_thing(n); } + + +Stage::SetCamera::Loader::Loader(SetCamera &s, Demo &d): + DataFile::DerivedObjectLoader(s, d) +{ + add("camera", &Loader::camera); + add("stage", &Loader::stage); +} + +void Stage::SetCamera::Loader::stage(const string &n) +{ + obj.stage = &demo.get_thing(n); +} + +void Stage::SetCamera::Loader::camera(const string &n) +{ + obj.camera = &demo.get_resources().get(n); +} + +} // namespace DemoScene +} // namespace Msp