blob: bfe8f5bb5ddd8a60b9fdf7016e6fb50e0703eb5e [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/ui/lib/escher/scene/directional_light.h"
#include <glm/gtc/epsilon.hpp>
#include "gtest/gtest.h"
namespace {
using namespace escher;
TEST(DirectionalLight, PolarAndVectorConstructorsMatch) {
constexpr float kDispersion = 1.f;
const vec3 kColor(1.f, 1.f, 1.f);
constexpr float kStepSize = 0.01f;
constexpr float kEpsilon = 0.00002f;
constexpr float kNearNorthPoleElevation = M_PI / 2 - 0.0002f;
constexpr float kNearSouthPoleElevation = -kNearNorthPoleElevation;
for (float azimuth = 0; azimuth < 2 * M_PI; azimuth += kStepSize) {
for (float elevation = -M_PI / 2; elevation <= M_PI / 2; elevation += kStepSize) {
DirectionalLight polar1(vec2(azimuth, elevation), kDispersion, kColor);
DirectionalLight euclid1(polar1.direction(), kDispersion, kColor);
DirectionalLight polar2(vec2(euclid1.polar_direction()), kDispersion, kColor);
DirectionalLight euclid2(polar2.direction(), kDispersion, kColor);
EXPECT_NEAR(0.f, glm::distance(polar1.direction(), euclid2.direction()), kEpsilon);
// Near the poles there are precision issues with atan2() that cause the
// azimuth to differ wildly; as long as the Euclidean direction vectors
// are close enough, we're happy.
if (elevation >= kNearSouthPoleElevation && elevation < kNearNorthPoleElevation) {
EXPECT_NEAR(0.f, glm::distance(polar1.polar_direction(), euclid2.polar_direction()),
kEpsilon);
}
}
}
}
} // namespace