AcTools.Render.Kn5SpecificDeferred.Kn5ObjectRenderer.DeferredCarLight.CreateLights C# (CSharp) Method

CreateLights() private method

private CreateLights ( ) : PointLight[]
return PointLight[]
            private PointLight[] CreateLights() {
                if (Node?.BoundingBox.HasValue != true) return null;

                var inv = Matrix.Invert(Matrix.Transpose(Node.ParentMatrix));
                var vertices = Node.Vertices.Select(x => new {
                    Position = Vector3.Transform(x.Position, Node.ParentMatrix).GetXyz(),
                    Normal = Vector3.Transform(x.Normal, inv).GetXyz()
                }).ToArray();
                var list = new List<InnerPair>();

                var threshold = 0.25f;
                foreach (var v in vertices) {
                    var min = float.MaxValue;
                    InnerPair minPair = null;
                    foreach (var t in list) {
                        var p = t;
                        var d = (v.Position - t.Position).LengthSquared();
                        if (d > min || d > threshold) continue;
                        min = d;
                        minPair = p;
                    }

                    if (minPair == null) {
                        list.Add(new InnerPair { Position = v.Position, Normal = v.Normal, Count = 1 });
                    } else {
                        minPair.Position = (minPair.Position * minPair.Count + v.Position) / (1f + minPair.Count);
                        minPair.Normal = (minPair.Normal * minPair.Count + v.Normal) / (1f + minPair.Count);
                        minPair.Count++;
                    }
                }

                for (var i = 1; i < list.Count; i++) {
                    var v = list[i];
                    for (var j = 0; j < i; j++) {
                        var t = list[j];
                        var d = (v.Position - t.Position).LengthSquared();
                        if (d <= threshold) {
                            v.Position = (v.Position * v.Count + t.Position * t.Count) / (v.Count + t.Count);
                            v.Normal = (v.Normal * v.Count + t.Normal * t.Count) / (v.Count + t.Count);
                            v.Count += t.Count;
                            list.Remove(v);
                            list.Remove(t);

                            i = 0;
                            break;
                        }
                    }
                }

                var emissive = Emissive;
                var limit = Type == CarLightType.Headlight ? 120f : 90f;
                if (emissive.GetBrightness() > limit) {
                    emissive *= limit / emissive.GetBrightness();
                }

                return list.Select(x => new PointLight {
                    Position = x.Position + x.Normal * (0.15f + emissive.GetBrightness() * (Type == CarLightType.Headlight ? 0.007f : 0.003f)),
                    Radius = 1.6f,
                    Specular = false,
                    Color = emissive / 500f
                }).ToArray();
            }
Kn5ObjectRenderer.DeferredCarLight