27 tile_mode_ = tile_mode;
31 colors_ = std::move(colors);
35 stops_ = std::move(stops);
49 focus_radius_ = radius;
56 return RenderSSBO(renderer, entity, pass);
58 return RenderTexture(renderer, entity, pass);
61 bool ConicalGradientContents::RenderSSBO(
const ContentContext& renderer,
67 VS::FrameInfo frame_info;
74 return ColorSourceContents::DrawGeometry<VS>(
75 renderer, entity, pass, pipeline_callback, frame_info,
76 [
this, &renderer, &entity](RenderPass& pass) {
77 FS::FragInfo frag_info;
78 frag_info.center = center_;
79 frag_info.radius = radius_;
80 frag_info.tile_mode =
static_cast<Scalar>(tile_mode_);
81 frag_info.decal_border_color = decal_border_color_;
86 frag_info.focus = focus_.value();
87 frag_info.focus_radius = focus_radius_;
89 frag_info.focus = center_;
90 frag_info.focus_radius = 0.0;
96 frag_info.colors_length = colors.size();
98 host_buffer.Emplace(colors.data(), colors.size() *
sizeof(StopData),
103 FS::BindColorData(pass, color_buffer);
105 pass.SetCommandLabel(
"ConicalGradientSSBOFill");
110 bool ConicalGradientContents::RenderTexture(
const ContentContext& renderer,
111 const Entity& entity,
112 RenderPass& pass)
const {
117 auto gradient_texture =
119 if (gradient_texture ==
nullptr) {
123 VS::FrameInfo frame_info;
127 [&renderer](ContentContextOptions options) {
128 return renderer.GetConicalGradientFillPipeline(options);
130 return ColorSourceContents::DrawGeometry<VS>(
131 renderer, entity, pass, pipeline_callback, frame_info,
132 [
this, &renderer, &gradient_texture, &entity](RenderPass& pass) {
133 FS::FragInfo frag_info;
134 frag_info.center = center_;
135 frag_info.radius = radius_;
136 frag_info.tile_mode =
static_cast<Scalar>(tile_mode_);
137 frag_info.decal_border_color = decal_border_color_;
138 frag_info.texture_sampler_y_coord_scale =
139 gradient_texture->GetYCoordScale();
143 frag_info.half_texel =
144 Vector2(0.5 / gradient_texture->GetSize().width,
145 0.5 / gradient_texture->GetSize().height);
147 frag_info.focus = focus_.value();
148 frag_info.focus_radius = focus_radius_;
150 frag_info.focus = center_;
151 frag_info.focus_radius = 0.0;
154 pass.SetCommandLabel(
"ConicalGradientFill");
157 pass, renderer.GetTransientsBuffer().EmplaceUniform(frag_info));
158 SamplerDescriptor sampler_desc;
161 FS::BindTextureSampler(
162 pass, gradient_texture,
163 renderer.GetContext()->GetSamplerLibrary()->GetSampler(
175 decal_border_color_ = color_filter_proc(decal_border_color_);