diff --git a/src/osgPlugins/osgText/IO_TextBase.cpp b/src/osgPlugins/osgText/IO_TextBase.cpp new file mode 100644 index 000000000..135f73503 --- /dev/null +++ b/src/osgPlugins/osgText/IO_TextBase.cpp @@ -0,0 +1,383 @@ +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +bool TextBase_readLocalData(osg::Object &obj, osgDB::Input &fr); +bool TextBase_writeLocalData(const osg::Object &obj, osgDB::Output &fw); + +osgDB::RegisterDotOsgWrapperProxy TextBase_Proxy +( + /*new osgText::Text*/NULL, + "TextBase", + "Object Drawable TextBase", + TextBase_readLocalData, + TextBase_writeLocalData +); + +bool TextBase_readLocalData(osg::Object &obj, osgDB::Input &fr) +{ + osgText::Text &text = static_cast(obj); + bool itAdvanced = false; + + if (fr[0].matchWord("fontResolution") || fr[0].matchWord("fontSize")) + { + unsigned int width; + unsigned int height; + if (fr[1].getUInt(width) && fr[2].getUInt(height)) + { + text.setFontResolution(width,height); + fr += 3; + itAdvanced = true; + } + } + + if (fr[0].matchWord("characterSize")) + { + float height; + float aspectRatio; + if (fr[1].getFloat(height) && fr[2].getFloat(aspectRatio)) + { + text.setCharacterSize(height,aspectRatio); + fr += 3; + itAdvanced = true; + } + } + + if (fr.matchSequence("characterSizeMode %w")) + { + std::string str = fr[1].getStr(); + if (str=="OBJECT_COORDS") text.setCharacterSizeMode(osgText::Text::OBJECT_COORDS); + else if (str=="SCREEN_COORDS") text.setCharacterSizeMode(osgText::Text::SCREEN_COORDS); + else if (str=="OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT") text.setCharacterSizeMode(osgText::Text::OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT); + } + + // maximum dimentsions of text box. + if (fr[0].matchWord("maximumWidth")) + { + float width; + if (fr[1].getFloat(width)) + { + text.setMaximumWidth(width); + fr += 2; + itAdvanced = true; + } + } + + if (fr[0].matchWord("maximumHeight")) + { + float height; + if (fr[1].getFloat(height)) + { + text.setMaximumHeight(height); + fr += 2; + itAdvanced = true; + } + } + + if (fr[0].matchWord("lineSpacing")) + { + float height; + if (fr[1].getFloat(height)) + { + text.setLineSpacing(height); + fr += 2; + itAdvanced = true; + } + } + + if (fr.matchSequence("alignment %w")) + { + std::string str = fr[1].getStr(); + if (str=="LEFT_TOP") text.setAlignment(osgText::Text::LEFT_TOP); + else if (str=="LEFT_CENTER") text.setAlignment(osgText::Text::LEFT_CENTER); + else if (str=="LEFT_BOTTOM") text.setAlignment(osgText::Text::LEFT_BOTTOM); + else if (str=="CENTER_TOP") text.setAlignment(osgText::Text::CENTER_TOP); + else if (str=="CENTER_CENTER") text.setAlignment(osgText::Text::CENTER_CENTER); + else if (str=="CENTER_BOTTOM") text.setAlignment(osgText::Text::CENTER_BOTTOM); + else if (str=="RIGHT_TOP") text.setAlignment(osgText::Text::RIGHT_TOP); + else if (str=="RIGHT_CENTER") text.setAlignment(osgText::Text::RIGHT_CENTER); + else if (str=="RIGHT_BOTTOM") text.setAlignment(osgText::Text::RIGHT_BOTTOM); + else if (str=="LEFT_BASE_LINE") text.setAlignment(osgText::Text::LEFT_BASE_LINE); + else if (str=="CENTER_BASE_LINE") text.setAlignment(osgText::Text::CENTER_BASE_LINE); + else if (str=="RIGHT_BASE_LINE") text.setAlignment(osgText::Text::RIGHT_BASE_LINE); + else if (str=="LEFT_BOTTOM_BASE_LINE") text.setAlignment(osgText::Text::LEFT_BOTTOM_BASE_LINE); + else if (str=="CENTER_BOTTOM_BASE_LINE") text.setAlignment(osgText::Text::CENTER_BOTTOM_BASE_LINE); + else if (str=="RIGHT_BOTTOM_BASE_LINE") text.setAlignment(osgText::Text::RIGHT_BOTTOM_BASE_LINE); + else if (str=="BASE_LINE") text.setAlignment(osgText::Text::BASE_LINE); + fr += 2; + itAdvanced = true; + } + + if (fr.matchSequence("axisAlignment %w")) + { + std::string str = fr[1].getStr(); + if (str=="XY_PLANE") text.setAxisAlignment(osgText::Text::XY_PLANE); + else if (str=="REVERSED_XY_PLANE") text.setAxisAlignment(osgText::Text::REVERSED_XY_PLANE); + else if (str=="XZ_PLANE") text.setAxisAlignment(osgText::Text::XZ_PLANE); + else if (str=="REVERSED_XZ_PLANE") text.setAxisAlignment(osgText::Text::REVERSED_XZ_PLANE); + else if (str=="YZ_PLANE") text.setAxisAlignment(osgText::Text::YZ_PLANE); + else if (str=="REVERSED_YZ_PLANE") text.setAxisAlignment(osgText::Text::REVERSED_YZ_PLANE); + else if (str=="SCREEN") text.setAxisAlignment(osgText::Text::SCREEN); + fr += 2; + itAdvanced = true; + } + + if (fr.matchSequence("rotation")) + { + osg::Vec4 rotation; + if (fr[1].getFloat(rotation.x()) && fr[2].getFloat(rotation.y()) && fr[3].getFloat(rotation.z()) && fr[4].getFloat(rotation.w())) + { + text.setRotation(rotation); + fr += 4; + itAdvanced = true; + } + } + + if (fr.matchSequence("autoRotateToScreen TRUE")) + { + text.setAutoRotateToScreen(true); + fr += 2; + itAdvanced = true; + } + + if (fr.matchSequence("autoScaleToLimitScreenSizeToFontResolution TRUE")) + { + text.setCharacterSizeMode(osgText::Text::SCREEN_COORDS); + fr += 2; + itAdvanced = true; + } + + if (fr.matchSequence("layout %w") && fr[1].getStr()) + { + std::string str = fr[1].getStr(); + if (str=="LEFT_TO_RIGHT") text.setLayout(osgText::Text::LEFT_TO_RIGHT); + else if (str=="RIGHT_TO_LEFT") text.setLayout(osgText::Text::RIGHT_TO_LEFT); + else if (str=="VERTICAL") text.setLayout(osgText::Text::VERTICAL); + fr += 2; + itAdvanced = true; + } + + + // position + if (fr[0].matchWord("position")) + { + osg::Vec3 p; + if (fr[1].getFloat(p.x()) && fr[2].getFloat(p.y()) && fr[3].getFloat(p.z())) + { + text.setPosition(p); + fr += 4; + itAdvanced = true; + } + } + + // draw mode + if (fr[0].matchWord("drawMode")) + { + int i; + if (fr[1].getInt(i)) { + text.setDrawMode(i); + fr += 2; + itAdvanced = true; + } + } + + // text + if (fr.matchSequence("text %s") && fr[1].getStr()) { + text.setText(std::string(fr[1].getStr())); + fr += 2; + itAdvanced = true; + } + + if (fr.matchSequence("text %i {")) + { + // pre 0.9.3 releases.. + int entry = fr[0].getNoNestedBrackets(); + + int capacity; + fr[1].getInt(capacity); + + osgText::String str; + str.reserve(capacity); + + fr += 3; + + while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) + { + unsigned int c; + if (fr[0].getUInt(c)) + { + ++fr; + str.push_back(c); + } + else + { + ++fr; + } + } + + text.setText(str); + + itAdvanced = true; + ++fr; + } + + return itAdvanced; +} + +//osgText::Text::CharactereSizeMode convertCharactereSizeModeStringtoEnum(std::string & str) +//{ +// if (str=="OBJECT_COORDS") return osgText::Text::OBJECT_COORDS; +// else if (str=="SCREEN_COORDS") return osgText::Text::SCREEN_COORDS; +// else if (str=="OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT") return osgText::Text::OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT; +// else return -1; +//} +// +//std::string convertCharactereSizeModeStringtoEnum(osgText::Text::CharactereSizeMode charactereSizeMode) +//{ +// switch(charactereSizeMode) +// { +// case osgText::Text::OBJECT_COORDS : return "OBJECT_COORDS"; +// case osgText::Text::SCREEN_COORDS : return "SCREEN_COORDS"; +// case osgText::Text::OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT: return "OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT"; +// default : return ""; +// } +//} + +bool TextBase_writeLocalData(const osg::Object &obj, osgDB::Output &fw) +{ + const osgText::Text &text = static_cast(obj); + + // font resolution + fw.indent() << "fontResolution " << text.getFontWidth() << " " << text.getFontHeight() << std::endl; + + // charater size. + fw.indent() << "characterSize " << text.getCharacterHeight() << " " << text.getCharacterAspectRatio() << std::endl; + + fw.indent() << "characterSizeMode "; + switch(text.getCharacterSizeMode()) + { + case osgText::Text::OBJECT_COORDS : fw<<"OBJECT_COORDS"<0.0f) + { + fw.indent() << "maximumWidth " << text.getMaximumWidth() << std::endl; + } + + if (text.getMaximumHeight()>0.0f) + { + fw.indent() << "maximumHeight " << text.getMaximumHeight() << std::endl; + } + + if (text.getLineSpacing()>0.0f) + { + fw.indent() << "lineSpacing " << text.getLineSpacing() << std::endl; + } + + // alignment + fw.indent() << "alignment "; + switch(text.getAlignment()) + { + case osgText::Text::LEFT_TOP: fw << "LEFT_TOP" << std::endl; break; + case osgText::Text::LEFT_CENTER : fw << "LEFT_CENTER" << std::endl; break; + case osgText::Text::LEFT_BOTTOM : fw << "LEFT_BOTTOM" << std::endl; break; + + case osgText::Text::CENTER_TOP: fw << "CENTER_TOP" << std::endl; break; + case osgText::Text::CENTER_CENTER: fw << "CENTER_CENTER" << std::endl; break; + case osgText::Text::CENTER_BOTTOM: fw << "CENTER_BOTTOM" << std::endl; break; + + case osgText::Text::RIGHT_TOP: fw << "RIGHT_TOP" << std::endl; break; + case osgText::Text::RIGHT_CENTER: fw << "RIGHT_CENTER" << std::endl; break; + case osgText::Text::RIGHT_BOTTOM: fw << "RIGHT_BOTTOM" << std::endl; break; + + case osgText::Text::LEFT_BASE_LINE: fw << "LEFT_BASE_LINE" << std::endl; break; + case osgText::Text::CENTER_BASE_LINE:fw << "CENTER_BASE_LINE" << std::endl; break; + case osgText::Text::RIGHT_BASE_LINE: fw << "RIGHT_BASE_LINE" << std::endl; break; + + case osgText::Text::LEFT_BOTTOM_BASE_LINE: fw << "LEFT_BOTTOM_BASE_LINE" << std::endl; break; + case osgText::Text::CENTER_BOTTOM_BASE_LINE:fw << "CENTER_BOTTOM_BASE_LINE" << std::endl; break; + case osgText::Text::RIGHT_BOTTOM_BASE_LINE: fw << "RIGHT_BOTTOM_BASE_LINE" << std::endl; break; + }; + + + if (!text.getRotation().zeroRotation()) + { + fw.indent() << "rotation " << text.getRotation() << std::endl; + } + + if (text.getAutoRotateToScreen()) + { + fw.indent() << "autoRotateToScreen TRUE"<< std::endl; + } + + + // layout + fw.indent() << "layout "; + switch(text.getLayout()) + { + case osgText::Text::LEFT_TO_RIGHT: fw << "LEFT_TO_RIGHT" << std::endl; break; + case osgText::Text::RIGHT_TO_LEFT: fw << "RIGHT_TO_LEFT" << std::endl; break; + case osgText::Text::VERTICAL: fw << "VERTICAL" << std::endl; break; + }; + + + // position + osg::Vec3 p = text.getPosition(); + fw.indent() << "position " << p.x() << " " << p.y() << " " << p.z() << std::endl; + + // color +// osg::Vec4 c = text.getColor(); +// fw.indent() << "color " << c.x() << " " << c.y() << " " << c.z() << " " << c.w() << std::endl; + + // draw mode + fw.indent() << "drawMode " << text.getDrawMode() << std::endl; + + + // text + const osgText::String& textstring = text.getText(); + bool isACString = true; + osgText::String::const_iterator itr; + for(itr=textstring.begin(); + itr!=textstring.end() && isACString; + ++itr) + { + if (*itr==0 || *itr>256) isACString=false; + } + if (isACString) + { + std::string str; + + for(itr=textstring.begin(); + itr!=textstring.end(); + ++itr) + { + str += (char)(*itr); + } + + //std::copy(textstring.begin(),textstring.end(),std::back_inserter(str)); + + fw.indent() << "text " << fw.wrapString(str) << std::endl; + } + else + { + // do it the hardway...output each character as an int + fw.indent() << "text "<