Exemplo n.º 1
0
        protected override void OnUpdate()
        {
            Entities.ForEach((Entity entity, ref Text3D text3D, ref SetText3DCmd setTextCmd) =>
            {
                var text    = text3D.Text;
                var newText = setTextCmd.Text;

                EntityManager.RemoveComponent <SetText3DCmd>(entity);

                if (text.Equals(newText))
                {
                    return;
                }

                text3D.Text = newText;
                //textComp.IsNeedUpdate = true;
                if (EntityManager.HasComponent <UpdatedState>(entity))
                {
                    EntityManager.RemoveComponent <UpdatedState>(entity);
                }
            });

            Entities
            .WithNone <UpdatedState>()
            .ForEach((Entity entity, ref Text3D text3D) =>
            {
                if (!gameDataManagerSystem.GetGameData <Font3DData>(text3D.FontId, out var font3DData))
                {
                    return;
                }

                Font3DUtil.UpdateText3D(EntityManager, entity, font3DData);
                EntityManager.AddComponent <UpdatedState>(entity);
            });

            Entities
            .WithNone <Parent>()
            .ForEach((Entity entity, ref Char3D char3D) =>
            {
                EntityManager.DestroyEntity(entity);
            });
        }
Exemplo n.º 2
0
        public static bool UpdateText3D(EntityManager entityManager, Entity textEntity, Font3DData fontData)
        {
            var text3D   = entityManager.GetComponentData <Text3D>(textEntity);
            var text     = text3D.Text;
            var fontSize = text3D.FontSize;
            //var HAlignType = text3D.HAlignType;
            //var VAlignType = text3D.VAlignType;
            //var HSpacing = text3D.HSpacing;
            //var VSpacing = text3D.VSpacing;

            var buffer = entityManager.GetBuffer <Char3DElement>(textEntity);

            //remove all char elements
            foreach (var element in buffer)
            {
                if (element.CharEntity != Entity.Null)
                {
                    DestroyChar3DEntity(entityManager, element.CharEntity, element.Char);
                }
            }

            //add new char elements
            var len = text.LengthInBytes;

            if (len > 0)
            {
                var fontEntity            = fontData.Prefab;
                var font3D                = entityManager.GetComponentData <Font3D>(fontEntity);
                var fontCharElementBuffer = entityManager.GetBuffer <FontChar3DElement>(fontEntity);
                //var fontCharElementArray = fontCharElementBuffer.ToNativeArray(Allocator.Temp);
                var charWidth  = font3D.CharWidth;
                var charHeight = font3D.CharHeight;

                //var buf = new NativeArray<Char3DElement>(len, Allocator.Temp);
                //var aa = fontCharElementArray.ToArray();
                //var ll = fontCharElementBuffer.Length;
                //var aa = new FontChar3DElement[ll];
                for (int i = 0; i < Font3DData.CharNum; i++)
                {
                    fontChar3DElementBuf[i] = fontCharElementBuffer[i];
                }

                var buf = new NativeList <Char3DElement>(Allocator.Temp);
                Font3DUtil.ProcessText3D <FontChar3DElement>(text3D, fontChar3DElementBuf, charWidth, charHeight, (fontChar3D, x, y) =>
                {
                    var prefab   = fontChar3D.Prefab;
                    var textChar = fontChar3D.Char;

                    var charEntity = CreateChar3DEntity(entityManager, prefab, textChar);
                    entityManager.AddComponentData(charEntity, new Char3D {
                        Char = textChar
                    });
                    entityManager.SetOrAddComponentData(charEntity, new NonUniformScale {
                        Value = new float3(fontSize)
                    });
                    EntityUtil.SetParent(entityManager, charEntity, textEntity);

                    //var charEntity = CreateCharEntity(entityManager, textEntity, textChar);

                    buf.Add(new Char3DElement {
                        Char = textChar, CharEntity = charEntity
                    });

                    var pos   = entityManager.GetComponentData <Translation>(charEntity);
                    pos.Value = new float3(x, y, 0f);
                    entityManager.SetComponentData(charEntity, pos);
                });

                buffer = entityManager.GetBuffer <Char3DElement>(textEntity);
                buffer.Clear();
                buffer.AddRange(buf.AsArray());

                buf.Dispose();

                //fontCharElementArray.Dispose();

                //unsafe
                //{
                //    byte* b = &text.buffer.byte0000;

                //    //calculate x, y
                //    var minX = 0f;
                //    var minY = 0f;
                //    var textWidth = 0f;// = len * charWidth;
                //    var textHeight = charHeight;

                //    for (int i = 0; i < len; i++)
                //    {
                //        var textChar = (char)b[i];

                //        if (i > 0)
                //            textWidth += HSpacing;

                //        var charCode = (int)textChar;
                //        var index = charCode - Font3DData.MinCharCode;
                //        if (index < 0 || index >= Font3DData.CharNum)
                //        {
                //            textWidth += charWidth;
                //            continue;
                //        }

                //        var fontCharElement = fontCharElementArray[index];
                //        var prefab = fontCharElement.Prefab;
                //        if (prefab == Entity.Null)
                //        {
                //            textWidth += charWidth;
                //            continue;
                //        }

                //        textWidth += fontCharElement.Size.x;
                //    }

                //    if (HAlignType == EHAlignType.Middle)
                //    {
                //        minX = -(textWidth) * 0.5f;
                //    }
                //    else if (HAlignType == EHAlignType.Right)
                //    {
                //        minX = -(textWidth);
                //    }
                //    if (VAlignType == EVAlignType.Middle)
                //    {
                //        minY = -(textHeight) * 0.5f;
                //    }
                //    else if (VAlignType == EVAlignType.Top)
                //    {
                //        minY = -(textHeight);
                //    }

                //    var buf = new NativeArray<Char3DElement>(len, Allocator.Temp);
                //    float textOffsetX = 0f;
                //    for (int i = 0; i < len; i++)
                //    {
                //        var textChar = (char)b[i];
                //        //if (!IsSupportLowerCase)
                //        //{
                //        //    if (cc >= 97 && cc <= 122)
                //        //        cc = (char)(cc - 32);
                //        //}

                //        if (i > 0)
                //            textOffsetX += HSpacing;

                //        var charCode = (int)textChar;
                //        var index = charCode - Font3DData.MinCharCode;
                //        if (index < 0 || index >= Font3DData.CharNum)
                //        {
                //            textOffsetX += charWidth;
                //            continue;
                //        }

                //        var fontCharElement = fontCharElementArray[index];
                //        var prefab = fontCharElement.Prefab;
                //        if (prefab == Entity.Null)
                //        {
                //            textOffsetX += charWidth;
                //            continue;
                //        }

                //        var charEntity = CreateChar3DEntity(entityManager, prefab, textChar);
                //        entityManager.AddComponentData(charEntity, new Char3D { Char = textChar });
                //        EntityUtil.SetParent(entityManager, charEntity, textEntity);

                //        //var charEntity = CreateCharEntity(entityManager, textEntity, textChar);
                //        buf[i] = (new Char3DElement { Char = textChar, CharEntity = charEntity });

                //        textOffsetX += fontCharElement.Size.x;

                //        var x = minX + textOffsetX + fontCharElement.Min.x;
                //        var y = minY;
                //        var pos = entityManager.GetComponentData<Translation>(charEntity);
                //        pos.Value = new float3(x, y, 0f);
                //        entityManager.SetComponentData(charEntity, pos);
                //    }

                //    buffer = entityManager.GetBuffer<Char3DElement>(textEntity);
                //    buffer.Clear();
                //    buffer.AddRange(buf);

                //    buf.Dispose();
                //}
            }

            return(true);
        }