inline void init_towbar() { body_s_ = findFirstNode((tow_visual_object_)->root(),"body_s"); body_b_ = findFirstNode((tow_visual_object_)->root(),"body_b"); body_a_ = findFirstNode((tow_visual_object_)->root(),"body_a"); osg::ComputeBoundsVisitor cbvs; body_s_->accept( cbvs ); const osg::BoundingBox bb_s = cbvs.getBoundingBox(); osg::ComputeBoundsVisitor cbvb; body_b_->accept( cbvb ); const osg::BoundingBox bb_b = cbvb.getBoundingBox(); osg::ComputeBoundsVisitor cbva; body_a_->accept( cbva ); const osg::BoundingBox bb_a = cbva.getBoundingBox(); osg::ComputeBoundsVisitor cbv; (tow_visual_object_)->root()->accept( cbv ); const osg::BoundingBox bb_ = cbv.getBoundingBox(); radius_ = abs(bb_.yMax() - bb_.yMin())/2.0;//(*tow_visual_object_)->root()->getBound().radius(); radius_s_ = abs(bb_s.yMax() - bb_s.yMin())/2.0;//body_s_->getBound().radius(); radius_a_ = abs(bb_a.yMax() - bb_a.yMin())/2.0;//body_a_->getBound().radius(); radius_b_ = abs(bb_b.yMax() - bb_b.yMin())/2.0;//body_b_->getBound().radius(); }
BboxDrawable::BboxDrawable( const osg::BoundingBox& box, const BBoxSymbol &bboxSymbol ) : osg::Geometry() { setUseVertexBufferObjects(true); float margin = bboxSymbol.margin().isSet() ? bboxSymbol.margin().value() : 2.f; osg::Vec3Array* v = new osg::Vec3Array(); if ( bboxSymbol.geom().isSet() && bboxSymbol.geom().value() == BBoxSymbol::GEOM_BOX_ORIENTED ) { float h = box.yMax() - box.yMin() + 2.f * margin; v->push_back( osg::Vec3(box.xMax()+margin+h/2.f, box.yMax()+margin-h/2.f, 0) ); } v->push_back( osg::Vec3(box.xMax()+margin, box.yMax()+margin, 0) ); v->push_back( osg::Vec3(box.xMin()-margin, box.yMax()+margin, 0) ); v->push_back( osg::Vec3(box.xMin()-margin, box.yMin()-margin, 0) ); v->push_back( osg::Vec3(box.xMax()+margin, box.yMin()-margin, 0) ); setVertexArray(v); if ( v->getVertexBufferObject() ) v->getVertexBufferObject()->setUsage(GL_STATIC_DRAW_ARB); osg::Vec4Array* c = new osg::Vec4Array(); if ( bboxSymbol.fill().isSet() ) { c->push_back( bboxSymbol.fill()->color() ); addPrimitiveSet( new osg::DrawArrays(GL_POLYGON, 0, v->getNumElements()) ); } if ( bboxSymbol.border().isSet() ) { c->push_back( bboxSymbol.border()->color() ); if ( bboxSymbol.border()->width().isSet() ) getOrCreateStateSet()->setAttribute( new osg::LineWidth( bboxSymbol.border()->width().value() )); addPrimitiveSet( new osg::DrawArrays(GL_LINE_LOOP, 0, v->getNumElements()) ); } setColorArray( c ); setColorBinding( osg::Geometry::BIND_PER_PRIMITIVE_SET ); // add the static "isText=true" uniform; this is a hint for the annotation shaders // if they get installed. static osg::ref_ptr<osg::Uniform> s_isTextUniform = new osg::Uniform(osg::Uniform::BOOL, AnnotationUtils::UNIFORM_IS_TEXT()); s_isTextUniform->set( false ); getOrCreateStateSet()->addUniform( s_isTextUniform.get() ); // Disable culling since this bounding box will eventually be drawn in screen space. #if OSG_MIN_VERSION_REQUIRED(3,4,0) setCullingActive(false); #endif }
void BuildKdTree::computeDivisions(KdTree::BuildOptions& options) { osg::Vec3 dimensions(_bb.xMax()-_bb.xMin(), _bb.yMax()-_bb.yMin(), _bb.zMax()-_bb.zMin()); #ifdef VERBOSE_OUTPUT OSG_NOTICE<<"computeDivisions("<<options._maxNumLevels<<") "<<dimensions<< " { "<<std::endl; #endif _axisStack.reserve(options._maxNumLevels); for(unsigned int level=0; level<options._maxNumLevels; ++level) { int axis = 0; if (dimensions[0]>=dimensions[1]) { if (dimensions[0]>=dimensions[2]) axis = 0; else axis = 2; } else if (dimensions[1]>=dimensions[2]) axis = 1; else axis = 2; _axisStack.push_back(axis); dimensions[axis] /= 2.0f; #ifdef VERBOSE_OUTPUT OSG_NOTICE<<" "<<level<<", "<<dimensions<<", "<<axis<<std::endl; #endif } #ifdef VERBOSE_OUTPUT OSG_NOTICE<<"}"<<std::endl; #endif }
BboxDrawable::BboxDrawable( const osg::BoundingBox& box, const BBoxSymbol &bboxSymbol ) : osg::Geometry() { setUseVertexBufferObjects(true); float margin = bboxSymbol.margin().isSet() ? bboxSymbol.margin().value() : 2.f; osg::Vec3Array* v = new osg::Vec3Array(); if ( bboxSymbol.geom().isSet() && bboxSymbol.geom().value() == BBoxSymbol::GEOM_BOX_ORIENTED ) { float h = box.yMax() - box.yMin() + 2.f * margin; v->push_back( osg::Vec3(box.xMax()+margin+h/2.f, box.yMax()+margin-h/2.f, 0) ); } v->push_back( osg::Vec3(box.xMax()+margin, box.yMax()+margin, 0) ); v->push_back( osg::Vec3(box.xMin()-margin, box.yMax()+margin, 0) ); v->push_back( osg::Vec3(box.xMin()-margin, box.yMin()-margin, 0) ); v->push_back( osg::Vec3(box.xMax()+margin, box.yMin()-margin, 0) ); setVertexArray(v); if ( v->getVertexBufferObject() ) v->getVertexBufferObject()->setUsage(GL_STATIC_DRAW_ARB); osg::Vec4Array* c = new osg::Vec4Array(osg::Array::BIND_PER_PRIMITIVE_SET); if ( bboxSymbol.fill().isSet() ) { c->push_back( bboxSymbol.fill()->color() ); osg::DrawElements* de = new osg::DrawElementsUByte(GL_TRIANGLE_STRIP); de->addElement(0); de->addElement(1); de->addElement(3); de->addElement(2); addPrimitiveSet(de); //addPrimitiveSet( new osg::DrawArrays(GL_POLYGON, 0, v->getNumElements()) ); } if ( bboxSymbol.border().isSet() ) { c->push_back( bboxSymbol.border()->color() ); if ( bboxSymbol.border()->width().isSet() ) getOrCreateStateSet()->setAttribute( new osg::LineWidth( bboxSymbol.border()->width().value() )); addPrimitiveSet( new osg::DrawArrays(GL_LINE_LOOP, 0, v->getNumElements()) ); } setColorArray( c ); // Disable culling since this bounding box will eventually be drawn in screen space. setCullingActive(false); }
osg::BoundingSphere TileNode::computeBound() const { osg::BoundingSphere bs; if (_surface.valid()) { bs = _surface->getBound(); const osg::BoundingBox bbox = _surface->getAlignedBoundingBox(); _tileKeyValue.a() = std::max( (bbox.xMax()-bbox.xMin()), (bbox.yMax()-bbox.yMin()) ); } return bs; }
CSulGeomBox::CSulGeomBox( const osg::BoundingBox& bb ) : CSulGeode() { m_minX = bb.xMin(); m_maxX = bb.xMax(); m_minY = bb.yMin(); m_maxY = bb.yMax(); m_minZ = bb.zMin(); m_maxZ = bb.zMax(); createDrawable(); }
osg::ref_ptr<osg::Geometry> HUDView::createRandNumBackground(osg::BoundingBox bb) { osg::ref_ptr<osg::Geometry> geom = new osg::Geometry; osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array; osg::Vec3 sizeUpY(0, bb.yMax() + bb.yMax() / 2, 0.0); osg::Vec3 sizeUpYN(0, -bb.yMax() / 2, 0.0); bb.expandBy(sizeUpY); bb.expandBy(sizeUpYN); osg::Vec3 halfExtent((bb.xMax() - bb.xMin()) / 2.0, (bb.yMax() - bb.yMin()) / 2.0f, 0); float x_length = bb.xMax() - bb.xMin(); float y_length = bb.yMax() - bb.yMin(); vertices->push_back(osg::Vec3(0, y_length, 0) - halfExtent); vertices->push_back(osg::Vec3(0, 0, 0) - halfExtent); vertices->push_back(osg::Vec3(x_length, 0, 0) - halfExtent); vertices->push_back(osg::Vec3(x_length, y_length, 0) - halfExtent); geom->setVertexArray(vertices); osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array; normals->push_back(osg::Vec3(0.0f, 0.0f, 1.0f)); geom->setNormalArray(normals, osg::Array::BIND_OVERALL); osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array; colors->push_back(osg::Vec4(0.0f, 0.2f, 1.0f, 0.7f)); geom->setColorArray(colors, osg::Array::BIND_OVERALL); geom->addPrimitiveSet(new osg::DrawArrays(GL_QUADS, 0, 4)); osg::ref_ptr<osg::StateSet> stateset = geom->getOrCreateStateSet(); stateset->setMode(GL_BLEND, osg::StateAttribute::ON); stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF); //stateset->setAttribute(new osg::PolygonOffset(1.0f,1.0f),osg::StateAttribute::ON); stateset->setRenderingHint(osg::StateSet::TRANSPARENT_BIN); return geom; }
void Style::setupClipStateSet(const osg::BoundingBox& extents, osg::StateSet* stateset) { unsigned int clipTextureUnit = 1; stateset->setAttributeAndModes( new osg::AlphaFunc(osg::AlphaFunc::GREATER, 0.0f), osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE); stateset->setTextureAttributeAndModes( clipTextureUnit, _clipTexture.get(), osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE); osg::Matrixd matrix = osg::Matrixd::translate(osg::Vec3(-extents.xMin(), -extents.yMin(), -extents.zMin()))* osg::Matrixd::scale(osg::Vec3(1.0f/(extents.xMax()-extents.xMin()), 1.0f/(extents.yMax()-extents.yMin()), 1.0f)); osg::ref_ptr<osg::TexGen> texgen = new osg::TexGen; texgen->setPlanesFromMatrix(matrix); texgen->setMode(osg::TexGen::OBJECT_LINEAR); stateset->setTextureAttributeAndModes( clipTextureUnit, texgen.get(), osg::StateAttribute::ON); }
osg::Vec2 Curve::mapTo2D( const osg::Vec3 p, osg::BoundingBox originRect, osg::BoundingBox newRect ) { if ( originRect.xMin()==originRect.xMax() ) { newRect.zMin() = newRect.yMin(); newRect.zMax() = newRect.yMax(); newRect.yMin() = newRect.xMin(); newRect.yMax() = newRect.xMax(); newRect.xMin() = 0.0; newRect.xMax() = 0.0; } else if ( originRect.yMin()==originRect.yMax() ) { newRect.zMin() = newRect.yMin(); newRect.zMax() = newRect.yMax(); newRect.yMin() = 0.0; newRect.yMax() = 0.0; } osg::Vec3 newPoint = mapTo( p, originRect, newRect ); osg::Vec2 point2D( newPoint.x(), newPoint.y() ); if ( originRect.xMin()==originRect.xMax() ) point2D.set( newPoint.y(), newPoint.z() ); else if ( originRect.yMin()==originRect.yMax() ) point2D.set( newPoint.x(), newPoint.z() ); return point2D; }
void WriterCompareTriangle::cutscene(int nbVertices, const osg::BoundingBox& sceneBox) { osg::BoundingBox::vec_type length = sceneBox._max - sceneBox._min; static const unsigned int k = 4; unsigned int nbVerticesX = (nbVertices * k) / (length.z() * length.y()); unsigned int nbVerticesY = (nbVertices * k) / (length.z() * length.x()); unsigned int nbVerticesZ = (nbVertices * k) / (length.x() * length.y()); setMaxMin (nbVerticesX, nbVerticesY, nbVerticesZ); OSG_DEBUG << "Cutting x by " << nbVerticesX << std::endl << "Cutting y by " << nbVerticesY << std::endl << "Cutting z by " << nbVerticesZ << std::endl; osg::BoundingBox::value_type blocX = length.x() / nbVerticesX; //These 3 lines set the size of a box in x, y and z osg::BoundingBox::value_type blocY = length.y() / nbVerticesY; osg::BoundingBox::value_type blocZ = length.z() / nbVerticesZ; boxList.reserve(nbVerticesX * nbVerticesY * nbVerticesZ); short yinc = 1; short xinc = 1; unsigned int y = 0; unsigned int x = 0; for (unsigned int z = 0; z < nbVerticesZ; ++z) { while (x < nbVerticesX && x >= 0) { while (y < nbVerticesY && y >= 0) { osg::BoundingBox::value_type xMin = sceneBox.xMin() + x * blocX; if (x == 0) //to prevent from mesh with no case xMin -= 10; osg::BoundingBox::value_type yMin = sceneBox.yMin() + y * blocY; if (y == 0) //to prevent from mesh with no case yMin -= 10; osg::BoundingBox::value_type zMin = sceneBox.zMin() + z * blocZ; if (z == 0) //to prevent from mesh with no case zMin -= 10; osg::BoundingBox::value_type xMax = sceneBox.xMin() + (x + 1) * blocX; if (x == nbVerticesX - 1) //to prevent from mesh with no case xMax += 10; osg::BoundingBox::value_type yMax = sceneBox.yMin() + (y + 1) * blocY; if (y == nbVerticesY - 1) //to prevent from mesh with no case yMax += 10; osg::BoundingBox::value_type zMax = sceneBox.zMin() + (z + 1) * blocZ; if (z == nbVerticesZ - 1) //to prevent from mesh with no case zMax += 10; boxList.push_back(osg::BoundingBox(xMin, // Add a box to the list yMin, zMin, xMax, yMax, zMax)); y += yinc; } yinc = -yinc; y += yinc; x += xinc; } xinc = -xinc; x += xinc; } }
void WriterCompareTriangle::cutscene(int nbVertices, const osg::BoundingBox & sceneBox) { osg::BoundingBox::vec_type length = sceneBox._max - sceneBox._min; static const float k = 1.3f; // Arbitrary constant multiplier for density computation ("simulates" non-uniform point distributions) // Computes "density" of points, and thus the number of blocks to divide the mesh into int nbVerticesX = static_cast<int>( (nbVertices * k) / (length.z() * length.y()) ); int nbVerticesY = static_cast<int>( (nbVertices * k) / (length.z() * length.x()) ); int nbVerticesZ = static_cast<int>( (nbVertices * k) / (length.x() * length.y()) ); setMaxMin (nbVerticesX, nbVerticesY, nbVerticesZ); // This function prevent from cutting the scene in too many blocs OSG_INFO << "Cutting x by " << nbVerticesX << std::endl << "Cutting y by " << nbVerticesY << std::endl << "Cutting z by " << nbVerticesZ << std::endl; osg::BoundingBox::value_type blocX = length.x() / nbVerticesX; // These 3 lines set the size of a bloc in x, y and z osg::BoundingBox::value_type blocY = length.y() / nbVerticesY; osg::BoundingBox::value_type blocZ = length.z() / nbVerticesZ; boxList.reserve(nbVerticesX * nbVerticesY * nbVerticesZ); short yinc = 1; short xinc = 1; int y = 0; int x = 0; for (int z = 0; z < nbVerticesZ; ++z) { while (x < nbVerticesX && x >= 0) { while (y < nbVerticesY && y >= 0) { osg::BoundingBox::value_type xMin = sceneBox.xMin() + x * blocX; if (x == 0) //to prevent from mesh with no case xMin -= 10; osg::BoundingBox::value_type yMin = sceneBox.yMin() + y * blocY; if (y == 0) //to prevent from mesh with no case yMin -= 10; osg::BoundingBox::value_type zMin = sceneBox.zMin() + z * blocZ; if (z == 0) //to prevent from mesh with no case zMin -= 10; osg::BoundingBox::value_type xMax = sceneBox.xMin() + (x + 1) * blocX; if (x == nbVerticesX - 1) //to prevent from mesh with no case xMax += 10; osg::BoundingBox::value_type yMax = sceneBox.yMin() + (y + 1) * blocY; if (y == nbVerticesY - 1) //to prevent from mesh with no case yMax += 10; osg::BoundingBox::value_type zMax = sceneBox.zMin() + (z + 1) * blocZ; if (z == nbVerticesZ - 1) //to prevent from mesh with no case zMax += 10; boxList.push_back(osg::BoundingBox(xMin, // Add a bloc to the list yMin, zMin, xMax, yMax, zMax)); y += yinc; } yinc = -yinc; y += yinc; x += xinc; } xinc = -xinc; x += xinc; } }
bool IntersectKdTree::intersectAndClip(osg::Vec3& s, osg::Vec3& e, const osg::BoundingBox& bb) const { //return true; //if (!bb.valid()) return true; // compate s and e against the xMin to xMax range of bb. if (s.x()<=e.x()) { // trivial reject of segment wholely outside. if (e.x()<bb.xMin()) return false; if (s.x()>bb.xMax()) return false; if (s.x()<bb.xMin()) { // clip s to xMin. s = s+_d_invX*(bb.xMin()-s.x()); } if (e.x()>bb.xMax()) { // clip e to xMax. e = s+_d_invX*(bb.xMax()-s.x()); } } else { if (s.x()<bb.xMin()) return false; if (e.x()>bb.xMax()) return false; if (e.x()<bb.xMin()) { // clip s to xMin. e = s+_d_invX*(bb.xMin()-s.x()); } if (s.x()>bb.xMax()) { // clip e to xMax. s = s+_d_invX*(bb.xMax()-s.x()); } } // compate s and e against the yMin to yMax range of bb. if (s.y()<=e.y()) { // trivial reject of segment wholely outside. if (e.y()<bb.yMin()) return false; if (s.y()>bb.yMax()) return false; if (s.y()<bb.yMin()) { // clip s to yMin. s = s+_d_invY*(bb.yMin()-s.y()); } if (e.y()>bb.yMax()) { // clip e to yMax. e = s+_d_invY*(bb.yMax()-s.y()); } } else { if (s.y()<bb.yMin()) return false; if (e.y()>bb.yMax()) return false; if (e.y()<bb.yMin()) { // clip s to yMin. e = s+_d_invY*(bb.yMin()-s.y()); } if (s.y()>bb.yMax()) { // clip e to yMax. s = s+_d_invY*(bb.yMax()-s.y()); } } // compate s and e against the zMin to zMax range of bb. if (s.z()<=e.z()) { // trivial reject of segment wholely outside. if (e.z()<bb.zMin()) return false; if (s.z()>bb.zMax()) return false; if (s.z()<bb.zMin()) { // clip s to zMin. s = s+_d_invZ*(bb.zMin()-s.z()); } if (e.z()>bb.zMax()) { // clip e to zMax. e = s+_d_invZ*(bb.zMax()-s.z()); } } else { if (s.z()<bb.zMin()) return false; if (e.z()>bb.zMax()) return false; if (e.z()<bb.zMin()) { // clip s to zMin. e = s+_d_invZ*(bb.zMin()-s.z()); } if (s.z()>bb.zMax()) { // clip e to zMax. s = s+_d_invZ*(bb.zMax()-s.z()); } } // OSG_NOTICE<<"clampped segment "<<s<<" "<<e<<std::endl; // if (s==e) return false; return true; }