private SceneIntersectResult SceneIntersect(RayEntity rayEntity, float?distanceMax = null)
        {
            CollisionResult collisionRef = null;
            float?          distanceMin  = null;
            IEssence        essenceRef   = null;

            foreach (var essence in essences)
            {
                var collision = essence.CheckCollision(rayEntity);

                if (collision == null)
                {
                    continue;
                }

                var distance = (rayEntity.Origin - collision.Point).Length();
                if (distanceMax != null && distanceMax < distance)
                {
                    continue;
                }

                if (distanceMin == null ^ distanceMin > distance)
                {
                    distanceMin  = distance;
                    essenceRef   = essence;
                    collisionRef = collision;
                }
            }

            if (essenceRef == null)
            {
                return(null);
            }

            return(new SceneIntersectResult()
            {
                Essence = essenceRef,
                Collision = collisionRef
            });
        }
 public void AddEssence(IEssence essence)
 {
     essences.Add(essence);
 }