2005-04-15 05:41:28 +08:00
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2005 Robert Osfield
2003-01-22 00:45:36 +08:00
*
* 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.
*/
2001-10-24 03:51:39 +08:00
#ifndef OSGTEXT_TEXT
2003-03-03 05:05:05 +08:00
#define OSGTEXT_TEXT 1
2001-10-24 03:51:39 +08:00
#include <osg/Drawable>
2003-03-03 05:05:05 +08:00
#include <osg/Quat>
2001-10-24 03:51:39 +08:00
2001-11-09 23:06:01 +08:00
#include <osgText/Font>
2003-03-06 05:05:37 +08:00
#include <osgText/String>
2001-10-24 03:51:39 +08:00
namespace osgText {
2003-03-03 05:05:05 +08:00
2001-11-09 23:06:01 +08:00
class OSGTEXT_EXPORT Text : public osg::Drawable
2001-10-24 03:51:39 +08:00
{
2003-03-03 05:05:05 +08:00
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<const Text*>(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(); }
2003-04-30 19:40:17 +08:00
2003-03-03 05:05:05 +08:00
/** 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.*/
2003-04-30 19:40:17 +08:00
void setFontResolution(unsigned int width, unsigned int height);
2003-03-03 05:05:05 +08:00
unsigned int getFontWidth() const { return _fontWidth; }
2004-10-11 02:18:45 +08:00
unsigned int getFontHeight() const { return _fontHeight; }
2003-03-03 05:05:05 +08:00
2003-03-06 05:05:37 +08:00
/** Set the text using a osgText::String.*/
void setText(const String& text);
2003-03-03 05:05:05 +08:00
/** Set the text using a std::string,
* which is converted to an internal TextString.*/
void setText(const std::string& text);
2003-03-03 23:36:52 +08:00
/** 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. */
2003-03-06 05:05:37 +08:00
void setText(const std::string& text,String::Encoding encoding);
2003-03-03 23:36:52 +08:00
2003-03-03 05:05:05 +08:00
/** Set the text using a wchar_t string,
* which is converted to an internal TextString.*/
void setText(const wchar_t* text);
2003-03-25 21:57:16 +08:00
/** Get the text string.
* Note, if you modify the string you must call Text::update() for
* the internal glyph reprentation to be updated.*/
String& getText() { return _text; }
2003-03-03 05:05:05 +08:00
/** Get the const text string.*/
2003-03-06 05:05:37 +08:00
const String& getText() const { return _text; }
2003-03-25 21:57:16 +08:00
/** update internal glyph respresnetation used for rendering,
* and bounding volume.*/
void update() { computeGlyphRepresentation(); }
2003-03-03 05:05:05 +08:00
/** Set the rendered character size in object coordinates.*/
2003-03-04 04:24:49 +08:00
void setCharacterSize(float height,float aspectRatio=1.0f);
2003-03-03 05:05:05 +08:00
float getCharacterHeight() const { return _characterHeight; }
float getCharacterAspectRatio() const { return _characterAspectRatio; }
2003-06-24 23:40:09 +08:00
enum CharacterSizeMode
{
OBJECT_COORDS, /// default
SCREEN_COORDS, /// internally scale the characters to be constant screen size.
OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT /// text that behavaves like OBJECT_COORDS sized text when a long distance way, but has its screen sized capped automatically when the viewer gets near.
};
/** Set how the CharacterSize value relates to the final rendered character.*/
void setCharacterSizeMode(CharacterSizeMode mode) { _characterSizeMode = mode; }
/** Get the CharacterSizeMode.*/
CharacterSizeMode getCharacterSizeMode() const { return _characterSizeMode; }
2003-03-03 05:05:05 +08:00
2003-03-07 05:35:33 +08:00
/** Set the maximum width of the text box.
* With horizontal layouts any characters which do not fit are wrapped around.
* 0 or negative values indicate that no maximum width is set, lines can be as long as
* they need be to fit thre required text*/
void setMaximumWidth(float maximumWidth);
/** Get the maximim width of the text box.*/
float getMaximumWidth() const { return _maximumWidth; }
/** Set the maximum height of the text box.
* With horizontal layouts any characters which do not fit are wrapped around.
* 0 or negative values indicate that no maximum height is set, lines can be as long as
* they need be to fit thre required text*/
void setMaximumHeight(float maximumHeight);
/** Get the maximum height of the text box.*/
float getMaximumHeight() const { return _maximumHeight; }
2003-03-03 05:05:05 +08:00
/** 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,
2003-04-27 18:58:39 +08:00
LEFT_BASE_LINE,
CENTER_BASE_LINE,
RIGHT_BASE_LINE,
2005-07-16 00:22:53 +08:00
LEFT_BOTTOM_BASE_LINE,
CENTER_BOTTOM_BASE_LINE,
RIGHT_BOTTOM_BASE_LINE,
2003-04-27 18:58:39 +08:00
BASE_LINE = LEFT_BASE_LINE /// default.
2003-03-03 05:05:05 +08:00
};
void setAlignment(AlignmentType alignment);
AlignmentType getAlignment() const { return _alignment; }
enum AxisAlignment
{
XY_PLANE,
2003-12-20 22:20:48 +08:00
REVERSED_XY_PLANE,
2003-03-03 05:05:05 +08:00
XZ_PLANE,
2003-12-20 22:20:48 +08:00
REVERSED_XZ_PLANE,
2003-03-03 05:05:05 +08:00
YZ_PLANE,
2003-12-20 22:20:48 +08:00
REVERSED_YZ_PLANE,
2003-03-03 05:05:05 +08:00
SCREEN
};
void setAxisAlignment(AxisAlignment axis);
2003-04-30 19:40:17 +08:00
void setRotation(const osg::Quat& quat);
2003-06-24 23:40:09 +08:00
const osg::Quat& getRotation() const { return _rotation; }
2003-03-03 05:05:05 +08:00
2003-04-30 19:40:17 +08:00
void setAutoRotateToScreen(bool autoRotateToScreen);
bool getAutoRotateToScreen() const { return _autoRotateToScreen; }
2003-03-03 05:05:05 +08:00
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
2003-07-14 22:42:10 +08:00
BOUNDINGBOX = 2,
ALIGNMENT = 4
2003-03-03 05:05:05 +08:00
};
2003-05-02 05:06:18 +08:00
void setDrawMode(unsigned int mode);
2003-03-03 05:05:05 +08:00
unsigned int getDrawMode() const { return _drawMode; }
2003-06-27 00:21:49 +08:00
void setKerningType(KerningType kerningType) { _kerningType = kerningType; }
KerningType getKerningType() const { return _kerningType; }
2005-07-16 00:22:53 +08:00
/** Get the number of wrapped lines - only valid after computeGlyphRepresentation() has been called, returns -1 otherwise */
unsigned int getLineCount() { return _lineCount; }
2003-03-03 05:05:05 +08:00
/** Draw the text.*/
virtual void drawImplementation(osg::State& state) const;
2003-03-11 00:40:26 +08:00
/** return false, osgText::Text does not support accept(AttributeFunctor&).*/
2005-03-18 10:42:59 +08:00
virtual bool supports(const osg::Drawable::AttributeFunctor&) const { return false; }
2003-03-11 00:40:26 +08:00
/** return true, osgText::Text does support accept(ConstAttributeFunctor&).*/
2005-03-18 10:42:59 +08:00
virtual bool supports(const osg::Drawable::ConstAttributeFunctor&) const { return true; }
2003-03-11 00:40:26 +08:00
/** accept an ConstAttributeFunctor and call its methods to tell it about the interal attributes that this Drawable has.*/
virtual void accept(osg::Drawable::ConstAttributeFunctor& af) const;
/** return true, osgText::Text does support accept(PrimitiveFunctor&) .*/
2005-03-18 10:42:59 +08:00
virtual bool supports(const osg::PrimitiveFunctor&) const { return true; }
2003-03-11 00:40:26 +08:00
/** accept a PrimtiveFunctor and call its methods to tell it about the interal primtives that this Drawable has.*/
2005-02-09 18:39:45 +08:00
virtual void accept(osg::PrimitiveFunctor& pf) const;
2003-03-11 00:40:26 +08:00
2005-05-08 04:47:09 +08:00
/** If State is non-zero, this function releases OpenGL objects for
* the specified graphics context. Otherwise, releases OpenGL objexts
* for all graphics contexts. */
virtual void releaseGLObjects(osg::State* state=0) const;
2003-03-11 00:40:26 +08:00
2003-03-04 20:34:42 +08:00
// make Font a friend to allow it set the _font to 0 if the font is
// forcefully unloaded.
2003-03-05 01:14:42 +08:00
friend class Font;
2003-04-27 18:58:39 +08:00
public:
2003-03-03 05:05:05 +08:00
// internal structures, variable and methods used for rendering of characters.
2003-04-27 18:58:39 +08:00
struct OSGTEXT_EXPORT GlyphQuads
2003-03-03 05:05:05 +08:00
{
2003-05-02 05:06:18 +08:00
typedef std::vector<Font::Glyph*> Glyphs;
2005-03-03 20:33:07 +08:00
typedef std::vector<unsigned int> LineNumbers;
2003-04-30 19:40:17 +08:00
typedef std::vector<osg::Vec2> Coords2;
typedef std::vector<osg::Vec3> Coords3;
2003-03-03 05:05:05 +08:00
typedef std::vector<osg::Vec2> TexCoords;
2003-05-06 21:13:31 +08:00
Glyphs _glyphs;
Coords2 _coords;
osg::buffered_object<Coords3> _transformedCoords;
TexCoords _texcoords;
2005-03-03 20:33:07 +08:00
LineNumbers _lineNumbers;
2003-04-27 18:58:39 +08:00
2003-05-02 05:06:18 +08:00
Glyphs getGlyphs() { return _glyphs; }
const Glyphs getGlyphs() const { return _glyphs; }
2003-04-30 19:40:17 +08:00
Coords2& getCoords() { return _coords; }
const Coords2& getCoords() const { return _coords; }
2003-05-06 21:13:31 +08:00
Coords3& getTransformedCoords(unsigned int contexID) { return _transformedCoords[contexID]; }
const Coords3& getTransformedCoords(unsigned int contexID) const { return _transformedCoords[contexID]; }
2003-04-27 18:58:39 +08:00
TexCoords& getTexCoords() { return _texcoords; }
const TexCoords& getTexCoords() const { return _texcoords; }
2005-03-03 20:33:07 +08:00
LineNumbers& getLineNumbers() { return _lineNumbers; }
const LineNumbers& getLineNumbers() const { return _lineNumbers; }
2003-03-03 05:05:05 +08:00
};
2003-04-27 18:58:39 +08:00
2003-03-03 05:05:05 +08:00
typedef std::map<osg::ref_ptr<osg::StateSet>,GlyphQuads> TextureGlyphQuadMap;
2003-04-27 18:58:39 +08:00
/** Direct Access to GlyphQuads */
2003-06-27 00:21:49 +08:00
const GlyphQuads* getGlyphQuads(osg::StateSet* stateSet) const
2003-04-27 18:58:39 +08:00
{
2003-06-27 00:21:49 +08:00
TextureGlyphQuadMap::iterator itGlyphQuad = _textureGlyphQuadMap.find(stateSet);
if (itGlyphQuad == _textureGlyphQuadMap.end()) return NULL;
2003-04-27 18:58:39 +08:00
2003-06-27 00:21:49 +08:00
return &itGlyphQuad->second;
2003-04-27 18:58:39 +08:00
}
2003-11-04 21:40:24 +08:00
const TextureGlyphQuadMap& getTextureGlyphQuadMap() const
{
return _textureGlyphQuadMap;
}
2005-05-12 22:03:22 +08:00
virtual osg::BoundingBox computeBound() const;
2003-04-27 18:58:39 +08:00
protected:
2003-04-30 19:40:17 +08:00
virtual ~Text();
Font* getActiveFont();
const Font* getActiveFont() const;
2005-07-16 00:22:53 +08:00
String::iterator computeLastCharacterOnLine(osg::Vec2& cursor, String::iterator first,String::iterator last);
2003-04-30 19:40:17 +08:00
// members which have public access.
2003-05-06 21:13:31 +08:00
osg::ref_ptr<Font> _font;
unsigned int _fontWidth;
unsigned int _fontHeight;
float _characterHeight;
float _characterAspectRatio;
2003-06-24 23:40:09 +08:00
CharacterSizeMode _characterSizeMode;
2003-05-06 21:13:31 +08:00
float _maximumWidth;
float _maximumHeight;
String _text;
osg::Vec3 _position;
AlignmentType _alignment;
2003-06-24 23:40:09 +08:00
osg::Quat _rotation;
2003-05-06 21:13:31 +08:00
bool _autoRotateToScreen;
Layout _layout;
osg::Vec4 _color;
unsigned int _drawMode;
2005-07-16 00:22:53 +08:00
KerningType _kerningType;
unsigned int _lineCount;
2003-04-30 19:40:17 +08:00
2003-03-03 05:05:05 +08:00
// iternal map used for rendering. Set up by the computeGlyphRepresentation() method.
2003-06-24 23:40:09 +08:00
mutable TextureGlyphQuadMap _textureGlyphQuadMap;
2003-03-03 05:05:05 +08:00
void computeGlyphRepresentation();
2003-03-03 17:37:02 +08:00
// internal caches of the positioning of the text.
2003-06-24 23:40:09 +08:00
struct AutoTransformCache
{
AutoTransformCache():
_traversalNumber(-1),
_width(0),
_height(0) {}
int _traversalNumber;
int _width;
int _height;
osg::Vec3 _transformedPosition;
osg::Matrix _modelview;
osg::Matrix _projection;
osg::Matrix _matrix;
};
mutable osg::buffered_object<AutoTransformCache> _autoTransformCache;
mutable osg::Vec3 _offset;
mutable osg::Vec3 _normal;
mutable osg::BoundingBox _textBB;
2003-04-30 19:40:17 +08:00
2003-03-03 17:37:02 +08:00
void computePositions();
2003-06-24 23:40:09 +08:00
void computePositions(unsigned int contextID) const;
2003-03-03 17:37:02 +08:00
2001-10-24 03:51:39 +08:00
};
2002-02-03 20:33:41 +08:00
}
2001-10-24 03:51:39 +08:00
2003-03-03 05:05:05 +08:00
#endif