1 /*
2  * Copyright (C) 2018 Open Source Robotics Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16 */
17 
18 #include <gtest/gtest.h>
19 #include <ignition/math/Pose3.hh>
20 #include "sdf/Light.hh"
21 
22 /////////////////////////////////////////////////
TEST(DOMLight,DefaultConstruction)23 TEST(DOMLight, DefaultConstruction)
24 {
25   sdf::Light light;
26   EXPECT_EQ(nullptr, light.Element());
27   EXPECT_EQ(sdf::LightType::POINT, light.Type());
28   EXPECT_TRUE(light.Name().empty());
29 
30   light.SetName("test_light");
31   EXPECT_EQ("test_light", light.Name());
32 
33   EXPECT_EQ(ignition::math::Pose3d::Zero, light.Pose());
34   EXPECT_TRUE(light.PoseFrame().empty());
35 
36   light.SetPose({1, 2, 3, 0, 0, IGN_PI});
37   EXPECT_EQ(ignition::math::Pose3d(1, 2, 3, 0, 0, IGN_PI), light.Pose());
38 
39   light.SetPoseFrame("world");
40   EXPECT_EQ("world", light.PoseFrame());
41 
42   EXPECT_FALSE(light.CastShadows());
43   light.SetCastShadows(true);
44   EXPECT_TRUE(light.CastShadows());
45 
46   EXPECT_EQ(ignition::math::Color(0, 0, 0, 1), light.Diffuse());
47   light.SetDiffuse(ignition::math::Color(0.1f, 0.2f, 0.3f, 1.0));
48   EXPECT_EQ(ignition::math::Color(0.1f, 0.2f, 0.3f, 1), light.Diffuse());
49 
50   EXPECT_EQ(ignition::math::Color(0, 0, 0, 1), light.Specular());
51   light.SetSpecular(ignition::math::Color(0.4f, 0.6f, 0.7f, 1.0));
52   EXPECT_EQ(ignition::math::Color(0.4f, 0.6f, 0.7f, 1), light.Specular());
53 
54   EXPECT_DOUBLE_EQ(10.0, light.AttenuationRange());
55   light.SetAttenuationRange(1.2);
56   EXPECT_DOUBLE_EQ(1.2, light.AttenuationRange());
57 
58   EXPECT_DOUBLE_EQ(1.0, light.LinearAttenuationFactor());
59   light.SetLinearAttenuationFactor(0.2);
60   EXPECT_DOUBLE_EQ(0.2, light.LinearAttenuationFactor());
61 
62   EXPECT_DOUBLE_EQ(1.0, light.ConstantAttenuationFactor());
63   light.SetConstantAttenuationFactor(0.4);
64   EXPECT_DOUBLE_EQ(0.4, light.ConstantAttenuationFactor());
65 
66   EXPECT_DOUBLE_EQ(0.0, light.QuadraticAttenuationFactor());
67   light.SetQuadraticAttenuationFactor(1.1);
68   EXPECT_DOUBLE_EQ(1.1, light.QuadraticAttenuationFactor());
69 
70   EXPECT_EQ(ignition::math::Vector3d(0, 0, -1), light.Direction());
71   light.SetDirection({0.4, 0.2, 0});
72   EXPECT_EQ(ignition::math::Vector3d(0.4, 0.2, 0), light.Direction());
73 
74   EXPECT_EQ(ignition::math::Angle(0.0), light.SpotInnerAngle());
75   light.SetSpotInnerAngle(1.4);
76   EXPECT_EQ(ignition::math::Angle(1.4), light.SpotInnerAngle());
77 
78   EXPECT_EQ(ignition::math::Angle(0.0), light.SpotOuterAngle());
79   light.SetSpotOuterAngle(0.2);
80   EXPECT_EQ(ignition::math::Angle(0.2), light.SpotOuterAngle());
81 
82   EXPECT_DOUBLE_EQ(0.0, light.SpotFalloff());
83   light.SetSpotFalloff(4.3);
84   EXPECT_DOUBLE_EQ(4.3, light.SpotFalloff());
85 }
86 
87 /////////////////////////////////////////////////
TEST(DOMLight,CopyConstructor)88 TEST(DOMLight, CopyConstructor)
89 {
90   sdf::Light light;
91   light.SetName("test_copy_light");
92   light.SetType(sdf::LightType::DIRECTIONAL);
93   light.SetPose({3, 2, 1, 0, IGN_PI, 0});
94   light.SetPoseFrame("ground_plane");
95   light.SetCastShadows(true);
96   light.SetDiffuse(ignition::math::Color(0.4f, 0.5f, 0.6f, 1.0));
97   light.SetSpecular(ignition::math::Color(0.8f, 0.9f, 0.1f, 1.0));
98   light.SetAttenuationRange(3.2);
99   light.SetLinearAttenuationFactor(0.1);
100   light.SetConstantAttenuationFactor(0.5);
101   light.SetQuadraticAttenuationFactor(0.01);
102   light.SetDirection({0.1, 0.2, 1});
103   light.SetSpotInnerAngle(1.9);
104   light.SetSpotOuterAngle(3.3);
105   light.SetSpotFalloff(0.9);
106 
107   sdf::Light light2(light);
108   EXPECT_EQ("test_copy_light", light2.Name());
109   EXPECT_EQ(sdf::LightType::DIRECTIONAL, light2.Type());
110   EXPECT_EQ(ignition::math::Pose3d(3, 2, 1, 0, IGN_PI, 0), light2.Pose());
111   EXPECT_EQ("ground_plane", light2.PoseFrame());
112   EXPECT_TRUE(light2.CastShadows());
113   EXPECT_EQ(ignition::math::Color(0.4f, 0.5f, 0.6f, 1), light2.Diffuse());
114   EXPECT_EQ(ignition::math::Color(0.8f, 0.9f, 0.1f, 1), light2.Specular());
115   EXPECT_DOUBLE_EQ(3.2, light2.AttenuationRange());
116   EXPECT_DOUBLE_EQ(0.1, light2.LinearAttenuationFactor());
117   EXPECT_DOUBLE_EQ(0.5, light2.ConstantAttenuationFactor());
118   EXPECT_DOUBLE_EQ(0.01, light2.QuadraticAttenuationFactor());
119   EXPECT_EQ(ignition::math::Vector3d(0.1, 0.2, 1), light2.Direction());
120   EXPECT_EQ(ignition::math::Angle(1.9), light2.SpotInnerAngle());
121   EXPECT_EQ(ignition::math::Angle(3.3), light2.SpotOuterAngle());
122   EXPECT_DOUBLE_EQ(0.9, light2.SpotFalloff());
123 }
124 
125 /////////////////////////////////////////////////
TEST(DOMLight,AssignmentOperator)126 TEST(DOMLight, AssignmentOperator)
127 {
128   sdf::Light light;
129   light.SetName("test_light_assignment");
130   light.SetType(sdf::LightType::DIRECTIONAL);
131   light.SetPose({3, 2, 1, 0, IGN_PI, 0});
132   light.SetPoseFrame("ground_plane");
133   light.SetCastShadows(true);
134   light.SetDiffuse(ignition::math::Color(0.4f, 0.5f, 0.6f, 1.0));
135   light.SetSpecular(ignition::math::Color(0.8f, 0.9f, 0.1f, 1.0));
136   light.SetAttenuationRange(3.2);
137   light.SetLinearAttenuationFactor(0.1);
138   light.SetConstantAttenuationFactor(0.5);
139   light.SetQuadraticAttenuationFactor(0.01);
140   light.SetDirection({0.1, 0.2, 1});
141   light.SetSpotInnerAngle(1.9);
142   light.SetSpotOuterAngle(3.3);
143   light.SetSpotFalloff(0.9);
144 
145   sdf::Light light2 = light;
146   EXPECT_EQ("test_light_assignment", light2.Name());
147   EXPECT_EQ(sdf::LightType::DIRECTIONAL, light2.Type());
148   EXPECT_EQ(ignition::math::Pose3d(3, 2, 1, 0, IGN_PI, 0), light2.Pose());
149   EXPECT_EQ("ground_plane", light2.PoseFrame());
150   EXPECT_TRUE(light2.CastShadows());
151   EXPECT_EQ(ignition::math::Color(0.4f, 0.5f, 0.6f, 1), light2.Diffuse());
152   EXPECT_EQ(ignition::math::Color(0.8f, 0.9f, 0.1f, 1), light2.Specular());
153   EXPECT_DOUBLE_EQ(3.2, light2.AttenuationRange());
154   EXPECT_DOUBLE_EQ(0.1, light2.LinearAttenuationFactor());
155   EXPECT_DOUBLE_EQ(0.5, light2.ConstantAttenuationFactor());
156   EXPECT_DOUBLE_EQ(0.01, light2.QuadraticAttenuationFactor());
157   EXPECT_EQ(ignition::math::Vector3d(0.1, 0.2, 1), light2.Direction());
158   EXPECT_EQ(ignition::math::Angle(1.9), light2.SpotInnerAngle());
159   EXPECT_EQ(ignition::math::Angle(3.3), light2.SpotOuterAngle());
160   EXPECT_DOUBLE_EQ(0.9, light2.SpotFalloff());
161 }
162 
163 /////////////////////////////////////////////////
TEST(DOMLight,SpotLightNegativeValues)164 TEST(DOMLight, SpotLightNegativeValues)
165 {
166   sdf::Light light;
167   light.SetSpotFalloff(-1.0);
168   EXPECT_DOUBLE_EQ(0.0, light.SpotFalloff());
169 
170   light.SetSpotInnerAngle({-1.0});
171   EXPECT_DOUBLE_EQ(0.0, light.SpotInnerAngle().Radian());
172 
173   light.SetSpotOuterAngle({-2.0});
174   EXPECT_DOUBLE_EQ(0.0, light.SpotOuterAngle().Radian());
175 }
176 
177 /////////////////////////////////////////////////
TEST(DOMLight,AttenuationClamp)178 TEST(DOMLight, AttenuationClamp)
179 {
180   sdf::Light light;
181 
182   light.SetLinearAttenuationFactor(-1.0);
183   EXPECT_DOUBLE_EQ(0.0, light.LinearAttenuationFactor());
184 
185   light.SetLinearAttenuationFactor(20.0);
186   EXPECT_DOUBLE_EQ(1.0, light.LinearAttenuationFactor());
187 
188   light.SetConstantAttenuationFactor(-1.0);
189   EXPECT_DOUBLE_EQ(0.0, light.ConstantAttenuationFactor());
190 
191   light.SetConstantAttenuationFactor(20.0);
192   EXPECT_DOUBLE_EQ(1.0, light.ConstantAttenuationFactor());
193 
194   light.SetQuadraticAttenuationFactor(-1.0);
195   EXPECT_DOUBLE_EQ(0.0, light.QuadraticAttenuationFactor());
196 }
197