]> git.tdb.fi Git - libs/gl.git/blobdiff - source/materials/rendermethod.h
Rename RenderPass to RenderMethod
[libs/gl.git] / source / materials / rendermethod.h
diff --git a/source/materials/rendermethod.h b/source/materials/rendermethod.h
new file mode 100644 (file)
index 0000000..11c7e85
--- /dev/null
@@ -0,0 +1,119 @@
+#ifndef MSP_GL_RENDERPASS_H_
+#define MSP_GL_RENDERPASS_H_
+
+#include <msp/core/refptr.h>
+#include <msp/datafile/objectloader.h>
+#include "cullface.h"
+#include "material.h"
+
+namespace Msp {
+namespace GL {
+
+class Program;
+class ProgramData;
+class Renderer;
+class Sampler;
+class Texture;
+
+/**
+Encapsulates the data that determines the appearance of a rendered surface.
+This includes shader and data for it, material and texturing.
+*/
+class RenderMethod
+{
+public:
+       class Loader: public DataFile::CollectionObjectLoader<RenderMethod>
+       {
+       private:
+               std::string inline_base_name;
+
+               static ActionMap shared_actions;
+
+       public:
+               Loader(RenderMethod &);
+               Loader(RenderMethod &, Collection &);
+       private:
+               virtual void init_actions();
+       
+       public:
+               void set_inline_base_name(const std::string &);
+
+       private:
+               virtual void finish();
+
+               void material_inline();
+               void material(const std::string &);
+               void shader(const std::string &);
+               void texture(const std::string &);
+               void uniforms();
+               void uniform_slot(const std::string &);
+               void uniform_slot2(const std::string &, const std::string &);
+       };
+
+private:
+       struct TextureSlot
+       {
+               class Loader: public DataFile::CollectionObjectLoader<TextureSlot>
+               {
+               private:
+                       std::string auto_slot_name;
+
+               public:
+                       Loader(TextureSlot &, const std::string &, Collection *);
+
+               private:
+                       void slot_auto();
+               };
+
+               Tag tag;
+               std::string slot_name;
+               const Texture *texture;
+               const Sampler *sampler;
+
+               TextureSlot(Tag t): tag(t), texture(0), sampler(0) { }
+       };
+
+       const Program *shprog;
+       bool shprog_from_material;
+       RefPtr<ProgramData> shdata;
+       std::map<Tag, Tag> uniform_slots;
+       const Material *material;
+       std::string material_slot;
+       std::vector<TextureSlot> textures;
+       CullMode face_cull;
+       bool receive_shadows;
+       bool image_based_lighting;
+
+public:
+       RenderMethod();
+
+private:
+       void maybe_create_material_shader();
+       void set_material_textures();
+
+public:
+       void set_shader_program(const Program *, const ProgramData *);
+       const Program *get_shader_program() const { return shprog; }
+       const ProgramData *get_shader_data() const { return shdata.get(); }
+       Tag get_slotted_uniform_tag(Tag) const;
+       void set_material(const Material *);
+       const Material *get_material() const { return material; }
+       const std::string &get_material_slot_name() const { return material_slot; }
+       void set_texture(Tag, const Texture *, const Sampler * = 0);
+       Tag get_texture_tag(const std::string &) const;
+       void set_face_cull(CullMode);
+       CullMode get_face_cull() const { return face_cull; }
+       void set_receive_shadows(bool);
+       bool get_receive_shadows() const { return receive_shadows; }
+       void set_image_based_lighting(bool);
+       bool get_image_based_lighting() const { return image_based_lighting; }
+
+       void apply(Renderer &) const;
+
+       void set_debug_name(const std::string &);
+};
+
+} // namespace GL
+} // namespace Msp
+
+#endif