Here are the examples of the csharp api TMPro.TMP_TextUtilities.ScreenPointToWorldPointInRectangle(UnityEngine.Transform, UnityEngine.Vector2, UnityEngine.Camera, out UnityEngine.Vector3) taken from open source projects. By voting up you can indicate which examples are most useful and appropriate.
12 Examples
19
View Source File : TMP_TextUtilities.cs
License : GNU Lesser General Public License v3.0
Project Creator : disruptorbeam
License : GNU Lesser General Public License v3.0
Project Creator : disruptorbeam
public static int GetCursorIndexFromPosition(TMP_Text textComponent, Vector3 position, Camera camera, out CaretPosition cursor)
{
int line = TMP_TextUtilities.FindNearestLine(textComponent, position, camera);
int index = FindNearestCharacterOnLine(textComponent, position, line, camera, false);
// Special handling if line contains only one character.
if (textComponent.textInfo.lineInfo[line].characterCount == 1)
{
cursor = CaretPosition.Left;
return index;
}
RectTransform rectTransform = textComponent.rectTransform;
// Convert position into Worldspace coordinates
ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);
TMP_CharacterInfo cInfo = textComponent.textInfo.characterInfo[index];
// Get Bottom Left and Top Right position of the current character
Vector3 bl = rectTransform.TransformPoint(cInfo.bottomLeft);
Vector3 tr = rectTransform.TransformPoint(cInfo.topRight);
float insertPosition = (position.x - bl.x) / (tr.x - bl.x);
if (insertPosition < 0.5f)
{
cursor = CaretPosition.Left;
return index;
}
else
{
cursor = CaretPosition.Right;
return index;
}
}
19
View Source File : TMP_TextUtilities.cs
License : GNU Lesser General Public License v3.0
Project Creator : disruptorbeam
License : GNU Lesser General Public License v3.0
Project Creator : disruptorbeam
public static int FindNearestLine(TMP_Text text, Vector3 position, Camera camera)
{
RectTransform rectTransform = text.rectTransform;
float distance = Mathf.Infinity;
int closest = -1;
// Convert position into Worldspace coordinates
ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);
for (int i = 0; i < text.textInfo.lineCount; i++)
{
TMP_LineInfo lineInfo = text.textInfo.lineInfo[i];
float ascender = rectTransform.TransformPoint(new Vector3(0, lineInfo.ascender, 0)).y;
float descender = rectTransform.TransformPoint(new Vector3(0, lineInfo.descender, 0)).y;
if (ascender > position.y && descender < position.y)
{
//Debug.Log("Position is on line " + i);
return i;
}
float d0 = Mathf.Abs(ascender - position.y);
float d1 = Mathf.Abs(descender - position.y);
float d = Mathf.Min(d0, d1);
if (d < distance)
{
distance = d;
closest = i;
}
}
//Debug.Log("Closest line to position is " + closest);
return closest;
}
19
View Source File : TMP_TextUtilities.cs
License : GNU Lesser General Public License v3.0
Project Creator : disruptorbeam
License : GNU Lesser General Public License v3.0
Project Creator : disruptorbeam
public static int FindIntersectingLink(TMP_Text text, Vector3 position, Camera camera)
{
Transform rectTransform = text.transform;
// Convert position into Worldspace coordinates
ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);
for (int i = 0; i < text.textInfo.linkCount; i++)
{
TMP_LinkInfo linkInfo = text.textInfo.linkInfo[i];
bool isBeginRegion = false;
Vector3 bl = Vector3.zero;
Vector3 tl = Vector3.zero;
Vector3 br = Vector3.zero;
Vector3 tr = Vector3.zero;
// Iterate through each character of the word
for (int j = 0; j < linkInfo.linkTextLength; j++)
{
int characterIndex = linkInfo.linkTextfirstCharacterIndex + j;
TMP_CharacterInfo currentCharInfo = text.textInfo.characterInfo[characterIndex];
int currentLine = currentCharInfo.lineNumber;
// Check if Link characters are on the current page
if (text.overflowMode == TextOverflowModes.Page && currentCharInfo.pageNumber + 1 != text.pageToDisplay) continue;
if (isBeginRegion == false)
{
isBeginRegion = true;
bl = rectTransform.TransformPoint(new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.descender, 0));
tl = rectTransform.TransformPoint(new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.ascender, 0));
//Debug.Log("Start Word Region at [" + currentCharInfo.character + "]");
// If Word is one character
if (linkInfo.linkTextLength == 1)
{
isBeginRegion = false;
br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));
tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));
// Check for Intersection
if (PointIntersectRectangle(position, bl, tl, tr, br))
return i;
//Debug.Log("End Word Region at [" + currentCharInfo.character + "]");
}
}
// Last Character of Word
if (isBeginRegion && j == linkInfo.linkTextLength - 1)
{
isBeginRegion = false;
br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));
tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));
// Check for Intersection
if (PointIntersectRectangle(position, bl, tl, tr, br))
return i;
//Debug.Log("End Word Region at [" + currentCharInfo.character + "]");
}
// If Word is split on more than one line.
else if (isBeginRegion && currentLine != text.textInfo.characterInfo[characterIndex + 1].lineNumber)
{
isBeginRegion = false;
br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));
tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));
// Check for Intersection
if (PointIntersectRectangle(position, bl, tl, tr, br))
return i;
//Debug.Log("End Word Region at [" + currentCharInfo.character + "]");
}
}
//Debug.Log("Word at Index: " + i + " is located at (" + bl + ", " + tl + ", " + tr + ", " + br + ").");
}
return -1;
}
19
View Source File : TMP_TextUtilities.cs
License : GNU Lesser General Public License v3.0
Project Creator : disruptorbeam
License : GNU Lesser General Public License v3.0
Project Creator : disruptorbeam
public static int GetCursorIndexFromPosition(TMP_Text textComponent, Vector3 position, Camera camera)
{
int index = TMP_TextUtilities.FindNearestCharacter(textComponent, position, camera, false);
RectTransform rectTransform = textComponent.rectTransform;
// Convert position into Worldspace coordinates
ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);
TMP_CharacterInfo cInfo = textComponent.textInfo.characterInfo[index];
// Get Bottom Left and Top Right position of the current character
Vector3 bl = rectTransform.TransformPoint(cInfo.bottomLeft);
Vector3 tr = rectTransform.TransformPoint(cInfo.topRight);
float insertPosition = (position.x - bl.x) / (tr.x - bl.x);
if (insertPosition < 0.5f)
return index;
else
return index + 1;
}
19
View Source File : TMP_TextUtilities.cs
License : GNU Lesser General Public License v3.0
Project Creator : disruptorbeam
License : GNU Lesser General Public License v3.0
Project Creator : disruptorbeam
public static int FindIntersectingWord(TMP_Text text, Vector3 position, Camera camera)
{
RectTransform rectTransform = text.rectTransform;
// Convert position into Worldspace coordinates
ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);
for (int i = 0; i < text.textInfo.wordCount; i++)
{
TMP_WordInfo wInfo = text.textInfo.wordInfo[i];
bool isBeginRegion = false;
Vector3 bl = Vector3.zero;
Vector3 tl = Vector3.zero;
Vector3 br = Vector3.zero;
Vector3 tr = Vector3.zero;
float maxAscender = -Mathf.Infinity;
float minDescender = Mathf.Infinity;
// Iterate through each character of the word
for (int j = 0; j < wInfo.characterCount; j++)
{
int characterIndex = wInfo.firstCharacterIndex + j;
TMP_CharacterInfo currentCharInfo = text.textInfo.characterInfo[characterIndex];
int currentLine = currentCharInfo.lineNumber;
bool isCharacterVisible = currentCharInfo.isVisible;
// Track maximum Ascender and minimum Descender for each word.
maxAscender = Mathf.Max(maxAscender, currentCharInfo.ascender);
minDescender = Mathf.Min(minDescender, currentCharInfo.descender);
if (isBeginRegion == false && isCharacterVisible)
{
isBeginRegion = true;
bl = new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.descender, 0);
tl = new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.ascender, 0);
//Debug.Log("Start Word Region at [" + currentCharInfo.character + "]");
// If Word is one character
if (wInfo.characterCount == 1)
{
isBeginRegion = false;
br = new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0);
tr = new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0);
// Transform coordinates to be relative to transform and account min descender and max ascender.
bl = rectTransform.TransformPoint(new Vector3(bl.x, minDescender, 0));
tl = rectTransform.TransformPoint(new Vector3(tl.x, maxAscender, 0));
tr = rectTransform.TransformPoint(new Vector3(tr.x, maxAscender, 0));
br = rectTransform.TransformPoint(new Vector3(br.x, minDescender, 0));
// Check for Intersection
if (PointIntersectRectangle(position, bl, tl, tr, br))
return i;
//Debug.Log("End Word Region at [" + currentCharInfo.character + "]");
}
}
// Last Character of Word
if (isBeginRegion && j == wInfo.characterCount - 1)
{
isBeginRegion = false;
br = new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0);
tr = new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0);
// Transform coordinates to be relative to transform and account min descender and max ascender.
bl = rectTransform.TransformPoint(new Vector3(bl.x, minDescender, 0));
tl = rectTransform.TransformPoint(new Vector3(tl.x, maxAscender, 0));
tr = rectTransform.TransformPoint(new Vector3(tr.x, maxAscender, 0));
br = rectTransform.TransformPoint(new Vector3(br.x, minDescender, 0));
// Check for Intersection
if (PointIntersectRectangle(position, bl, tl, tr, br))
return i;
//Debug.Log("End Word Region at [" + currentCharInfo.character + "]");
}
// If Word is split on more than one line.
else if (isBeginRegion && currentLine != text.textInfo.characterInfo[characterIndex + 1].lineNumber)
{
isBeginRegion = false;
br = new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0);
tr = new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0);
// Transform coordinates to be relative to transform and account min descender and max ascender.
bl = rectTransform.TransformPoint(new Vector3(bl.x, minDescender, 0));
tl = rectTransform.TransformPoint(new Vector3(tl.x, maxAscender, 0));
tr = rectTransform.TransformPoint(new Vector3(tr.x, maxAscender, 0));
br = rectTransform.TransformPoint(new Vector3(br.x, minDescender, 0));
maxAscender = -Mathf.Infinity;
minDescender = Mathf.Infinity;
// Check for Intersection
if (PointIntersectRectangle(position, bl, tl, tr, br))
return i;
//Debug.Log("End Word Region at [" + currentCharInfo.character + "]");
}
}
//Debug.Log("Word at Index: " + i + " is located at (" + bl + ", " + tl + ", " + tr + ", " + br + ").");
}
return -1;
}
19
View Source File : TMP_TextUtilities.cs
License : GNU Lesser General Public License v3.0
Project Creator : disruptorbeam
License : GNU Lesser General Public License v3.0
Project Creator : disruptorbeam
public static int FindNearestCharacterOnLine(TMP_Text text, Vector3 position, int line, Camera camera, bool visibleOnly)
{
RectTransform rectTransform = text.rectTransform;
// Convert position into Worldspace coordinates
ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);
int firstCharacter = text.textInfo.lineInfo[line].firstCharacterIndex;
int lastCharacter = text.textInfo.lineInfo[line].lastCharacterIndex;
float distanceSqr = Mathf.Infinity;
int closest = lastCharacter;
for (int i = firstCharacter; i < lastCharacter; i++)
{
// Get current character info.
TMP_CharacterInfo cInfo = text.textInfo.characterInfo[i];
if (visibleOnly && !cInfo.isVisible) continue;
// Get Bottom Left and Top Right position of the current character
Vector3 bl = rectTransform.TransformPoint(cInfo.bottomLeft);
Vector3 tl = rectTransform.TransformPoint(new Vector3(cInfo.bottomLeft.x, cInfo.topRight.y, 0));
Vector3 tr = rectTransform.TransformPoint(cInfo.topRight);
Vector3 br = rectTransform.TransformPoint(new Vector3(cInfo.topRight.x, cInfo.bottomLeft.y, 0));
if (PointIntersectRectangle(position, bl, tl, tr, br))
{
closest = i;
break;
}
// Find the closest corner to position.
float dbl = DistanceToLine(bl, tl, position);
float dtl = DistanceToLine(tl, tr, position);
float dtr = DistanceToLine(tr, br, position);
float dbr = DistanceToLine(br, bl, position);
float d = dbl < dtl ? dbl : dtl;
d = d < dtr ? d : dtr;
d = d < dbr ? d : dbr;
if (distanceSqr > d)
{
distanceSqr = d;
closest = i;
}
}
return closest;
}
19
View Source File : TMP_TextUtilities.cs
License : GNU Lesser General Public License v3.0
Project Creator : disruptorbeam
License : GNU Lesser General Public License v3.0
Project Creator : disruptorbeam
public static int FindNearestWord(TMP_Text text, Vector3 position, Camera camera)
{
RectTransform rectTransform = text.rectTransform;
float distanceSqr = Mathf.Infinity;
int closest = 0;
// Convert position into Worldspace coordinates
ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);
for (int i = 0; i < text.textInfo.wordCount; i++)
{
TMP_WordInfo wInfo = text.textInfo.wordInfo[i];
bool isBeginRegion = false;
Vector3 bl = Vector3.zero;
Vector3 tl = Vector3.zero;
Vector3 br = Vector3.zero;
Vector3 tr = Vector3.zero;
// Iterate through each character of the word
for (int j = 0; j < wInfo.characterCount; j++)
{
int characterIndex = wInfo.firstCharacterIndex + j;
TMP_CharacterInfo currentCharInfo = text.textInfo.characterInfo[characterIndex];
int currentLine = currentCharInfo.lineNumber;
bool isCharacterVisible = currentCharInfo.isVisible;
if (isBeginRegion == false && isCharacterVisible)
{
isBeginRegion = true;
bl = rectTransform.TransformPoint(new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.descender, 0));
tl = rectTransform.TransformPoint(new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.ascender, 0));
//Debug.Log("Start Word Region at [" + currentCharInfo.character + "]");
// If Word is one character
if (wInfo.characterCount == 1)
{
isBeginRegion = false;
br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));
tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));
// Check for Intersection
if (PointIntersectRectangle(position, bl, tl, tr, br))
return i;
// Find the closest line segment to position.
float dbl = DistanceToLine(bl, tl, position);
float dtl = DistanceToLine(tl, tr, position);
float dtr = DistanceToLine(tr, br, position);
float dbr = DistanceToLine(br, bl, position);
float d = dbl < dtl ? dbl : dtl;
d = d < dtr ? d : dtr;
d = d < dbr ? d : dbr;
if (distanceSqr > d)
{
distanceSqr = d;
closest = i;
}
}
}
// Last Character of Word
if (isBeginRegion && j == wInfo.characterCount - 1)
{
isBeginRegion = false;
br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));
tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));
// Check for Intersection
if (PointIntersectRectangle(position, bl, tl, tr, br))
return i;
// Find the closest line segment to position.
float dbl = DistanceToLine(bl, tl, position);
float dtl = DistanceToLine(tl, tr, position);
float dtr = DistanceToLine(tr, br, position);
float dbr = DistanceToLine(br, bl, position);
float d = dbl < dtl ? dbl : dtl;
d = d < dtr ? d : dtr;
d = d < dbr ? d : dbr;
if (distanceSqr > d)
{
distanceSqr = d;
closest = i;
}
}
// If Word is split on more than one line.
else if (isBeginRegion && currentLine != text.textInfo.characterInfo[characterIndex + 1].lineNumber)
{
isBeginRegion = false;
br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));
tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));
// Check for Intersection
if (PointIntersectRectangle(position, bl, tl, tr, br))
return i;
// Find the closest line segment to position.
float dbl = DistanceToLine(bl, tl, position);
float dtl = DistanceToLine(tl, tr, position);
float dtr = DistanceToLine(tr, br, position);
float dbr = DistanceToLine(br, bl, position);
float d = dbl < dtl ? dbl : dtl;
d = d < dtr ? d : dtr;
d = d < dbr ? d : dbr;
if (distanceSqr > d)
{
distanceSqr = d;
closest = i;
}
}
}
//Debug.Log("Word at Index: " + i + " is located at (" + bl + ", " + tl + ", " + tr + ", " + br + ").");
}
return closest;
}
19
View Source File : TMP_TextUtilities.cs
License : GNU Lesser General Public License v3.0
Project Creator : disruptorbeam
License : GNU Lesser General Public License v3.0
Project Creator : disruptorbeam
public static int FindIntersectingLine(TMP_Text text, Vector3 position, Camera camera)
{
RectTransform rectTransform = text.rectTransform;
int closest = -1;
// Convert position into Worldspace coordinates
ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);
for (int i = 0; i < text.textInfo.lineCount; i++)
{
TMP_LineInfo lineInfo = text.textInfo.lineInfo[i];
float ascender = rectTransform.TransformPoint(new Vector3(0, lineInfo.ascender, 0)).y;
float descender = rectTransform.TransformPoint(new Vector3(0, lineInfo.descender, 0)).y;
if (ascender > position.y && descender < position.y)
{
//Debug.Log("Position is on line " + i);
return i;
}
}
//Debug.Log("Closest line to position is " + closest);
return closest;
}
19
View Source File : TMP_TextUtilities.cs
License : GNU Lesser General Public License v3.0
Project Creator : disruptorbeam
License : GNU Lesser General Public License v3.0
Project Creator : disruptorbeam
public static bool IsIntersectingRectTransform(RectTransform rectTransform, Vector3 position, Camera camera)
{
// Convert position into Worldspace coordinates
ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);
rectTransform.GetWorldCorners(m_rectWorldCorners);
if (PointIntersectRectangle(position, m_rectWorldCorners[0], m_rectWorldCorners[1], m_rectWorldCorners[2], m_rectWorldCorners[3]))
{
return true;
}
return false;
}
19
View Source File : TMP_TextUtilities.cs
License : GNU Lesser General Public License v3.0
Project Creator : disruptorbeam
License : GNU Lesser General Public License v3.0
Project Creator : disruptorbeam
public static int FindIntersectingCharacter(TMP_Text text, Vector3 position, Camera camera, bool visibleOnly)
{
RectTransform rectTransform = text.rectTransform;
// Convert position into Worldspace coordinates
ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);
for (int i = 0; i < text.textInfo.characterCount; i++)
{
// Get current character info.
TMP_CharacterInfo cInfo = text.textInfo.characterInfo[i];
if (visibleOnly && !cInfo.isVisible) continue;
// Get Bottom Left and Top Right position of the current character
Vector3 bl = rectTransform.TransformPoint(cInfo.bottomLeft);
Vector3 tl = rectTransform.TransformPoint(new Vector3(cInfo.bottomLeft.x, cInfo.topRight.y, 0));
Vector3 tr = rectTransform.TransformPoint(cInfo.topRight);
Vector3 br = rectTransform.TransformPoint(new Vector3(cInfo.topRight.x, cInfo.bottomLeft.y, 0));
if (PointIntersectRectangle(position, bl, tl, tr, br))
return i;
}
return -1;
}
19
View Source File : TMP_TextUtilities.cs
License : GNU Lesser General Public License v3.0
Project Creator : disruptorbeam
License : GNU Lesser General Public License v3.0
Project Creator : disruptorbeam
public static int FindNearestCharacter(TMP_Text text, Vector3 position, Camera camera, bool visibleOnly)
{
RectTransform rectTransform = text.rectTransform;
float distanceSqr = Mathf.Infinity;
int closest = 0;
// Convert position into Worldspace coordinates
ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);
for (int i = 0; i < text.textInfo.characterCount; i++)
{
// Get current character info.
TMP_CharacterInfo cInfo = text.textInfo.characterInfo[i];
if (visibleOnly && !cInfo.isVisible) continue;
// Get Bottom Left and Top Right position of the current character
Vector3 bl = rectTransform.TransformPoint(cInfo.bottomLeft);
Vector3 tl = rectTransform.TransformPoint(new Vector3(cInfo.bottomLeft.x, cInfo.topRight.y, 0));
Vector3 tr = rectTransform.TransformPoint(cInfo.topRight);
Vector3 br = rectTransform.TransformPoint(new Vector3(cInfo.topRight.x, cInfo.bottomLeft.y, 0));
if (PointIntersectRectangle(position, bl, tl, tr, br))
return i;
// Find the closest corner to position.
float dbl = DistanceToLine(bl, tl, position);
float dtl = DistanceToLine(tl, tr, position);
float dtr = DistanceToLine(tr, br, position);
float dbr = DistanceToLine(br, bl, position);
float d = dbl < dtl ? dbl : dtl;
d = d < dtr ? d : dtr;
d = d < dbr ? d : dbr;
if (distanceSqr > d)
{
distanceSqr = d;
closest = i;
}
}
return closest;
}
19
View Source File : TMP_TextUtilities.cs
License : GNU Lesser General Public License v3.0
Project Creator : disruptorbeam
License : GNU Lesser General Public License v3.0
Project Creator : disruptorbeam
public static int FindNearestLink(TMP_Text text, Vector3 position, Camera camera)
{
RectTransform rectTransform = text.rectTransform;
// Convert position into Worldspace coordinates
ScreenPointToWorldPointInRectangle(rectTransform, position, camera, out position);
float distanceSqr = Mathf.Infinity;
int closest = 0;
for (int i = 0; i < text.textInfo.linkCount; i++)
{
TMP_LinkInfo linkInfo = text.textInfo.linkInfo[i];
bool isBeginRegion = false;
Vector3 bl = Vector3.zero;
Vector3 tl = Vector3.zero;
Vector3 br = Vector3.zero;
Vector3 tr = Vector3.zero;
// Iterate through each character of the link
for (int j = 0; j < linkInfo.linkTextLength; j++)
{
int characterIndex = linkInfo.linkTextfirstCharacterIndex + j;
TMP_CharacterInfo currentCharInfo = text.textInfo.characterInfo[characterIndex];
int currentLine = currentCharInfo.lineNumber;
// Check if Link characters are on the current page
if (text.overflowMode == TextOverflowModes.Page && currentCharInfo.pageNumber + 1 != text.pageToDisplay) continue;
if (isBeginRegion == false)
{
isBeginRegion = true;
//Debug.Log("Start Word Region at [" + currentCharInfo.character + "]");
bl = rectTransform.TransformPoint(new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.descender, 0));
tl = rectTransform.TransformPoint(new Vector3(currentCharInfo.bottomLeft.x, currentCharInfo.ascender, 0));
// If Link is one character
if (linkInfo.linkTextLength == 1)
{
isBeginRegion = false;
br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));
tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));
// Check for Intersection
if (PointIntersectRectangle(position, bl, tl, tr, br))
return i;
// Find the closest line segment to position.
float dbl = DistanceToLine(bl, tl, position);
float dtl = DistanceToLine(tl, tr, position);
float dtr = DistanceToLine(tr, br, position);
float dbr = DistanceToLine(br, bl, position);
float d = dbl < dtl ? dbl : dtl;
d = d < dtr ? d : dtr;
d = d < dbr ? d : dbr;
if (distanceSqr > d)
{
distanceSqr = d;
closest = i;
}
}
}
// Last Character of Word
if (isBeginRegion && j == linkInfo.linkTextLength - 1)
{
isBeginRegion = false;
br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));
tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));
// Check for Intersection
if (PointIntersectRectangle(position, bl, tl, tr, br))
return i;
// Find the closest line segment to position.
float dbl = DistanceToLine(bl, tl, position);
float dtl = DistanceToLine(tl, tr, position);
float dtr = DistanceToLine(tr, br, position);
float dbr = DistanceToLine(br, bl, position);
float d = dbl < dtl ? dbl : dtl;
d = d < dtr ? d : dtr;
d = d < dbr ? d : dbr;
if (distanceSqr > d)
{
distanceSqr = d;
closest = i;
}
}
// If Link is split on more than one line.
else if (isBeginRegion && currentLine != text.textInfo.characterInfo[characterIndex + 1].lineNumber)
{
isBeginRegion = false;
br = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.descender, 0));
tr = rectTransform.TransformPoint(new Vector3(currentCharInfo.topRight.x, currentCharInfo.ascender, 0));
// Check for Intersection
if (PointIntersectRectangle(position, bl, tl, tr, br))
return i;
// Find the closest line segment to position.
float dbl = DistanceToLine(bl, tl, position);
float dtl = DistanceToLine(tl, tr, position);
float dtr = DistanceToLine(tr, br, position);
float dbr = DistanceToLine(br, bl, position);
float d = dbl < dtl ? dbl : dtl;
d = d < dtr ? d : dtr;
d = d < dbr ? d : dbr;
if (distanceSqr > d)
{
distanceSqr = d;
closest = i;
}
}
}
//Debug.Log("Word at Index: " + i + " is located at (" + bl + ", " + tl + ", " + tr + ", " + br + ").");
}
return closest;
}