Added a dirtyBound() to osgUtil::Optimizer.
Corrected mispelling of alignment is osg::Text and the osgtext demo. Added guards for divide bu zero's to osg::IntersectVisitor.
This commit is contained in:
@@ -57,7 +57,7 @@ std::string ttfPath1("fudd.ttf");
|
||||
int gFontSize=18;
|
||||
int gFontSize1=24;
|
||||
std::vector<osg::ref_ptr<osgText::Text > > 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<osg::ref_ptr<osgText::Text> >::iterator itr=gTextList.begin();
|
||||
for(;itr!=gTextList.end();itr++)
|
||||
(*itr)->setAlignement(gAlignement);
|
||||
(*itr)->setAlignment(gAlignment);
|
||||
}
|
||||
return;
|
||||
default:
|
||||
|
||||
@@ -377,7 +377,7 @@ void Text::setFont(Font* font)
|
||||
else if(dynamic_cast<OutlineFont*>(_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
|
||||
|
||||
@@ -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<float,int>(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 (ds31<d231) return;
|
||||
}
|
||||
|
||||
if (d312==0.0f || d123==0.0f || d231==0.0f)
|
||||
{
|
||||
// the triangle and the line must be parallel intersection.
|
||||
|
||||
}
|
||||
|
||||
float r3 = ds12/d312;
|
||||
float r1 = ds23/d123;
|
||||
float r2 = ds31/d231;
|
||||
|
||||
//float rt = r1+r2+r3;
|
||||
float r3;
|
||||
if (ds12==0.0f) r3=0.0f;
|
||||
else if (d312>0.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;
|
||||
|
||||
@@ -295,7 +295,9 @@ void Optimizer::FlattenStaticTransformsVisitor::apply(osg::Geode& geode)
|
||||
for(int i=0;i<geode.getNumDrawables();++i)
|
||||
{
|
||||
geode.getDrawable(i)->applyAttributeOperation(tf);
|
||||
geode.getDrawable(i)->dirtyBound();
|
||||
}
|
||||
geode.dirtyBound();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user