#include "texture.h"
#include "uniformblock.h"
#include "vertexsetup.h"
-#include "windingtest.h"
using namespace std;
PipelineState::PipelineState():
shprog(0),
vertex_setup(0),
- winding_test(0),
+ front_face(COUNTERCLOCKWISE),
+ face_cull(NO_CULL),
enabled_clip_planes(0),
changes(0)
{
last_applied = 0;
}
-void PipelineState::set_shader_program(const Program *p)
+template<typename T>
+void PipelineState::set(T &target, T value, unsigned flag)
{
- if(p!=shprog)
+ if(value!=target)
{
- shprog = p;
- changes |= SHPROG;
+ target = value;
+ changes |= flag;
}
}
+void PipelineState::set_shader_program(const Program *p)
+{
+ set(shprog, p, SHPROG);
+}
+
void PipelineState::set_vertex_setup(const VertexSetup *s)
{
- if(s!=vertex_setup)
- {
- vertex_setup = s;
- changes |= VERTEX_SETUP;
- }
+ set(vertex_setup, s, VERTEX_SETUP);
}
-void PipelineState::set_winding_test(const WindingTest *w)
+void PipelineState::set_front_face(FaceWinding w)
{
- if(w!=winding_test)
- {
- winding_test = w;
- changes |= WINDING_TEST;
- }
+ set(front_face, w, FACE_CULL);
+}
+
+void PipelineState::set_face_cull(CullMode c)
+{
+ set(face_cull, c, FACE_CULL);
}
void PipelineState::set_enabled_clip_planes(unsigned p)
{
- if(p!=enabled_clip_planes)
- {
- enabled_clip_planes = p;
- changes |= CLIP_PLANES;
- }
+ set(enabled_clip_planes, p, CLIP_PLANES);
}
void PipelineState::set_texture(unsigned binding, const Texture *tex, const Sampler *samp)
vertex_setup->refresh();
}
- if(mask&WINDING_TEST)
+ if(mask&FACE_CULL)
{
- if(winding_test)
+ glFrontFace(front_face==CLOCKWISE ? GL_CW : GL_CCW);
+
+ if(face_cull!=NO_CULL && front_face!=NON_MANIFOLD)
{
glEnable(GL_CULL_FACE);
- glFrontFace(winding_test->get_winding());
+ glCullFace(face_cull==CULL_FRONT ? GL_FRONT : GL_BACK);
}
else
glDisable(GL_CULL_FACE);
}
for(vector<BoundTexture>::const_iterator i=textures.begin(); i!=textures.end(); ++i)
- if(i->changed)
+ if(i->changed || mask==~0U)
{
if(i->texture && i->sampler)
{
}
for(vector<BoundUniformBlock>::const_iterator i=uniform_blocks.begin(); i!=uniform_blocks.end(); ++i)
- if(i->changed)
+ if(i->changed || mask==~0U)
{
if(i->block)
{