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