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); } } } } }); }