X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fclipping.cpp;fp=source%2Fcore%2Fclipping.cpp;h=3bdeee3ca8b3367624504f9815338f1810c4dcb9;hb=7aaec9a70b8d7733429bec043f8e33e02956f266;hp=0000000000000000000000000000000000000000;hpb=bec07999d95b76f4b47cffcc564d0cd0afc0435e;p=libs%2Fgl.git diff --git a/source/core/clipping.cpp b/source/core/clipping.cpp new file mode 100644 index 00000000..3bdeee3c --- /dev/null +++ b/source/core/clipping.cpp @@ -0,0 +1,85 @@ +#include +#include "clipping.h" +#include "clipplane.h" +#include "matrix.h" +#include "misc.h" + +using namespace std; + +namespace Msp { +namespace GL { + +unsigned Clipping::get_n_attach_points() +{ + static Require _req(MSP_clipping); + static int count = get_i(GL_MAX_CLIP_PLANES); + return count; +} + +void Clipping::attach(unsigned i, const ClipPlane &p) +{ + if(i>=get_n_attach_points()) + throw out_of_range("Clipping::attach"); + + if(i>=planes.size()) + planes.resize(i+1); + + planes[i] = &p; + if(current()==this) + glEnable(GL_CLIP_PLANE0+i); +} + +void Clipping::detach(unsigned i) +{ + if(i>=planes.size()) + return; + + planes[i] = 0; + if(current()==this) + disable(GL_CLIP_PLANE0+i); +} + +void Clipping::update_shader_data(ProgramData &shdata, const Matrix &view_matrix) const +{ + Matrix view_inverse = invert(view_matrix); + for(unsigned i=0; iupdate_shader_data(shdata, view_inverse, i); +} + +void Clipping::bind() const +{ + static Require _req(MSP_clipping); + + const Clipping *old = current(); + if(!set_current(this)) + return; + + for(unsigned i=0; iplanes.size(); ++i) + disable(GL_CLIP_PLANE0+i); + } +} + +void Clipping::unbind() +{ + const Clipping *old = current(); + if(!set_current(0)) + return; + + for(unsigned i=0; iplanes.size(); ++i) + if(old->planes[i]) + disable(GL_CLIP_PLANE0+i); +} + +} // namespace GL +} // namespace Msp