protected override void OnUpdate()
    {
        Entities.ForEach((LODGroup lodGroup) =>
        {
            if (lodGroup.lodCount > 8)
            {
                Debug.LogWarning("LODGroup has more than 8 LOD - Not supported", lodGroup);
                return;
            }

            var lodGroupEntity = GetPrimaryEntity(lodGroup);

            var lodGroupData = new MeshLODGroupComponent();
            //@TODO: LOD calculation should respect scale...
            var worldSpaceSize = LODGroupExtensions.GetWorldSpaceSize(lodGroup);
            lodGroupData.LocalReferencePoint = lodGroup.localReferencePoint;

            var lodDistances0 = new float4(float.PositiveInfinity);
            var lodDistances1 = new float4(float.PositiveInfinity);
            var lodGroupLODs  = lodGroup.GetLODs();
            for (int i = 0; i < lodGroup.lodCount; ++i)
            {
                float d = worldSpaceSize / lodGroupLODs[i].screenRelativeTransitionHeight;
                if (i < 4)
                {
                    lodDistances0[i] = d;
                }
                else
                {
                    lodDistances1[i - 4] = d;
                }
            }

            lodGroupData.LODDistances0 = lodDistances0;
            lodGroupData.LODDistances1 = lodDistances1;

            DstEntityManager.AddComponentData(lodGroupEntity, lodGroupData);

            for (int i = 0; i < lodGroupLODs.Length; ++i)
            {
                foreach (var renderer in lodGroupLODs[i].renderers)
                {
                    if (renderer == null)
                    {
                        Debug.LogWarning("Missing renderer in LOD Group", lodGroup);
                        continue;
                    }

                    DeclareDependency(renderer, lodGroup);
                    DeclareDependency(lodGroup, renderer);

                    foreach (var rendererEntity in GetEntities(renderer))
                    {
                        if (DstEntityManager.HasComponent <RenderMesh>(rendererEntity))
                        {
                            var lodComponent = new MeshLODComponent {
                                Group = lodGroupEntity, LODMask = 1 << i
                            };
                            if (!DstEntityManager.HasComponent <MeshLODComponent>(rendererEntity))
                            {
                                DstEntityManager.AddComponentData(rendererEntity, lodComponent);
                            }
                            else
                            {
                                var previousLODComponent = DstEntityManager.GetComponentData <MeshLODComponent>(rendererEntity);
                                if (previousLODComponent.Group != lodComponent.Group)
                                {
                                    Debug.LogWarning("A renderer can not be in multiple different LODGroup.", renderer);
                                    continue;
                                }

                                if ((previousLODComponent.LODMask & (1 << (i - 1))) == 0)
                                {
                                    Debug.LogWarning("A renderer that is present in the same LODGroup multiple times must be in consecutive LOD levels.", renderer);
                                }

                                lodComponent.LODMask |= previousLODComponent.LODMask;
                                DstEntityManager.SetComponentData(rendererEntity, lodComponent);
                            }
                        }
                    }
                }
            }
        });
    }
        protected override void OnUpdate()
        {
            float dt = UnityEngine.Time.deltaTime;

            UnityEngine.Camera           camera   = UnityEngine.Camera.main;
            LODGroupExtensions.LODParams lodPrams = default;
            if (camera)
            {
                lodPrams = Unity.Rendering.LODGroupExtensions.CalculateLODParams(camera);
            }

            ComponentDataFromEntity <AnimationData> animationData   = GetComponentDataFromEntity <AnimationData>(true);
            ComponentDataFromEntity <Translation>   translationData = GetComponentDataFromEntity <Translation>(true);
            ComponentDataFromEntity <Rotation>      rotationData    = GetComponentDataFromEntity <Rotation>(true);

            //ComponentDataFromEntity<Scale> scaleData = GetComponentDataFromEntity<Scale>(true);

            Entities
            .WithName("ECS_AnimatorEntityFrameDataCalcSystem")
            .WithBurst(Unity.Burst.FloatMode.Default, Unity.Burst.FloatPrecision.Standard)
            .WithStoreEntityQueryInField(ref m_calcAnimatorFrameDataGroup)
            .ForEach((ref LocalToWorld location, ref AnimationData animData, ref MeshLODGroupComponent lodGrpup, in Translation translation) =>
            {
                var lodIndex        = LODGroupExtensions.CalculateCurrentLODIndex(lodGrpup.LODDistances0, translation.Value, ref lodPrams);
                animData.ActivedLOD = lodIndex + 1;

                int frameCount = animData.AnimationFrameCountArr.Value.ArrayData[animData.AnimationIndex];

                animData.StartTime += dt;
                float normalizeTime = animData.CalcNormalizeTime(frameCount, animData.StartTime);
                animData.CurFrame   = (int)(normalizeTime * frameCount);
            }).ScheduleParallel();



            Entities
            .WithName("ECS_AnimatorEntityAttachRenderingSystem")
            .WithBurst(Unity.Burst.FloatMode.Default, Unity.Burst.FloatPrecision.Standard)
            .WithStoreEntityQueryInField(ref m_finalGroup)
            .WithReadOnly(animationData)
            .WithReadOnly(translationData)
            .WithReadOnly(rotationData)
            //.WithReadOnly(scaleData)
            .ForEach((Entity entity, int entityInQueryIndex, ref LocalToWorld location, ref ECS_FrameDataMaterialPropertyComponent frameDataMaterialProerty, in ECS_SkinnedMatrixAnimatorAttach attach, in MeshLODComponent lod) =>
            {
                AnimationData animData = animationData[attach.Parent];

                //未激活的LOD attach return
                if ((lod.LODMask & animData.ActivedLOD) == 0)
                {
                    return;
                }

                int frameInPixelOffset = animData.AnimationFrameOffsetArr.Value.ArrayData[(attach.AttachIndex * animData.AnimCount) + animData.AnimationIndex];
                int smrOffset          = animData.AttachSmrCountArr.Value.ArrayData[attach.AttachIndex];
                float3 texData         = texData = animData.AttachTexDataArr.Value.ArrayData[attach.AttachIndex];

                int frameOffset     = frameInPixelOffset + animData.CurFrame * smrOffset * 2;
                float4 perFrameData = new float4(texData.x, texData.y, frameOffset, texData.z);

                Translation animatorTranslateData = translationData[attach.Parent];
                Rotation animatorRotationData     = rotationData[attach.Parent];
                //Scale animatorScaleData = scaleData[attach.Parent];
                float3 position = animatorTranslateData.Value;

                float4x4 trs = float4x4.TRS(animatorTranslateData.Value, animatorRotationData.Value, new float3(1, 1, 1));

                frameDataMaterialProerty.Value = perFrameData;

                location.Value = trs;
            }).ScheduleParallel();
    protected override void OnUpdate()
    {
        ForEach((LODGroup lodGroup) =>
        {
            if (lodGroup.lodCount > 8)
            {
                Debug.LogWarning("LODGroup has more than 8 LOD - Not supported", lodGroup);
                return;
            }

            var lodGroupEntity = GetPrimaryEntity(lodGroup);

            var lodGroupData = new MeshLODGroupComponent();
            //@TODO: LOD calculation should respect scale...
            var worldSpaceSize = LODGroupExtensions.GetWorldSpaceSize(lodGroup);
            lodGroupData.LocalReferencePoint = lodGroup.localReferencePoint;

            var lodDistances0 = new float4(float.PositiveInfinity);
            var lodDistances1 = new float4(float.PositiveInfinity);
            var lodGroupLODs  = lodGroup.GetLODs();
            for (int i = 0; i < lodGroup.lodCount; ++i)
            {
                float d = worldSpaceSize / lodGroupLODs[i].screenRelativeTransitionHeight;
                if (i < 4)
                {
                    lodDistances0[i] = d;
                }
                else
                {
                    lodDistances1[i - 4] = d;
                }
            }

            lodGroupData.LODDistances0 = lodDistances0;
            lodGroupData.LODDistances1 = lodDistances1;

            DstEntityManager.AddComponentData(lodGroupEntity, lodGroupData);

            for (int i = 0; i < lodGroupLODs.Length; ++i)
            {
                foreach (var renderer in lodGroupLODs[i].renderers)
                {
                    if (renderer == null)
                    {
                        Debug.LogWarning("Missing renderer in LOD Group", lodGroup);
                        continue;
                    }

                    foreach (var rendererEntity in GetEntities(renderer))
                    {
                        if (DstEntityManager.HasComponent <RenderMesh>(rendererEntity))
                        {
                            var lodComponent = new MeshLODComponent {
                                Group = lodGroupEntity, LODMask = 1 << i
                            };
                            DstEntityManager.AddComponentData(rendererEntity, lodComponent);
                        }
                    }
                }
            }
        });
    }