Ejemplo n.º 1
0
    public void UpdateLocalPosition()
    {
        _doesLocalPositionNeedUpdate = false;

        float minY = 100000000;
        float maxY = -100000000;

        float minX = 100000000;
        float maxX = -100000000;

        int lineCount = _letterQuadLines.Length;

        for (int i = 0; i < lineCount; i++)
        {
            FLetterQuadLine line = _letterQuadLines[i];
            minY = Math.Min(line.bounds.yMin, minY);
            maxY = Math.Max(line.bounds.yMax, maxY);
        }

        float offsetY = -(minY + ((maxY - minY) * _anchorY));

        for (int i = 0; i < lineCount; i++)
        {
            FLetterQuadLine line    = _letterQuadLines[i];
            float           offsetX = -line.bounds.width * _anchorX;

            minX = Math.Min(offsetX, minX);
            maxX = Math.Max(offsetX + line.bounds.width, maxX);

            int quadCount = line.quads.Length;
            for (int q = 0; q < quadCount; q++)
            {
                //todo: figure out where this magic 1.0f comes from
                //it's needed for everything to be perfectly positioned, but I'm not sure why...
                line.quads[q].CalculateVectors(offsetX + _font.offsetX + 1.0f, offsetY + _font.offsetY + 1.0f);
            }
        }

        _textRect.x      = minX;
        _textRect.y      = minY + offsetY;
        _textRect.width  = maxX - minX;
        _textRect.height = maxY - minY;

        _isMeshDirty = true;
    }
Ejemplo n.º 2
0
    public void UpdateLocalPosition()
    {
        _doesLocalPositionNeedUpdate = false;

        float minY = 100000000;
        float maxY = -100000000;

        float minX = 100000000;
        float maxX = -100000000;

        int lineCount = _letterQuadLines.Length;

        for (int i = 0; i < lineCount; i++)
        {
            FLetterQuadLine line = _letterQuadLines[i];
            minY = Math.Min(line.bounds.yMin, minY);
            maxY = Math.Max(line.bounds.yMax, maxY);
        }

        float offsetY = -(minY + ((maxY - minY) * _anchorY));

        for (int i = 0; i < lineCount; i++)
        {
            FLetterQuadLine line    = _letterQuadLines[i];
            float           offsetX = -line.bounds.width * _anchorX;

            minX = Math.Min(offsetX, minX);
            maxX = Math.Max(offsetX + line.bounds.width, maxX);

            int quadCount = line.quads.Length;
            for (int q = 0; q < quadCount; q++)
            {
                line.quads[q].CalculateVectors(offsetX, offsetY);
            }
        }

        _textRect.x      = minX;
        _textRect.y      = minY + offsetY;
        _textRect.width  = maxX - minX;
        _textRect.height = maxY - minY;

        _isMeshDirty = true;
    }
Ejemplo n.º 3
0
    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;
    }
Ejemplo n.º 4
0
    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;
    }
Ejemplo n.º 5
0
    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);
    }
Ejemplo n.º 6
0
    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);
    }
Ejemplo n.º 7
0
	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;
	}