int FillTextData()
{
Vector2 gradientOffset = new Vector2((float)_textureGradient / font.gradientCount, 0);
Vector2 dims = GetMeshDimensionsForString(_formattedText);
float offsetY = GetYAnchorForHeight(dims.y);
bool _useInlineStyling = useInlineStyling;
float cursorX = 0.0f;
float cursorY = 0.0f;
int target = 0;
int alignStartTarget = 0;
for (int i = 0; i < _formattedText.Length && target < _maxChars; ++i)
{
int idx = _formattedText[i];
tk2dFontChar chr;
if (_fontInst.useDictionary)
{
if (!_fontInst.charDict.ContainsKey(idx)) idx = 0;
chr = _fontInst.charDict[idx];
}
else
{
if (idx >= _fontInst.chars.Length) idx = 0; // should be space
chr = _fontInst.chars[idx];
}
if (idx == '\n')
{
float lineWidth = cursorX;
int alignEndTarget = target; // this is one after the last filled character
if (alignStartTarget != target)
{
float xOffset = GetXAnchorForWidth(lineWidth);
PostAlignTextData(alignStartTarget, alignEndTarget, xOffset);
}
alignStartTarget = target;
cursorX = 0.0f;
cursorY -= (_fontInst.lineHeight + lineSpacing) * _scale.y;
continue;
}
else if (_useInlineStyling)
{
if (idx == '^')
{
if (i+1 < _formattedText.Length)
{
i++;
if (_formattedText[i] != '^')
{
int data = _formattedText[i] - '0';
gradientOffset = new Vector2((float)data / font.gradientCount, 0);
continue;
}
}
}
}
vertices[target * 4 + 0] = new Vector3(cursorX + chr.p0.x * _scale.x, offsetY + cursorY + chr.p0.y * _scale.y, 0);
vertices[target * 4 + 1] = new Vector3(cursorX + chr.p1.x * _scale.x, offsetY + cursorY + chr.p0.y * _scale.y, 0);
vertices[target * 4 + 2] = new Vector3(cursorX + chr.p0.x * _scale.x, offsetY + cursorY + chr.p1.y * _scale.y, 0);
vertices[target * 4 + 3] = new Vector3(cursorX + chr.p1.x * _scale.x, offsetY + cursorY + chr.p1.y * _scale.y, 0);
if (chr.flipped)
{
uvs[target * 4 + 0] = new Vector2(chr.uv1.x, chr.uv1.y);
uvs[target * 4 + 1] = new Vector2(chr.uv1.x, chr.uv0.y);
uvs[target * 4 + 2] = new Vector2(chr.uv0.x, chr.uv1.y);
uvs[target * 4 + 3] = new Vector2(chr.uv0.x, chr.uv0.y);
}
else
{
uvs[target * 4 + 0] = new Vector2(chr.uv0.x, chr.uv0.y);
uvs[target * 4 + 1] = new Vector2(chr.uv1.x, chr.uv0.y);
uvs[target * 4 + 2] = new Vector2(chr.uv0.x, chr.uv1.y);
uvs[target * 4 + 3] = new Vector2(chr.uv1.x, chr.uv1.y);
}
if (_fontInst.textureGradients)
{
uv2[target * 4 + 0] = gradientOffset + chr.gradientUv[0];
uv2[target * 4 + 1] = gradientOffset + chr.gradientUv[1];
uv2[target * 4 + 2] = gradientOffset + chr.gradientUv[2];
uv2[target * 4 + 3] = gradientOffset + chr.gradientUv[3];
}
cursorX += (chr.advance + spacing) * _scale.x;
if (_kerning && i < _formattedText.Length - 1)
{
foreach (var k in _fontInst.kerning)
{
if (k.c0 == _formattedText[i] && k.c1 == _formattedText[i+1])
{
cursorX += k.amount * _scale.x;
break;
}
}
}
++target;
}
if (alignStartTarget != target)
{
float lineWidth = cursorX;
int alignEndTarget = target;
float xOffset = GetXAnchorForWidth(lineWidth);
PostAlignTextData(alignStartTarget, alignEndTarget, xOffset);
}
return target;
}