override public void PopulateRenderLayer() { if (_isOnStage && _firstFacetIndex != -1) { _isMeshDirty = false; Vector3[] vertices = _renderLayer.vertices; Vector2[] uvs = _renderLayer.uvs; Color[] colors = _renderLayer.colors; int vertexIndex0 = _firstFacetIndex * 4; int vertexIndex1 = vertexIndex0 + 1; int vertexIndex2 = vertexIndex0 + 2; int vertexIndex3 = vertexIndex0 + 3; int lineCount = _letterQuadLines.Length; for (int i = 0; i < lineCount; i++) { FLetterQuad[] quads = _letterQuadLines[i].quads; int quadCount = quads.Length; for (int q = 0; q < quadCount; q++) { FLetterQuad quad = quads[q]; FCharInfo charInfo = quad.charInfo; _concatenatedMatrix.ApplyVector3FromLocalVector2(ref vertices[vertexIndex0], quad.topLeft, 0); _concatenatedMatrix.ApplyVector3FromLocalVector2(ref vertices[vertexIndex1], quad.topRight, 0); _concatenatedMatrix.ApplyVector3FromLocalVector2(ref vertices[vertexIndex2], quad.bottomRight, 0); _concatenatedMatrix.ApplyVector3FromLocalVector2(ref vertices[vertexIndex3], quad.bottomLeft, 0); uvs[vertexIndex0] = charInfo.uvTopLeft; uvs[vertexIndex1] = charInfo.uvTopRight; uvs[vertexIndex2] = charInfo.uvBottomRight; uvs[vertexIndex3] = charInfo.uvBottomLeft; colors[vertexIndex0] = _alphaColor; colors[vertexIndex1] = _alphaColor; colors[vertexIndex2] = _alphaColor; colors[vertexIndex3] = _alphaColor; vertexIndex0 += 4; vertexIndex1 += 4; vertexIndex2 += 4; vertexIndex3 += 4; } } _renderLayer.HandleVertsChange(); } }
public FLetterQuadLine[] GetQuadInfoForText(string text, FTextParams textParams) { int lineCount = 0; int letterCount = 0; char[] letters = text.ToCharArray(); //at some point these should probably be pooled and reused so we're not allocing new ones all the time FLetterQuadLine[] lines = new FLetterQuadLine[10]; int lettersLength = letters.Length; for(int c = 0; c<lettersLength; ++c) { char letter = letters[c]; if(letter == ASCII_NEWLINE) { lines[lineCount] = new FLetterQuadLine(); lines[lineCount].letterCount = letterCount; lines[lineCount].quads = new FLetterQuad[letterCount]; lineCount++; letterCount = 0; } else { letterCount++; } } lines[lineCount] = new FLetterQuadLine(); lines[lineCount].letterCount = letterCount; lines[lineCount].quads = new FLetterQuad[letterCount]; FLetterQuadLine[] oldLines = lines; lines = new FLetterQuadLine[lineCount+1]; for(int c = 0; c<lineCount+1; ++c) { lines[c] = oldLines[c]; } lineCount = 0; letterCount = 0; float nextX = 0; float nextY = 0; FCharInfo charInfo; char previousLetter = '\0'; float minX = 100000; float maxX = -100000; float minY = 100000; float maxY = -100000; float usableLineHeight = _lineHeight + textParams.scaledLineHeightOffset + _textParams.scaledLineHeightOffset; for(int c = 0; c<lettersLength; ++c) { char letter = letters[c]; if(letter == ASCII_NEWLINE) { lines[lineCount].bounds = new Rect(minX,minY,maxX-minX,maxY-minY); minX = 100000; maxX = -100000; minY = 100000; maxY = -100000; nextX = 0; nextY -= usableLineHeight; lineCount++; letterCount = 0; } else { FKerningInfo foundKerning = _nullKerning; for(int k = 0; k<_kerningCount; k++) { FKerningInfo kerningInfo = _kerningInfos[k]; if(kerningInfo.first == previousLetter && kerningInfo.second == letter) { foundKerning = kerningInfo; } } //TODO: Reuse letterquads with pooling! FLetterQuad letterQuad = new FLetterQuad(); if(_charInfosByID.ContainsKey(letter)) { charInfo = _charInfosByID[letter]; } else //we don't have that character in the font { //blank, character (could consider using the "char not found square") charInfo = _charInfosByID[0]; } float totalKern = foundKerning.amount + textParams.scaledKerningOffset + _textParams.scaledKerningOffset; nextX += totalKern; letterQuad.charInfo = charInfo; Rect quadRect = new Rect(nextX + charInfo.offsetX, nextY - charInfo.offsetY - charInfo.height, charInfo.width, charInfo.height); letterQuad.rect = quadRect; lines[lineCount].quads[letterCount] = letterQuad; minX = Math.Min (minX, quadRect.xMin); maxX = Math.Max (maxX, quadRect.xMax); maxY = Math.Max (maxY, nextY); minY = Math.Min (minY, nextY - usableLineHeight); // minY = Math.Min (minY, quadRect.yMin); // maxY = Math.Max (maxY, quadRect.yMax); nextX += charInfo.xadvance; letterCount++; } previousLetter = letter; } lines[lineCount].bounds = new Rect(minX,minY,maxX-minX,maxY-minY); return lines; }
public FLetterQuadLine[] GetQuadInfoForText(string text, FTextParams textParams) { int lineCount = 0; int letterCount = 0; char[] letters = text.ToCharArray(); FLetterQuadLine[] lines = new FLetterQuadLine[10]; for(int c = 0; c<letters.Length; ++c) { char letter = letters[c]; if(letter == ASCII_NEWLINE) { lines[lineCount] = new FLetterQuadLine(); lines[lineCount].letterCount = letterCount; lines[lineCount].quads = new FLetterQuad[letterCount]; lineCount++; letterCount = 0; } else { letterCount++; } } lines[lineCount] = new FLetterQuadLine(); lines[lineCount].letterCount = letterCount; lines[lineCount].quads = new FLetterQuad[letterCount]; FLetterQuadLine[] oldLines = lines; lines = new FLetterQuadLine[lineCount+1]; for(int c = 0; c<lineCount+1; ++c) { lines[c] = oldLines[c]; } lineCount = 0; letterCount = 0; float nextX = 0; float nextY = 0; FCharInfo charInfo; char previousLetter = '\0'; float minX = 100000; float maxX = -100000; float minY = 100000; float maxY = -100000; for(int c = 0; c<letters.Length; ++c) { char letter = letters[c]; if(letter == ASCII_NEWLINE) { lines[lineCount].bounds = new Rect(minX,minY,maxX-minX,maxY-minY); minX = 100000; maxX = -100000; minY = 100000; maxY = -100000; nextX = 0; nextY -= _lineHeight + textParams.scaledLineHeightOffset + _fontTextParams.scaledLineHeightOffset; lineCount++; letterCount = 0; } else { FKerningInfo foundKerning = _nullKerning; foreach(FKerningInfo kerningInfo in _kerningInfos) { if(kerningInfo.first == previousLetter && kerningInfo.second == letter) { foundKerning = kerningInfo; } } //TODO: Reuse letterquads with pooling! FLetterQuad letterQuad = new FLetterQuad(); charInfo = _charInfosByID[letter]; float totalKern = foundKerning.amount + textParams.scaledKerningOffset + _fontTextParams.scaledKerningOffset; nextX += totalKern; letterQuad.charInfo = charInfo; // Rect quadRect = new Rect(nextX + charInfo.offsetX, nextY - charInfo.offsetY - charInfo.height, charInfo.width, charInfo.height); letterQuad.rect = quadRect; lines[lineCount].quads[letterCount] = letterQuad; minX = Math.Min (minX, quadRect.xMin); maxX = Math.Max (maxX, quadRect.xMax); minY = Math.Min (minY, quadRect.yMin); maxY = Math.Max (maxY, quadRect.yMax); nextX += charInfo.xadvance; letterCount++; } previousLetter = letter; } lines[lineCount].bounds = new Rect(minX,minY,maxX-minX,maxY-minY); return lines; }
public FLetterQuadLine[] GetQuadInfoForText(string text, FTextParams labelTextParams) { int lineCount = 0; int letterCount = 0; char[] letters = text.ToCharArray(); //at some point these should probably be pooled and reused so we're not allocing new ones all the time //now they're structs though, so it might not be an issue FLetterQuadLine[] lines = new FLetterQuadLine[15]; int lettersLength = letters.Length; for (int c = 0; c < lettersLength; ++c) { char letter = letters[c]; if (letter == ASCII_NEWLINE) { lines[lineCount] = new FLetterQuadLine(); lines[lineCount].letterCount = letterCount; lines[lineCount].quads = new FLetterQuad[letterCount]; lineCount++; letterCount = 0; } else { letterCount++; } } lines[lineCount] = new FLetterQuadLine(); lines[lineCount].letterCount = letterCount; lines[lineCount].quads = new FLetterQuad[letterCount]; FLetterQuadLine[] oldLines = lines; lines = new FLetterQuadLine[lineCount + 1]; for (int c = 0; c < lineCount + 1; ++c) { lines[c] = oldLines[c]; } lineCount = 0; letterCount = 0; float nextX = 0; float nextY = 0; FCharInfo charInfo; char previousLetter = '\0'; float minX = float.MaxValue; float maxX = float.MinValue; float minY = float.MaxValue; float maxY = float.MinValue; float usableLineHeight = _lineHeight + labelTextParams.scaledLineHeightOffset + _textParams.scaledLineHeightOffset; for (int c = 0; c < lettersLength; ++c) { char letter = letters[c]; if (letter == ASCII_NEWLINE) { if (letterCount == 0) { lines[lineCount].bounds = new Rect(0, 0, nextY, nextY - usableLineHeight); } else { lines[lineCount].bounds = new Rect(minX, minY, maxX - minX, maxY - minY); } minX = float.MaxValue; maxX = float.MinValue; minY = float.MaxValue; maxY = float.MinValue; nextX = 0; nextY -= usableLineHeight; lineCount++; letterCount = 0; } else { FKerningInfo foundKerning = _nullKerning; for (int k = 0; k < _kerningCount; k++) { FKerningInfo kerningInfo = _kerningInfos[k]; if (kerningInfo.first == previousLetter && kerningInfo.second == letter) { foundKerning = kerningInfo; } } //TODO: Reuse letterquads with pooling! FLetterQuad letterQuad = new FLetterQuad(); if (_charInfosByID.ContainsKey(letter)) { charInfo = _charInfosByID[letter]; } else //we don't have that character in the font { //blank, character (could consider using the "char not found square") charInfo = _charInfosByID[0]; } float totalKern = foundKerning.amount + labelTextParams.scaledKerningOffset + _textParams.scaledKerningOffset; if (letterCount == 0) { nextX = -charInfo.offsetX; //don't offset the first character } else { nextX += totalKern; } letterQuad.charInfo = charInfo; Rect quadRect = new Rect(nextX + charInfo.offsetX, nextY - charInfo.offsetY - charInfo.height, charInfo.width, charInfo.height); letterQuad.rect = quadRect; lines[lineCount].quads[letterCount] = letterQuad; minX = Math.Min(minX, quadRect.xMin); maxX = Math.Max(maxX, quadRect.xMax); minY = Math.Min(minY, nextY - usableLineHeight); maxY = Math.Max(maxY, nextY); nextX += charInfo.xadvance; letterCount++; } previousLetter = letter; } if (letterCount == 0) //there were no letters, so minX and minY would be crazy if we used them { lines[lineCount].bounds = new Rect(0, 0, nextY, nextY - usableLineHeight); } else { lines[lineCount].bounds = new Rect(minX, minY, maxX - minX, maxY - minY); } return(lines); }
public FLetterQuadLine[] GetQuadInfoForText(string text, FTextParams textParams) { int lineCount = 0; int letterCount = 0; char[] letters = text.ToCharArray(); FLetterQuadLine[] lines = new FLetterQuadLine[10]; for (int c = 0; c < letters.Length; ++c) { char letter = letters[c]; if (letter == ASCII_NEWLINE) { lines[lineCount] = new FLetterQuadLine(); lines[lineCount].letterCount = letterCount; lines[lineCount].quads = new FLetterQuad[letterCount]; lineCount++; letterCount = 0; } else { letterCount++; } } lines[lineCount] = new FLetterQuadLine(); lines[lineCount].letterCount = letterCount; lines[lineCount].quads = new FLetterQuad[letterCount]; FLetterQuadLine[] oldLines = lines; lines = new FLetterQuadLine[lineCount + 1]; for (int c = 0; c < lineCount + 1; ++c) { lines[c] = oldLines[c]; } lineCount = 0; letterCount = 0; float nextX = 0; float nextY = 0; FCharInfo charInfo; char previousLetter = '\0'; float minX = 100000; float maxX = -100000; float minY = 100000; float maxY = -100000; for (int c = 0; c < letters.Length; ++c) { char letter = letters[c]; if (letter == ASCII_NEWLINE) { lines[lineCount].bounds = new Rect(minX, minY, maxX - minX, maxY - minY); minX = 100000; maxX = -100000; minY = 100000; maxY = -100000; nextX = 0; nextY -= _lineHeight + textParams.scaledLineHeightOffset + _fontTextParams.scaledLineHeightOffset; lineCount++; letterCount = 0; } else { FKerningInfo foundKerning = _nullKerning; foreach (FKerningInfo kerningInfo in _kerningInfos) { if (kerningInfo.first == previousLetter && kerningInfo.second == letter) { foundKerning = kerningInfo; } } //TODO: Reuse letterquads with pooling! FLetterQuad letterQuad = new FLetterQuad(); charInfo = _charInfosByID[letter]; float totalKern = foundKerning.amount + textParams.scaledKerningOffset + _fontTextParams.scaledKerningOffset; nextX += totalKern; letterQuad.charInfo = charInfo; // Rect quadRect = new Rect(nextX + charInfo.offsetX, nextY - charInfo.offsetY - charInfo.height, charInfo.width, charInfo.height); letterQuad.rect = quadRect; lines[lineCount].quads[letterCount] = letterQuad; minX = Math.Min(minX, quadRect.xMin); maxX = Math.Max(maxX, quadRect.xMax); minY = Math.Min(minY, quadRect.yMin); maxY = Math.Max(maxY, quadRect.yMax); nextX += charInfo.xadvance; letterCount++; } previousLetter = letter; } lines[lineCount].bounds = new Rect(minX, minY, maxX - minX, maxY - minY); return(lines); }
public FLetterQuadLine[] GetQuadInfoForText(string text, FTextParams labelTextParams) { int lineCount = 0; int letterCount = 0; char[] letters = text.ToCharArray(); //at some point these should probably be pooled and reused so we're not allocing new ones all the time //now they're structs though, so it might not be an issue FLetterQuadLine[] lines = new FLetterQuadLine[10]; int lettersLength = letters.Length; for(int c = 0; c<lettersLength; ++c) { char letter = letters[c]; if(letter == ASCII_NEWLINE) { lines[lineCount] = new FLetterQuadLine(); lines[lineCount].letterCount = letterCount; lines[lineCount].quads = new FLetterQuad[letterCount]; lineCount++; letterCount = 0; } else { letterCount++; } } lines[lineCount] = new FLetterQuadLine(); lines[lineCount].letterCount = letterCount; lines[lineCount].quads = new FLetterQuad[letterCount]; FLetterQuadLine[] oldLines = lines; lines = new FLetterQuadLine[lineCount+1]; for(int c = 0; c<lineCount+1; ++c) { lines[c] = oldLines[c]; } lineCount = 0; letterCount = 0; float nextX = 0; float nextY = 0; FCharInfo charInfo; char previousLetter = '\0'; float minX = float.MaxValue; float maxX = float.MinValue; float minY = float.MaxValue; float maxY = float.MinValue; float usableLineHeight = _lineHeight + labelTextParams.scaledLineHeightOffset + _textParams.scaledLineHeightOffset; for(int c = 0; c<lettersLength; ++c) { char letter = letters[c]; if(letter == ASCII_NEWLINE) { if(letterCount == 0) { lines[lineCount].bounds = new Rect(0,0,nextY,nextY - usableLineHeight); } else { lines[lineCount].bounds = new Rect(minX,minY,maxX-minX,maxY-minY); } minX = float.MaxValue; maxX = float.MinValue; minY = float.MaxValue; maxY = float.MinValue; nextX = 0; nextY -= usableLineHeight; lineCount++; letterCount = 0; } else { FKerningInfo foundKerning = _nullKerning; for(int k = 0; k<_kerningCount; k++) { FKerningInfo kerningInfo = _kerningInfos[k]; if(kerningInfo.first == previousLetter && kerningInfo.second == letter) { foundKerning = kerningInfo; } } FLetterQuad letterQuad = new FLetterQuad(); if(!_charInfosByID.TryGetValue(letter,out charInfo)) { charInfo = _charInfosByID[0]; } float totalKern = foundKerning.amount + labelTextParams.scaledKerningOffset + _textParams.scaledKerningOffset; if(letterCount == 0) { nextX = -charInfo.offsetX; //don't offset the first character } else { nextX += totalKern; } letterQuad.charInfo = charInfo; Rect quadRect = new Rect(nextX + charInfo.offsetX, nextY - charInfo.offsetY - charInfo.height, charInfo.width, charInfo.height); letterQuad.rect = quadRect; lines[lineCount].quads[letterCount] = letterQuad; minX = Math.Min (minX, quadRect.xMin); maxX = Math.Max (maxX, quadRect.xMax); minY = Math.Min (minY, nextY - usableLineHeight); maxY = Math.Max (maxY, nextY); nextX += charInfo.xadvance; letterCount++; } previousLetter = letter; } if(letterCount == 0) //there were no letters, so minX and minY would be crazy if we used them { lines[lineCount].bounds = new Rect(0,0,nextY,nextY - usableLineHeight); } else { lines[lineCount].bounds = new Rect(minX,minY,maxX-minX,maxY-minY); } for(int n = 0; n<lineCount+1; n++) { lines[n].bounds.height += labelTextParams.scaledLineHeightOffset + _textParams.scaledLineHeightOffset; } return lines; }
override public void PopulateRenderLayer() { if (_isOnStage && _firstFacetIndex != -1) { _isMeshDirty = false; //check if the label is empty so we don't have to bother trying to draw anything if (_letterQuadLines.Length == 0 || _letterQuadLines[0].quads.Length == 0) { _renderLayer.HandleVertsChange(); return; } Vector3[] vertices = _renderLayer.vertices; Vector2[] uvs = _renderLayer.uvs; Color[] colors = _renderLayer.colors; int vertexIndex0 = _firstFacetIndex * 4; int vertexIndex1 = vertexIndex0 + 1; int vertexIndex2 = vertexIndex0 + 2; int vertexIndex3 = vertexIndex0 + 3; Vector2 topLeft = _letterQuadLines[0].quads[0].topLeft; FMatrix matrixToUse = _concatenatedMatrix; if (_shouldSnapToPixels) { matrixToUse = matrixToUse.Clone(); matrixToUse.tx += (Mathf.Round(topLeft.x * Futile.displayScale) * Futile.displayScaleInverse) - topLeft.x; matrixToUse.ty += (Mathf.Round(topLeft.y * Futile.displayScale) * Futile.displayScaleInverse) - topLeft.y; } int lineCount = _letterQuadLines.Length; for (int i = 0; i < lineCount; i++) { FLetterQuad[] quads = _letterQuadLines[i].quads; int quadCount = quads.Length; for (int q = 0; q < quadCount; q++) { FLetterQuad quad = quads[q]; FCharInfo charInfo = quad.charInfo; matrixToUse.ApplyVector3FromLocalVector2(ref vertices[vertexIndex0], quad.topLeft, 0); matrixToUse.ApplyVector3FromLocalVector2(ref vertices[vertexIndex1], quad.topRight, 0); matrixToUse.ApplyVector3FromLocalVector2(ref vertices[vertexIndex2], quad.bottomRight, 0); matrixToUse.ApplyVector3FromLocalVector2(ref vertices[vertexIndex3], quad.bottomLeft, 0); uvs[vertexIndex0] = charInfo.uvTopLeft; uvs[vertexIndex1] = charInfo.uvTopRight; uvs[vertexIndex2] = charInfo.uvBottomRight; uvs[vertexIndex3] = charInfo.uvBottomLeft; colors[vertexIndex0] = _alphaColor; colors[vertexIndex1] = _alphaColor; colors[vertexIndex2] = _alphaColor; colors[vertexIndex3] = _alphaColor; vertexIndex0 += 4; vertexIndex1 += 4; vertexIndex2 += 4; vertexIndex3 += 4; } } _renderLayer.HandleVertsChange(); } }