OpenSceneGraph/include/osgText/Text3D

168 lines
5.9 KiB
Plaintext
Raw Normal View History

From David Callu, "Problem: osgText::Text and osgText::Text3D use the same font file. The first really load the file and obtain an osgText::Font object, the second use the cache created during the first load of the font file, and so obtain an osgText::Font object instead of osgText::Font3D object. To obtain an osgText::Font3D object, osgText::Text3D call osgDB::readObjectFile(...) with an option to specify the plugin we want an osgText::Font3D instead of osgText::Font. Generalised Problem: In osgDB::Registry, loaded file cache is referenced by the name of this file, so if I load a file with some options, and the cache already contain object for this filename, I obtain an object potentially not loaded with my options. Behaviours: Cache management is delegate to osgDB::Registry, but cache coherence (load a file with option then reuse it, deactivate the cache when load a specific file or don't cached the loaded file) is user's responsibility. Text3D solution: Postfix the font file name by .text3d or something similar and then have the freetype plugin return osgText::Font3D when it detects this. This operation is done by osgText::readFont3DFile() which unsure the filename have .text3d as extension. This is totaly transparent for user, and backward compatible. BTW, I fix the bug about the Normal of 3D text. Currently, the front and wall face have the same normal (0,0,1) in the Text3D object coordinate. Now the wall face have its own normal array computed by the plugin. BTW 2, I implement - void Text3D::accept(osg::Drawable::ConstAttributeFunctor& af) const - void Text3D::accept(osg::PrimitiveFunctor& pf) const so now statistics are well reported. "
2009-03-10 18:56:00 +08:00
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
2007-12-11 03:49:17 +08:00
*
From David Callu, "Problem: osgText::Text and osgText::Text3D use the same font file. The first really load the file and obtain an osgText::Font object, the second use the cache created during the first load of the font file, and so obtain an osgText::Font object instead of osgText::Font3D object. To obtain an osgText::Font3D object, osgText::Text3D call osgDB::readObjectFile(...) with an option to specify the plugin we want an osgText::Font3D instead of osgText::Font. Generalised Problem: In osgDB::Registry, loaded file cache is referenced by the name of this file, so if I load a file with some options, and the cache already contain object for this filename, I obtain an object potentially not loaded with my options. Behaviours: Cache management is delegate to osgDB::Registry, but cache coherence (load a file with option then reuse it, deactivate the cache when load a specific file or don't cached the loaded file) is user's responsibility. Text3D solution: Postfix the font file name by .text3d or something similar and then have the freetype plugin return osgText::Font3D when it detects this. This operation is done by osgText::readFont3DFile() which unsure the filename have .text3d as extension. This is totaly transparent for user, and backward compatible. BTW, I fix the bug about the Normal of 3D text. Currently, the front and wall face have the same normal (0,0,1) in the Text3D object coordinate. Now the wall face have its own normal array computed by the plugin. BTW 2, I implement - void Text3D::accept(osg::Drawable::ConstAttributeFunctor& af) const - void Text3D::accept(osg::PrimitiveFunctor& pf) const so now statistics are well reported. "
2009-03-10 18:56:00 +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
2007-12-11 03:49:17 +08:00
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
From David Callu, "Problem: osgText::Text and osgText::Text3D use the same font file. The first really load the file and obtain an osgText::Font object, the second use the cache created during the first load of the font file, and so obtain an osgText::Font object instead of osgText::Font3D object. To obtain an osgText::Font3D object, osgText::Text3D call osgDB::readObjectFile(...) with an option to specify the plugin we want an osgText::Font3D instead of osgText::Font. Generalised Problem: In osgDB::Registry, loaded file cache is referenced by the name of this file, so if I load a file with some options, and the cache already contain object for this filename, I obtain an object potentially not loaded with my options. Behaviours: Cache management is delegate to osgDB::Registry, but cache coherence (load a file with option then reuse it, deactivate the cache when load a specific file or don't cached the loaded file) is user's responsibility. Text3D solution: Postfix the font file name by .text3d or something similar and then have the freetype plugin return osgText::Font3D when it detects this. This operation is done by osgText::readFont3DFile() which unsure the filename have .text3d as extension. This is totaly transparent for user, and backward compatible. BTW, I fix the bug about the Normal of 3D text. Currently, the front and wall face have the same normal (0,0,1) in the Text3D object coordinate. Now the wall face have its own normal array computed by the plugin. BTW 2, I implement - void Text3D::accept(osg::Drawable::ConstAttributeFunctor& af) const - void Text3D::accept(osg::PrimitiveFunctor& pf) const so now statistics are well reported. "
2009-03-10 18:56:00 +08:00
*
2007-12-11 03:49:17 +08:00
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
From David Callu, "Problem: osgText::Text and osgText::Text3D use the same font file. The first really load the file and obtain an osgText::Font object, the second use the cache created during the first load of the font file, and so obtain an osgText::Font object instead of osgText::Font3D object. To obtain an osgText::Font3D object, osgText::Text3D call osgDB::readObjectFile(...) with an option to specify the plugin we want an osgText::Font3D instead of osgText::Font. Generalised Problem: In osgDB::Registry, loaded file cache is referenced by the name of this file, so if I load a file with some options, and the cache already contain object for this filename, I obtain an object potentially not loaded with my options. Behaviours: Cache management is delegate to osgDB::Registry, but cache coherence (load a file with option then reuse it, deactivate the cache when load a specific file or don't cached the loaded file) is user's responsibility. Text3D solution: Postfix the font file name by .text3d or something similar and then have the freetype plugin return osgText::Font3D when it detects this. This operation is done by osgText::readFont3DFile() which unsure the filename have .text3d as extension. This is totaly transparent for user, and backward compatible. BTW, I fix the bug about the Normal of 3D text. Currently, the front and wall face have the same normal (0,0,1) in the Text3D object coordinate. Now the wall face have its own normal array computed by the plugin. BTW 2, I implement - void Text3D::accept(osg::Drawable::ConstAttributeFunctor& af) const - void Text3D::accept(osg::PrimitiveFunctor& pf) const so now statistics are well reported. "
2009-03-10 18:56:00 +08:00
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2007-12-11 03:49:17 +08:00
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGTEXT_TEXT3D
#define OSGTEXT_TEXT3D 1
#include <osgText/TextBase>
2010-09-06 23:43:59 +08:00
#include <osgText/Font>
2007-12-11 03:49:17 +08:00
namespace osgText {
class OSGTEXT_EXPORT Text3D : public osgText::TextBase
{
public:
/** Reder mode used to render the Text.
* PER_FACE : render all front face with the default StateSet
* all wall face with the wall StateSet
* all back face with the back StateSet (back face of the character, no the OpenGL back face)
From David Callu, "Problem: osgText::Text and osgText::Text3D use the same font file. The first really load the file and obtain an osgText::Font object, the second use the cache created during the first load of the font file, and so obtain an osgText::Font object instead of osgText::Font3D object. To obtain an osgText::Font3D object, osgText::Text3D call osgDB::readObjectFile(...) with an option to specify the plugin we want an osgText::Font3D instead of osgText::Font. Generalised Problem: In osgDB::Registry, loaded file cache is referenced by the name of this file, so if I load a file with some options, and the cache already contain object for this filename, I obtain an object potentially not loaded with my options. Behaviours: Cache management is delegate to osgDB::Registry, but cache coherence (load a file with option then reuse it, deactivate the cache when load a specific file or don't cached the loaded file) is user's responsibility. Text3D solution: Postfix the font file name by .text3d or something similar and then have the freetype plugin return osgText::Font3D when it detects this. This operation is done by osgText::readFont3DFile() which unsure the filename have .text3d as extension. This is totaly transparent for user, and backward compatible. BTW, I fix the bug about the Normal of 3D text. Currently, the front and wall face have the same normal (0,0,1) in the Text3D object coordinate. Now the wall face have its own normal array computed by the plugin. BTW 2, I implement - void Text3D::accept(osg::Drawable::ConstAttributeFunctor& af) const - void Text3D::accept(osg::PrimitiveFunctor& pf) const so now statistics are well reported. "
2009-03-10 18:56:00 +08:00
*
2007-12-11 03:49:17 +08:00
* PER_GLYPH : render all Charactere with the default StateSet
*/
enum RenderMode
{
PER_FACE,
PER_GLYPH
};
From David Callu, "Problem: osgText::Text and osgText::Text3D use the same font file. The first really load the file and obtain an osgText::Font object, the second use the cache created during the first load of the font file, and so obtain an osgText::Font object instead of osgText::Font3D object. To obtain an osgText::Font3D object, osgText::Text3D call osgDB::readObjectFile(...) with an option to specify the plugin we want an osgText::Font3D instead of osgText::Font. Generalised Problem: In osgDB::Registry, loaded file cache is referenced by the name of this file, so if I load a file with some options, and the cache already contain object for this filename, I obtain an object potentially not loaded with my options. Behaviours: Cache management is delegate to osgDB::Registry, but cache coherence (load a file with option then reuse it, deactivate the cache when load a specific file or don't cached the loaded file) is user's responsibility. Text3D solution: Postfix the font file name by .text3d or something similar and then have the freetype plugin return osgText::Font3D when it detects this. This operation is done by osgText::readFont3DFile() which unsure the filename have .text3d as extension. This is totaly transparent for user, and backward compatible. BTW, I fix the bug about the Normal of 3D text. Currently, the front and wall face have the same normal (0,0,1) in the Text3D object coordinate. Now the wall face have its own normal array computed by the plugin. BTW 2, I implement - void Text3D::accept(osg::Drawable::ConstAttributeFunctor& af) const - void Text3D::accept(osg::PrimitiveFunctor& pf) const so now statistics are well reported. "
2009-03-10 18:56:00 +08:00
2007-12-11 03:49:17 +08:00
Text3D();
Text3D(const Text3D& text,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY);
META_Object(osgText,Text3D)
/** Get the Charactere Depth of text. */
float getCharacterDepth() const { return _characterDepth; }
/** Set the Charactere Depth of text. */
void setCharacterDepth(float characterDepth) { _characterDepth = characterDepth; computeGlyphRepresentation(); }
From David Callu, "Problem: osgText::Text and osgText::Text3D use the same font file. The first really load the file and obtain an osgText::Font object, the second use the cache created during the first load of the font file, and so obtain an osgText::Font object instead of osgText::Font3D object. To obtain an osgText::Font3D object, osgText::Text3D call osgDB::readObjectFile(...) with an option to specify the plugin we want an osgText::Font3D instead of osgText::Font. Generalised Problem: In osgDB::Registry, loaded file cache is referenced by the name of this file, so if I load a file with some options, and the cache already contain object for this filename, I obtain an object potentially not loaded with my options. Behaviours: Cache management is delegate to osgDB::Registry, but cache coherence (load a file with option then reuse it, deactivate the cache when load a specific file or don't cached the loaded file) is user's responsibility. Text3D solution: Postfix the font file name by .text3d or something similar and then have the freetype plugin return osgText::Font3D when it detects this. This operation is done by osgText::readFont3DFile() which unsure the filename have .text3d as extension. This is totaly transparent for user, and backward compatible. BTW, I fix the bug about the Normal of 3D text. Currently, the front and wall face have the same normal (0,0,1) in the Text3D object coordinate. Now the wall face have its own normal array computed by the plugin. BTW 2, I implement - void Text3D::accept(osg::Drawable::ConstAttributeFunctor& af) const - void Text3D::accept(osg::PrimitiveFunctor& pf) const so now statistics are well reported. "
2009-03-10 18:56:00 +08:00
2007-12-11 03:49:17 +08:00
/** Get the render mode used to render the text. */
RenderMode getRenderMode() const { return _renderMode; }
/** Set the render mode used to render the text. */
void setRenderMode(RenderMode renderMode) { _renderMode = renderMode; computeGlyphRepresentation(); }
2007-12-11 03:49:17 +08:00
// /** Get the wall StateSet */
// osg::StateSet * getWallStateSet() { return _wallStateSet.get(); }
// /** Get or create the wall StateSet */
From David Callu, "Problem: osgText::Text and osgText::Text3D use the same font file. The first really load the file and obtain an osgText::Font object, the second use the cache created during the first load of the font file, and so obtain an osgText::Font object instead of osgText::Font3D object. To obtain an osgText::Font3D object, osgText::Text3D call osgDB::readObjectFile(...) with an option to specify the plugin we want an osgText::Font3D instead of osgText::Font. Generalised Problem: In osgDB::Registry, loaded file cache is referenced by the name of this file, so if I load a file with some options, and the cache already contain object for this filename, I obtain an object potentially not loaded with my options. Behaviours: Cache management is delegate to osgDB::Registry, but cache coherence (load a file with option then reuse it, deactivate the cache when load a specific file or don't cached the loaded file) is user's responsibility. Text3D solution: Postfix the font file name by .text3d or something similar and then have the freetype plugin return osgText::Font3D when it detects this. This operation is done by osgText::readFont3DFile() which unsure the filename have .text3d as extension. This is totaly transparent for user, and backward compatible. BTW, I fix the bug about the Normal of 3D text. Currently, the front and wall face have the same normal (0,0,1) in the Text3D object coordinate. Now the wall face have its own normal array computed by the plugin. BTW 2, I implement - void Text3D::accept(osg::Drawable::ConstAttributeFunctor& af) const - void Text3D::accept(osg::PrimitiveFunctor& pf) const so now statistics are well reported. "
2009-03-10 18:56:00 +08:00
// osg::StateSet * getOrCreateWallStateSet()
// {
// if (_wallStateSet.valid() == false) _wallStateSet = new osg::StateSet;
// return _wallStateSet.get();
2007-12-11 03:49:17 +08:00
// }
// /** Set the wall StateSet */
// void setWallStateSet(osg::StateSet * wallStateSet) { _wallStateSet = wallStateSet; }
//
// /** Get the back StateSet */
// osg::StateSet * getBackStateSet() { return _backStateSet.get(); }
// /** Get or create the back StateSet */
// osg::StateSet * getOrCreateBackStateSet() { if (_backStateSet.valid() == false) _backStateSet = new osg::StateSet; return _backStateSet.get(); }
// /** Set the back StateSet */
// void setBackStateSet(osg::StateSet * backStateSet) { _backStateSet = backStateSet; }
From David Callu, "Problem: osgText::Text and osgText::Text3D use the same font file. The first really load the file and obtain an osgText::Font object, the second use the cache created during the first load of the font file, and so obtain an osgText::Font object instead of osgText::Font3D object. To obtain an osgText::Font3D object, osgText::Text3D call osgDB::readObjectFile(...) with an option to specify the plugin we want an osgText::Font3D instead of osgText::Font. Generalised Problem: In osgDB::Registry, loaded file cache is referenced by the name of this file, so if I load a file with some options, and the cache already contain object for this filename, I obtain an object potentially not loaded with my options. Behaviours: Cache management is delegate to osgDB::Registry, but cache coherence (load a file with option then reuse it, deactivate the cache when load a specific file or don't cached the loaded file) is user's responsibility. Text3D solution: Postfix the font file name by .text3d or something similar and then have the freetype plugin return osgText::Font3D when it detects this. This operation is done by osgText::readFont3DFile() which unsure the filename have .text3d as extension. This is totaly transparent for user, and backward compatible. BTW, I fix the bug about the Normal of 3D text. Currently, the front and wall face have the same normal (0,0,1) in the Text3D object coordinate. Now the wall face have its own normal array computed by the plugin. BTW 2, I implement - void Text3D::accept(osg::Drawable::ConstAttributeFunctor& af) const - void Text3D::accept(osg::PrimitiveFunctor& pf) const so now statistics are well reported. "
2009-03-10 18:56:00 +08:00
//
/** Set the Font to use to render the text.
2007-12-11 03:49:17 +08:00
* setFont(0) sets the use of the default font.*/
2010-09-06 23:43:59 +08:00
void setFont(Font* font);
2007-12-11 03:49:17 +08:00
/** Set the font, loaded from the specified front file, to use to render the text,
* setFont("") sets the use of the default font.
* See the osgText::readFontFile function for how the font file will be located. */
void setFont(const std::string& fontfile);
From David Callu, "Problem: osgText::Text and osgText::Text3D use the same font file. The first really load the file and obtain an osgText::Font object, the second use the cache created during the first load of the font file, and so obtain an osgText::Font object instead of osgText::Font3D object. To obtain an osgText::Font3D object, osgText::Text3D call osgDB::readObjectFile(...) with an option to specify the plugin we want an osgText::Font3D instead of osgText::Font. Generalised Problem: In osgDB::Registry, loaded file cache is referenced by the name of this file, so if I load a file with some options, and the cache already contain object for this filename, I obtain an object potentially not loaded with my options. Behaviours: Cache management is delegate to osgDB::Registry, but cache coherence (load a file with option then reuse it, deactivate the cache when load a specific file or don't cached the loaded file) is user's responsibility. Text3D solution: Postfix the font file name by .text3d or something similar and then have the freetype plugin return osgText::Font3D when it detects this. This operation is done by osgText::readFont3DFile() which unsure the filename have .text3d as extension. This is totaly transparent for user, and backward compatible. BTW, I fix the bug about the Normal of 3D text. Currently, the front and wall face have the same normal (0,0,1) in the Text3D object coordinate. Now the wall face have its own normal array computed by the plugin. BTW 2, I implement - void Text3D::accept(osg::Drawable::ConstAttributeFunctor& af) const - void Text3D::accept(osg::PrimitiveFunctor& pf) const so now statistics are well reported. "
2009-03-10 18:56:00 +08:00
/** Get the font. Return 0 if default is being used.*/
2010-09-06 23:43:59 +08:00
const Font* getFont() const { return _font.get(); }
2007-12-11 03:49:17 +08:00
From David Callu, "Problem: osgText::Text and osgText::Text3D use the same font file. The first really load the file and obtain an osgText::Font object, the second use the cache created during the first load of the font file, and so obtain an osgText::Font object instead of osgText::Font3D object. To obtain an osgText::Font3D object, osgText::Text3D call osgDB::readObjectFile(...) with an option to specify the plugin we want an osgText::Font3D instead of osgText::Font. Generalised Problem: In osgDB::Registry, loaded file cache is referenced by the name of this file, so if I load a file with some options, and the cache already contain object for this filename, I obtain an object potentially not loaded with my options. Behaviours: Cache management is delegate to osgDB::Registry, but cache coherence (load a file with option then reuse it, deactivate the cache when load a specific file or don't cached the loaded file) is user's responsibility. Text3D solution: Postfix the font file name by .text3d or something similar and then have the freetype plugin return osgText::Font3D when it detects this. This operation is done by osgText::readFont3DFile() which unsure the filename have .text3d as extension. This is totaly transparent for user, and backward compatible. BTW, I fix the bug about the Normal of 3D text. Currently, the front and wall face have the same normal (0,0,1) in the Text3D object coordinate. Now the wall face have its own normal array computed by the plugin. BTW 2, I implement - void Text3D::accept(osg::Drawable::ConstAttributeFunctor& af) const - void Text3D::accept(osg::PrimitiveFunctor& pf) const so now statistics are well reported. "
2009-03-10 18:56:00 +08:00
2007-12-11 03:49:17 +08:00
/** Draw the text.*/
virtual void drawImplementation(osg::RenderInfo& renderInfo) const;
/** return false, osgText::Text does not support accept(AttributeFunctor&).*/
virtual bool supports(const osg::Drawable::AttributeFunctor&) const { return false; }
/** return true, osgText::Text does support accept(ConstAttributeFunctor&).*/
virtual bool supports(const osg::Drawable::ConstAttributeFunctor&) const { return false; }
/** accept an ConstAttributeFunctor and call its methods to tell it about the interal attributes that this Drawable has.*/
From David Callu, "Problem: osgText::Text and osgText::Text3D use the same font file. The first really load the file and obtain an osgText::Font object, the second use the cache created during the first load of the font file, and so obtain an osgText::Font object instead of osgText::Font3D object. To obtain an osgText::Font3D object, osgText::Text3D call osgDB::readObjectFile(...) with an option to specify the plugin we want an osgText::Font3D instead of osgText::Font. Generalised Problem: In osgDB::Registry, loaded file cache is referenced by the name of this file, so if I load a file with some options, and the cache already contain object for this filename, I obtain an object potentially not loaded with my options. Behaviours: Cache management is delegate to osgDB::Registry, but cache coherence (load a file with option then reuse it, deactivate the cache when load a specific file or don't cached the loaded file) is user's responsibility. Text3D solution: Postfix the font file name by .text3d or something similar and then have the freetype plugin return osgText::Font3D when it detects this. This operation is done by osgText::readFont3DFile() which unsure the filename have .text3d as extension. This is totaly transparent for user, and backward compatible. BTW, I fix the bug about the Normal of 3D text. Currently, the front and wall face have the same normal (0,0,1) in the Text3D object coordinate. Now the wall face have its own normal array computed by the plugin. BTW 2, I implement - void Text3D::accept(osg::Drawable::ConstAttributeFunctor& af) const - void Text3D::accept(osg::PrimitiveFunctor& pf) const so now statistics are well reported. "
2009-03-10 18:56:00 +08:00
virtual void accept(osg::Drawable::ConstAttributeFunctor& af) const;
2007-12-11 03:49:17 +08:00
/** return true, osgText::Text does support accept(PrimitiveFunctor&) .*/
virtual bool supports(const osg::PrimitiveFunctor&) const { return false; }
/** accept a PrimtiveFunctor and call its methods to tell it about the interal primtives that this Drawable has.*/
From David Callu, "Problem: osgText::Text and osgText::Text3D use the same font file. The first really load the file and obtain an osgText::Font object, the second use the cache created during the first load of the font file, and so obtain an osgText::Font object instead of osgText::Font3D object. To obtain an osgText::Font3D object, osgText::Text3D call osgDB::readObjectFile(...) with an option to specify the plugin we want an osgText::Font3D instead of osgText::Font. Generalised Problem: In osgDB::Registry, loaded file cache is referenced by the name of this file, so if I load a file with some options, and the cache already contain object for this filename, I obtain an object potentially not loaded with my options. Behaviours: Cache management is delegate to osgDB::Registry, but cache coherence (load a file with option then reuse it, deactivate the cache when load a specific file or don't cached the loaded file) is user's responsibility. Text3D solution: Postfix the font file name by .text3d or something similar and then have the freetype plugin return osgText::Font3D when it detects this. This operation is done by osgText::readFont3DFile() which unsure the filename have .text3d as extension. This is totaly transparent for user, and backward compatible. BTW, I fix the bug about the Normal of 3D text. Currently, the front and wall face have the same normal (0,0,1) in the Text3D object coordinate. Now the wall face have its own normal array computed by the plugin. BTW 2, I implement - void Text3D::accept(osg::Drawable::ConstAttributeFunctor& af) const - void Text3D::accept(osg::PrimitiveFunctor& pf) const so now statistics are well reported. "
2009-03-10 18:56:00 +08:00
virtual void accept(osg::PrimitiveFunctor& pf) const;
2007-12-11 03:49:17 +08:00
/** Set whether to use a mutex to ensure ref() and unref() are thread safe.*/
virtual void setThreadSafeRefUnref(bool threadSafe);
/** Resize any per context GLObject buffers to specified size. */
virtual void resizeGLObjectBuffers(unsigned int maxSize);
/** 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;
From David Callu, "Problem: osgText::Text and osgText::Text3D use the same font file. The first really load the file and obtain an osgText::Font object, the second use the cache created during the first load of the font file, and so obtain an osgText::Font object instead of osgText::Font3D object. To obtain an osgText::Font3D object, osgText::Text3D call osgDB::readObjectFile(...) with an option to specify the plugin we want an osgText::Font3D instead of osgText::Font. Generalised Problem: In osgDB::Registry, loaded file cache is referenced by the name of this file, so if I load a file with some options, and the cache already contain object for this filename, I obtain an object potentially not loaded with my options. Behaviours: Cache management is delegate to osgDB::Registry, but cache coherence (load a file with option then reuse it, deactivate the cache when load a specific file or don't cached the loaded file) is user's responsibility. Text3D solution: Postfix the font file name by .text3d or something similar and then have the freetype plugin return osgText::Font3D when it detects this. This operation is done by osgText::readFont3DFile() which unsure the filename have .text3d as extension. This is totaly transparent for user, and backward compatible. BTW, I fix the bug about the Normal of 3D text. Currently, the front and wall face have the same normal (0,0,1) in the Text3D object coordinate. Now the wall face have its own normal array computed by the plugin. BTW 2, I implement - void Text3D::accept(osg::Drawable::ConstAttributeFunctor& af) const - void Text3D::accept(osg::PrimitiveFunctor& pf) const so now statistics are well reported. "
2009-03-10 18:56:00 +08:00
// // make Font a friend to allow it set the _font to 0 if the font is
2007-12-11 03:49:17 +08:00
// // forcefully unloaded.
friend class Font;
2007-12-11 03:49:17 +08:00
virtual osg::BoundingBox computeBound() const;
2007-12-11 03:49:17 +08:00
protected:
From David Callu, "Problem: osgText::Text and osgText::Text3D use the same font file. The first really load the file and obtain an osgText::Font object, the second use the cache created during the first load of the font file, and so obtain an osgText::Font object instead of osgText::Font3D object. To obtain an osgText::Font3D object, osgText::Text3D call osgDB::readObjectFile(...) with an option to specify the plugin we want an osgText::Font3D instead of osgText::Font. Generalised Problem: In osgDB::Registry, loaded file cache is referenced by the name of this file, so if I load a file with some options, and the cache already contain object for this filename, I obtain an object potentially not loaded with my options. Behaviours: Cache management is delegate to osgDB::Registry, but cache coherence (load a file with option then reuse it, deactivate the cache when load a specific file or don't cached the loaded file) is user's responsibility. Text3D solution: Postfix the font file name by .text3d or something similar and then have the freetype plugin return osgText::Font3D when it detects this. This operation is done by osgText::readFont3DFile() which unsure the filename have .text3d as extension. This is totaly transparent for user, and backward compatible. BTW, I fix the bug about the Normal of 3D text. Currently, the front and wall face have the same normal (0,0,1) in the Text3D object coordinate. Now the wall face have its own normal array computed by the plugin. BTW 2, I implement - void Text3D::accept(osg::Drawable::ConstAttributeFunctor& af) const - void Text3D::accept(osg::PrimitiveFunctor& pf) const so now statistics are well reported. "
2009-03-10 18:56:00 +08:00
virtual ~Text3D() {}
2007-12-11 03:49:17 +08:00
void renderPerGlyph(osg::State & state) const;
void renderPerFace(osg::State & state) const;
String::iterator computeLastCharacterOnLine(osg::Vec2& cursor, String::iterator first,String::iterator last);
void computeGlyphRepresentation();
void computePositions(unsigned int contextID) const;
From David Callu, "Problem: osgText::Text and osgText::Text3D use the same font file. The first really load the file and obtain an osgText::Font object, the second use the cache created during the first load of the font file, and so obtain an osgText::Font object instead of osgText::Font3D object. To obtain an osgText::Font3D object, osgText::Text3D call osgDB::readObjectFile(...) with an option to specify the plugin we want an osgText::Font3D instead of osgText::Font. Generalised Problem: In osgDB::Registry, loaded file cache is referenced by the name of this file, so if I load a file with some options, and the cache already contain object for this filename, I obtain an object potentially not loaded with my options. Behaviours: Cache management is delegate to osgDB::Registry, but cache coherence (load a file with option then reuse it, deactivate the cache when load a specific file or don't cached the loaded file) is user's responsibility. Text3D solution: Postfix the font file name by .text3d or something similar and then have the freetype plugin return osgText::Font3D when it detects this. This operation is done by osgText::readFont3DFile() which unsure the filename have .text3d as extension. This is totaly transparent for user, and backward compatible. BTW, I fix the bug about the Normal of 3D text. Currently, the front and wall face have the same normal (0,0,1) in the Text3D object coordinate. Now the wall face have its own normal array computed by the plugin. BTW 2, I implement - void Text3D::accept(osg::Drawable::ConstAttributeFunctor& af) const - void Text3D::accept(osg::PrimitiveFunctor& pf) const so now statistics are well reported. "
2009-03-10 18:56:00 +08:00
2007-12-11 03:49:17 +08:00
// ** glyph and other information to render the glyph
struct GlyphRenderInfo
{
GlyphRenderInfo(Glyph3D * glyph, osg::Vec3 & pos) :
2007-12-11 03:49:17 +08:00
_glyph(glyph), _position(pos) {}
From David Callu, "Problem: osgText::Text and osgText::Text3D use the same font file. The first really load the file and obtain an osgText::Font object, the second use the cache created during the first load of the font file, and so obtain an osgText::Font object instead of osgText::Font3D object. To obtain an osgText::Font3D object, osgText::Text3D call osgDB::readObjectFile(...) with an option to specify the plugin we want an osgText::Font3D instead of osgText::Font. Generalised Problem: In osgDB::Registry, loaded file cache is referenced by the name of this file, so if I load a file with some options, and the cache already contain object for this filename, I obtain an object potentially not loaded with my options. Behaviours: Cache management is delegate to osgDB::Registry, but cache coherence (load a file with option then reuse it, deactivate the cache when load a specific file or don't cached the loaded file) is user's responsibility. Text3D solution: Postfix the font file name by .text3d or something similar and then have the freetype plugin return osgText::Font3D when it detects this. This operation is done by osgText::readFont3DFile() which unsure the filename have .text3d as extension. This is totaly transparent for user, and backward compatible. BTW, I fix the bug about the Normal of 3D text. Currently, the front and wall face have the same normal (0,0,1) in the Text3D object coordinate. Now the wall face have its own normal array computed by the plugin. BTW 2, I implement - void Text3D::accept(osg::Drawable::ConstAttributeFunctor& af) const - void Text3D::accept(osg::PrimitiveFunctor& pf) const so now statistics are well reported. "
2009-03-10 18:56:00 +08:00
osg::ref_ptr<Glyph3D> _glyph;
2007-12-11 03:49:17 +08:00
osg::Vec3 _position;
};
From David Callu, "Problem: osgText::Text and osgText::Text3D use the same font file. The first really load the file and obtain an osgText::Font object, the second use the cache created during the first load of the font file, and so obtain an osgText::Font object instead of osgText::Font3D object. To obtain an osgText::Font3D object, osgText::Text3D call osgDB::readObjectFile(...) with an option to specify the plugin we want an osgText::Font3D instead of osgText::Font. Generalised Problem: In osgDB::Registry, loaded file cache is referenced by the name of this file, so if I load a file with some options, and the cache already contain object for this filename, I obtain an object potentially not loaded with my options. Behaviours: Cache management is delegate to osgDB::Registry, but cache coherence (load a file with option then reuse it, deactivate the cache when load a specific file or don't cached the loaded file) is user's responsibility. Text3D solution: Postfix the font file name by .text3d or something similar and then have the freetype plugin return osgText::Font3D when it detects this. This operation is done by osgText::readFont3DFile() which unsure the filename have .text3d as extension. This is totaly transparent for user, and backward compatible. BTW, I fix the bug about the Normal of 3D text. Currently, the front and wall face have the same normal (0,0,1) in the Text3D object coordinate. Now the wall face have its own normal array computed by the plugin. BTW 2, I implement - void Text3D::accept(osg::Drawable::ConstAttributeFunctor& af) const - void Text3D::accept(osg::PrimitiveFunctor& pf) const so now statistics are well reported. "
2009-03-10 18:56:00 +08:00
2007-12-11 03:49:17 +08:00
typedef std::vector<GlyphRenderInfo> LineRenderInfo;
From David Callu, "Problem: osgText::Text and osgText::Text3D use the same font file. The first really load the file and obtain an osgText::Font object, the second use the cache created during the first load of the font file, and so obtain an osgText::Font object instead of osgText::Font3D object. To obtain an osgText::Font3D object, osgText::Text3D call osgDB::readObjectFile(...) with an option to specify the plugin we want an osgText::Font3D instead of osgText::Font. Generalised Problem: In osgDB::Registry, loaded file cache is referenced by the name of this file, so if I load a file with some options, and the cache already contain object for this filename, I obtain an object potentially not loaded with my options. Behaviours: Cache management is delegate to osgDB::Registry, but cache coherence (load a file with option then reuse it, deactivate the cache when load a specific file or don't cached the loaded file) is user's responsibility. Text3D solution: Postfix the font file name by .text3d or something similar and then have the freetype plugin return osgText::Font3D when it detects this. This operation is done by osgText::readFont3DFile() which unsure the filename have .text3d as extension. This is totaly transparent for user, and backward compatible. BTW, I fix the bug about the Normal of 3D text. Currently, the front and wall face have the same normal (0,0,1) in the Text3D object coordinate. Now the wall face have its own normal array computed by the plugin. BTW 2, I implement - void Text3D::accept(osg::Drawable::ConstAttributeFunctor& af) const - void Text3D::accept(osg::PrimitiveFunctor& pf) const so now statistics are well reported. "
2009-03-10 18:56:00 +08:00
typedef std::vector<LineRenderInfo> TextRenderInfo;
2007-12-11 03:49:17 +08:00
TextRenderInfo _textRenderInfo;
2010-09-06 23:43:59 +08:00
osg::ref_ptr<Font> _font;
2007-12-11 03:49:17 +08:00
float _characterDepth;
From David Callu, "Problem: osgText::Text and osgText::Text3D use the same font file. The first really load the file and obtain an osgText::Font object, the second use the cache created during the first load of the font file, and so obtain an osgText::Font object instead of osgText::Font3D object. To obtain an osgText::Font3D object, osgText::Text3D call osgDB::readObjectFile(...) with an option to specify the plugin we want an osgText::Font3D instead of osgText::Font. Generalised Problem: In osgDB::Registry, loaded file cache is referenced by the name of this file, so if I load a file with some options, and the cache already contain object for this filename, I obtain an object potentially not loaded with my options. Behaviours: Cache management is delegate to osgDB::Registry, but cache coherence (load a file with option then reuse it, deactivate the cache when load a specific file or don't cached the loaded file) is user's responsibility. Text3D solution: Postfix the font file name by .text3d or something similar and then have the freetype plugin return osgText::Font3D when it detects this. This operation is done by osgText::readFont3DFile() which unsure the filename have .text3d as extension. This is totaly transparent for user, and backward compatible. BTW, I fix the bug about the Normal of 3D text. Currently, the front and wall face have the same normal (0,0,1) in the Text3D object coordinate. Now the wall face have its own normal array computed by the plugin. BTW 2, I implement - void Text3D::accept(osg::Drawable::ConstAttributeFunctor& af) const - void Text3D::accept(osg::PrimitiveFunctor& pf) const so now statistics are well reported. "
2009-03-10 18:56:00 +08:00
2007-12-11 03:49:17 +08:00
RenderMode _renderMode;
From David Callu, "Problem: osgText::Text and osgText::Text3D use the same font file. The first really load the file and obtain an osgText::Font object, the second use the cache created during the first load of the font file, and so obtain an osgText::Font object instead of osgText::Font3D object. To obtain an osgText::Font3D object, osgText::Text3D call osgDB::readObjectFile(...) with an option to specify the plugin we want an osgText::Font3D instead of osgText::Font. Generalised Problem: In osgDB::Registry, loaded file cache is referenced by the name of this file, so if I load a file with some options, and the cache already contain object for this filename, I obtain an object potentially not loaded with my options. Behaviours: Cache management is delegate to osgDB::Registry, but cache coherence (load a file with option then reuse it, deactivate the cache when load a specific file or don't cached the loaded file) is user's responsibility. Text3D solution: Postfix the font file name by .text3d or something similar and then have the freetype plugin return osgText::Font3D when it detects this. This operation is done by osgText::readFont3DFile() which unsure the filename have .text3d as extension. This is totaly transparent for user, and backward compatible. BTW, I fix the bug about the Normal of 3D text. Currently, the front and wall face have the same normal (0,0,1) in the Text3D object coordinate. Now the wall face have its own normal array computed by the plugin. BTW 2, I implement - void Text3D::accept(osg::Drawable::ConstAttributeFunctor& af) const - void Text3D::accept(osg::PrimitiveFunctor& pf) const so now statistics are well reported. "
2009-03-10 18:56:00 +08:00
2007-12-11 03:49:17 +08:00
osg::ref_ptr<osg::StateSet> _wallStateSet;
osg::ref_ptr<osg::StateSet> _backStateSet;
};
}
#endif