X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbuilders%2Fpipelinetemplate.h;fp=source%2Fbuilders%2Fpipelinetemplate.h;h=fb24ea29df547f468ff05ba142631c7bd215107d;hb=7aaec9a70b8d7733429bec043f8e33e02956f266;hp=0000000000000000000000000000000000000000;hpb=bec07999d95b76f4b47cffcc564d0cd0afc0435e;p=libs%2Fgl.git diff --git a/source/builders/pipelinetemplate.h b/source/builders/pipelinetemplate.h new file mode 100644 index 00000000..fb24ea29 --- /dev/null +++ b/source/builders/pipelinetemplate.h @@ -0,0 +1,153 @@ +#ifndef PIPELINETEMPLATE_H_ +#define PIPELINETEMPLATE_H_ + +#include +#include +#include +#include +#include "blend.h" +#include "postprocessor.h" +#include "predicate.h" + +namespace Msp { +namespace GL { + +class DepthTest; +class Lighting; + +class PipelineTemplate +{ +private: + class PostProcLoader: virtual public DataFile::Loader + { + private: + template + struct AddPostProc + { + static void add(PostProcLoader &ldr, const std::string &kw) { ldr.add(kw, &PostProcLoader::postprocessor); } + }; + + protected: + RefPtr postproc; + + public: + PostProcLoader(); + + PostProcessor::Template *get_postprocessor_template() { return postproc.release(); } + + protected: + virtual void postprocessor_loaded() { } + + private: + template + void postprocessor(); + + friend class PipelineTemplate; + }; + +public: + class Loader: public DataFile::CollectionObjectLoader, public PostProcLoader + { + public: + Loader(PipelineTemplate &); + Loader(PipelineTemplate &, Collection &); + private: + void init(); + + virtual void postprocessor_loaded(); + void multisample(unsigned); + void multisample_range(unsigned, unsigned); + void pass(const std::string &, const std::string &); + void postprocessor(const std::string &); + }; + + struct Pass + { + class Loader: public DataFile::CollectionObjectLoader + { + public: + Loader(Pass &); + Loader(Pass &, Collection &); + private: + void init(); + + void blend(BlendFactor, BlendFactor); + void blend_predefined(const std::string &); + void depth_test(Predicate); + void depth_test_predefined(const std::string &); + void lighting(const std::string &); + void lighting_inline(); + // TODO requires support for scenes in Resources + //void scene(const std::string &); + }; + + std::string tag; + RefPtr lighting; + RefPtr depth_test; + RefPtr blend; + std::string renderable_name; + //Renderable *default_renderable; + + ~Pass(); + }; + + struct PostProcessor + { + GL::PostProcessor::Template *postprocessor_template; + std::string slot_name; + + PostProcessor(GL::PostProcessor::Template * = 0); + }; + + typedef std::vector PassArray; + typedef std::vector PostProcessorArray; + +private: + typedef DataFile::LoadableTypeRegistry PostProcessorRegistry; + + bool hdr; + bool alpha; + unsigned required_multisample; + unsigned max_multisample; + PassArray passes; + PostProcessorArray postprocessors; + +public: + PipelineTemplate(); + ~PipelineTemplate(); + + bool get_hdr() const { return hdr; } + bool get_alpha() const { return alpha; } + unsigned get_required_multisample() const { return required_multisample; } + unsigned get_maximum_multisample() const { return max_multisample; } + const PassArray &get_passes() const { return passes; } + const PostProcessorArray &get_postprocessors() const { return postprocessors; } + + template + static void register_postprocessor(const std::string &); +private: + static PostProcessorRegistry &get_postprocessor_registry(); +}; + +template +void PipelineTemplate::register_postprocessor(const std::string &kw) +{ + get_postprocessor_registry().register_type(kw); +} + +template +void PipelineTemplate::PostProcLoader::postprocessor() +{ + if(postproc) + throw std::logic_error("Only one postprocessor allowed per slot"); + RefPtr pp = new typename T::Template; + load_sub(*pp); + postproc = pp; + pp = 0; + postprocessor_loaded(); +} + +} // namespace GL +} // namespace Msp + +#endif