Replaced hardwired glDrawArrays calls with use of osg::DrawElementsUshort.

This commit is contained in:
Robert Osfield 2017-03-01 11:51:27 +00:00
parent 256441906f
commit f4966a96d4
5 changed files with 150 additions and 114 deletions

View File

@ -295,10 +295,6 @@ public:
public: public:
typedef osg::ref_ptr<osg::Vec3Array> Coords;
typedef osg::ref_ptr<osg::Vec2Array> TexCoords;
typedef osg::ref_ptr<osg::Vec4Array> ColorCoords;
Coords _coords; Coords _coords;
ColorCoords _colorCoords; ColorCoords _colorCoords;
TexCoords _texcoords; TexCoords _texcoords;
@ -318,7 +314,6 @@ public:
struct OSGTEXT_EXPORT GlyphQuads struct OSGTEXT_EXPORT GlyphQuads
{ {
typedef std::vector<Glyph*> Glyphs; typedef std::vector<Glyph*> Glyphs;
typedef std::vector< osg::ref_ptr<osg::DrawElementsUShort> > Primitives;
Glyphs _glyphs; Glyphs _glyphs;
Primitives _primitives; Primitives _primitives;

View File

@ -279,6 +279,10 @@ protected:
virtual void computeGlyphRepresentation() = 0; virtual void computeGlyphRepresentation() = 0;
typedef osg::ref_ptr<osg::Vec3Array> Coords;
typedef osg::ref_ptr<osg::Vec2Array> TexCoords;
typedef osg::ref_ptr<osg::Vec4Array> ColorCoords;
typedef std::vector< osg::ref_ptr<osg::DrawElementsUShort> > Primitives;
// members which have public access. // members which have public access.
osg::Vec4 _color; osg::Vec4 _color;
@ -311,9 +315,13 @@ protected:
mutable osg::Matrix _matrix; mutable osg::Matrix _matrix;
Coords _decorationVertices;
Primitives _decorationPrimitives;
void setupDecoration(); void setupDecoration();
osg::ref_ptr<osg::Vec3Array> _decorationVertices;
}; };

View File

@ -1094,21 +1094,16 @@ void Text::drawImplementation(osg::State& state, const osg::Vec4& colorMultiplie
if ((_drawMode&(~TEXT))!=0) if ((_drawMode&(~TEXT))!=0)
{ {
state.disableNormalPointer();
state.Color(colorMultiplier.r()*_textBBColor.r(),colorMultiplier.g()*_textBBColor.g(),colorMultiplier.b()*_textBBColor.b(),colorMultiplier.a()*_textBBColor.a());
if (_decorationVertices.valid() && !_decorationVertices->empty()) if (_decorationVertices.valid() && !_decorationVertices->empty())
{ {
state.disableNormalPointer();
osg::State::ApplyModeProxy applyMode(state, GL_LIGHTING, false); osg::State::ApplyModeProxy applyMode(state, GL_LIGHTING, false);
osg::State::ApplyTextureModeProxy applyTextureMode(state, 0, GL_TEXTURE_2D, false); osg::State::ApplyTextureModeProxy applyTextureMode(state, 0, GL_TEXTURE_2D, false);
state.disableAllVertexArrays(); state.disableAllVertexArrays();
state.setVertexPointer(_decorationVertices.get()); state.setVertexPointer(_decorationVertices.get());
unsigned int start_index = 0;
if ((_drawMode & FILLEDBOUNDINGBOX)!=0 && _textBB.valid())
{
#if !defined(OSG_GLES1_AVAILABLE) && !defined(OSG_GLES2_AVAILABLE) && !defined(OSG_GL3_AVAILABLE) #if !defined(OSG_GLES1_AVAILABLE) && !defined(OSG_GLES2_AVAILABLE) && !defined(OSG_GL3_AVAILABLE)
switch(_backdropImplementation) switch(_backdropImplementation)
{ {
@ -1129,10 +1124,19 @@ void Text::drawImplementation(osg::State& state, const osg::Vec4& colorMultiplie
glEnable(GL_POLYGON_OFFSET_FILL); glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(0.1f * osg::PolygonOffset::getFactorMultiplier(), 10.0f * osg::PolygonOffset::getUnitsMultiplier() ); glPolygonOffset(0.1f * osg::PolygonOffset::getFactorMultiplier(), 10.0f * osg::PolygonOffset::getUnitsMultiplier() );
} }
#endif
glDrawArrays(GL_QUADS, 0, 4); for(Primitives::const_iterator itr = _decorationPrimitives.begin();
start_index += 4; itr != _decorationPrimitives.end();
++itr)
{
if ((*itr)->getMode()==GL_TRIANGLES) state.Color(colorMultiplier.r()*_textBBColor.r(), colorMultiplier.g()*_textBBColor.g(), colorMultiplier.b()*_textBBColor.b(), colorMultiplier.a()*_textBBColor.a());
else state.Color(colorMultiplier.r(), colorMultiplier.g(), colorMultiplier.b(), colorMultiplier.a());
(*itr)->draw(state, _useVertexBufferObjects);
}
#if !defined(OSG_GLES1_AVAILABLE) && !defined(OSG_GLES2_AVAILABLE) && !defined(OSG_GL3_AVAILABLE)
switch(_backdropImplementation) switch(_backdropImplementation)
{ {
case NO_DEPTH_BUFFER: case NO_DEPTH_BUFFER:
@ -1150,13 +1154,6 @@ void Text::drawImplementation(osg::State& state, const osg::Vec4& colorMultiplie
} }
#endif #endif
} }
if (start_index<_decorationVertices->size())
{
state.Color(colorMultiplier.r(),colorMultiplier.g(),colorMultiplier.b(),colorMultiplier.a());
glDrawArrays(GL_LINES, start_index, _decorationVertices->size());
}
}
} }
#if defined(OSG_GL_FIXED_FUNCTION_AVAILABLE) #if defined(OSG_GL_FIXED_FUNCTION_AVAILABLE)

View File

@ -468,18 +468,11 @@ void Text3D::drawImplementation(osg::RenderInfo& renderInfo) const
state.setVertexPointer(_decorationVertices.get()); state.setVertexPointer(_decorationVertices.get());
unsigned int start_index = 0; for(Primitives::const_iterator itr = _decorationPrimitives.begin();
if ((_drawMode & FILLEDBOUNDINGBOX)!=0 && _textBB.valid()) itr != _decorationPrimitives.end();
++itr)
{ {
state.Color(_textBBColor.r(),_textBBColor.g(),_textBBColor.b(),_textBBColor.a()); (*itr)->draw(state, _useVertexBufferObjects);
glDrawArrays(GL_QUADS, 0, 4);
start_index += 4;
}
if (start_index<_decorationVertices->size())
{
state.Color(_color.r(),_color.g(),_color.b(),_color.a());
glDrawArrays(GL_LINES, start_index, _decorationVertices->size());
} }
} }
} }
@ -602,13 +595,13 @@ void Text3D::renderPerFace(osg::State & state) const
LineRenderInfo::const_iterator it, endLine = itLine->end(); LineRenderInfo::const_iterator it, endLine = itLine->end();
for (it = itLine->begin(); it!=endLine; ++it) for (it = itLine->begin(); it!=endLine; ++it)
{ {
state.setVertexPointer(it->_glyphGeometry->getVertexArray());
state.setNormalPointer(it->_glyphGeometry->getNormalArray());
osg::Matrix matrix(original_modelview); osg::Matrix matrix(original_modelview);
matrix.preMultTranslate(osg::Vec3d(it->_position.x(), it->_position.y(), it->_position.z())); matrix.preMultTranslate(osg::Vec3d(it->_position.x(), it->_position.y(), it->_position.z()));
state.applyModelViewMatrix(matrix); state.applyModelViewMatrix(matrix);
state.setVertexPointer(it->_glyphGeometry->getVertexArray());
state.setNormalPointer(it->_glyphGeometry->getNormalArray());
// ** render the front face of the glyph // ** render the front face of the glyph
osg::Geometry::PrimitiveSetList & psl = it->_glyphGeometry->getFrontPrimitiveSetList(); osg::Geometry::PrimitiveSetList & psl = it->_glyphGeometry->getFrontPrimitiveSetList();
for(osg::Geometry::PrimitiveSetList::const_iterator itr=psl.begin(), end=psl.end(); itr!=end; ++itr) for(osg::Geometry::PrimitiveSetList::const_iterator itr=psl.begin(), end=psl.end(); itr!=end; ++itr)
@ -627,13 +620,13 @@ void Text3D::renderPerFace(osg::State & state) const
LineRenderInfo::const_iterator it, endLine = itLine->end(); LineRenderInfo::const_iterator it, endLine = itLine->end();
for (it = itLine->begin(); it!=endLine; ++it) for (it = itLine->begin(); it!=endLine; ++it)
{ {
state.setVertexPointer(it->_glyphGeometry->getVertexArray());
state.setNormalPointer(it->_glyphGeometry->getNormalArray());
osg::Matrix matrix(original_modelview); osg::Matrix matrix(original_modelview);
matrix.preMultTranslate(osg::Vec3d(it->_position.x(), it->_position.y(), it->_position.z())); matrix.preMultTranslate(osg::Vec3d(it->_position.x(), it->_position.y(), it->_position.z()));
state.applyModelViewMatrix(matrix); state.applyModelViewMatrix(matrix);
state.setVertexPointer(it->_glyphGeometry->getVertexArray());
state.setNormalPointer(it->_glyphGeometry->getNormalArray());
const osg::Geometry::PrimitiveSetList & psl = it->_glyphGeometry->getWallPrimitiveSetList(); const osg::Geometry::PrimitiveSetList & psl = it->_glyphGeometry->getWallPrimitiveSetList();
for(osg::Geometry::PrimitiveSetList::const_iterator itr=psl.begin(), end=psl.end(); itr!=end; ++itr) for(osg::Geometry::PrimitiveSetList::const_iterator itr=psl.begin(), end=psl.end(); itr!=end; ++itr)
{ {
@ -654,13 +647,13 @@ void Text3D::renderPerFace(osg::State & state) const
LineRenderInfo::const_iterator it, endLine = itLine->end(); LineRenderInfo::const_iterator it, endLine = itLine->end();
for (it = itLine->begin(); it!=endLine; ++it) for (it = itLine->begin(); it!=endLine; ++it)
{ {
state.setVertexPointer(it->_glyphGeometry->getVertexArray());
state.setNormalPointer(it->_glyphGeometry->getNormalArray());
osg::Matrix matrix(original_modelview); osg::Matrix matrix(original_modelview);
matrix.preMultTranslate(osg::Vec3d(it->_position.x(), it->_position.y(), it->_position.z())); matrix.preMultTranslate(osg::Vec3d(it->_position.x(), it->_position.y(), it->_position.z()));
state.applyModelViewMatrix(matrix); state.applyModelViewMatrix(matrix);
state.setVertexPointer(it->_glyphGeometry->getVertexArray());
state.setNormalPointer(it->_glyphGeometry->getNormalArray());
// ** render the back face of the glyph // ** render the back face of the glyph
const osg::Geometry::PrimitiveSetList & psl = it->_glyphGeometry->getBackPrimitiveSetList(); const osg::Geometry::PrimitiveSetList & psl = it->_glyphGeometry->getBackPrimitiveSetList();
for(osg::Geometry::PrimitiveSetList::const_iterator itr=psl.begin(), end=psl.end(); itr!=end; ++itr) for(osg::Geometry::PrimitiveSetList::const_iterator itr=psl.begin(), end=psl.end(); itr!=end; ++itr)

View File

@ -630,6 +630,7 @@ void TextBase::setupDecoration()
} }
_decorationVertices->clear(); _decorationVertices->clear();
_decorationPrimitives.clear();
if ((_drawMode & FILLEDBOUNDINGBOX)!=0 && _textBB.valid()) if ((_drawMode & FILLEDBOUNDINGBOX)!=0 && _textBB.valid())
{ {
@ -638,10 +639,22 @@ void TextBase::setupDecoration()
osg::Vec3 c110(_textBB.xMax(),_textBB.yMax(),_textBB.zMin()); osg::Vec3 c110(_textBB.xMax(),_textBB.yMax(),_textBB.zMin());
osg::Vec3 c010(_textBB.xMin(),_textBB.yMax(),_textBB.zMin()); osg::Vec3 c010(_textBB.xMin(),_textBB.yMax(),_textBB.zMin());
unsigned int base = _decorationVertices->size();
_decorationVertices->push_back(c000); _decorationVertices->push_back(c000);
_decorationVertices->push_back(c100); _decorationVertices->push_back(c100);
_decorationVertices->push_back(c110); _decorationVertices->push_back(c110);
_decorationVertices->push_back(c010); _decorationVertices->push_back(c010);
osg::ref_ptr<osg::DrawElementsUShort> primitives = new osg::DrawElementsUShort(GL_TRIANGLES);
_decorationPrimitives.push_back(primitives);
primitives->push_back(base);
primitives->push_back(base+1);
primitives->push_back(base+2);
primitives->push_back(base);
primitives->push_back(base+1);
primitives->push_back(base+3);
} }
if ((_drawMode & BOUNDINGBOX)!=0 && _textBB.valid()) if ((_drawMode & BOUNDINGBOX)!=0 && _textBB.valid())
@ -653,17 +666,20 @@ void TextBase::setupDecoration()
osg::Vec3 c110(_textBB.xMax(),_textBB.yMax(),_textBB.zMin()); osg::Vec3 c110(_textBB.xMax(),_textBB.yMax(),_textBB.zMin());
osg::Vec3 c010(_textBB.xMin(),_textBB.yMax(),_textBB.zMin()); osg::Vec3 c010(_textBB.xMin(),_textBB.yMax(),_textBB.zMin());
unsigned int base = _decorationVertices->size();
_decorationVertices->push_back(c000); _decorationVertices->push_back(c000);
_decorationVertices->push_back(c100); _decorationVertices->push_back(c100);
_decorationVertices->push_back(c100);
_decorationVertices->push_back(c110);
_decorationVertices->push_back(c110); _decorationVertices->push_back(c110);
_decorationVertices->push_back(c010); _decorationVertices->push_back(c010);
_decorationVertices->push_back(c010); osg::ref_ptr<osg::DrawElementsUShort> primitives = new osg::DrawElementsUShort(GL_LINE_LOOP);
_decorationVertices->push_back(c000); _decorationPrimitives.push_back(primitives);
primitives->push_back(base);
primitives->push_back(base+1);
primitives->push_back(base+2);
primitives->push_back(base+3);
} }
else else
{ {
@ -677,46 +693,61 @@ void TextBase::setupDecoration()
osg::Vec3 c111(_textBB.xMax(),_textBB.yMax(),_textBB.zMax()); osg::Vec3 c111(_textBB.xMax(),_textBB.yMax(),_textBB.zMax());
osg::Vec3 c011(_textBB.xMin(),_textBB.yMax(),_textBB.zMax()); osg::Vec3 c011(_textBB.xMin(),_textBB.yMax(),_textBB.zMax());
unsigned int base = _decorationVertices->size();
_decorationVertices->push_back(c000); // +0
_decorationVertices->push_back(c100); // +1
_decorationVertices->push_back(c110); // +2
_decorationVertices->push_back(c010); // +3
_decorationVertices->push_back(c001); // +4
_decorationVertices->push_back(c101); // +5
_decorationVertices->push_back(c111); // +6
_decorationVertices->push_back(c011); // +7
osg::ref_ptr<osg::DrawElementsUShort> primitives = new osg::DrawElementsUShort(GL_LINES);
_decorationPrimitives.push_back(primitives);
// front loop
primitives->push_back(base+0);
primitives->push_back(base+1);
primitives->push_back(base+1);
primitives->push_back(base+2);
primitives->push_back(base+2);
primitives->push_back(base+3);
primitives->push_back(base+3);
primitives->push_back(base+0);
// back loop
primitives->push_back(base+4);
primitives->push_back(base+5);
primitives->push_back(base+5);
primitives->push_back(base+6);
primitives->push_back(base+6);
primitives->push_back(base+7);
primitives->push_back(base+7);
primitives->push_back(base+4);
// edges from corner 000 // edges from corner 000
_decorationVertices->push_back(c000); primitives->push_back(base+0);
_decorationVertices->push_back(c100); primitives->push_back(base+4);
_decorationVertices->push_back(c000); primitives->push_back(base+1);
_decorationVertices->push_back(c001); primitives->push_back(base+5);
_decorationVertices->push_back(c000); primitives->push_back(base+2);
_decorationVertices->push_back(c010); primitives->push_back(base+6);
// edges from corner C101 primitives->push_back(base+3);
_decorationVertices->push_back(c101); primitives->push_back(base+7);
_decorationVertices->push_back(c100);
_decorationVertices->push_back(c101);
_decorationVertices->push_back(c001);
_decorationVertices->push_back(c101);
_decorationVertices->push_back(c111);
// edges from corner C110
_decorationVertices->push_back(c110);
_decorationVertices->push_back(c010);
_decorationVertices->push_back(c110);
_decorationVertices->push_back(c100);
_decorationVertices->push_back(c110);
_decorationVertices->push_back(c111);
// edges from corner C011
_decorationVertices->push_back(c011);
_decorationVertices->push_back(c010);
_decorationVertices->push_back(c011);
_decorationVertices->push_back(c001);
_decorationVertices->push_back(c011);
_decorationVertices->push_back(c111);
} }
} }
@ -729,9 +760,21 @@ void TextBase::setupDecoration()
osg::Vec3 vt(osg::Vec3(_offset.x(),_offset.y()-cursorsize,_offset.z())); osg::Vec3 vt(osg::Vec3(_offset.x(),_offset.y()-cursorsize,_offset.z()));
osg::Vec3 vb(osg::Vec3(_offset.x(),_offset.y()+cursorsize,_offset.z())); osg::Vec3 vb(osg::Vec3(_offset.x(),_offset.y()+cursorsize,_offset.z()));
unsigned int base = _decorationVertices->size();
_decorationVertices->push_back(hl); _decorationVertices->push_back(hl);
_decorationVertices->push_back(hr); _decorationVertices->push_back(hr);
_decorationVertices->push_back(vt); _decorationVertices->push_back(vt);
_decorationVertices->push_back(vb); _decorationVertices->push_back(vb);
osg::ref_ptr<osg::DrawElementsUShort> primitives = new osg::DrawElementsUShort(GL_LINES);
_decorationPrimitives.push_back(primitives);
// front loop
primitives->push_back(base+0);
primitives->push_back(base+1);
primitives->push_back(base+1);
primitives->push_back(base+2);
} }
} }