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 FS::FragInfo frag_info;
68 frag_info.center = center_;
69 frag_info.radius = radius_;
70 frag_info.tile_mode =
static_cast<Scalar>(tile_mode_);
71 frag_info.decal_border_color = decal_border_color_;
74 frag_info.focus = focus_.value();
75 frag_info.focus_radius = focus_radius_;
77 frag_info.focus = center_;
78 frag_info.focus_radius = 0.0;
84 frag_info.colors_length = colors.size();
86 host_buffer.Emplace(colors.data(), colors.size() *
sizeof(StopData),
89 VS::FrameInfo frame_info;
97 auto geometry_result =
98 GetGeometry()->GetPositionBuffer(renderer, entity, pass);
100 if (geometry_result.prevent_overdraw) {
104 options.primitive_type = geometry_result.type;
107 cmd.BindVertices(std::move(geometry_result.vertex_buffer));
109 FS::BindColorData(cmd, color_buffer);
116 if (geometry_result.prevent_overdraw) {
117 auto restore = ClipRestoreContents();
119 return restore.Render(renderer, entity, pass);
124 bool ConicalGradientContents::RenderTexture(
const ContentContext& renderer,
125 const Entity& entity,
126 RenderPass& pass)
const {
131 auto gradient_texture =
133 if (gradient_texture ==
nullptr) {
137 FS::FragInfo frag_info;
138 frag_info.center = center_;
139 frag_info.radius = radius_;
140 frag_info.tile_mode =
static_cast<Scalar>(tile_mode_);
141 frag_info.decal_border_color = decal_border_color_;
142 frag_info.texture_sampler_y_coord_scale = gradient_texture->GetYCoordScale();
144 frag_info.half_texel =
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 auto geometry_result =
155 GetGeometry()->GetPositionBuffer(renderer, entity, pass);
157 VS::FrameInfo frame_info;
158 frame_info.mvp = geometry_result.transform;
163 cmd.stencil_reference = entity.GetClipDepth();
166 if (geometry_result.prevent_overdraw) {
170 options.primitive_type = geometry_result.type;
171 cmd.pipeline = renderer.GetConicalGradientFillPipeline(options);
173 cmd.BindVertices(std::move(geometry_result.vertex_buffer));
174 FS::BindFragInfo(cmd, pass.GetTransientsBuffer().EmplaceUniform(frag_info));
175 SamplerDescriptor sampler_desc;
178 FS::BindTextureSampler(
179 cmd, gradient_texture,
180 renderer.GetContext()->GetSamplerLibrary()->GetSampler(sampler_desc));
181 VS::BindFrameInfo(cmd, pass.GetTransientsBuffer().EmplaceUniform(frame_info));
183 if (!pass.AddCommand(std::move(cmd))) {
187 if (geometry_result.prevent_overdraw) {
188 auto restore = ClipRestoreContents();
190 return restore.Render(renderer, entity, pass);
197 for (
Color& color : colors_) {
198 color = color_filter_proc(color);
200 decal_border_color_ = color_filter_proc(decal_border_color_);