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