1 #include <msp/core/algorithm.h>
2 #include <msp/gl/extensions/msp_clipping.h>
14 unsigned Clipping::get_n_attach_points()
16 static Require _req(MSP_clipping);
17 static int count = get_i(GL_MAX_CLIP_PLANES);
21 void Clipping::attach(const ClipPlane &p)
23 if(find(planes, &p)!=planes.end())
25 if(planes.size()>=get_n_attach_points())
26 throw invalid_operation("Clipping::attach");
30 glEnable(GL_CLIP_PLANE0+planes.size()-1);
33 void Clipping::detach(const ClipPlane &p)
35 vector<const ClipPlane *>::iterator i = find(planes, &p);
40 disable(GL_CLIP_PLANE0+planes.size());
45 void Clipping::detach(unsigned i)
51 void Clipping::update_shader_data(ProgramData &shdata, const Matrix &view_matrix) const
53 Matrix view_inverse = invert(view_matrix);
54 for(unsigned i=0; i<planes.size(); ++i)
55 planes[i]->update_shader_data(shdata, view_inverse, i);
58 void Clipping::bind() const
60 static Require _req(MSP_clipping);
62 const Clipping *old = current();
63 if(!set_current(this))
66 for(unsigned i=0; i<planes.size(); ++i)
67 enable(GL_CLIP_PLANE0+i);
71 for(unsigned i=planes.size(); i<old->planes.size(); ++i)
72 disable(GL_CLIP_PLANE0+i);
76 void Clipping::unbind()
78 const Clipping *old = current();
82 for(unsigned i=0; i<old->planes.size(); ++i)
83 disable(GL_CLIP_PLANE0+i);