This is necessary for generating environment maps for an object, since
the object itself should not be included in the map. The alternative is
to create a separate Scene, but that's rather clumsy.
{
for(InstanceMap::const_iterator i=renderables.begin(); i!=renderables.end(); ++i)
for(RenderableSet::const_iterator j=i->second.begin(); j!=i->second.end(); ++j)
{
for(InstanceMap::const_iterator i=renderables.begin(); i!=renderables.end(); ++i)
for(RenderableSet::const_iterator j=i->second.begin(); j!=i->second.end(); ++j)
- (*j)->render(renderer, tag);
+ renderer.render(**j, tag);
#include <algorithm>
#include "orderedscene.h"
#include <algorithm>
#include "orderedscene.h"
namespace Msp {
namespace GL {
namespace Msp {
namespace GL {
void OrderedScene::render(Renderer &renderer, const Tag &tag) const
{
for(RenderableList::const_iterator i=renderables.begin(); i!=renderables.end(); ++i)
void OrderedScene::render(Renderer &renderer, const Tag &tag) const
{
for(RenderableList::const_iterator i=renderables.begin(); i!=renderables.end(); ++i)
- (*i)->render(renderer, tag);
+ renderer.render(**i, tag);
for(vector<Slot>::const_iterator j=renderables.begin(); j!=renderables.end(); ++j)
if(j->passes.empty() || j->passes.count(i->get_tag()))
for(vector<Slot>::const_iterator j=renderables.begin(); j!=renderables.end(); ++j)
if(j->passes.empty() || j->passes.count(i->get_tag()))
- j->renderable->render(renderer, i->get_tag());
+ renderer.render(*j->renderable, i->get_tag());
#include "material.h"
#include "program.h"
#include "programdata.h"
#include "material.h"
#include "program.h"
#include "programdata.h"
#include "renderer.h"
#include "texture.h"
#include "texturing.h"
#include "renderer.h"
#include "texture.h"
#include "texturing.h"
Buffer::unbind_from(ELEMENT_ARRAY_BUFFER);
}
Buffer::unbind_from(ELEMENT_ARRAY_BUFFER);
}
+void Renderer::exclude(const Renderable &renderable)
+{
+ excluded.insert(&renderable);
+}
+
+void Renderer::include(const Renderable &renderable)
+{
+ excluded.erase(&renderable);
+}
+
+void Renderer::render(const Renderable &renderable, const Tag &tag)
+{
+ if(!excluded.count(&renderable))
+ renderable.render(*this, tag);
+}
+
void Renderer::draw(const Batch &batch)
{
if(!vertex_array)
void Renderer::draw(const Batch &batch)
{
if(!vertex_array)
#ifndef MSP_GL_RENDERER_H_
#define MSP_GL_RENDERER_H_
#ifndef MSP_GL_RENDERER_H_
#define MSP_GL_RENDERER_H_
#include <vector>
#include "matrix.h"
#include <vector>
#include "matrix.h"
namespace Msp {
namespace GL {
namespace Msp {
namespace GL {
class Material;
class Program;
class ProgramData;
class Material;
class Program;
class ProgramData;
class Texture;
class Texturing;
class VertexArray;
class Texture;
class Texturing;
class VertexArray;
~Push() { renderer.pop_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); }
+ };
+
const VertexArray *vertex_array;
bool vertex_array_changed;
const Buffer *element_buffer;
const VertexArray *vertex_array;
bool vertex_array_changed;
const Buffer *element_buffer;
+ std::set<const Renderable *> excluded;
public:
Renderer(const Camera *);
public:
Renderer(const Camera *);
Renderer. */
void escape();
Renderer. */
void escape();
+ void exclude(const Renderable &);
+ void include(const Renderable &);
+
+ void render(const Renderable &, const Tag & = Tag());
void draw(const Batch &);
private:
void draw(const Batch &);
private:
void ShadowMap::render(Renderer &renderer, const Tag &tag) const
{
if(!enabled_passes.count(tag))
void ShadowMap::render(Renderer &renderer, const Tag &tag) const
{
if(!enabled_passes.count(tag))
- return renderable.render(renderer, tag);
+ return renderer.render(renderable, tag);
Vector4 lpos = light.get_position();
if(lpos.w)
Vector4 lpos = light.get_position();
if(lpos.w)
Renderer::Push _push_rend(renderer);
renderer.add_shader_data(shdata);
Renderer::Push _push_rend(renderer);
renderer.add_shader_data(shdata);
- renderable.render(renderer, tag);
+ renderer.render(renderable, tag);
Texture::unbind_from(unit);
TexGen::unbind_from(SCOORD);
Texture::unbind_from(unit);
TexGen::unbind_from(SCOORD);
#include "simplescene.h"
namespace Msp {
#include "simplescene.h"
namespace Msp {
void SimpleScene::render(Renderer &renderer, const Tag &tag) const
{
for(RenderableSet::const_iterator i=renderables.begin(); i!=renderables.end(); ++i)
void SimpleScene::render(Renderer &renderer, const Tag &tag) const
{
for(RenderableSet::const_iterator i=renderables.begin(); i!=renderables.end(); ++i)
- (*i)->render(renderer, tag);
+ renderer.render(**i, tag);