/*! The IntersectAction callback for Geometry. It computes if the ray used in the IntersectAction \a action hits this object and if that is the case, which triangle is hit. \param[in] action IntersectAction performing the intersect test. \return Action result code, \see OSG::Action. \note This method is registered with the IntersectAction and automatically called from there, you probably never have to call it manually. */ Action::ResultE Geometry::intersect(Action * action) { IntersectAction *ia = dynamic_cast<IntersectAction*>(action); ia->getActNode()->updateVolume(); const BoxVolume &bv = ia->getActNode()->getVolume(); if(bv.isValid() && !bv.intersect(ia->getLine())) { return Action::Skip; //bv missed -> can not hit children } TriangleIterator it = this->beginTriangles(); TriangleIterator end = this->endTriangles (); Real32 t; Vec3f norm; Line ia_line(ia->getLine()); for(; it != end; ++it) { if(ia_line.intersect(it.getPosition(0), it.getPosition(1), it.getPosition(2), t, &norm)) { ia->setHit(t, ia->getActNode(), it.getIndex(), norm, -1); } } // If we need to test lines, iterate over lines and test for // lines that are within width distance from the line if(ia->getTestLines()) { Real32 range_sq = ia->getTestLineWidth(); range_sq = range_sq * range_sq; LineIterator it = this->beginLines(); LineIterator end = this->endLines (); Pnt3f pt1, pt2; OSG::Vec3f norm; // Find closest points and if they are within the range, then add a hit for(; it != end; ++it) { Line cur_line(it.getPosition(0), it.getPosition(1)); ia_line.getClosestPoints(cur_line, pt1, pt2); Real32 dist_sq( pt1.dist2(pt2) ); if (dist_sq <= range_sq) { t = ia_line.getPosition().dist(pt1); ia->setHit(t, ia->getActNode(), -1, norm, it.getIndex()); } } } return Action::Continue; }
bool INIFile::setLine(LineIterator line_it, const String& line) { // section lines cannot be changed with this method if (!isValid(line_it) || (*line_it)[0] == '[') { return false; } String new_key(line.before("=")); new_key.trim(); if ((*line_it).hasSubstring("=", 1)) { // oh, this line had a key :( String old_key((*line_it).before("=")); old_key.trim(); if (old_key == new_key) { line_it.setLine_(line); return true; } // its a new key: delete the old one. line_it.getSection()->key_map_.remove(old_key); } line_it.setLine_(line); if (line.hasSubstring("=", 1)) { // oh, the new line has a key :( line_it.getSection()->key_map_[new_key] = line_it.getPosition(); } return true; }