Flutter Impeller
impeller::scene::testing Namespace Reference

Typedefs

using SceneTest = PlaygroundTest
 

Functions

 INSTANTIATE_PLAYGROUND_SUITE (SceneTest)
 
 TEST_P (SceneTest, CuboidUnlit)
 
 TEST_P (SceneTest, FlutterLogo)
 
 TEST_P (SceneTest, TwoTriangles)
 
 TEST_P (SceneTest, Dash)
 

Typedef Documentation

◆ SceneTest

Definition at line 34 of file scene_unittests.cc.

Function Documentation

◆ INSTANTIATE_PLAYGROUND_SUITE()

impeller::scene::testing::INSTANTIATE_PLAYGROUND_SUITE ( SceneTest  )

◆ TEST_P() [1/4]

impeller::scene::testing::TEST_P ( SceneTest  ,
CuboidUnlit   
)

Definition at line 37 of file scene_unittests.cc.

37  {
38  auto scene_context = std::make_shared<SceneContext>(GetContext());
39 
40  Renderer::RenderCallback callback = [&](RenderTarget& render_target) {
41  auto allocator = GetContext()->GetResourceAllocator();
42  auto scene = Scene(scene_context);
43 
44  {
45  Mesh mesh;
46 
47  auto material = Material::MakeUnlit();
48  material->SetColor(Color::Red());
49 
50  Vector3 size(1, 1, 0);
51  mesh.AddPrimitive({Geometry::MakeCuboid(size), std::move(material)});
52 
53  Node& root = scene.GetRoot();
54  root.SetLocalTransform(Matrix::MakeTranslation(-size / 2));
55  root.SetMesh(std::move(mesh));
56  }
57 
58  // Face towards the +Z direction (+X right, +Y up).
59  auto camera = Camera::MakePerspective(
60  /* fov */ Radians(kPiOver4),
61  /* position */ {2, 2, -5})
62  .LookAt(
63  /* target */ Vector3(),
64  /* up */ {0, 1, 0});
65 
66  scene.Render(render_target, camera);
67  return true;
68  };
69 
70  OpenPlaygroundHere(callback);
71 }

References impeller::scene::Mesh::AddPrimitive(), impeller::kPiOver4, impeller::scene::Geometry::MakeCuboid(), impeller::scene::Camera::MakePerspective(), impeller::Matrix::MakeTranslation(), impeller::scene::Material::MakeUnlit(), impeller::Color::Red(), impeller::scene::Node::SetLocalTransform(), and impeller::scene::Node::SetMesh().

◆ TEST_P() [2/4]

impeller::scene::testing::TEST_P ( SceneTest  ,
Dash   
)

Definition at line 198 of file scene_unittests.cc.

198  {
199  auto allocator = GetContext()->GetResourceAllocator();
200 
201  auto mapping = flutter::testing::OpenFixtureAsMapping("dash.glb.ipscene");
202  if (!mapping) {
203  // TODO(bdero): Just skip this playground is the dash asset isn't found. I
204  // haven't checked it in because it's way too big right now,
205  // but this is still useful to keep around for debugging
206  // purposes.
207  return;
208  }
209  ASSERT_NE(mapping, nullptr);
210 
211  std::shared_ptr<Node> gltf_scene =
212  Node::MakeFromFlatbuffer(*mapping, *allocator);
213  ASSERT_NE(gltf_scene, nullptr);
214 
215  auto walk_anim = gltf_scene->FindAnimationByName("Walk");
216  ASSERT_NE(walk_anim, nullptr);
217 
218  AnimationClip* walk_clip = gltf_scene->AddAnimation(walk_anim);
219  ASSERT_NE(walk_clip, nullptr);
220  walk_clip->SetLoop(true);
221  walk_clip->Play();
222 
223  auto run_anim = gltf_scene->FindAnimationByName("Run");
224  ASSERT_NE(walk_anim, nullptr);
225 
226  AnimationClip* run_clip = gltf_scene->AddAnimation(run_anim);
227  ASSERT_NE(run_clip, nullptr);
228  run_clip->SetLoop(true);
229  run_clip->Play();
230 
231  auto scene_context = std::make_shared<SceneContext>(GetContext());
232  auto scene = Scene(scene_context);
233  scene.GetRoot().AddChild(std::move(gltf_scene));
234 
235  Renderer::RenderCallback callback = [&](RenderTarget& render_target) {
236  ImGui::Begin("Controls", nullptr, ImGuiWindowFlags_AlwaysAutoResize);
237  {
238  static Scalar playback_time_scale = 1;
239  static Scalar walk = 0.5;
240  static Scalar run = 0.5;
241  static bool loop = true;
242 
243  ImGui::SliderFloat("Playback time scale", &playback_time_scale, -5, 5);
244  ImGui::SliderFloat("Walk weight", &walk, 0, 1);
245  ImGui::SliderFloat("Run weight", &run, 0, 1);
246  ImGui::Checkbox("Loop", &loop);
247  if (ImGui::Button("Play")) {
248  walk_clip->Play();
249  run_clip->Play();
250  }
251  if (ImGui::Button("Pause")) {
252  walk_clip->Pause();
253  run_clip->Pause();
254  }
255  if (ImGui::Button("Stop")) {
256  walk_clip->Stop();
257  run_clip->Stop();
258  }
259 
260  walk_clip->SetPlaybackTimeScale(playback_time_scale);
261  walk_clip->SetWeight(walk);
262  walk_clip->SetLoop(loop);
263 
264  run_clip->SetPlaybackTimeScale(playback_time_scale);
265  run_clip->SetWeight(run);
266  run_clip->SetLoop(loop);
267  }
268 
269  ImGui::End();
270  Node& node = *scene.GetRoot().GetChildren()[0];
271  node.SetLocalTransform(node.GetLocalTransform() *
272  Matrix::MakeRotation(0.02, {0, 1, 0, 0}));
273 
274  static ImVec2 mouse_pos_prev = ImGui::GetMousePos();
275  ImVec2 mouse_pos = ImGui::GetMousePos();
276  Vector2 mouse_diff =
277  Vector2(mouse_pos.x - mouse_pos_prev.x, mouse_pos.y - mouse_pos_prev.y);
278 
279  static Vector3 position(0, 1, -5);
280  static Vector3 cam_position = position;
281  auto strafe =
282  Vector3(ImGui::IsKeyDown(ImGuiKey_D) - ImGui::IsKeyDown(ImGuiKey_A),
283  ImGui::IsKeyDown(ImGuiKey_E) - ImGui::IsKeyDown(ImGuiKey_Q),
284  ImGui::IsKeyDown(ImGuiKey_W) - ImGui::IsKeyDown(ImGuiKey_S));
285  position += strafe * 0.5;
286  cam_position = cam_position.Lerp(position, 0.02);
287 
288  // Face towards the +Z direction (+X right, +Y up).
289  auto camera = Camera::MakePerspective(
290  /* fov */ Degrees(60),
291  /* position */ cam_position)
292  .LookAt(
293  /* target */ cam_position + Vector3(0, 0, 1),
294  /* up */ {0, 1, 0});
295 
296  scene.Render(render_target, camera);
297  return true;
298  };
299 
300  OpenPlaygroundHere(callback);
301 }

References impeller::scene::Node::GetChildren(), impeller::scene::Node::GetLocalTransform(), impeller::Vector3::Lerp(), impeller::scene::Camera::LookAt(), impeller::scene::Node::MakeFromFlatbuffer(), impeller::scene::Camera::MakePerspective(), impeller::Matrix::MakeRotation(), impeller::scene::AnimationClip::Pause(), impeller::scene::AnimationClip::Play(), impeller::scene::Node::SetLocalTransform(), impeller::scene::AnimationClip::SetLoop(), impeller::scene::AnimationClip::SetPlaybackTimeScale(), impeller::scene::AnimationClip::SetWeight(), and impeller::scene::AnimationClip::Stop().

◆ TEST_P() [3/4]

impeller::scene::testing::TEST_P ( SceneTest  ,
FlutterLogo   
)

Definition at line 73 of file scene_unittests.cc.

73  {
74  auto allocator = GetContext()->GetResourceAllocator();
75 
76  auto mapping =
77  flutter::testing::OpenFixtureAsMapping("flutter_logo_baked.glb.ipscene");
78  ASSERT_NE(mapping, nullptr);
79 
80  flatbuffers::Verifier verifier(mapping->GetMapping(), mapping->GetSize());
81  ASSERT_TRUE(fb::VerifySceneBuffer(verifier));
82 
83  std::shared_ptr<Node> gltf_scene =
84  Node::MakeFromFlatbuffer(*mapping, *allocator);
85  ASSERT_NE(gltf_scene, nullptr);
86  ASSERT_EQ(gltf_scene->GetChildren().size(), 1u);
87  ASSERT_EQ(gltf_scene->GetChildren()[0]->GetMesh().GetPrimitives().size(), 1u);
88 
89  auto scene_context = std::make_shared<SceneContext>(GetContext());
90  auto scene = Scene(scene_context);
91  scene.GetRoot().AddChild(std::move(gltf_scene));
92  scene.GetRoot().SetLocalTransform(Matrix::MakeScale({3, 3, 3}));
93 
94  Renderer::RenderCallback callback = [&](RenderTarget& render_target) {
95  Quaternion rotation({0, 1, 0}, -GetSecondsElapsed() * 0.5);
96  Vector3 start_position(-1, -1.5, -5);
97 
98  // Face towards the +Z direction (+X right, +Y up).
99  auto camera = Camera::MakePerspective(
100  /* fov */ Degrees(60),
101  /* position */ rotation * start_position)
102  .LookAt(
103  /* target */ Vector3(),
104  /* up */ {0, 1, 0});
105 
106  scene.Render(render_target, camera);
107  return true;
108  };
109 
110  OpenPlaygroundHere(callback);
111 }

References impeller::scene::Camera::LookAt(), impeller::scene::Node::MakeFromFlatbuffer(), impeller::scene::Camera::MakePerspective(), and impeller::Matrix::MakeScale().

◆ TEST_P() [4/4]

impeller::scene::testing::TEST_P ( SceneTest  ,
TwoTriangles   
)

Definition at line 113 of file scene_unittests.cc.

113  {
114  if (GetBackend() == PlaygroundBackend::kVulkan) {
115  GTEST_SKIP_("Temporarily disabled.");
116  }
117  auto allocator = GetContext()->GetResourceAllocator();
118 
119  auto mapping =
120  flutter::testing::OpenFixtureAsMapping("two_triangles.glb.ipscene");
121  ASSERT_NE(mapping, nullptr);
122 
123  std::shared_ptr<Node> gltf_scene =
124  Node::MakeFromFlatbuffer(*mapping, *allocator);
125  ASSERT_NE(gltf_scene, nullptr);
126 
127  auto animation = gltf_scene->FindAnimationByName("Metronome");
128  ASSERT_NE(animation, nullptr);
129 
130  AnimationClip* metronome_clip = gltf_scene->AddAnimation(animation);
131  ASSERT_NE(metronome_clip, nullptr);
132  metronome_clip->SetLoop(true);
133  metronome_clip->Play();
134 
135  auto scene_context = std::make_shared<SceneContext>(GetContext());
136  auto scene = Scene(scene_context);
137  scene.GetRoot().AddChild(std::move(gltf_scene));
138 
139  Renderer::RenderCallback callback = [&](RenderTarget& render_target) {
140  ImGui::Begin("Controls", nullptr, ImGuiWindowFlags_AlwaysAutoResize);
141  {
142  static Scalar playback_time_scale = 1;
143  static Scalar weight = 1;
144  static bool loop = true;
145 
146  ImGui::SliderFloat("Playback time scale", &playback_time_scale, -5, 5);
147  ImGui::SliderFloat("Weight", &weight, -2, 2);
148  ImGui::Checkbox("Loop", &loop);
149  if (ImGui::Button("Play")) {
150  metronome_clip->Play();
151  }
152  if (ImGui::Button("Pause")) {
153  metronome_clip->Pause();
154  }
155  if (ImGui::Button("Stop")) {
156  metronome_clip->Stop();
157  }
158 
159  metronome_clip->SetPlaybackTimeScale(playback_time_scale);
160  metronome_clip->SetWeight(weight);
161  metronome_clip->SetLoop(loop);
162  }
163 
164  ImGui::End();
165  Node& node = *scene.GetRoot().GetChildren()[0];
166  node.SetLocalTransform(node.GetLocalTransform() *
167  Matrix::MakeRotation(0.02, {0, 1, 0, 0}));
168 
169  static ImVec2 mouse_pos_prev = ImGui::GetMousePos();
170  ImVec2 mouse_pos = ImGui::GetMousePos();
171  Vector2 mouse_diff =
172  Vector2(mouse_pos.x - mouse_pos_prev.x, mouse_pos.y - mouse_pos_prev.y);
173 
174  static Vector3 position(0, 1, -5);
175  static Vector3 cam_position = position;
176  auto strafe =
177  Vector3(ImGui::IsKeyDown(ImGuiKey_D) - ImGui::IsKeyDown(ImGuiKey_A),
178  ImGui::IsKeyDown(ImGuiKey_E) - ImGui::IsKeyDown(ImGuiKey_Q),
179  ImGui::IsKeyDown(ImGuiKey_W) - ImGui::IsKeyDown(ImGuiKey_S));
180  position += strafe * 0.5;
181  cam_position = cam_position.Lerp(position, 0.02);
182 
183  // Face towards the +Z direction (+X right, +Y up).
184  auto camera = Camera::MakePerspective(
185  /* fov */ Degrees(60),
186  /* position */ cam_position)
187  .LookAt(
188  /* target */ cam_position + Vector3(0, 0, 1),
189  /* up */ {0, 1, 0});
190 
191  scene.Render(render_target, camera);
192  return true;
193  };
194 
195  OpenPlaygroundHere(callback);
196 }

References impeller::scene::Node::GetChildren(), impeller::scene::Node::GetLocalTransform(), impeller::kVulkan, impeller::Vector3::Lerp(), impeller::scene::Camera::LookAt(), impeller::scene::Node::MakeFromFlatbuffer(), impeller::scene::Camera::MakePerspective(), impeller::Matrix::MakeRotation(), impeller::scene::AnimationClip::Pause(), impeller::scene::AnimationClip::Play(), impeller::scene::Node::SetLocalTransform(), impeller::scene::AnimationClip::SetLoop(), impeller::scene::AnimationClip::SetPlaybackTimeScale(), impeller::scene::AnimationClip::SetWeight(), and impeller::scene::AnimationClip::Stop().

impeller::Scalar
float Scalar
Definition: scalar.h:18
impeller::Vector2
Point Vector2
Definition: point.h:320
impeller::kPiOver4
constexpr float kPiOver4
Definition: constants.h:35