public int DoStep(ref TextCotext context, EmojiEvent uievent) { if (uievent == EmojiEvent.LateUpdate) { context.Settings = context.Owner.Settings; if (context.Settings.AnimationSpeed < 1) { context.Settings.AnimationSpeed = 30; } if (_last.HasValue) { if (_last.Value.Equals(context.Settings) == false) { for (int i = 0; i < context.AllTexts.Count; i++) { if (context.AllTexts[i] == null) { continue; } context.AllTexts[i].SetVerticesDirty(); } _last = context.Settings; } } else { _last = context.Settings; } } return(0); }
public int DoStep(ref TextCotext context, EmojiEvent uievent) { if (uievent == EmojiEvent.LateUpdate) { for (int i = context.AllTexts.Count - 1; i >= 0; i--) { if (context.AllTexts[i] == null) { context.AllTexts.RemoveAt(i); context.Results.RemoveAt(i); } } for (int i = 0; i < context.FailedText.Count; i++) { int idx = context.AllTexts.IndexOf(context.FailedText[i]); if (idx != -1) { context.AllTexts.RemoveAt(idx); context.Results.RemoveAt(idx); } } } return(0); }
public int DoStep(ref TextCotext context, EmojiEvent uievent) { if (uievent == EmojiEvent.PreRender) { for (int i = 0; i < context.Results.Count; i++) { var result = context.Results[i]; var text = context.AllTexts[i]; if (text == null) { continue; } var hrefmesh = result.MeshGroup.HrefMeshReult; hrefmesh.Init(); for (int k = 0; k < result.MeshGroup.TextMeshResult.EmojiVerts.Count; k += 4) { int emojiindex = k / 4; int arrayindex; int emojitype = result.ParseGroup.GetIndexType(emojiindex, out arrayindex); if (emojitype == 2 && arrayindex >= 0 && arrayindex < result.ParseGroup.HrefResult.Count) { var hrefcolor = result.ParseGroup.HrefResult.GetHrefCols()[arrayindex]; var p2 = result.MeshGroup.TextMeshResult.EmojiVerts[k + 2]; var p3 = result.MeshGroup.TextMeshResult.EmojiVerts[k + 3]; var width = p2.x - p3.x; // var botmid = (p3 + p2) / 2; for (int m = 0; m < 4; m++) { var uivert = new EmojiUIVertex(); uivert.color = hrefcolor; uivert.normal = Vector3.back; uivert.tangent = new Vector4(1.0f, 0.0f, 0.0f, -1.0f); float wc = ((m & 2) >> 1) == (m & 1) ? -0.5f : 0.5f; float hc = (m & 2) == 0 ? -0.5f : 0.5f; var pos = botmid + new Vector3(wc * width, (hc * HrefLine * text.fontSize) / 10);//result.MeshGroup.TextMeshResult.EmojiVerts[k + m]; uivert.position = pos; hrefmesh.HrefVerts.Add(uivert); } } } result.MeshGroup.HrefMeshReult = hrefmesh; context.Results[i] = result; } } return(0); }
public int DoStep(ref TextCotext context, EmojiEvent uievent) { if (uievent == EmojiEvent.PreRender) { for (int i = 0; i < context.AllTexts.Count; i++) { InlineText text = context.AllTexts[i]; if (text == null) { continue; } if (!context.RebuildTexts.Contains(text)) { continue; } _cache.Clear(); TextElementResult result = context.Results[i]; //if (result.ParseGroup.emojitypeMap == null) // result.ParseGroup.emojitypeMap = new Dictionary<int, int>(); //else //result.ParseGroup.emojitypeMap.Clear(); int val = 0; for (int k = 0; k < result.ParseGroup.fillplacemap.Count; k++) { val += result.ParseGroup.fillplacemap[k]; _cache[k] = val; } //emoji FixPoints(result.ParseGroup.EmojiResult.GetEmojiPoints(), 1, ref result); //href FixPoints(result.ParseGroup.HrefResult.GetHrefPoints(), 2, ref result); context.Results[i] = result; } } return(0); }
public int DoStep(ref TextCotext context, EmojiEvent uievent) { if (uievent == EmojiEvent.PreRender) { int errcode = 0; for (int i = 0; i < context.AllTexts.Count; i++) { InlineText text = context.AllTexts[i]; if (text == null) { continue; } if (!context.RebuildTexts.Contains(text)) { continue; } TextElementResult result = context.Results[i]; result.MeshGroup.TextMeshResult.Init(); result.GizmosResult.Clear(); //text string currenttext = null; if (result.ParseGroup.TextResult.FormatElements != null && result.ParseGroup.TextResult.FormatElements.Count > 0) { currenttext = result.ParseGroup.TextResult.FormatString; } else { currenttext = text.text; } errcode = FillText(text, currenttext, ref context, ref result); context.Results[i] = result; } return(errcode); } return(0); }
public void DoUpdate(EmojiEvent uievent) { if (_systems != null) { for (int i = 0; i < _systems.Count; i++) { var sy = _systems[i]; if (sy is IEmojiStructSystem <TextCotext> ) { IEmojiStructSystem <TextCotext> essystem = sy as IEmojiStructSystem <TextCotext>; int code = essystem.DoStep(ref Context, uievent); if (code != 0) { #if UNITY_EDITOR Debug.LogErrorFormat("DoStep Code {0} in {1}", (EmojiErrorCode)code, essystem); #endif } } } } }
public int DoStep(ref TextCotext context, EmojiEvent uievent) { if (uievent == EmojiEvent.DrawGizmos) { #if UNITY_EDITOR if (context.AllTexts.Count > 0 && context.Results.Count > 0) { for (int i = 0; i < context.Results.Count; i++) { var gdata = context.Results[i].GizmosResult; if (i < context.AllTexts.Count) { context.AllTexts[i].DrawGizmos(ref gdata); } } } #endif } return(0); }
public int DoStep(ref TextCotext context, EmojiEvent uievent) { if (uievent == EmojiEvent.PreRender) { for (int i = 0; i < context.AllTexts.Count; i++) { var text = context.AllTexts[i]; if (text == null) { continue; } var result = context.Results[i]; var task = result.EmojiImgeTasks; task.NeedUpdate = context.RebuildTexts.Contains(text); result.EmojiImgeTasks = task; context.Results[i] = result; } //clear context.RebuildTexts.Clear(); } else if (uievent == EmojiEvent.LateUpdate) { for (int i = 0; i < context.AllTexts.Count; i++) { var text = context.AllTexts[i]; if (text == null) { continue; } var result = context.Results[i]; var task = result.EmojiImgeTasks; bool canrender = result.MeshGroup.CanRender(); if (canrender) { if (task.Images == null) { task.Images = new EmojiList <EmojiImage>(); } if (text.isActiveAndEnabled && task.NeedUpdate) { var list = ListPool <int> .Get(); for (int j = 0; j < task.Images.Count; j++) { if (j < list.Count) { list[j] = 1; } else { list.Add(1); } } for (int j = 0; j < result.MeshGroup.EmojiMeshResult.EmojiVerts.Count; j += 4) { var vert = result.MeshGroup.EmojiMeshResult.EmojiVerts[j]; var texture = vert.texture; if (texture != null) { int idx = GetRenderIndex(texture, ref task); if (idx >= 0) { EmojiImage emojimg = task.Images[idx]; emojimg.RenderEmoji(text, texture, ref result.MeshGroup); list[idx] = 0; } else { int freeidx = GetNullRenderIndex(texture, ref task); if (freeidx >= 0) { list[freeidx] = 0; EmojiImage emojimg = task.Images[freeidx]; emojimg.RenderEmoji(text, texture, ref result.MeshGroup); } else { EmojiImage emojimg = TextCotext.Pool.AddChild2Target(text.transform); emojimg.RenderEmoji(text, texture, ref result.MeshGroup); task.Images.Add(emojimg); } } } } for (int j = 0; j < list.Count; j++) { if (list[j] == 1) { task.Images[j].UnRenderEmoji(); } } ListPool <int> .Release(list); } else if (!text.isActiveAndEnabled) { for (int j = 0; j < task.Images.Count; j++) { task.Images[j].UnRenderEmoji(); } } task.NeedUpdate = false; } else if (task.Images != null && !canrender) { for (int j = task.Images.Count - 1; j >= 0; j--) { TextCotext.Pool.RemoveChildFromTarget(task.Images[j]); task.Images.RemoveAt(j); } } result.EmojiImgeTasks = task; context.Results[i] = result; } } return(0); }
public int DoStep(ref TextCotext context, EmojiEvent uievent) { if (uievent == EmojiEvent.PreRender) { int errcode = 0; for (int i = 0; i < context.RebuildTexts.Count; i++) { var text = context.RebuildTexts[i]; if (text == null) { continue; } int index = context.AllTexts.IndexOf(text); if (index == -1) { continue; } var result = context.Results[index]; if (result.ParseGroup.TextResult.FormatElements == null) { continue; } result.ParseGroup.HrefResult.Clear(); for (int m = 0; m < result.ParseGroup.TextResult.FormatElements.Count; m++) { string info = result.ParseGroup.TextResult.FormatElements[m]; int point = result.ParseGroup.TextResult.GetPoints()[m]; int len = 0; string tagKey = null; if (!ParseElement(text, info, ref context, out len, out tagKey)) { errcode = (int)EmojiErrorCode.ParseFailed; break; } if (len >= 0) { continue; } Color col; if (!ColorUtility.TryParseHtmlString(tagKey, out col)) { errcode = (int)EmojiErrorCode.ParseColFailed; break; } len = Mathf.Abs(len); //int left = result.ParseGroup.TextResult.FormatString.Length -1 -(point+ len); //if (left < len) //{ // len = Mathf.Max(0, left); //} result.ParseGroup.HrefResult.GetHrefCols().Add(col); result.ParseGroup.HrefResult.GetHrefPoints().Add(new EmojiIndex(m, point, len)); } context.Results[index] = result; } return(errcode); } return(0); }
public int DoStep(ref TextCotext context, EmojiEvent uievent) { if (uievent == EmojiEvent.PreRender) { for (int i = 0; i < context.Results.Count; i++) { var result = context.Results[i]; var emojimesh = result.MeshGroup.EmojiMeshResult; emojimesh.Init(); for (int k = 0; k < result.MeshGroup.TextMeshResult.EmojiVerts.Count; k += 4) { int emojiindex = k / 4; int arrayindex; int emojitype = result.ParseGroup.GetIndexType(emojiindex, out arrayindex); if (emojitype == 1 && arrayindex >= 0 && arrayindex < result.ParseGroup.EmojiResult.Count) { var group = result.ParseGroup.EmojiResult.GetGroups()[arrayindex]; emojimesh.FrameIndex.Add(0); emojimesh.RenderGroup.Add(group); var center = (result.MeshGroup.TextMeshResult.EmojiVerts[k] + result.MeshGroup.TextMeshResult.EmojiVerts[k + 1] + result.MeshGroup.TextMeshResult.EmojiVerts[k + 2] + result.MeshGroup.TextMeshResult.EmojiVerts[k + 3]) / 4; for (int m = 0; m < 4; m++) { var uivert = new EmojiUIVertex(); var sprite = group.spritegroups[0]; uivert.uv0 = sprite.uv[3 - m]; uivert.uv1 = sprite.uv[3 - m]; uivert.uv2 = sprite.uv[3 - m]; uivert.uv3 = sprite.uv[3 - m]; uivert.color = Color.white; uivert.normal = Vector3.back; uivert.tangent = new Vector4(1.0f, 0.0f, 0.0f, -1.0f); uivert.texture = sprite.sprite.texture; float wc = ((m & 2) >> 1) == (m & 1) ? -0.5f : 0.5f; float hc = (m & 2) == 0 ? -0.5f : 0.5f; float emojisize = result.ParseGroup.EmojiResult.GetEmojiSize()[arrayindex]; var position = center + new Vector3(wc * emojisize, hc * emojisize, 0); uivert.position = position; emojimesh.EmojiVerts.Add(uivert); } } } result.MeshGroup.EmojiMeshResult = emojimesh; context.Results[i] = result; } } return(0); }
public int DoStep(ref TextCotext context, EmojiEvent uievent) { return(0); }
public int DoStep(ref TextCotext context, EmojiEvent uievent) { if (uievent == EmojiEvent.PreRender) { int errcode = 0; foreach (var target in context.RebuildTexts) { if (target == null) { continue; } string text = target.text; if (text.Length > 16381) //65535/4-1 { errcode = (int)EmojiErrorCode.TooMuchChars; continue; } ParseTextResult result = new ParseTextResult(); int index = context.AllTexts.IndexOf(target); if (index != -1) { result = context.Results[index].ParseGroup.TextResult; result.Clear(); } if (_sb == null) { _sb = new StringBuilder(); } _sb.Capacity = text.Length; int textstart = -1; int start = 0; int flag = 0; for (int i = 0; i < text.Length; i++) { char subchar = text[i]; if (subchar == ParsetLeft) { if (flag == 0) { start = i; result.GetPoints().Add(_sb.Length); } flag++; } else if (subchar == ParsetRight) { flag--; if (flag == 0) { string substr = text.Substring(start, i - start + 1); result.GetElements().Add(substr); // textstart = -1; } } else if (flag == 0)//正常显示内容 { if (textstart < 0) { textstart = i; } _sb.Append(subchar); } } if (flag > 0) { string substr = text.Substring(start); _sb.Append(substr); } result.FormatString = _sb.ToString(); FillPart(target, result.FormatString, 0, result.FormatString.Length - 1, ref result); _sb.Length = 0; //assign if (index == -1) { TextElementResult elementresult = new TextElementResult(); elementresult.RenderId = target.GetHashCode(); elementresult.ParseGroup.TextResult = result; elementresult.ParseGroup.fillplacemap = new EmojiList <int>(64); context.AllTexts.Add(target); context.Results.Add(elementresult); } else { TextElementResult elementresult = context.Results[index]; elementresult.ParseGroup.TextResult = result; elementresult.ParseGroup.fillplacemap.Clear(); context.Results[index] = elementresult; } } return(errcode); } return(0); }
public int DoStep(ref TextCotext context, EmojiEvent uievent) { if (uievent == EmojiEvent.PreRender) { int errcode = 0; for (int i = 0; i < context.RebuildTexts.Count; i++) { var text = context.RebuildTexts[i]; if (text == null) { continue; } int index = context.AllTexts.IndexOf(text); if (index == -1) { continue; } var result = context.Results[index]; result.ParseGroup.EmojiResult.Clear(); if (result.ParseGroup.TextResult.FormatElements != null && result.ParseGroup.TextResult.FormatElements.Count > 0) { if (_sb == null) { _sb = new StringBuilder(result.ParseGroup.TextResult.FormatString); } else { _sb.Length = 0; _sb.Append(result.ParseGroup.TextResult.FormatString); } int addedcnt = 0; float linesize = 0; int emojistart = -1; int emojiidx = 0; if (emojiidx < result.ParseGroup.TextResult.GetPoints().Count) { emojistart = result.ParseGroup.TextResult.GetPoints()[emojiidx]; //不相等 刷新缓存 if (_lasttext != text) { Vector2 extents = text.rectTransform.rect.size; TextGenerationSettings settings = text.GetGenerationSettings(extents); text.cachedTextGenerator.Populate(DoublePlaceholder, settings); if (text.cachedTextGenerator.vertexCount < 8) { errcode = (int)EmojiErrorCode.VertTooLarge; break; } IList <UIVertex> spaceverts = text.cachedTextGenerator.verts; float spacewid = spaceverts[1].position.x - spaceverts[0].position.x; float spaceheight = spaceverts[0].position.y - spaceverts[3].position.y; _space = spaceverts[4].position.x - spaceverts[1].position.x; _placesize = new Vector2(spacewid, spaceheight); _lasttext = text; } } float textsize = text.rectTransform.rect.width; for (int charindex = 0; charindex < result.ParseGroup.TextResult.GetPartSize().Count; charindex++) { while (emojistart == charindex && InsertEmoji(text, ref result, ref emojiidx, ref context, ref linesize, ref emojistart, ref addedcnt)) { //fix line if (text.horizontalOverflow != HorizontalWrapMode.Overflow && linesize > textsize - _space - _placesize.x)//这个字符自动跳到下一行 { linesize = 0; } } if (emojistart < 0) { break; } float w = result.ParseGroup.TextResult.GetPartSize()[charindex]; linesize += w; //fix line if (text.horizontalOverflow != HorizontalWrapMode.Overflow && linesize > textsize - _space - _placesize.x)//这个字符自动跳到下一行 { linesize = 0; } } //fill last if (emojistart >= 0) { while (emojistart == result.ParseGroup.TextResult.GetPartSize().Count && InsertEmoji(text, ref result, ref emojiidx, ref context, ref linesize, ref emojistart, ref addedcnt)) { //fix line if (text.horizontalOverflow != HorizontalWrapMode.Overflow && linesize > textsize - _space - _placesize.x)//这个字符自动跳到下一行 { linesize = 0; } } } result.ParseGroup.TextResult.FormatString = _sb.ToString(); } //assign context.Results[index] = result; } _lasttext = null; return(errcode); } return(0); }