Show
Ignore:
Timestamp:
03/05/03 13:28:42 (12 years ago)
Author:
robert
Message:

Updates to the GLUT and Producer text demo.

Fix to text to better handle unsetting of vertex arrays.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/examples/osgtext/osgtext.cpp

    r1649 r1651  
    4444 
    4545 
     46//////////////////////////////////////////////////////////////////////////////////////////////////////// 
     47//     
     48// Examples of how to set up different text layout 
     49// 
     50 
    4651    osg::Vec4 layoutColor(1.0f,1.0f,0.0f,1.0f); 
    4752    float layoutCharacterSize = 20.0f;     
     
    9196     
    9297     
     98//////////////////////////////////////////////////////////////////////////////////////////////////////// 
     99//     
     100// Examples of how to set up different font resolution 
     101// 
     102 
    93103    osg::Vec4 fontSizeColor(0.0f,1.0f,1.0f,1.0f); 
    94104    float fontSizeCharacterSize = 30; 
     
    141151 
    142152 
     153//////////////////////////////////////////////////////////////////////////////////////////////////////// 
     154//     
     155// Examples of how to set up different sized text 
     156// 
     157 
    143158    osg::Vec4 characterSizeColor(1.0f,0.0f,1.0f,1.0f); 
    144159     
     
    190205 
    191206 
    192     cursor.x() = 500; 
    193     cursor.y() = margin; 
     207//////////////////////////////////////////////////////////////////////////////////////////////////////// 
     208//     
     209// Examples of how to set up different alignments 
     210// 
     211 
     212    osg::Vec4 alignmentSizeColor(0.0f,1.0f,0.0f,1.0f); 
     213    float alignmentCharacterSize = 25.0f; 
     214    cursor.x() = 640; 
     215    cursor.y() = margin*4.0f; 
     216     
     217    typedef std::pair<osgText::Text::AlignmentType,std::string> AlignmentPair; 
     218    typedef std::vector<AlignmentPair> AlignmentList; 
     219    AlignmentList alignmentList; 
     220    alignmentList.push_back(AlignmentPair(osgText::Text::LEFT_TOP,"text->setAlignment(osgText::Text::LEFT_TOP);")); 
     221    alignmentList.push_back(AlignmentPair(osgText::Text::LEFT_CENTER,"text->setAlignment(osgText::Text::LEFT_CENTER);")); 
     222    alignmentList.push_back(AlignmentPair(osgText::Text::LEFT_BOTTOM,"text->setAlignment(osgText::Text::LEFT_BOTTOM);")); 
     223    alignmentList.push_back(AlignmentPair(osgText::Text::CENTER_TOP,"text->setAlignment(osgText::Text::CENTER_TOP);")); 
     224    alignmentList.push_back(AlignmentPair(osgText::Text::CENTER_CENTER,"text->setAlignment(osgText::Text::CENTER_CENTER);")); 
     225    alignmentList.push_back(AlignmentPair(osgText::Text::CENTER_BOTTOM,"text->setAlignment(osgText::Text::CENTER_BOTTOM);")); 
     226    alignmentList.push_back(AlignmentPair(osgText::Text::RIGHT_TOP,"text->setAlignment(osgText::Text::RIGHT_TOP);")); 
     227    alignmentList.push_back(AlignmentPair(osgText::Text::RIGHT_CENTER,"text->setAlignment(osgText::Text::RIGHT_CENTER);")); 
     228    alignmentList.push_back(AlignmentPair(osgText::Text::RIGHT_BOTTOM,"text->setAlignment(osgText::Text::RIGHT_BOTTOM);")); 
     229    alignmentList.push_back(AlignmentPair(osgText::Text::BASE_LINE,"text->setAlignment(osgText::Text::BASE_LINE);//default")); 
    194230 
    195231    osg::Sequence* sequence = new osg::Sequence; 
    196     
     232    { 
     233        for(AlignmentList::iterator itr=alignmentList.begin(); 
     234            itr!=alignmentList.end(); 
     235            ++itr) 
     236        { 
     237            osg::Geode* alignmentGeode = new osg::Geode; 
     238            sequence->addChild(alignmentGeode); 
     239            sequence->setTime(sequence->getNumChildren(), 1.0f); 
     240 
     241            osgText::Text* text = new osgText::Text; 
     242            text->setFont(font); 
     243            text->setColor(alignmentSizeColor); 
     244            text->setCharacterSize(alignmentCharacterSize); 
     245            text->setPosition(cursor); 
     246            text->setDrawMode(osgText::Text::TEXT|osgText::Text::ALIGNMENT|osgText::Text::BOUNDINGBOX); 
     247             
     248            text->setAlignment(itr->first); 
     249            text->setText(itr->second); 
     250             
     251            alignmentGeode->addDrawable(text); 
     252 
     253 
     254        } 
     255         
     256    } 
     257 
    197258    sequence->setMode(osg::Sequence::START); 
    198259    sequence->setInterval(osg::Sequence::LOOP, 0, -1); 
    199260    sequence->setDuration(1.0f, -1); 
    200261     
    201 //    osg::Group* sequence = new osg::Group; 
    202 //    rootNode->addChild(sequence); 
    203     
    204     { 
    205         for(unsigned int i=osgText::Text::LEFT_TOP;i<=osgText::Text::BASE_LINE;i++) 
    206         { 
    207             osg::Geode* alignmentGeode = new osg::Geode; 
    208             sequence->addChild(alignmentGeode); 
    209             sequence->setTime(i, 1.0f); 
    210  
    211             osgText::Text* text = new osgText::Text; 
    212             text->setFont(font); 
    213             text->setColor(characterSizeColor); 
    214             text->setPosition(cursor); 
    215             text->setDrawMode(osgText::Text::TEXT|osgText::Text::ALIGNMENT|osgText::Text::BOUNDINGBOX); 
    216              
    217             text->setAlignment((osgText::Text::AlignmentType)i); 
    218              
    219             text->setText("text->setAlignment();"); 
    220             alignmentGeode->addDrawable(text); 
    221  
    222             cursor.y() += 40.0f; 
    223  
    224  
    225         } 
    226          
    227     } 
    228262    rootNode->addChild(sequence); 
     263 
     264 
     265//////////////////////////////////////////////////////////////////////////////////////////////////////// 
     266//     
     267// Examples of how to set up different fonts... 
     268// 
     269 
     270    cursor.x() = margin*2.0f; 
     271    cursor.y() = margin*2.0f; 
     272     
     273    osg::Vec4 fontColor(1.0f,0.5f,0.0f,1.0f); 
     274    float fontCharacterSize = 20.0f; 
     275    float spacing = 40.0f; 
     276     
     277    { 
     278        osgText::Text* text = new osgText::Text; 
     279        text->setColor(fontColor); 
     280        text->setPosition(cursor); 
     281        text->setCharacterSize(fontCharacterSize); 
     282         
     283        text->setFont(0); 
     284        text->setText("text->setFont(0); // inbuilt font."); 
     285        geode->addDrawable(text); 
     286 
     287        cursor.x() = text->getBound().xMax() + spacing ; 
     288    } 
     289     
     290    { 
     291        osgText::Font* arial = osgText::readFontFile("fonts/arial.ttf"); 
     292 
     293        osgText::Text* text = new osgText::Text; 
     294        text->setColor(fontColor); 
     295        text->setPosition(cursor); 
     296        text->setCharacterSize(fontCharacterSize); 
     297         
     298        text->setFont(arial); 
     299        text->setText(arial!=0? 
     300                      "text->setFont(\"fonts/arial.ttf\");": 
     301                      "unable to load \"fonts/arial.ttf\""); 
     302        geode->addDrawable(text); 
     303 
     304        cursor.x() = text->getBound().xMax() + spacing ; 
     305    } 
     306     
     307    { 
     308        osgText::Font* times = osgText::readFontFile("fonts/times.ttf"); 
     309 
     310        osgText::Text* text = new osgText::Text; 
     311        text->setColor(fontColor); 
     312        text->setPosition(cursor); 
     313        text->setCharacterSize(fontCharacterSize); 
     314         
     315        geode->addDrawable(text); 
     316        text->setFont(times); 
     317        text->setText(times!=0? 
     318                      "text->setFont(\"fonts/times.ttf\");": 
     319                      "unable to load \"fonts/times.ttf\""); 
     320 
     321        cursor.x() = text->getBound().xMax() + spacing ; 
     322    } 
     323     
     324    cursor.x() = margin*2.0f; 
     325    cursor.y() = margin; 
     326 
     327    { 
     328        osgText::Font* dirtydoz = osgText::readFontFile("fonts/dirtydoz.ttf"); 
     329 
     330        osgText::Text* text = new osgText::Text; 
     331        text->setColor(fontColor); 
     332        text->setPosition(cursor); 
     333        text->setCharacterSize(fontCharacterSize); 
     334         
     335        text->setFont(dirtydoz); 
     336        text->setText(dirtydoz!=0? 
     337                      "text->setFont(\"fonts/dirtydoz.ttf\");": 
     338                      "unable to load \"fonts/dirtydoz.ttf\""); 
     339        geode->addDrawable(text); 
     340 
     341        cursor.x() = text->getBound().xMax() + spacing ; 
     342    } 
     343     
     344    { 
     345        osgText::Font* fudd = osgText::readFontFile("fonts/fudd.ttf"); 
     346     
     347        osgText::Text* text = new osgText::Text; 
     348        text->setColor(fontColor); 
     349        text->setPosition(cursor); 
     350        text->setCharacterSize(fontCharacterSize); 
     351         
     352        text->setFont(fudd); 
     353        text->setText(fudd!=0? 
     354                      "text->setFont(\"fonts/fudd.ttf\");": 
     355                      "unable to load \"fonts/fudd.ttf\""); 
     356        geode->addDrawable(text); 
     357 
     358        cursor.x() = text->getBound().xMax() + spacing ; 
     359    } 
    229360             
    230361    return rootNode;     
    231362} 
    232363 
    233 osg::Group* create3DText() 
     364 
     365 
     366 
     367// create text which sits in 3D space such as would be inserted into a normal model 
     368osg::Group* create3DText(const osg::Vec3& center,float radius) 
    234369{ 
    235370 
    236371    osg::Geode* geode  = new osg::Geode; 
     372 
     373//////////////////////////////////////////////////////////////////////////////////////////////////////// 
     374//     
     375// Examples of how to set up axis/orientation alignments 
     376// 
     377 
     378    float characterSize=radius*0.2f; 
     379     
     380    osg::Vec3 pos(center.x()-radius*.5f,center.y()-radius*.5f,center.z()-radius*.5f); 
    237381 
    238382    osgText::Text* text1 = new osgText::Text; 
    239383    text1->setFont("fonts/times.ttf"); 
     384    text1->setCharacterSize(characterSize); 
     385    text1->setPosition(pos); 
    240386    text1->setAxisAlignment(osgText::Text::XY_PLANE); 
    241387    text1->setText("XY_PLANE"); 
     
    244390    osgText::Text* text2 = new osgText::Text; 
    245391    text2->setFont("fonts/times.ttf"); 
    246     text2->setPosition(osg::Vec3(0.0f,0.0f,0.0f)); 
     392    text2->setCharacterSize(characterSize); 
     393    text2->setPosition(pos); 
    247394    text2->setAxisAlignment(osgText::Text::YZ_PLANE); 
    248395    text2->setText("YZ_PLANE"); 
     
    251398    osgText::Text* text3 = new osgText::Text; 
    252399    text3->setFont("fonts/times.ttf"); 
    253     text3->setPosition(osg::Vec3(00.0f,00.0f,00.0f)); 
     400    text3->setCharacterSize(characterSize); 
     401    text3->setPosition(pos); 
    254402    text3->setAxisAlignment(osgText::Text::XZ_PLANE); 
    255403    text3->setText("XZ_PLANE"); 
     
    257405 
    258406 
    259     osg::Vec3 screenCenter(300.0f,00.0f,00.0f); 
    260407    osgText::Text* text4 = new osgText::Text; 
    261408    text4->setFont("fonts/times.ttf"); 
     409    text4->setCharacterSize(characterSize); 
     410    text4->setPosition(center); 
    262411    text4->setAxisAlignment(osgText::Text::SCREEN); 
    263     text4->setPosition(screenCenter); 
    264412    text4->setText("SCREEN"); 
    265413    geode->addDrawable(text4); 
    266414 
    267     osg::ShapeDrawable* shape = new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(screenCenter),2.0f)); 
     415    osg::ShapeDrawable* shape = new osg::ShapeDrawable(new osg::Sphere(center,characterSize*0.2f)); 
    268416    shape->getOrCreateStateSet()->setMode(GL_LIGHTING,osg::StateAttribute::ON); 
    269417    geode->addDrawable(shape); 
     
    319467    { 
    320468 
     469        osg::Vec3 center(0.0f,0.0f,0.0f); 
     470        float radius = 1.0f; 
     471         
    321472        if (rootNode.valid()) 
    322473        { 
     
    324475            osgUtil::Optimizer optimizer; 
    325476            optimizer.optimize(rootNode.get()); 
     477             
     478            const osg::BoundingSphere& bs = rootNode->getBound(); 
     479            center = bs.center(); 
     480            radius = bs.radius(); 
    326481        } 
    327482 
     
    353508        } 
    354509 
    355         osg::MatrixTransform* scale = new osg::MatrixTransform; 
    356         scale->setMatrix(osg::Matrix::scale(1.0f,1.0f,1.0f)); 
    357         scale->addChild(create3DText()); 
    358         group->addChild(scale); 
     510        group->addChild(create3DText(center,radius)); 
    359511 
    360512    } 
     
    362514    // set the scene to render 
    363515    viewer.setSceneData(rootNode.get()); 
    364      
    365     osgDB::writeNodeFile(*rootNode,"test.osg"); 
    366516 
    367517    // create the windows and run the threads.