const Framebuffer *out_fbo = Framebuffer::current();
// These are no-ops but will ensure the related state gets restored
BindRestore restore_fbo(out_fbo);
- BindRestore restore_depth_test(DepthTest::current());
- BindRestore restore_blend(Blend::current());
if(target[0])
{
for(vector<Step>::const_iterator i=steps.begin(); i!=steps.end(); ++i)
{
- if(const DepthTest *dt = i->get_depth_test())
- dt->bind();
- else
- DepthTest::unbind();
+ Renderer::Push push(renderer);
- if(const Blend *b = i->get_blend())
- b->bind();
- else
- Blend::unbind();
+ renderer.set_depth_test(&i->get_depth_test());
+ renderer.set_stencil_test(&i->get_stencil_test());
+ renderer.set_blend(&i->get_blend());
if (const Lighting *lighting = i->get_lighting())
renderer.add_shader_data(lighting->get_shader_data());
if(target[0])
{
- DepthTest::unbind();
- Blend::unbind();
+ renderer.set_depth_test(0);
+ renderer.set_stencil_test(0);
+ renderer.set_blend(0);
if(samples)
target[0]->blit_from(*target_ms);
Sequence::Step::Step(Tag t, Renderable *r):
tag(t),
lighting(0),
- depth_test(0),
- blend(0),
clipping(0),
renderable(r)
{ }
lighting = l;
}
-void Sequence::Step::set_depth_test(const DepthTest *d)
+void Sequence::Step::set_depth_test(const DepthTest &dt)
{
- depth_test = d;
+ depth_test = dt;
}
-void Sequence::Step::set_blend(const Blend *b)
+void Sequence::Step::set_stencil_test(const StencilTest &st)
+{
+ stencil_test = st;
+}
+
+void Sequence::Step::set_blend(const Blend &b)
{
blend = b;
}