Files
OpenSceneGraph/src/osgPlugins/ive/Text.cpp

188 lines
5.1 KiB
C++

/**********************************************************************
*
* FILE: Text.cpp
*
* DESCRIPTION: Read/Write osgText::Text in binary format to disk.
*
* CREATED BY: Auto generated by iveGenerator
* and later modified by Rune Schmidt Jensen.
*
* HISTORY: Created 27.3.2003
*
* Copyright 2003 VR-C
**********************************************************************/
#include "Exception.h"
#include "Text.h"
#include "Drawable.h"
#include "Object.h"
#include <osgDB/FileUtils>
#include <osgDB/FileNameUtils>
#include <osg/Notify>
using namespace ive;
void Text::write(DataOutputStream* out){
// Write Text's identification.
out->writeInt(IVETEXT);
// If the osg class is inherited by any other class we should also write this to file.
osg::Object* obj = dynamic_cast<osg::Object*>(this);
if(obj){
((ive::Drawable*)(obj))->write(out);
}
else
throw Exception("Text::write(): Could not cast this osgText::Text to an osg::Drawable.");
// Write Text's properties.
if( getFont() )
{
std::string fname = getFont()->getFileName();
if(!fname.empty())
{
if(out->getUseOriginalExternalReferences())
{
out->writeString(fname); //Saving file name with local directory
}
else
{
out->writeString(osgDB::getSimpleFileName(fname)); //Saving original file name
}
}
else
out->writeString(""); //Blank string
}
else
out->writeString(""); //Blank string
out->writeUInt(getFontWidth());
out->writeUInt(getFontHeight());
out->writeFloat(getCharacterHeight());
out->writeFloat(getCharacterAspectRatio());
out->writeUInt(getCharacterSizeMode());
out->writeFloat(getMaximumWidth());
out->writeFloat(getMaximumHeight());
out->writeUInt(getAlignment());
out->writeQuat(getRotation()); //FIXME: controllare che ci sia
out->writeBool(getAutoRotateToScreen());
out->writeUInt(getLayout());
out->writeVec3(getPosition());
out->writeVec4(getColor());
out->writeUInt(getDrawMode());
// text :: Modified from osgPlugins::osg
const osgText::String& textstring = 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));
out->writeBool(true);
out->writeString(str);
}
else
{
// do it the hardway...output each character as an int
osg::ref_ptr<osg::UByteArray> strarr = new osg::UByteArray(textstring.size());
for(itr=textstring.begin();
itr!=textstring.end();
++itr)
{
strarr->push_back((char)(*itr));
}
out->writeBool(false);
out->writeUByteArray(strarr.get());
}
}
void Text::read(DataInputStream* in){
// Peek on Text's identification.
int id = in->peekInt();
if(id == IVETEXT){
// Read Text's identification.
id = in->readInt();
// If the osg class is inherited by any other class we should also read this from file.
osg::Object* obj = dynamic_cast<osg::Object*>(this);
if(obj){
((ive::Drawable*)(obj))->read(in);
}
else
throw Exception("Text::read(): Could not cast this osgText::Text to an osg::Drawable.");
// Read Text's properties
unsigned int width, height;
float c_height, aspectRatio;
setFont(in->readString());
width = in->readUInt();
height = in->readUInt();
setFontResolution(width,height);
c_height = in->readFloat();
aspectRatio = in->readFloat();
setCharacterSize(c_height,aspectRatio);
setCharacterSizeMode((osgText::Text::CharacterSizeMode) in->readUInt());
setMaximumWidth(in->readFloat());
setMaximumHeight(in->readFloat());
setAlignment((osgText::Text::AlignmentType) in->readUInt());
//Nothing to do...
//setAxisAlignment((osgText::Text::AxisAlignment) in->readUint());
setRotation(in->readQuat());
setAutoRotateToScreen(in->readBool());
setLayout((osgText::Text::Layout) in->readUInt());
setPosition(in->readVec3());
setColor(in->readVec4());
setDrawMode(in->readUInt());
if(in->readBool())
setText(in->readString());
else
{
std::string textstr;
osg::ref_ptr<osg::UByteArray> arr = in->readUByteArray();
for(unsigned int i = 0; i < arr->getNumElements(); i++)
{
textstr += (char) arr->at(i);
}
setText(textstr);
}
}
else{
throw Exception("ShadeModel::read(): Expected ShadeModel identification.");
}
}