Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 662c5f8

Browse files
authored
[Impeller Scene] Wire up camera (#38053)
* [Impeller Scene] Wire up camera * Resolve view transform once
1 parent b3e86c3 commit 662c5f8

10 files changed

+29
-24
lines changed

impeller/scene/camera.cc

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
namespace impeller {
88
namespace scene {
99

10-
Camera Camera::MakePerspective(Scalar fov_y, Vector3 position) {
10+
Camera Camera::MakePerspective(Radians fov_y, Vector3 position) {
1111
Camera camera;
1212
camera.fov_y_ = fov_y;
1313
camera.position_ = position;
@@ -26,9 +26,8 @@ Matrix Camera::GetTransform(ISize target_size) const {
2626
return transform_.value();
2727
}
2828

29-
transform_ =
30-
Matrix::MakePerspective(Radians(fov_y_), target_size, z_near_, z_far_) *
31-
Matrix::MakeLookAt(position_, target_, up_).Invert();
29+
transform_ = Matrix::MakePerspective(fov_y_, target_size, z_near_, z_far_) *
30+
Matrix::MakeLookAt(position_, target_, up_);
3231

3332
return transform_.value();
3433
}

impeller/scene/camera.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ namespace scene {
1313

1414
class Camera {
1515
public:
16-
static Camera MakePerspective(Scalar fov_y, Vector3 position);
16+
static Camera MakePerspective(Radians fov_y, Vector3 position);
1717

1818
Camera LookAt(Vector3 target, Vector3 up = Vector3(0, -1, 0)) const;
1919

2020
Matrix GetTransform(ISize target_size) const;
2121

2222
private:
23-
Scalar fov_y_ = 60;
23+
Radians fov_y_ = Degrees(60);
2424
Vector3 position_ = Vector3();
2525
Vector3 target_ = Vector3(0, 0, -1);
2626
Vector3 up_ = Vector3(0, -1, 0);

impeller/scene/scene.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,15 @@ bool Scene::Render(const RenderTarget& render_target,
2626
const Camera& camera) const {
2727
// Collect the render commands from the scene.
2828
SceneEncoder encoder;
29-
if (!root_.Render(encoder, camera)) {
29+
if (!root_.Render(encoder)) {
3030
FML_LOG(ERROR) << "Failed to render frame.";
3131
return false;
3232
}
3333

3434
// Encode the commands.
3535

3636
std::shared_ptr<CommandBuffer> command_buffer =
37-
encoder.BuildSceneCommandBuffer(*scene_context_, render_target);
37+
encoder.BuildSceneCommandBuffer(*scene_context_, camera, render_target);
3838

3939
// TODO(bdero): Do post processing.
4040

impeller/scene/scene_encoder.cc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ void SceneEncoder::Add(const SceneCommand& command) {
2222
}
2323

2424
static void EncodeCommand(const SceneContext& scene_context,
25+
const Matrix& view_transform,
2526
RenderPass& render_pass,
2627
const SceneCommand& scene_command) {
2728
auto& host_buffer = render_pass.GetTransientsBuffer();
@@ -39,14 +40,15 @@ static void EncodeCommand(const SceneContext& scene_context,
3940
scene_command.material->BindToCommand(scene_context, host_buffer, cmd);
4041

4142
GeometryVertexShader::VertInfo info;
42-
info.mvp = scene_command.transform;
43+
info.mvp = view_transform * scene_command.transform;
4344
GeometryVertexShader::BindVertInfo(cmd, host_buffer.EmplaceUniform(info));
4445

4546
render_pass.AddCommand(std::move(cmd));
4647
}
4748

4849
std::shared_ptr<CommandBuffer> SceneEncoder::BuildSceneCommandBuffer(
4950
const SceneContext& scene_context,
51+
const Camera& camera,
5052
const RenderTarget& render_target) const {
5153
auto command_buffer = scene_context.GetContext()->CreateCommandBuffer();
5254
if (!command_buffer) {
@@ -61,7 +63,9 @@ std::shared_ptr<CommandBuffer> SceneEncoder::BuildSceneCommandBuffer(
6163
}
6264

6365
for (auto& command : commands_) {
64-
EncodeCommand(scene_context, *render_pass, command);
66+
Matrix view_transform =
67+
camera.GetTransform(render_pass->GetRenderTargetSize());
68+
EncodeCommand(scene_context, view_transform, *render_pass, command);
6569
}
6670

6771
if (!render_pass->EncodeCommands()) {

impeller/scene/scene_encoder.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#include "flutter/fml/macros.h"
1212
#include "impeller/renderer/command_buffer.h"
13+
#include "impeller/scene/camera.h"
1314
#include "impeller/scene/geometry.h"
1415
#include "impeller/scene/material.h"
1516

@@ -34,6 +35,7 @@ class SceneEncoder {
3435

3536
std::shared_ptr<CommandBuffer> BuildSceneCommandBuffer(
3637
const SceneContext& scene_context,
38+
const Camera& camera,
3739
const RenderTarget& render_target) const;
3840

3941
std::vector<SceneCommand> commands_;

impeller/scene/scene_entity.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,17 +56,17 @@ bool SceneEntity::Add(const std::shared_ptr<SceneEntity>& child) {
5656
return true;
5757
}
5858

59-
bool SceneEntity::Render(SceneEncoder& encoder, const Camera& camera) const {
60-
OnRender(encoder, camera);
59+
bool SceneEntity::Render(SceneEncoder& encoder) const {
60+
OnRender(encoder);
6161
for (auto& child : children_) {
62-
if (!child->Render(encoder, camera)) {
62+
if (!child->Render(encoder)) {
6363
return false;
6464
}
6565
}
6666
return true;
6767
}
6868

69-
bool SceneEntity::OnRender(SceneEncoder& encoder, const Camera& camera) const {
69+
bool SceneEntity::OnRender(SceneEncoder& encoder) const {
7070
return true;
7171
}
7272

impeller/scene/scene_entity.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@ class SceneEntity {
3434

3535
bool Add(const std::shared_ptr<SceneEntity>& child);
3636

37-
bool Render(SceneEncoder& encoder, const Camera& camera) const;
37+
bool Render(SceneEncoder& encoder) const;
3838

3939
protected:
4040
Matrix local_transform_;
4141

4242
private:
43-
virtual bool OnRender(SceneEncoder& encoder, const Camera& camera) const;
43+
virtual bool OnRender(SceneEncoder& encoder) const;
4444

4545
SceneEntity* parent_ = nullptr;
4646
std::vector<std::shared_ptr<SceneEntity>> children_;

impeller/scene/scene_unittests.cc

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,20 +37,21 @@ TEST_P(SceneTest, CuboidUnlit) {
3737
material->SetColor(Color::Red());
3838
mesh->SetMaterial(std::move(material));
3939

40-
Vector3 size(1, 2, 3);
40+
Vector3 size(1, 1, 0);
4141
mesh->SetGeometry(Geometry::MakeCuboid(size));
4242

43-
mesh->SetLocalTransform(Matrix::MakeTranslation(size / 2));
43+
mesh->SetLocalTransform(Matrix::MakeTranslation(-size / 2));
4444

4545
scene.Add(mesh);
4646
}
4747

48+
// Face towards the +Z direction (+X right, +Y up).
4849
auto camera = Camera::MakePerspective(
49-
/* fov */ kPiOver4,
50-
/* position */ {50, -30, 50})
50+
/* fov */ Radians(kPiOver4),
51+
/* position */ {2, 2, -5})
5152
.LookAt(
5253
/* target */ Vector3(),
53-
/* up */ {0, -1, 0});
54+
/* up */ {0, 1, 0});
5455

5556
scene.Render(render_target, camera);
5657
return true;

impeller/scene/static_mesh_entity.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ void StaticMeshEntity::SetMaterial(std::shared_ptr<Material> material) {
2424
}
2525

2626
// |SceneEntity|
27-
bool StaticMeshEntity::OnRender(SceneEncoder& encoder,
28-
const Camera& camera) const {
27+
bool StaticMeshEntity::OnRender(SceneEncoder& encoder) const {
2928
SceneCommand command = {
3029
.label = "Static Mesh",
3130
.transform = GetGlobalTransform(),

impeller/scene/static_mesh_entity.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class StaticMeshEntity final : public SceneEntity {
2525

2626
private:
2727
// |SceneEntity|
28-
bool OnRender(SceneEncoder& encoder, const Camera& camera) const override;
28+
bool OnRender(SceneEncoder& encoder) const override;
2929

3030
std::shared_ptr<Material> material_;
3131
std::shared_ptr<Geometry> geometry_;

0 commit comments

Comments
 (0)