| 1 | #include <osgText/TextBase> |
|---|
| 2 | #include <osgDB/ObjectWrapper> |
|---|
| 3 | #include <osgDB/InputStream> |
|---|
| 4 | #include <osgDB/OutputStream> |
|---|
| 5 | |
|---|
| 6 | |
|---|
| 7 | static bool checkFont( const osgText::TextBase& text ) |
|---|
| 8 | { |
|---|
| 9 | return text.getFont()!=NULL; |
|---|
| 10 | } |
|---|
| 11 | |
|---|
| 12 | static bool readFont( osgDB::InputStream& is, osgText::TextBase& text ) |
|---|
| 13 | { |
|---|
| 14 | std::string fontName; is.readWrappedString( fontName ); |
|---|
| 15 | text.setFont( osgText::readFontFile(fontName) ); |
|---|
| 16 | return true; |
|---|
| 17 | } |
|---|
| 18 | |
|---|
| 19 | static bool writeFont( osgDB::OutputStream& os, const osgText::TextBase& text ) |
|---|
| 20 | { |
|---|
| 21 | os.writeWrappedString( text.getFont()->getFileName() ); |
|---|
| 22 | os << std::endl; |
|---|
| 23 | return true; |
|---|
| 24 | } |
|---|
| 25 | |
|---|
| 26 | |
|---|
| 27 | static bool checkFontSize( const osgText::TextBase& text ) |
|---|
| 28 | { |
|---|
| 29 | return true; |
|---|
| 30 | } |
|---|
| 31 | |
|---|
| 32 | static bool readFontSize( osgDB::InputStream& is, osgText::TextBase& text ) |
|---|
| 33 | { |
|---|
| 34 | unsigned int width, height; is >> width >> height; |
|---|
| 35 | text.setFontResolution( width, height ); |
|---|
| 36 | return true; |
|---|
| 37 | } |
|---|
| 38 | |
|---|
| 39 | static bool writeFontSize( osgDB::OutputStream& os, const osgText::TextBase& text ) |
|---|
| 40 | { |
|---|
| 41 | os << text.getFontWidth() << text.getFontHeight() << std::endl; |
|---|
| 42 | return true; |
|---|
| 43 | } |
|---|
| 44 | |
|---|
| 45 | |
|---|
| 46 | static bool checkCharacterSize( const osgText::TextBase& text ) |
|---|
| 47 | { |
|---|
| 48 | return true; |
|---|
| 49 | } |
|---|
| 50 | |
|---|
| 51 | static bool readCharacterSize( osgDB::InputStream& is, osgText::TextBase& text ) |
|---|
| 52 | { |
|---|
| 53 | float height, aspectRatio; is >> height >> aspectRatio; |
|---|
| 54 | text.setCharacterSize( height, aspectRatio ); |
|---|
| 55 | return true; |
|---|
| 56 | } |
|---|
| 57 | |
|---|
| 58 | static bool writeCharacterSize( osgDB::OutputStream& os, const osgText::TextBase& text ) |
|---|
| 59 | { |
|---|
| 60 | os << text.getCharacterHeight() << text.getCharacterAspectRatio() << std::endl; |
|---|
| 61 | return true; |
|---|
| 62 | } |
|---|
| 63 | |
|---|
| 64 | |
|---|
| 65 | static bool checkText( const osgText::TextBase& text ) |
|---|
| 66 | { |
|---|
| 67 | return text.getText().size()>0; |
|---|
| 68 | } |
|---|
| 69 | |
|---|
| 70 | static bool readText( osgDB::InputStream& is, osgText::TextBase& text ) |
|---|
| 71 | { |
|---|
| 72 | bool isACString; is >> isACString; |
|---|
| 73 | if ( isACString ) |
|---|
| 74 | { |
|---|
| 75 | std::string acString; is.readWrappedString( acString ); |
|---|
| 76 | text.setText( acString ); |
|---|
| 77 | } |
|---|
| 78 | else |
|---|
| 79 | { |
|---|
| 80 | osg::UIntArray* array = dynamic_cast<osg::UIntArray*>( is.readArray() ); |
|---|
| 81 | if ( array ) |
|---|
| 82 | { |
|---|
| 83 | osgText::String string; |
|---|
| 84 | for ( osg::UIntArray::iterator itr=array->begin(); itr!=array->end(); ++itr ) |
|---|
| 85 | { |
|---|
| 86 | string.push_back( *itr ); |
|---|
| 87 | } |
|---|
| 88 | text.setText( string ); |
|---|
| 89 | } |
|---|
| 90 | } |
|---|
| 91 | return true; |
|---|
| 92 | } |
|---|
| 93 | |
|---|
| 94 | static bool writeText( osgDB::OutputStream& os, const osgText::TextBase& text ) |
|---|
| 95 | { |
|---|
| 96 | bool isACString = true; |
|---|
| 97 | const osgText::String& string = text.getText(); |
|---|
| 98 | for ( osgText::String::const_iterator itr=string.begin(); itr!=string.end(); ++itr ) |
|---|
| 99 | { |
|---|
| 100 | if ( *itr==0 || *itr>256 ) |
|---|
| 101 | { |
|---|
| 102 | isACString = false; |
|---|
| 103 | break; |
|---|
| 104 | } |
|---|
| 105 | } |
|---|
| 106 | |
|---|
| 107 | os << isACString; |
|---|
| 108 | if ( isACString ) |
|---|
| 109 | { |
|---|
| 110 | std::string acString; |
|---|
| 111 | for ( osgText::String::const_iterator itr=string.begin(); itr!=string.end(); ++itr ) |
|---|
| 112 | { |
|---|
| 113 | acString += (char)(*itr); |
|---|
| 114 | } |
|---|
| 115 | os.writeWrappedString( acString ); |
|---|
| 116 | os << std::endl; |
|---|
| 117 | } |
|---|
| 118 | else |
|---|
| 119 | { |
|---|
| 120 | osg::ref_ptr<osg::UIntArray> array = new osg::UIntArray( string.begin(), string.end() ); |
|---|
| 121 | os << array.get(); |
|---|
| 122 | } |
|---|
| 123 | return true; |
|---|
| 124 | } |
|---|
| 125 | |
|---|
| 126 | |
|---|
| 127 | static bool checkDrawMode( const osgText::TextBase& text ) |
|---|
| 128 | { |
|---|
| 129 | return text.getDrawMode()!=osgText::TextBase::TEXT; |
|---|
| 130 | } |
|---|
| 131 | |
|---|
| 132 | static bool readDrawMode( osgDB::InputStream& is, osgText::TextBase& text ) |
|---|
| 133 | { |
|---|
| 134 | unsigned int mask = osgText::TextBase::TEXT; |
|---|
| 135 | if ( is.isBinary() ) |
|---|
| 136 | is >> mask; |
|---|
| 137 | else |
|---|
| 138 | { |
|---|
| 139 | std::string maskSetString; is >> maskSetString; |
|---|
| 140 | osgDB::StringList maskList; osgDB::split( maskSetString, maskList, '|' ); |
|---|
| 141 | for ( unsigned int i=0; i<maskList.size(); ++i ) |
|---|
| 142 | { |
|---|
| 143 | const std::string& maskValue = maskList[i]; |
|---|
| 144 | if ( maskValue=="TEXT" ) mask |= osgText::TextBase::TEXT; |
|---|
| 145 | else if ( maskValue=="BOUND" ) mask |= osgText::TextBase::BOUNDINGBOX; |
|---|
| 146 | else if ( maskValue=="FILLED" ) mask |= osgText::TextBase::FILLEDBOUNDINGBOX; |
|---|
| 147 | else if ( maskValue=="ALIGNMENT" ) mask |= osgText::TextBase::ALIGNMENT; |
|---|
| 148 | } |
|---|
| 149 | } |
|---|
| 150 | text.setDrawMode( mask ); |
|---|
| 151 | return true; |
|---|
| 152 | } |
|---|
| 153 | |
|---|
| 154 | static bool writeDrawMode( osgDB::OutputStream& os, const osgText::TextBase& text ) |
|---|
| 155 | { |
|---|
| 156 | unsigned int mask = text.getDrawMode(); |
|---|
| 157 | if ( os.isBinary() ) |
|---|
| 158 | os << mask; |
|---|
| 159 | else |
|---|
| 160 | { |
|---|
| 161 | std::string maskString; |
|---|
| 162 | if ( mask==osgText::TextBase::TEXT ) maskString += std::string("TEXT|"); |
|---|
| 163 | if ( mask==osgText::TextBase::BOUNDINGBOX ) maskString += std::string("BOUND|"); |
|---|
| 164 | if ( mask==osgText::TextBase::FILLEDBOUNDINGBOX ) maskString += std::string("FILLED|"); |
|---|
| 165 | if ( mask==osgText::TextBase::ALIGNMENT ) maskString += std::string("ALIGNMENT|"); |
|---|
| 166 | if ( !maskString.size() ) maskString = std::string("NONE|"); |
|---|
| 167 | os << maskString.substr(0, maskString.size()-1) << std::endl; |
|---|
| 168 | } |
|---|
| 169 | return true; |
|---|
| 170 | } |
|---|
| 171 | |
|---|
| 172 | REGISTER_OBJECT_WRAPPER( osgText_TextBase, |
|---|
| 173 | NULL, |
|---|
| 174 | osgText::TextBase, |
|---|
| 175 | "osg::Object osg::Drawable osgText::TextBase" ) |
|---|
| 176 | { |
|---|
| 177 | ADD_USER_SERIALIZER( Font ); |
|---|
| 178 | ADD_USER_SERIALIZER( FontSize ); |
|---|
| 179 | ADD_USER_SERIALIZER( CharacterSize ); |
|---|
| 180 | |
|---|
| 181 | BEGIN_ENUM_SERIALIZER( CharacterSizeMode, OBJECT_COORDS ); |
|---|
| 182 | ADD_ENUM_VALUE( OBJECT_COORDS ); |
|---|
| 183 | ADD_ENUM_VALUE( SCREEN_COORDS ); |
|---|
| 184 | ADD_ENUM_VALUE( OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT ); |
|---|
| 185 | END_ENUM_SERIALIZER(); |
|---|
| 186 | |
|---|
| 187 | ADD_FLOAT_SERIALIZER( MaximumWidth, 0.0f ); |
|---|
| 188 | ADD_FLOAT_SERIALIZER( MaximumHeight, 0.0f ); |
|---|
| 189 | ADD_FLOAT_SERIALIZER( LineSpacing, 0.0f ); |
|---|
| 190 | ADD_USER_SERIALIZER( Text ); |
|---|
| 191 | ADD_VEC3_SERIALIZER( Position, osg::Vec3() ); |
|---|
| 192 | |
|---|
| 193 | BEGIN_ENUM_SERIALIZER2( Alignment, osgText::TextBase::AlignmentType, LEFT_BASE_LINE ); |
|---|
| 194 | ADD_ENUM_VALUE( LEFT_TOP ); |
|---|
| 195 | ADD_ENUM_VALUE( LEFT_CENTER ); |
|---|
| 196 | ADD_ENUM_VALUE( LEFT_BOTTOM ); |
|---|
| 197 | ADD_ENUM_VALUE( CENTER_TOP ); |
|---|
| 198 | ADD_ENUM_VALUE( CENTER_CENTER ); |
|---|
| 199 | ADD_ENUM_VALUE( CENTER_BOTTOM ); |
|---|
| 200 | ADD_ENUM_VALUE( RIGHT_TOP ); |
|---|
| 201 | ADD_ENUM_VALUE( RIGHT_CENTER ); |
|---|
| 202 | ADD_ENUM_VALUE( RIGHT_BOTTOM ); |
|---|
| 203 | ADD_ENUM_VALUE( LEFT_BASE_LINE ); |
|---|
| 204 | ADD_ENUM_VALUE( CENTER_BASE_LINE ); |
|---|
| 205 | ADD_ENUM_VALUE( RIGHT_BASE_LINE ); |
|---|
| 206 | ADD_ENUM_VALUE( LEFT_BOTTOM_BASE_LINE ); |
|---|
| 207 | ADD_ENUM_VALUE( CENTER_BOTTOM_BASE_LINE ); |
|---|
| 208 | ADD_ENUM_VALUE( RIGHT_BOTTOM_BASE_LINE ); |
|---|
| 209 | END_ENUM_SERIALIZER(); |
|---|
| 210 | |
|---|
| 211 | BEGIN_ENUM_SERIALIZER( AxisAlignment, XY_PLANE ); |
|---|
| 212 | ADD_ENUM_VALUE( XY_PLANE ); |
|---|
| 213 | ADD_ENUM_VALUE( REVERSED_XY_PLANE ); |
|---|
| 214 | ADD_ENUM_VALUE( XZ_PLANE ); |
|---|
| 215 | ADD_ENUM_VALUE( REVERSED_XZ_PLANE ); |
|---|
| 216 | ADD_ENUM_VALUE( YZ_PLANE ); |
|---|
| 217 | ADD_ENUM_VALUE( REVERSED_YZ_PLANE ); |
|---|
| 218 | ADD_ENUM_VALUE( SCREEN ); |
|---|
| 219 | ADD_ENUM_VALUE( USER_DEFINED_ROTATION ); |
|---|
| 220 | END_ENUM_SERIALIZER(); |
|---|
| 221 | |
|---|
| 222 | ADD_QUAT_SERIALIZER( Rotation, osg::Quat() ); |
|---|
| 223 | ADD_BOOL_SERIALIZER( AutoRotateToScreen, false ); |
|---|
| 224 | |
|---|
| 225 | BEGIN_ENUM_SERIALIZER( Layout, LEFT_TO_RIGHT ); |
|---|
| 226 | ADD_ENUM_VALUE( LEFT_TO_RIGHT ); |
|---|
| 227 | ADD_ENUM_VALUE( RIGHT_TO_LEFT ); |
|---|
| 228 | ADD_ENUM_VALUE( VERTICAL ); |
|---|
| 229 | END_ENUM_SERIALIZER(); |
|---|
| 230 | |
|---|
| 231 | ADD_USER_SERIALIZER( DrawMode ); |
|---|
| 232 | ADD_FLOAT_SERIALIZER( BoundingBoxMargin, 0.0f ); |
|---|
| 233 | ADD_VEC4_SERIALIZER( BoundingBoxColor, osg::Vec4() ); |
|---|
| 234 | } |
|---|