Flutter Impeller
impeller::scene Namespace Reference

Namespaces

 importer
 
 testing
 

Classes

class  Animation
 
class  AnimationClip
 
class  AnimationPlayer
 
struct  AnimationTransforms
 
class  Camera
 
class  CuboidGeometry
 
class  Geometry
 
class  Material
 
class  Mesh
 
class  Node
 
class  PhysicallyBasedMaterial
 
struct  PipelineKey
 
class  PropertyResolver
 
class  RotationTimelineResolver
 
class  ScaleTimelineResolver
 
class  Scene
 
struct  SceneCommand
 
class  SceneContext
 
struct  SceneContextOptions
 
class  SceneEncoder
 
class  Skin
 
class  SkinnedVertexBufferGeometry
 
class  TimelineResolver
 
class  TranslationTimelineResolver
 
class  UnlitMaterial
 
class  UnskinnedVertexBufferGeometry
 

Enumerations

enum  GeometryType {
  GeometryType::kUnskinned = 0,
  GeometryType::kSkinned = 1,
  GeometryType::kLastType = kSkinned
}
 
enum  MaterialType {
  MaterialType::kUnlit = 0,
  MaterialType::kLastType = kUnlit
}
 

Functions

static std::shared_ptr< TextureUnpackTextureFromFlatbuffer (const fb::Texture *iptexture, Allocator &allocator)
 
static void EncodeCommand (const SceneContext &scene_context, const Matrix &view_transform, RenderPass &render_pass, const SceneCommand &scene_command)
 

Variables

static std::atomic_uint64_t kNextNodeID = 0
 

Enumeration Type Documentation

◆ GeometryType

Enumerator
kUnskinned 
kSkinned 
kLastType 

Definition at line 13 of file pipeline_key.h.

13  {
14  kUnskinned = 0,
15  kSkinned = 1,
17 };

◆ MaterialType

Enumerator
kUnlit 
kLastType 

Definition at line 18 of file pipeline_key.h.

18  {
19  kUnlit = 0,
20  kLastType = kUnlit,
21 };

Function Documentation

◆ EncodeCommand()

static void impeller::scene::EncodeCommand ( const SceneContext scene_context,
const Matrix view_transform,
RenderPass render_pass,
const SceneCommand scene_command 
)
static

Definition at line 23 of file scene_encoder.cc.

26  {
27  auto& host_buffer = render_pass.GetTransientsBuffer();
28 
29  Command cmd;
30  DEBUG_COMMAND_INFO(cmd, scene_command.label);
31  cmd.stencil_reference =
32  0; // TODO(bdero): Configurable stencil ref per-command.
33 
34  cmd.pipeline = scene_context.GetPipeline(
35  PipelineKey{scene_command.geometry->GetGeometryType(),
36  scene_command.material->GetMaterialType()},
37  scene_command.material->GetContextOptions(render_pass));
38 
39  scene_command.geometry->BindToCommand(
40  scene_context, host_buffer, view_transform * scene_command.transform,
41  cmd);
42  scene_command.material->BindToCommand(scene_context, host_buffer, cmd);
43 
44  render_pass.AddCommand(std::move(cmd));
45 }

References impeller::RenderPass::AddCommand(), impeller::scene::Geometry::BindToCommand(), impeller::scene::Material::BindToCommand(), DEBUG_COMMAND_INFO, impeller::scene::SceneCommand::geometry, impeller::scene::Material::GetContextOptions(), impeller::scene::Geometry::GetGeometryType(), impeller::scene::Material::GetMaterialType(), impeller::scene::SceneContext::GetPipeline(), impeller::RenderPass::GetTransientsBuffer(), impeller::scene::SceneCommand::label, impeller::scene::SceneCommand::material, impeller::Command::pipeline, impeller::Command::stencil_reference, and impeller::scene::SceneCommand::transform.

◆ UnpackTextureFromFlatbuffer()

static std::shared_ptr<Texture> impeller::scene::UnpackTextureFromFlatbuffer ( const fb::Texture *  iptexture,
Allocator allocator 
)
static

Definition at line 62 of file node.cc.

64  {
65  if (iptexture == nullptr || iptexture->embedded_image() == nullptr ||
66  iptexture->embedded_image()->bytes() == nullptr) {
67  return nullptr;
68  }
69 
70  auto embedded = iptexture->embedded_image();
71 
72  uint8_t bytes_per_component = 0;
73  switch (embedded->component_type()) {
74  case fb::ComponentType::k8Bit:
75  bytes_per_component = 1;
76  break;
77  case fb::ComponentType::k16Bit:
78  // bytes_per_component = 2;
79  FML_LOG(WARNING) << "16 bit textures not yet supported.";
80  return nullptr;
81  }
82 
83  DecompressedImage::Format format;
84  switch (embedded->component_count()) {
85  case 1:
86  format = DecompressedImage::Format::kGrey;
87  break;
88  case 3:
89  format = DecompressedImage::Format::kRGB;
90  break;
91  case 4:
92  format = DecompressedImage::Format::kRGBA;
93  break;
94  default:
95  FML_LOG(WARNING) << "Textures with " << embedded->component_count()
96  << " components are not supported." << std::endl;
97  return nullptr;
98  }
99  if (embedded->bytes()->size() != bytes_per_component *
100  embedded->component_count() *
101  embedded->width() * embedded->height()) {
102  FML_LOG(WARNING) << "Embedded texture has an unexpected size. Skipping."
103  << std::endl;
104  return nullptr;
105  }
106 
107  auto image_mapping = std::make_shared<fml::NonOwnedMapping>(
108  embedded->bytes()->Data(), embedded->bytes()->size());
109  auto decompressed_image =
110  DecompressedImage(ISize(embedded->width(), embedded->height()), format,
111  image_mapping)
112  .ConvertToRGBA();
113 
114  auto texture_descriptor = TextureDescriptor{};
115  texture_descriptor.storage_mode = StorageMode::kHostVisible;
116  texture_descriptor.format = PixelFormat::kR8G8B8A8UNormInt;
117  texture_descriptor.size = decompressed_image.GetSize();
118  // TODO(bdero): Generate mipmaps for embedded textures.
119  texture_descriptor.mip_count = 1u;
120 
121  auto texture = allocator.CreateTexture(texture_descriptor);
122  if (!texture) {
123  FML_LOG(ERROR) << "Could not allocate texture.";
124  return nullptr;
125  }
126 
127  auto uploaded = texture->SetContents(decompressed_image.GetAllocation());
128  if (!uploaded) {
129  FML_LOG(ERROR) << "Could not upload texture to device memory.";
130  return nullptr;
131  }
132 
133  return texture;
134 }

References impeller::DecompressedImage::ConvertToRGBA(), impeller::Allocator::CreateTexture(), impeller::DecompressedImage::kGrey, impeller::kHostVisible, impeller::kR8G8B8A8UNormInt, impeller::DecompressedImage::kRGB, impeller::DecompressedImage::kRGBA, and impeller::TextureDescriptor::storage_mode.

Referenced by impeller::scene::Node::MakeFromFlatbuffer().

Variable Documentation

◆ kNextNodeID

std::atomic_uint64_t impeller::scene::kNextNodeID = 0
static

Definition at line 28 of file node.cc.

DEBUG_COMMAND_INFO
#define DEBUG_COMMAND_INFO(obj, arg)
Definition: command.h:28
impeller::scene::GeometryType::kUnskinned
@ kUnskinned
impeller::scene::GeometryType::kLastType
@ kLastType
impeller::scene::MaterialType::kUnlit
@ kUnlit
impeller::ISize
TSize< int64_t > ISize
Definition: size.h:138
impeller::scene::GeometryType::kSkinned
@ kSkinned