public unsafe static void GetDemandedLODs(ViewportRenderingContext context, Component_Mesh mesh, float cameraDistanceMinSquared, float cameraDistanceMaxSquared, out LodState lodState) { //var cameraDistanceMinSquared2 = cameraDistanceMinSquared; //var cameraDistanceMaxSquared2 = cameraDistanceMaxSquared; ////!!!!fix for shadows. в случае простых билбордов тень рисуется дальше объекта другого лода, резко пропадает //cameraDistanceRangeSquared2.Maximum *= 1.1f; lodState = new LodState(); var lods = mesh.Result.MeshData.LODs; if (lods != null) { RangeF GetLodRange(int lodIndex) { if (lodIndex == 0) { return(new RangeF(0, lods[0].Distance)); } else { var arrayIndex = lodIndex - 1; var lod = lods[arrayIndex]; float far; if (arrayIndex + 1 < lods.Length) { far = lods[arrayIndex + 1].Distance; } else { far = 1000000.0f; } return(new RangeF(lod.Distance, far)); } } var lodCount = lods.Length + 1; var pipeline = context.renderingPipeline; var contextLodRange = pipeline.LODRange.Value; var contextLodScale = (float)pipeline.LODScale.Value; var lodStart = contextLodRange.Minimum; var lodEnd = Math.Min(lodCount - 1, contextLodRange.Maximum); if (lodStart > lodEnd) { lodStart = lodEnd; } for (int lodIndex = lodStart; lodIndex <= lodEnd; lodIndex++) { var lodRange = GetLodRange(lodIndex) * contextLodScale; if (lodIndex == lodStart) { lodRange.Minimum = 0; } if (lodIndex == lodEnd) { lodRange.Maximum = 1000000; } var min = lodRange.Minimum * 0.9f; var minSquared = min * min; var max = lodRange.Maximum; var maxSquared = max * max; //early exit if (minSquared > cameraDistanceMaxSquared) { break; } if (cameraDistanceMaxSquared >= minSquared && cameraDistanceMinSquared < maxSquared) { lodState.Add(lodIndex, lodRange); } } if (lodState.Count == 0) { lodState.Add(lodEnd, new RangeF(0, 1000000)); } lodState.FixMinMax(); } else { lodState.Add(0, new RangeF(0, 1000000)); } }
public void Lod_state_check(int hour, int minute, LodState correctState) { var dt = new DateTime(2020, 12, 03, hour, minute, 0, DateTimeKind.Local); LodModule.GetLodState(dt).ShouldBe(correctState); }