void operator()(FaceInstance& face) const { if(shader_equal(face.getFace().getShader(), m_name)) { face.setSelected(SelectionSystem::eFace, true); } }
bool Face_FindReplaceShader(Face& face, const char* find, const char* replace) { if(shader_equal(face.GetShader(), find)) { face.SetShader(replace); return true; } return false; }
bool Brush_hasShader(const Brush& brush, const char* name) { for(Brush::const_iterator i = brush.begin(); i != brush.end(); ++i) { if(shader_equal((*i)->GetShader(), name)) { return true; } } return false; }
bool filter(const Face& face) const { return shader_equal(face.GetShader(), m_shader); }
// greebo: TODO: Make this a member method of the Brush class bool Brush_merge(Brush& brush, const BrushPtrVector& in, bool onlyshape) { // gather potential outer faces typedef std::vector<const Face*> Faces; Faces faces; for (BrushPtrVector::const_iterator i(in.begin()); i != in.end(); ++i) { (*i)->getBrush().evaluateBRep(); for (Brush::const_iterator j((*i)->getBrush().begin()); j != (*i)->getBrush().end(); ++j) { if (!(*j)->contributes()) { continue; } const Face& face1 = *(*j); bool skip = false; // test faces of all input brushes //!\todo SPEEDUP: Flag already-skip faces and only test brushes from i+1 upwards. for (BrushPtrVector::const_iterator k(in.begin()); !skip && k != in.end(); ++k) { if (k != i) { // don't test a brush against itself for (Brush::const_iterator l((*k)->getBrush().begin()); !skip && l != (*k)->getBrush().end(); ++l) { const Face& face2 = *(*l); // face opposes another face if (face1.plane3() == -face2.plane3()) { // skip opposing planes skip = true; break; } } } } // check faces already stored for (Faces::const_iterator m = faces.begin(); !skip && m != faces.end(); ++m) { const Face& face2 = *(*m); // face equals another face if (face1.plane3() == face2.plane3()) { // if the texture/shader references should be the same but are not if (!onlyshape && !shader_equal( face1.getFaceShader().getMaterialName(), face2.getFaceShader().getMaterialName() )) { return false; } // skip duplicate planes skip = true; break; } // face1 plane intersects face2 winding or vice versa if (Winding::planesConcave(face1.getWinding(), face2.getWinding(), face1.plane3(), face2.plane3())) { // result would not be convex return false; } } if (!skip) { faces.push_back(&face1); } } } for (Faces::const_iterator i = faces.begin(); i != faces.end(); ++i) { if (!brush.addFace(*(*i))) { // result would have too many sides return false; } } brush.removeEmptyFaces(); return true; }