diff --git a/src/Demos/osgtext/main.cpp b/src/Demos/osgtext/main.cpp index f12ee8b86..7040c926f 100644 --- a/src/Demos/osgtext/main.cpp +++ b/src/Demos/osgtext/main.cpp @@ -57,7 +57,7 @@ std::string ttfPath1("fudd.ttf"); int gFontSize=18; int gFontSize1=24; std::vector > gTextList; -osgText::Text::AlignmentType gAlignement=osgText::Text::LEFT_BOTTOM; +osgText::Text::AlignmentType gAlignment=osgText::Text::LEFT_BOTTOM; void set2dScene(osg::Group* rootNode) @@ -83,7 +83,7 @@ void set2dScene(osg::Group* rootNode) text->setDrawMode( osgText::Text::TEXT | osgText::Text::BOUNDINGBOX | osgText::Text::ALIGNEMENT ); - text->setAlignement(gAlignement); + text->setAlignment(gAlignment); geode = new osg::Geode(); geode->setName("BitmapFont"); geode->addDrawable( text ); @@ -111,7 +111,7 @@ void set2dScene(osg::Group* rootNode) text->setDrawMode( osgText::Text::TEXT | osgText::Text::BOUNDINGBOX | osgText::Text::ALIGNEMENT ); - text->setAlignement(gAlignement); + text->setAlignment(gAlignment); geode = new osg::Geode(); geode->setName("PixmapFont"); geode->addDrawable( text ); @@ -151,7 +151,7 @@ void set2dScene(osg::Group* rootNode) text->setDrawMode( osgText::Text::TEXT | osgText::Text::BOUNDINGBOX | osgText::Text::ALIGNEMENT ); - text->setAlignement(gAlignement); + text->setAlignment(gAlignment); geode = new osg::Geode(); geode->setName("TextureFont"); geode->addDrawable( text ); @@ -188,7 +188,7 @@ void set2dScene(osg::Group* rootNode) text->setDrawMode( osgText::Text::TEXT | osgText::Text::BOUNDINGBOX | osgText::Text::ALIGNEMENT ); - text->setAlignement(gAlignement); + text->setAlignment(gAlignment); geode = new osg::Geode(); geode->setName("PolygonFont"); geode->addDrawable( text ); @@ -218,7 +218,7 @@ void set2dScene(osg::Group* rootNode) text->setDrawMode( osgText::Text::TEXT | osgText::Text::BOUNDINGBOX | osgText::Text::ALIGNEMENT ); - text->setAlignement(gAlignement); + text->setAlignment(gAlignment); geode = new osg::Geode(); geode->setName("OutlineFont"); geode->addDrawable( text ); @@ -266,7 +266,7 @@ void setScene(osg::Group* rootNode) text->setDrawMode( osgText::Text::TEXT | osgText::Text::BOUNDINGBOX | osgText::Text::ALIGNEMENT ); - text->setAlignement(gAlignement); + text->setAlignment(gAlignment); geode = new osg::Geode(); geode->setName("BitmapFont"); geode->addDrawable( text ); @@ -293,7 +293,7 @@ void setScene(osg::Group* rootNode) text->setDrawMode( osgText::Text::TEXT | osgText::Text::BOUNDINGBOX | osgText::Text::ALIGNEMENT ); - text->setAlignement(gAlignement); + text->setAlignment(gAlignment); geode = new osg::Geode(); geode->setName("PixmapFont"); geode->addDrawable( text ); @@ -327,7 +327,7 @@ void setScene(osg::Group* rootNode) text->setDrawMode( osgText::Text::TEXT | osgText::Text::BOUNDINGBOX | osgText::Text::ALIGNEMENT ); - text->setAlignement(gAlignement); + text->setAlignment(gAlignment); geode = new osg::Geode(); geode->setName("TextureFont"); geode->addDrawable( text ); @@ -364,7 +364,7 @@ void setScene(osg::Group* rootNode) text->setDrawMode( osgText::Text::TEXT | osgText::Text::BOUNDINGBOX | osgText::Text::ALIGNEMENT ); - text->setAlignement(gAlignement); + text->setAlignment(gAlignment); geode = new osg::Geode(); geode->setName("PolygonFont"); geode->addDrawable( text ); @@ -393,7 +393,7 @@ void setScene(osg::Group* rootNode) text->setDrawMode( osgText::Text::TEXT | osgText::Text::BOUNDINGBOX | osgText::Text::ALIGNEMENT ); - text->setAlignement(gAlignement); + text->setAlignment(gAlignment); geode = new osg::Geode(); geode->setName("OutlineFont"); geode->addDrawable( text ); @@ -525,14 +525,14 @@ protected: return; /////////////////////////////////////////////////////////////////// case '5': - { // change the textAlignement - gAlignement=(osgText::Text::AlignmentType)((int)gAlignement+1); - if(gAlignement>osgText::Text::RIGHT_BOTTOM) - gAlignement=osgText::Text::LEFT_TOP; + { // change the textAlignment + gAlignment=(osgText::Text::AlignmentType)((int)gAlignment+1); + if(gAlignment>osgText::Text::RIGHT_BOTTOM) + gAlignment=osgText::Text::LEFT_TOP; std::vector >::iterator itr=gTextList.begin(); for(;itr!=gTextList.end();itr++) - (*itr)->setAlignement(gAlignement); + (*itr)->setAlignment(gAlignment); } return; default: diff --git a/src/osgText/Text.cpp b/src/osgText/Text.cpp index 1266b7ebc..5cf0f46e2 100644 --- a/src/osgText/Text.cpp +++ b/src/osgText/Text.cpp @@ -377,7 +377,7 @@ void Text::setFont(Font* font) else if(dynamic_cast(_font.get())) _fontType=OUTLINE; - _initAlignement = false; + _initAlignment = false; dirtyBound(); } @@ -389,16 +389,16 @@ setDefaults() _init=false; _pos.set(0,0,0); - _alignementPos.set(0,0,0); + _alignmentPos.set(0,0,0); _fontType=UNDEF; - _alignement=LEFT_BOTTOM; + _alignment=LEFT_BOTTOM; _drawMode=DEFAULT; _boundingBoxType=GLYPH; _boundingBoxType=GEOMETRY; - _initAlignement=false; + _initAlignment=false; _useDisplayList=false; } @@ -430,8 +430,11 @@ computeBound() const _bbox.init(); // to be sure that the obj isn't culled +// _bbox.expandBy(_pos); + _bbox.expandBy(_pos + Vec3(-100,-100,-100)); _bbox.expandBy(_pos + Vec3(100,100,100)); + /* _bbox.expandBy(Vec3(-FLT_MAX,-FLT_MAX,-FLT_MAX)); _bbox.expandBy(Vec3(FLT_MAX,FLT_MAX,FLT_MAX)); @@ -453,20 +456,20 @@ void Text::drawImmediateMode(State& state) dirtyBound(); } - if(!_initAlignement) - initAlignement(); + if(!_initAlignment) + initAlignment(); // draw boundingBox if(_drawMode & BOUNDINGBOX) drawBoundingBox(); - // draw alignement + // draw alignment if(_drawMode & ALIGNEMENT) - drawAlignement(); + drawAlignment(); // draw boundingBox if(_drawMode & TEXT) { - Vec3 drawPos(_pos+_alignementPos); + Vec3 drawPos(_pos+_alignmentPos); glPushMatrix(); switch(_fontType) { @@ -515,7 +518,7 @@ drawBoundingBox(void) } void Text:: -drawAlignement(void) +drawAlignment(void) { if(!_init) return; @@ -563,7 +566,7 @@ calcBounds(Vec3* min,Vec3* max) const } bool Text:: -initAlignement(void) +initAlignment(void) { if(!_init) return false; @@ -574,14 +577,14 @@ initAlignement(void) _bbox.init(); Vec3 min,max; - initAlignement(&min,&max); + initAlignment(&min,&max); _bbox.expandBy(min); _bbox.expandBy(max); _bbox_computed=true; - _initAlignement=true; + _initAlignment=true; } else { // have to wait for the init. @@ -598,7 +601,7 @@ initAlignement(void) } void Text:: -initAlignement(Vec3* min,Vec3* max) +initAlignment(Vec3* min,Vec3* max) { if(!_init) return; @@ -614,81 +617,81 @@ initAlignement(Vec3* min,Vec3* max) { case GLYPH: h+=descender; - switch(_alignement) + switch(_alignment) { case LEFT_TOP: - _alignementPos.set(0.0,h,0.0); + _alignmentPos.set(0.0,h,0.0); break; case LEFT_CENTER: - _alignementPos.set(0.0,h/2.0,0.0); + _alignmentPos.set(0.0,h/2.0,0.0); break; case LEFT_BOTTOM: - _alignementPos.set(0.0,0.0,0.0); + _alignmentPos.set(0.0,0.0,0.0); break; case CENTER_TOP: - _alignementPos.set(w/2.0,h,0.0); + _alignmentPos.set(w/2.0,h,0.0); break; case CENTER_CENTER: - _alignementPos.set(w/2.0,h/2.0,0.0); + _alignmentPos.set(w/2.0,h/2.0,0.0); break; case CENTER_BOTTOM: - _alignementPos.set(w/2.0,0.0,0.0); + _alignmentPos.set(w/2.0,0.0,0.0); break; case RIGHT_TOP: - _alignementPos.set(w,h,0.0); + _alignmentPos.set(w,h,0.0); break; case RIGHT_CENTER: - _alignementPos.set(w,h/2.0,0.0); + _alignmentPos.set(w,h/2.0,0.0); break; case RIGHT_BOTTOM: - _alignementPos.set(w,0.0,0.0); + _alignmentPos.set(w,0.0,0.0); break; }; - _alignementPos=-_alignementPos; + _alignmentPos=-_alignmentPos; - *min+=_pos+_alignementPos; - *max+=_pos+_alignementPos; + *min+=_pos+_alignmentPos; + *max+=_pos+_alignmentPos; break; case GEOMETRY: - switch(_alignement) + switch(_alignment) { case LEFT_TOP: - _alignementPos.set(0.0,h + descender,0.0); + _alignmentPos.set(0.0,h + descender,0.0); break; case LEFT_CENTER: - _alignementPos.set(0.0,(max->y()-min->y()) /2.0 + descender,0.0); + _alignmentPos.set(0.0,(max->y()-min->y()) /2.0 + descender,0.0); break; case LEFT_BOTTOM: - _alignementPos.set(0.0,descender,0.0); + _alignmentPos.set(0.0,descender,0.0); break; case CENTER_TOP: - _alignementPos.set(w/2.0,h + descender,0.0); + _alignmentPos.set(w/2.0,h + descender,0.0); break; case CENTER_CENTER: - _alignementPos.set(w/2.0,(max->y()-min->y()) /2.0 + descender,0.0); + _alignmentPos.set(w/2.0,(max->y()-min->y()) /2.0 + descender,0.0); break; case CENTER_BOTTOM: - _alignementPos.set(w/2.0,descender,0.0); + _alignmentPos.set(w/2.0,descender,0.0); break; case RIGHT_TOP: - _alignementPos.set(w,h + descender,0.0); + _alignmentPos.set(w,h + descender,0.0); break; case RIGHT_CENTER: - _alignementPos.set(w,(max->y()-min->y()) /2.0 + descender,0.0); + _alignmentPos.set(w,(max->y()-min->y()) /2.0 + descender,0.0); break; case RIGHT_BOTTOM: - _alignementPos.set(w,descender,0.0); + _alignmentPos.set(w,descender,0.0); break; }; - _alignementPos=-_alignementPos; + _alignmentPos=-_alignmentPos; - *min+=_pos+_alignementPos; - *max+=_pos+_alignementPos; + *min+=_pos+_alignmentPos; + *max+=_pos+_alignmentPos; break; }; @@ -706,14 +709,14 @@ initAlignement(Vec3* min,Vec3* max) void Text:: -setAlignement(int alignement) +setAlignment(int alignment) { - _alignement=alignement; + _alignment=alignment; if(!_init || !_font->isCreated()) return; - initAlignement(); + initAlignment(); } void Text:: @@ -724,7 +727,7 @@ setBoundingBox(int mode) if(!_init || !_font->isCreated()) return; - initAlignement(); + initAlignment(); } // Text diff --git a/src/osgUtil/IntersectVisitor.cpp b/src/osgUtil/IntersectVisitor.cpp index 644713ff1..ad1f63ac1 100644 --- a/src/osgUtil/IntersectVisitor.cpp +++ b/src/osgUtil/IntersectVisitor.cpp @@ -367,19 +367,8 @@ struct TriangleIntersect } - // void operator () (const Vec3& v1,const Vec3& v2,const Vec3& v3) - // { - // float r; - // if (_seg.intersect(v1,v2,v3,r)) - // { - // _thl.insert(std::pair(r,_index)); - // _hit = true; - // } - // ++_index; - // } - // bool intersect(const Vec3& v1,const Vec3& v2,const Vec3& v3,float& r) - void operator () (const Vec3& v1,const Vec3& v2,const Vec3& v3) + inline void operator () (const Vec3& v1,const Vec3& v2,const Vec3& v3) { ++_index; @@ -429,13 +418,38 @@ struct TriangleIntersect if (ds31>0.0f) return; if (ds310.0f) r3 = ds12/d312; + else return; // the triangle and the line must be parallel intersection. + + float r1; + if (ds23==0.0f) r1=0.0f; + else if (d123>0.0f) r1 = ds23/d123; + else return; // the triangle and the line must be parallel intersection. + + float r2; + if (ds31==0.0f) r2=0.0f; + else if (d231>0.0f) r2 = ds31/d231; + else return; // the triangle and the line must be parallel intersection. + float total_r = (r1+r2+r3); + if (total_r!=1.0f) + { + if (total_r==0.0f) return; // the triangle and the line must be parallel intersection. + float inv_total_r = 1.0f/total_r; + r1 *= inv_total_r; + r2 *= inv_total_r; + r3 *= inv_total_r; + } + Vec3 in = v1*r1+v2*r2+v3*r3; float d = (in-_s)*_d; diff --git a/src/osgUtil/Optimizer.cpp b/src/osgUtil/Optimizer.cpp index cd99d33e8..19cd730ac 100644 --- a/src/osgUtil/Optimizer.cpp +++ b/src/osgUtil/Optimizer.cpp @@ -295,7 +295,9 @@ void Optimizer::FlattenStaticTransformsVisitor::apply(osg::Geode& geode) for(int i=0;iapplyAttributeOperation(tf); + geode.getDrawable(i)->dirtyBound(); } + geode.dirtyBound(); } }