blob: a9e0be7a3ba7c9c36cb602dede47a77af5957ac1 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#pragma once
#include <memory>
#include "impeller/geometry/scalar.h"
#include "impeller/renderer/formats.h"
#include "impeller/renderer/texture.h"
namespace impeller {
namespace scene {
class UnlitMaterial;
class StandardMaterial;
class Material {
public:
struct BlendConfig {
BlendOperation color_op = BlendOperation::kAdd;
BlendFactor source_color_factor = BlendFactor::kOne;
BlendFactor destination_color_factor = BlendFactor::kOneMinusSourceAlpha;
BlendOperation alpha_op = BlendOperation::kAdd;
BlendFactor source_alpha_factor = BlendFactor::kOne;
BlendFactor destination_alpha_factor = BlendFactor::kOneMinusSourceAlpha;
};
struct StencilConfig {
StencilOperation operation = StencilOperation::kKeep;
CompareFunction compare = CompareFunction::kAlways;
};
static std::unique_ptr<UnlitMaterial> MakeUnlit();
static std::unique_ptr<StandardMaterial> MakeStandard();
void SetBlendConfig(BlendConfig blend_config);
void SetStencilConfig(StencilConfig stencil_config);
void SetTranslucent(bool is_translucent);
protected:
BlendConfig blend_config_;
StencilConfig stencil_config_;
bool is_translucent_ = false;
};
class UnlitMaterial final : public Material {
public:
void SetColor(Color color);
private:
Color color_;
};
class StandardMaterial final : public Material {
public:
void SetAlbedo(Color albedo);
void SetRoughness(Scalar roughness);
void SetMetallic(Scalar metallic);
void SetAlbedoTexture(std::shared_ptr<Texture> albedo_texture);
void SetNormalTexture(std::shared_ptr<Texture> normal_texture);
void SetOcclusionRoughnessMetallicTexture(
std::shared_ptr<Texture> occlusion_roughness_metallic_texture);
void SetEnvironmentMap(std::shared_ptr<Texture> environment_map);
private:
Color albedo_ = Color::CornflowerBlue();
Scalar roughness_ = 0.5;
Scalar metallic_ = 0.5;
std::shared_ptr<Texture> albedo_texture_;
std::shared_ptr<Texture> normal_texture_;
std::shared_ptr<Texture> occlusion_roughness_metallic_texture_;
std::shared_ptr<Texture> environment_map_;
};
} // namespace scene
} // namespace impeller