public int Compare(LightNode x, LightNode y) { if (x.Priority < y.Priority) { return(-1); } if (x.Priority > y.Priority) { return(+1); } return(x.SortTag.CompareTo(y.SortTag)); }
private void AddNode(LightNode lightNode) { Debug.Assert(lightNode.ActualIsEnabled, "Scene query contains disabled nodes."); // Ignore light if the reference position is not in the clip geometry. if (lightNode.Clip != null && _referencePosition.HasValue) { bool haveContact = HaveContact(lightNode.Clip, _referencePosition.Value); if (lightNode.InvertClip == haveContact) { return; } } // ----- Sort by estimated light contribution. // All lights except IBL will be sorted by contribution. // Note: If we have no reference node, it still makes sense to sort the objects // by their contribution. We choose to get the light contribution at the position // of each light. Vector3 position = _referencePosition ?? lightNode.PoseWorld.Position; //lightNode.SortTag = lightNode.GetLightContribution(position, 0.7f); // Or simpler: Sort light nodes by distance. --> Use for image-based lights. // (We use distance², because it is faster.) //float distance = (position - lightNode.PoseWorld.Position).LengthSquared(); //lightNode.SortTag = -distance; // minus because we use descending sort. if (lightNode.Light is AmbientLight) { AmbientLights.Add(lightNode); lightNode.SortTag = lightNode.GetLightContribution(position, 0.7f); } else if (lightNode.Light is DirectionalLight) { DirectionalLights.Add(lightNode); lightNode.SortTag = lightNode.GetLightContribution(position, 0.7f); } else if (lightNode.Light is PointLight) { PointLights.Add(lightNode); lightNode.SortTag = lightNode.GetLightContribution(position, 0.7f); } else if (lightNode.Light is Spotlight) { Spotlights.Add(lightNode); lightNode.SortTag = lightNode.GetLightContribution(position, 0.7f); } else if (lightNode.Light is ProjectorLight) { ProjectorLights.Add(lightNode); lightNode.SortTag = lightNode.GetLightContribution(position, 0.7f); } else if (lightNode.Light is ImageBasedLight) { ImageBasedLights.Add(lightNode); float distance = (position - lightNode.PoseWorld.Position).LengthSquared(); lightNode.SortTag = -distance; // minus because we use descending sort. } else { OtherLights.Add(lightNode); lightNode.SortTag = lightNode.GetLightContribution(position, 0.7f); } }