18 std::shared_ptr<RuntimeStage> runtime_stage) {
19 runtime_stage_ = std::move(runtime_stage);
23 std::shared_ptr<std::vector<uint8_t>> uniforms) {
24 uniforms_ = std::move(uniforms);
28 std::vector<RuntimeEffectContents::TextureInput> texture_inputs) {
29 texture_inputs_ = std::move(texture_inputs);
33 std::optional<Entity> RuntimeEffectFilterContents::RenderFilter(
37 const Matrix& effect_transform,
39 const std::optional<Rect>& coverage_hint)
const {
45 inputs[0]->GetSnapshot(
"RuntimeEffectContents", renderer, entity);
46 if (!input_snapshot.has_value()) {
49 std::optional<Rect> maybe_input_coverage = input_snapshot->GetCoverage();
50 if (!maybe_input_coverage.has_value()) {
53 Rect input_coverage = maybe_input_coverage.value();
58 if (texture_inputs_.size() < 1 || uniforms_->size() < 8) {
60 <<
"Invalid fragment shader in RuntimeEffectFilterContents. "
61 <<
"Shader must have at least one sampler and a vec2 size uniform.";
66 std::vector<RuntimeEffectContents::TextureInput> texture_input_copy =
68 texture_input_copy[0].texture = input_snapshot->texture;
70 Size size =
Size(input_snapshot->texture->GetSize());
71 memcpy(uniforms_->data(), &size,
sizeof(
Size));
77 [input_snapshot, runtime_stage = runtime_stage_, uniforms = uniforms_,
78 texture_inputs = texture_input_copy,
79 input_coverage](
const ContentContext& renderer,
const Entity& entity,
80 RenderPass& pass) ->
bool {
81 RuntimeEffectContents contents;
83 contents.SetRuntimeStage(runtime_stage);
84 contents.SetUniformData(uniforms);
85 contents.SetTextureInputs(texture_inputs);
86 contents.SetGeometry(&geom);
87 return contents.Render(renderer, entity, pass);
91 [coverage](
const Entity& entity) -> std::optional<Rect> {
98 sub_entity.SetContents(std::move(contents));
99 sub_entity.SetBlendMode(entity.GetBlendMode());
100 sub_entity.SetTransform(input_snapshot->transform);
105 std::optional<Rect> RuntimeEffectFilterContents::GetFilterSourceCoverage(
106 const Matrix& effect_transform,
107 const Rect& output_limit)
const {
static std::shared_ptr< Contents > Make(RenderProc render_proc, CoverageProc coverage_proc)
std::function< std::optional< Rect >(const Entity &entity)> CoverageProc
std::function< bool(const ContentContext &renderer, const Entity &entity, RenderPass &pass)> RenderProc
void SetTextureInputs(std::vector< RuntimeEffectContents::TextureInput > texture_inputs)
void SetUniforms(std::shared_ptr< std::vector< uint8_t >> uniforms)
void SetRuntimeStage(std::shared_ptr< RuntimeStage > runtime_stage)
A 4x4 matrix using column-major storage.
constexpr TRect TransformBounds(const Matrix &transform) const
Creates a new bounding box that contains this transformed rectangle.
constexpr static TRect MakeSize(const TSize< U > &size)