X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fclipping.cpp;h=30d1f7c2db7dfeff09701f422baf9af2cc02526e;hb=009918e76dda88b0cb68fdaa20c63d6e952af260;hp=3bdeee3ca8b3367624504f9815338f1810c4dcb9;hpb=7aaec9a70b8d7733429bec043f8e33e02956f266;p=libs%2Fgl.git diff --git a/source/core/clipping.cpp b/source/core/clipping.cpp index 3bdeee3c..30d1f7c2 100644 --- a/source/core/clipping.cpp +++ b/source/core/clipping.cpp @@ -1,84 +1,41 @@ -#include +#include #include "clipping.h" #include "clipplane.h" -#include "matrix.h" -#include "misc.h" +#include "deviceinfo.h" +#include "error.h" using namespace std; namespace Msp { namespace GL { -unsigned Clipping::get_n_attach_points() +void Clipping::attach(const ClipPlane &p) { - 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()) + if(find_member(planes, &p, &AttachedPlane::plane)!=planes.end()) return; + if(planes.size()>=DeviceInfo::get_global().limits.max_clip_planes) + throw invalid_operation("Clipping::attach"); - planes[i] = 0; - if(current()==this) - disable(GL_CLIP_PLANE0+i); + planes.push_back(&p); } -void Clipping::update_shader_data(ProgramData &shdata, const Matrix &view_matrix) const +void Clipping::detach(const ClipPlane &p) { - Matrix view_inverse = invert(view_matrix); - for(unsigned i=0; iupdate_shader_data(shdata, view_inverse, i); + auto i = find_member(planes, &p, &AttachedPlane::plane); + if(i!=planes.end()) + planes.erase(i); } -void Clipping::bind() const +const ProgramData &Clipping::get_shader_data() 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; + if(planes[i].plane->get_generation()!=planes[i].generation) + { + planes[i].plane->update_shader_data(shdata, i); + planes[i].generation = planes[i].plane->get_generation(); + } - for(unsigned i=0; iplanes.size(); ++i) - if(old->planes[i]) - disable(GL_CLIP_PLANE0+i); + return shdata; } } // namespace GL