#include <msp/core/maputils.h>
#include <msp/datafile/collection.h>
+#include <msp/strings/format.h>
#include "ambientocclusion.h"
#include "blend.h"
#include "bloom.h"
#include "colorcurve.h"
+#include "environmentmap.h"
#include "lighting.h"
#include "object.h"
#include "resources.h"
#include "scene.h"
#include "sequencetemplate.h"
-#include "tests.h"
+#include "shadowmap.h"
+#include "sky.h"
using namespace std;
namespace Msp {
namespace GL {
-SequenceTemplate::SequenceTemplate():
- resources(0),
- hdr(false),
- alpha(false),
- required_multisample(0),
- max_multisample(0)
-{ }
-
SequenceTemplate::~SequenceTemplate()
{
- for(PostProcessorArray::iterator i=postprocessors.begin(); i!=postprocessors.end(); ++i)
- delete i->postprocessor_template;
+ for(const Renderable &r: renderables)
+ delete r.effect_template;
+ for(const PostProcessor &p: postprocessors)
+ delete p.postprocessor_template;
}
-Resources &SequenceTemplate::get_resources() const
+template<>
+SequenceTemplate::TemplateRegistry<GL::PostProcessor> &SequenceTemplate::get_registry<GL::PostProcessor>()
{
- if(!resources)
- throw logic_error("no resources");
- return *resources;
+ static TemplateRegistry<GL::PostProcessor> registry;
+ static bool initialized = false;
+ if(!initialized)
+ {
+ registry.register_type<AmbientOcclusion::Template>("ambient_occlusion");
+ registry.register_type<Bloom::Template>("bloom");
+ registry.register_type<ColorCurve::Template>("colorcurve");
+ initialized = true;
+ }
+ return registry;
}
-
-SequenceTemplate::PostProcessorRegistry &SequenceTemplate::get_postprocessor_registry()
+template<>
+SequenceTemplate::TemplateRegistry<Effect> &SequenceTemplate::get_registry<Effect>()
{
- static PostProcessorRegistry registry;
+ static TemplateRegistry<Effect> registry;
static bool initialized = false;
if(!initialized)
{
- registry.register_type<AmbientOcclusion>("ambient_occlusion");
- registry.register_type<Bloom>("bloom");
- registry.register_type<ColorCurve>("colorcurve");
+ registry.register_type<EnvironmentMap::Template>("environment_map");
+ registry.register_type<ShadowMap::Template>("shadow_map");
+ registry.register_type<Sky::Template>("sky");
initialized = true;
}
return registry;
}
-SequenceTemplate::Step::~Step()
-{ }
-
-
SequenceTemplate::PostProcessor::PostProcessor(GL::PostProcessor::Template *ppt):
postprocessor_template(ppt)
{ }
-SequenceTemplate::PostProcLoader::PostProcLoader()
+DataFile::Loader::ActionMap SequenceTemplate::Loader::shared_actions;
+
+SequenceTemplate::Loader::Loader(SequenceTemplate &t, Collection &c):
+ CollectionObjectLoader<SequenceTemplate>(t, &c)
{
- get_postprocessor_registry().invoke_all(*this);
+ set_actions(shared_actions);
}
-
-SequenceTemplate::Loader::Loader(SequenceTemplate &t, Collection &c):
- DataFile::CollectionObjectLoader<SequenceTemplate, Resources>(t, &c)
+void SequenceTemplate::Loader::init_actions()
{
add("hdr", &SequenceTemplate::hdr);
- add("alpha", &SequenceTemplate::alpha);
+ add("clear", &Loader::clear);
+ add("effect", &Loader::effect);
add("multisample", &Loader::multisample);
add("multisample", &Loader::multisample_range);
add("postprocessor", &Loader::postprocessor);
+ add("postprocessor", &Loader::postprocessor_with_slot);
+ add("renderable", &Loader::renderable);
+ add("renderable", &Loader::renderable_with_default);
+ add("sequence", &Loader::sequence);
add("step", &Loader::step);
- add("step", &Loader::step_with_slot);
-
- // Deprecated
- add("pass", &Loader::step_with_slot);
+}
- obj.resources = &c;
+void SequenceTemplate::Loader::clear()
+{
+ ClearLoader ldr(obj);
+ load_sub_with(ldr);
+ obj.clear_enabled = true;
}
-void SequenceTemplate::Loader::postprocessor_loaded()
+void SequenceTemplate::Loader::effect(const string &slot)
{
- obj.postprocessors.push_back(get_postprocessor_template());
+ TemplateLoader<Effect> ldr(get_collection());
+ load_sub_with(ldr);
+ Renderable rend;
+ rend.slot_name = slot;
+ rend.effect_template = ldr.get_object();
+ obj.renderables.push_back(rend);
}
void SequenceTemplate::Loader::multisample(unsigned samples)
obj.max_multisample = max;
}
-void SequenceTemplate::Loader::postprocessor(const string &slot)
+void SequenceTemplate::Loader::postprocessor()
{
- PostProcLoader ldr;
+ postprocessor_with_slot(string());
+}
+
+void SequenceTemplate::Loader::postprocessor_with_slot(const string &slot)
+{
+ TemplateLoader<GL::PostProcessor> ldr(get_collection());
load_sub_with(ldr);
PostProcessor pp;
- pp.postprocessor_template = ldr.get_postprocessor_template();
+ pp.postprocessor_template = ldr.get_object();
pp.slot_name = slot;
obj.postprocessors.push_back(pp);
}
-void SequenceTemplate::Loader::step(const string &tag)
+void SequenceTemplate::Loader::renderable(const string &slot)
+{
+ Renderable rend;
+ rend.slot_name = slot;
+ obj.renderables.push_back(rend);
+}
+
+void SequenceTemplate::Loader::renderable_with_default(const string &slot, const string &name)
+{
+ Renderable rend;
+ rend.renderable = &get_collection().get<GL::Renderable>(name);
+ rend.slot_name = slot;
+ obj.renderables.push_back(rend);
+}
+
+void SequenceTemplate::Loader::sequence(const string &slot, const string &name)
{
- step_with_slot(tag, string());
+ Renderable rend;
+ rend.sequence_template = &get_collection().get<SequenceTemplate>(name);
+ rend.slot_name = slot;
+ SequenceLoader ldr(rend);
+ load_sub_with(ldr);
+ obj.renderables.push_back(rend);
}
-void SequenceTemplate::Loader::step_with_slot(const string &tag, const string &rend)
+void SequenceTemplate::Loader::step(const string &tag, const string &rend)
{
Step stp;
stp.tag = tag;
- stp.slot_name = rend;
- if(coll)
- load_sub(stp, *coll);
- else
- load_sub(stp);
+ stp.renderable_name = rend;
+ Step::Loader ldr(stp, get_collection());
+ ldr.set_inline_base_name(format("%s/%d.step", get_source(), obj.steps.size()));
+ load_sub_with(ldr);
obj.steps.push_back(stp);
}
-SequenceTemplate::Step::Loader::Loader(Step &p):
- DataFile::CollectionObjectLoader<Step>(p, 0)
+DataFile::Loader::ActionMap SequenceTemplate::ClearLoader::shared_actions;
+
+SequenceTemplate::ClearLoader::ClearLoader(SequenceTemplate &t):
+ ObjectLoader<SequenceTemplate>(t)
+{
+ set_actions(shared_actions);
+}
+
+void SequenceTemplate::ClearLoader::init_actions()
+{
+ add("color", &ClearLoader::color);
+ add("depth", &ClearLoader::depth);
+ add("stencil", &ClearLoader::stencil);
+}
+
+void SequenceTemplate::ClearLoader::color(float r, float g, float b, float a)
{
- init();
+ obj.clear_colors.emplace_back(r, g, b, a);
}
-SequenceTemplate::Step::Loader::Loader(Step &p, Collection &c):
- DataFile::CollectionObjectLoader<Step>(p, &c)
+void SequenceTemplate::ClearLoader::depth(float d)
{
- init();
+ obj.clear_depth = d;
}
-void SequenceTemplate::Step::Loader::init()
+void SequenceTemplate::ClearLoader::stencil(int s)
{
- add("blend", &Loader::blend);
- add("blend", &Loader::blend_predefined);
- add("depth_test", &Loader::depth_test);
- add("depth_test", &Loader::depth_test_predefined);
- add("lighting", &Loader::lighting);
- add("lighting", &Loader::lighting_inline);
- add("object", &Loader::object);
- add("scene", &Loader::scene);
+ obj.clear_stencil = s;
}
-void SequenceTemplate::Step::Loader::blend_predefined(const string &name)
+
+DataFile::Loader::ActionMap SequenceTemplate::SequenceLoader::shared_actions;
+
+SequenceTemplate::SequenceLoader::SequenceLoader(Renderable &r):
+ ObjectLoader<Renderable>(r)
{
- const Blend *bln = 0;
- if(name=="alpha")
- bln = &Blend::alpha();
- else if(name=="additive")
- bln = &Blend::additive();
- else if(name=="additive_alpha")
- bln = &Blend::additive_alpha();
- else
- throw key_error(name);
+ set_actions(shared_actions);
+}
- obj.blend = bln;
- obj.blend.keep();
+void SequenceTemplate::SequenceLoader::init_actions()
+{
+ add("renderable", &SequenceLoader::renderable);
}
-void SequenceTemplate::Step::Loader::blend(BlendFactor src, BlendFactor dest)
+void SequenceTemplate::SequenceLoader::renderable(const string &slot, const string &name)
{
- obj.blend = new Blend(src, dest);
+ obj.sequence_renderables[slot] = name;
}
-void SequenceTemplate::Step::Loader::depth_test_predefined(const string &name)
+
+DataFile::Loader::ActionMap SequenceTemplate::Step::Loader::shared_actions;
+
+SequenceTemplate::Step::Loader::Loader(Step &p, Collection &c):
+ DataFile::CollectionObjectLoader<Step>(p, &c)
+{
+ set_actions(shared_actions);
+}
+
+void SequenceTemplate::Step::Loader::init_actions()
+{
+ add("depth_test", &Loader::depth_test);
+ add("depth_test", &Loader::depth_compare);
+ add("lighting", &Loader::lighting);
+ add("lighting", &Loader::lighting_inline);
+ add("stencil_test", &Loader::stencil_test);
+}
+
+void SequenceTemplate::Step::Loader::set_inline_base_name(const string &n)
{
- const DepthTest *dtest = 0;
- if(name=="lequal")
- dtest = &DepthTest::lequal();
- else
- throw key_error(name);
+ inline_base_name = n;
+}
- obj.depth_test = dtest;
- obj.depth_test.keep();
+void SequenceTemplate::Step::Loader::depth_test()
+{
+ load_sub(obj.depth_test);
}
-void SequenceTemplate::Step::Loader::depth_test(Predicate pred)
+void SequenceTemplate::Step::Loader::depth_compare(Predicate c)
{
- obj.depth_test = new DepthTest(pred);
+ obj.depth_test = DepthTest(c);
}
void SequenceTemplate::Step::Loader::lighting_inline()
{
RefPtr<Lighting> lightn = new Lighting;
- load_sub(*lightn);
- obj.lighting = lightn;
+ load_sub(*lightn, get_collection());
+ get_collection().add(inline_base_name+".lightn", lightn.get());
+ obj.lighting = lightn.release();
}
void SequenceTemplate::Step::Loader::lighting(const string &name)
{
obj.lighting = &get_collection().get<Lighting>(name);
- obj.lighting.keep();
-}
-
-void SequenceTemplate::Step::Loader::object(const string &name)
-{
- obj.default_renderable = &get_collection().get<GL::Object>(name);
}
-void SequenceTemplate::Step::Loader::scene(const string &name)
+void SequenceTemplate::Step::Loader::stencil_test()
{
- obj.default_renderable = &get_collection().get<Scene>(name);
+ load_sub(obj.stencil_test);
}
} // namespace GL