-/* $Id$
-
-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.
*/
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:
- struct TextureSlot
+ class InheritLoader: public Msp::DataFile::CollectionObjectLoader<Technique>
{
- std::string name;
- const Texture *texture;
-
- TextureSlot(): texture(0) { }
+ public:
+ InheritLoader(Technique &, Collection &);
+
+ private:
+ void texture(const std::string &, const std::string &);
};
- std::vector<TextureSlot> textures;
- const Texture *main_texture;
- std::map<unsigned, ObjectPass> passes;
- ObjectPass *normal_pass;
- const Material *material;
-
public:
- Technique();
- ~Technique();
+ typedef std::map<Tag, RenderPass> PassMap;
+private:
+ PassMap passes;
+
+public:
+ RenderPass &add_pass(const GL::Tag &);
bool has_pass(const GL::Tag &) const;
- const ObjectPass &get_pass(const GL::Tag &) const;
- unsigned get_n_textures() const { return textures.size(); }
- unsigned get_texture_index(const std::string &) const;
- const Texture *get_texture(unsigned) const;
- const Texture *get_main_texture() const { return main_texture; }
- const Material *get_material() const { return material; }
+ const RenderPass &get_pass(const GL::Tag &) const;
+ const PassMap &get_passes() const { return passes; }
+ bool has_shaders() const;
};
} // namespace GL