/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2003 Robert Osfield * * This library is open source and may be redistributed and/or modified under * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * (at your option) any later version. The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * OpenSceneGraph Public License for more details. */ #ifndef OSGTEXT_TEXT #define OSGTEXT_TEXT 1 #include #include #include namespace osgText { class OSGTEXT_EXPORT Text : public osg::Drawable { public: Text(); Text(const Text& text,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY); virtual osg::Object* cloneType() const { return new Text(); } virtual osg::Object* clone(const osg::CopyOp& copyop) const { return new Text(*this,copyop); } virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast(obj)!=NULL; } virtual const char* className() const { return "Text"; } virtual const char* libraryName() const { return "osgText"; } /** Set the Font to use to render the text. * setFont(0) sets the use of the default font.*/ void setFont(Font* font=0); /** Set the font, loaded from the specified front file, to use to render the text, * setFont("") sets the use of the default font.*/ void setFont(const std::string& fontfile); /** Get the font. Return 0 if default is being used.*/ const Font* getFont() const { return _font.get(); } /** Set the Font reference width and height resolution in texels. * Note, the size may not be supported by current font, * the closest supported font size will be selected.*/ void setFontSize(unsigned int width, unsigned int height); unsigned int getFontWidth() const { return _fontWidth; } unsigned int getFontHeight() const { return _fontWidth; } /** TextString is a general purpose vector of char codes (unsigned int's) * which is used internally by Text to represent strings.*/ typedef std::vector TextString; /** Set the text using a TextString.*/ void setText(const TextString& text); /** Set the text using a std::string, * which is converted to an internal TextString.*/ void setText(const std::string& text); /** * Types of string encodings supported */ enum Encoding { ENCODING_UNDEFINED, /// not using Unicode ENCODING_ASCII = ENCODING_UNDEFINED,/// unsigned char ASCII ENCODING_UTF8, /// 8-bit unicode transformation format ENCODING_UTF16, /// 16-bit signature ENCODING_UTF16_BE, /// 16-bit big-endian ENCODING_UTF16_LE, /// 16-bit little-endian ENCODING_UTF32, /// 32-bit signature ENCODING_UTF32_BE, /// 32-bit big-endian ENCODING_UTF32_LE, /// 32-bit little-endian ENCODING_SIGNATURE, /// detect encoding from signature }; /** Set the text using a Unicode encoded std::string, which is converted to an internal TextString. * The encoding parameter specificies which Unicode encodeding is used in the std::string. */ void setText(const std::string& text,Encoding encoding); /** Set the text using a wchar_t string, * which is converted to an internal TextString.*/ void setText(const wchar_t* text); /** Get the const text string.*/ const TextString& getText() const { return _text; } /** Set the rendered character size in object coordinates.*/ void setCharacterSize(float height,float aspectRatio=1.0f); float getCharacterHeight() const { return _characterHeight; } float getCharacterAspectRatio() const { return _characterAspectRatio; } /** Set the position of text.*/ void setPosition(const osg::Vec3& pos); /** Get the position of text.*/ const osg::Vec3& getPosition() const { return _position; } enum AlignmentType { LEFT_TOP, LEFT_CENTER, LEFT_BOTTOM, CENTER_TOP, CENTER_CENTER, CENTER_BOTTOM, RIGHT_TOP, RIGHT_CENTER, RIGHT_BOTTOM, BASE_LINE /// default. }; void setAlignment(AlignmentType alignment); AlignmentType getAlignment() const { return _alignment; } enum AxisAlignment { XY_PLANE, XZ_PLANE, YZ_PLANE, SCREEN }; void setAxisAlignment(AxisAlignment axis); AxisAlignment getAxisAlignment() const { return _axisAlignment; } void setRotation(const osg::Quat& quat); const osg::Quat& getRotation() const { return _rotation; } enum Layout { LEFT_TO_RIGHT, /// default RIGHT_TO_LEFT, VERTICAL }; void setLayout(Layout layout); Layout getLayout() const { return _layout; } void setColor(const osg::Vec4& color); const osg::Vec4& getColor() const { return _color; } enum DrawModeMask { TEXT = 1, /// default BOUNDINGBOX = 2, ALIGNMENT = 4 }; void setDrawMode(unsigned int mode) { _drawMode=mode; } unsigned int getDrawMode() const { return _drawMode; } /** Draw the text.*/ virtual void drawImplementation(osg::State& state) const; protected: virtual ~Text(); virtual bool computeBound() const; Font* getActiveFont(); const Font* getActiveFont() const; // members which have public access. osg::ref_ptr _font; unsigned int _fontWidth; unsigned int _fontHeight; float _characterHeight; float _characterAspectRatio; TextString _text; osg::Vec3 _position; AlignmentType _alignment; AxisAlignment _axisAlignment; osg::Quat _rotation; Layout _layout; osg::Vec4 _color; unsigned int _drawMode; // internal structures, variable and methods used for rendering of characters. struct GlyphQuads { typedef std::vector Coords; typedef std::vector TexCoords; Coords _coords; TexCoords _texcoords; }; typedef std::map,GlyphQuads> TextureGlyphQuadMap; // iternal map used for rendering. Set up by the computeGlyphRepresentation() method. TextureGlyphQuadMap _textureGlyphQuadMap; void computeGlyphRepresentation(); // internal caches of the positioning of the text. osg::Matrix _matrix; osg::Vec3 _offset; mutable osg::BoundingBox _textBB; void computePositions(); }; } #endif