-/* $Id$
+#ifndef MSP_GL_TECHNIQUE_H_
+#define MSP_GL_TECHNIQUE_H_
-This file is part of libmspgl
-Copyright © 2007 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
-#ifndef TECHNIQUE_H_
-#define TECHNIQUE_H_
-
-#include "objectpass.h"
+#include "renderpass.h"
+#include "tag.h"
namespace Msp {
namespace GL {
class Material;
-class Tag;
class Texture;
/**
-Stores a complete multipass rendering technique for an Object. This includes
-shaders, textures and a material. A Technique can also specify empty texture
-slots which Objects must override.
+Ties multiple tagged render passes together.
*/
class Technique
{
public:
- class Loader: public Msp::DataFile::Loader
+ class Loader: public Msp::DataFile::CollectionObjectLoader<Technique>
{
public:
- typedef DataFile::Collection Collection;
-
- protected:
- Technique &tech;
- Collection &coll;
-
- public:
+ Loader(Technique &);
Loader(Technique &, Collection &);
- Technique &get_object() const { return tech; }
- Collection &get_collection() const { return coll; }
private:
- virtual void finish();
- void material_inline();
+ void init();
+ void inherit(const std::string &);
void pass(const std::string &);
- void shader(const std::string &);
- void shader_texture(const std::string &);
- void texture(const std::string &);
- void texture_slot(const std::string &);
};
private:
- std::vector<std::string> tex_names;
- std::vector<const Texture *> textures;
- const Texture *main_texture;
- std::map<unsigned, ObjectPass> passes;
- ObjectPass *normal_pass;
- const Material *material;
+ class InheritLoader: public Msp::DataFile::CollectionObjectLoader<Technique>
+ {
+ public:
+ InheritLoader(Technique &, Collection &);
+
+ private:
+ void material(const std::string &, const std::string &);
+ void texture(const std::string &, const std::string &);
+ void uniforms();
+ };
public:
- Technique();
- ~Technique();
+ typedef std::map<Tag, RenderPass> PassMap;
- bool has_pass(const GL::Tag &) const;
- const ObjectPass &get_pass(const GL::Tag &) const;
- unsigned get_n_textures() const { return tex_names.size(); }
- unsigned get_texture_index(const std::string &) const;
- const Texture *get_texture(unsigned) const;
- const Material *get_material() const { return material; }
+private:
+ PassMap passes;
+
+public:
+ RenderPass &add_pass(const Tag &);
+ bool has_pass(const Tag &) const;
+ const RenderPass &get_pass(const Tag &) const;
+ const PassMap &get_passes() const { return passes; }
+ bool replace_texture(const std::string &, const Texture &);
+ bool replace_material(const std::string &, const Material &);
+ bool replace_uniforms(const ProgramData &);
+ bool has_shaders() const;
};
} // namespace GL