void Clipping::attach(const ClipPlane &p)
{
- if(find(planes, &p)!=planes.end())
+ if(find_member(planes, &p, &AttachedPlane::plane)!=planes.end())
return;
if(planes.size()>=get_n_attach_points())
throw invalid_operation("Clipping::attach");
void Clipping::detach(const ClipPlane &p)
{
- vector<const ClipPlane *>::iterator i = find(planes, &p);
+ vector<AttachedPlane>::iterator i = find_member(planes, &p, &AttachedPlane::plane);
if(i!=planes.end())
{
planes.erase(i);
void Clipping::detach(unsigned i)
{
if(i<planes.size())
- detach(*planes[i]);
+ detach(*planes[i].plane);
}
-void Clipping::update_shader_data(ProgramData &shdata, const Matrix &view_matrix) const
+const ProgramData &Clipping::get_shader_data() const
{
- Matrix view_inverse = invert(view_matrix);
for(unsigned i=0; i<planes.size(); ++i)
- planes[i]->update_shader_data(shdata, view_inverse, i);
+ 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();
+ }
+
+ return shdata;
}
void Clipping::bind() const