blob: d29d69cd71e265572260e5acc87b06b10aad71ac [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "garnet/lib/ui/gfx/resources/material.h"
#include "garnet/lib/ui/gfx/engine/session.h"
#include "garnet/lib/ui/gfx/resources/image.h"
#include "garnet/lib/ui/gfx/resources/image_base.h"
#include "garnet/lib/ui/gfx/resources/image_pipe.h"
namespace scenic_impl {
namespace gfx {
const ResourceTypeInfo Material::kTypeInfo = {ResourceType::kMaterial,
"Material"};
Material::Material(Session* session, ResourceId id)
: Resource(session, id, Material::kTypeInfo),
escher_material_(fxl::MakeRefCounted<escher::Material>()) {}
void Material::SetColor(float red, float green, float blue, float alpha) {
escher_material_->set_color(escher::vec4(red, green, blue, alpha));
// TODO(rosswang): This and related affordances are not enough to allow
// transparent textures to work on opaque materials. It may be worthwhile to
// surface the |opaque| flag on the Scenic client API to support this.
escher_material_->set_opaque(alpha == 1);
}
void Material::SetTexture(ImageBasePtr texture_image) {
texture_ = std::move(texture_image);
}
void Material::UpdateEscherMaterial(escher::BatchGpuUploader* gpu_uploader) {
// Update our escher::Material if our texture's presented image changed.
escher::ImagePtr escher_image;
if (texture_) {
texture_->UpdateEscherImage(gpu_uploader);
escher_image = texture_->GetEscherImage();
}
const escher::TexturePtr& escher_texture = escher_material_->texture();
if (!escher_texture || escher_image != escher_texture->image()) {
escher::TexturePtr texture;
if (escher_image) {
texture = fxl::MakeRefCounted<escher::Texture>(
session()->resource_context().escher_resource_recycler, escher_image,
vk::Filter::eLinear);
}
escher_material_->SetTexture(std::move(texture));
}
}
} // namespace gfx
} // namespace scenic_impl