+ void GenerateUnderlines( std::vector< MeshRecord>& meshRecords,
+ Vector< Extent >& extents,
+ const Vector4& underlineColor,
+ const Vector4& textColor )
+ {
+ MeshData newMeshData;
+ const float zero = 0.0f;
+ const float half = 0.5f;
+
+ for ( Vector< Extent >::ConstIterator eIt = extents.Begin(); eIt != extents.End(); ++eIt )
+ {
+ MeshData::VertexContainer newVerts;
+ newVerts.reserve( 4u );
+ uint32_t index = eIt->mMeshRecordIndex;
+ Vector2 uv = mGlyphManager.GetAtlasSize( meshRecords[ index ].mAtlasId );
+
+ // Make sure we don't hit texture edge for single pixel texture ( filled pixel is in top left of every atlas )
+ float u = half / uv.x;
+ float v = half / uv.y;
+ float thickness = eIt->mUnderlineThickness;
+ float baseLine = eIt->mBaseLine - eIt->mUnderlinePosition - ( thickness * 0.5f );
+ float tlx = eIt->mLeft;
+ float brx = eIt->mRight;
+
+ newVerts.push_back( MeshData::Vertex( Vector3( tlx, baseLine, zero ),
+ Vector2( zero, zero ),
+ Vector3( zero, zero, zero ) ) );
+
+ newVerts.push_back( MeshData::Vertex( Vector3( brx, baseLine, zero ),
+ Vector2( u, zero ),
+ Vector3( zero, zero, zero ) ) );
+
+ newVerts.push_back( MeshData::Vertex( Vector3( tlx, baseLine + thickness, zero ),
+ Vector2( zero, v ),
+ Vector3( zero, zero, zero ) ) );
+
+ newVerts.push_back( MeshData::Vertex( Vector3( brx, baseLine + thickness, zero ),
+ Vector2( u, v ),
+ Vector3( zero, zero, zero ) ) );
+
+ newMeshData.SetVertices( newVerts );
+ newMeshData.SetFaceIndices( mFace );
+
+ if ( underlineColor == textColor )
+ {
+ mGlyphManager.StitchMesh( meshRecords[ index ].mMeshData, newMeshData );
+ }
+ else
+ {
+ MeshRecord record;
+ newMeshData.SetMaterial( meshRecords[ index ].mMeshData.GetMaterial() );
+ newMeshData.SetHasNormals( true );
+ newMeshData.SetHasColor( false );
+ newMeshData.SetHasTextureCoords( true );
+ record.mMeshData = newMeshData;
+ record.mAtlasId = meshRecords[ index ].mAtlasId;
+ record.mColor = underlineColor;
+ record.mIsUnderline = true;
+ meshRecords.push_back( record );
+ }
+ }
+ }
+
+ MeshActor GenerateShadow( MeshRecord& meshRecord,