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