1 #include <msp/gl/extensions/msp_legacy_features.h>
13 bool Clipping::bound_with_legacy = false;
15 void Clipping::attach(unsigned i, const ClipPlane &p)
17 if(i>=ClipUnit::get_n_units())
18 throw out_of_range("Clipping::attach");
29 glEnable(GL_CLIP_PLANE0+i);
33 void Clipping::detach(unsigned i)
42 ClipPlane::unbind_from(i);
44 disable(GL_CLIP_PLANE0+i);
48 void Clipping::update_shader_data(ProgramData &shdata, const Matrix &view_matrix) const
50 Matrix view_inverse = invert(view_matrix);
51 for(unsigned i=0; i<planes.size(); ++i)
53 planes[i]->update_shader_data(shdata, view_inverse, i);
56 void Clipping::bind(bool legacy) const
59 static Require _req(MSP_legacy_features);
61 const Clipping *old = current();
62 if(!set_current(this))
65 bound_with_legacy = legacy;
68 for(unsigned i=0; i<planes.size(); ++i)
71 planes[i]->bind_to(i);
73 ClipPlane::unbind_from(i);
78 for(unsigned i=planes.size(); i<old->planes.size(); ++i)
79 ClipPlane::unbind_from(i);
84 for(unsigned i=0; i<planes.size(); ++i)
87 enable(GL_CLIP_PLANE0+i);
89 disable(GL_CLIP_PLANE0+i);
94 for(unsigned i=planes.size(); i<old->planes.size(); ++i)
95 disable(GL_CLIP_PLANE0+i);
100 void Clipping::unbind()
102 const Clipping *old = current();
106 if(bound_with_legacy)
108 for(unsigned i=0; i<old->planes.size(); ++i)
110 ClipPlane::unbind_from(i);
114 for(unsigned i=0; i<old->planes.size(); ++i)
116 disable(GL_CLIP_PLANE0+i);