+++ /dev/null
-#ifndef MSP_GL_RENDERER_H_
-#define MSP_GL_RENDERER_H_
-
-#include <set>
-#include <vector>
-#include "matrix.h"
-#include "programdata.h"
-#include "tag.h"
-
-namespace Msp {
-namespace GL {
-
-class Batch;
-class Buffer;
-class Camera;
-class Material;
-class Mesh;
-class Lighting;
-class Program;
-class Renderable;
-class Texture;
-class Texturing;
-class WindingTest;
-
-/**
-A class for supervising the rendering process. While many Renderables (in
-particular, Objects and Scenes) can by rendered without a Renderer, using one
-will often be more efficient. This is especially true for ObjectInstances.
-
-The Renderer works by deferring GL state changes until something is actually
-being drawn. This avoids many unnecessary GL calls if consecutive renderables
-use the same resources.
-
-A state stack is provided to help with state scoping. Typically a Renderable
-will push the current state on entry, set whatever state it requires, render
-itself, and pop the state when it's done. An RAII helper class is provided for
-the push/pop operation.
-*/
-class Renderer
-{
-public:
- class Push
- {
- private:
- Renderer &renderer;
-
- public:
- Push(Renderer &r): renderer(r) { renderer.push_state(); }
- ~Push() { renderer.pop_state(); }
- };
-
- class Exclude
- {
- private:
- Renderer &renderer;
- const Renderable &renderable;
-
- public:
- Exclude(Renderer &r, const Renderable &e): renderer(r), renderable(e) { renderer.exclude(renderable); }
- ~Exclude() { renderer.include(renderable); }
- };
-
-private:
- struct State
- {
- const Texture *texture;
- const Texturing *texturing;
- unsigned lowest_effect_texunit;
- const Material *material;
- const Lighting *lighting;
- Matrix lighting_matrix;
- const Program *shprog;
- unsigned shdata_count;
- const Mesh *mesh;
- const WindingTest *winding_test;
- bool reverse_winding;
-
- State();
- };
-
- class MtxStack: public MatrixStack
- {
- private:
- Renderer &renderer;
-
- public:
- MtxStack(Renderer &);
- private:
- virtual void update();
- };
-
- enum ChangeMask
- {
- LEGACY_MATRIX = 1,
- MODERN_MATRIX = 2,
- MATRIX = LEGACY_MATRIX|MODERN_MATRIX,
- LIGHTING = 4,
- SHADER_DATA = 8
- };
-
- MtxStack mtx_stack;
- unsigned char changed;
- bool matrices_loaded;
- unsigned shdata_applied;
- const Camera *camera;
- std::vector<State> state_stack;
- State *state;
- ProgramData standard_shdata;
- std::vector<const ProgramData *> shdata_stack;
- std::set<const Renderable *> excluded;
-
-public:
- Renderer(const Camera *);
- ~Renderer();
-
- /** Resets all internal state and restarts rendering. There must be no
- unpopped state in the stack. It is permissible to call begin() multiple
- times without an intervening end(). */
- void begin(const Camera *);
-
- MatrixStack &matrix_stack() { return mtx_stack; }
-
- const Camera *get_camera() const { return camera; }
-
- void set_texture(const Texture *);
- void set_texturing(const Texturing *);
- unsigned allocate_effect_texunit();
- void set_material(const Material *);
-
- void set_lighting(const Lighting *);
-
- /** Sets the shader program to use. An initial set of data can be set as
- well, with the same semantics as add_shader_data. */
- void set_shader_program(const Program *prog, const ProgramData *data = 0);
-
- /** Adds another set of data to be use with shader programs. The data is
- independent of any shader program changes and remains in effect until the
- Renderer state is popped. */
- void add_shader_data(const ProgramData &data);
-
- void set_mesh(const Mesh *);
- void set_winding_test(const WindingTest *);
- void set_reverse_winding(bool);
-
- /** Saves the current state so it can be restored later. */
- void push_state();
-
- /** Restores a previously saved state. Must be matched with an earlier
- push_state call. */
- void pop_state();
-
- /** Prepares for temporarily bypassing the Renderer by synchronizing the
- current state with GL. No additional call is necessary to resume using the
- Renderer. DEPRECATED. */
- void escape();
-
- /** Unbinds all objects and resets related state. There must be no unpopped
- state in the stack. Rendering with the same camera can be restarted without
- an explicit begin() call. */
- void end();
-
- void exclude(const Renderable &);
- void include(const Renderable &);
-
- void render(const Renderable &, const Tag & = Tag());
- void draw(const Batch &);
-
-private:
- void apply_state();
- void reset_state();
-};
-
-} // namespace GL
-} // namespace Msp
-
-#endif