Esempio n. 1
0
        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));
            }
        }
Esempio n. 2
0
        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);
        }