]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/clipping.cpp
Rearrange soucre files into subdirectories
[libs/gl.git] / source / core / clipping.cpp
diff --git a/source/core/clipping.cpp b/source/core/clipping.cpp
new file mode 100644 (file)
index 0000000..3bdeee3
--- /dev/null
@@ -0,0 +1,85 @@
+#include <msp/gl/extensions/msp_clipping.h>
+#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; i<planes.size(); ++i)
+               if(planes[i])
+                       planes[i]->update_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; i<planes.size(); ++i)
+       {
+               if(planes[i])
+                       enable(GL_CLIP_PLANE0+i);
+               else
+                       disable(GL_CLIP_PLANE0+i);
+       }
+
+       if(old)
+       {
+               for(unsigned i=planes.size(); i<old->planes.size(); ++i)
+                       disable(GL_CLIP_PLANE0+i);
+       }
+}
+
+void Clipping::unbind()
+{
+       const Clipping *old = current();
+       if(!set_current(0))
+               return;
+
+       for(unsigned i=0; i<old->planes.size(); ++i)
+               if(old->planes[i])
+                       disable(GL_CLIP_PLANE0+i);
+}
+
+} // namespace GL
+} // namespace Msp