27 tile_mode_ = tile_mode;
31 colors_ = std::move(colors);
35 stops_ = std::move(stops);
50 for (
auto color : colors_) {
51 if (!color.IsOpaque()) {
62 return RenderSSBO(renderer, entity, pass);
64 return RenderTexture(renderer, entity, pass);
67 bool RadialGradientContents::RenderSSBO(
const ContentContext& renderer,
73 FS::FragInfo frag_info;
74 frag_info.center = center_;
75 frag_info.radius = radius_;
76 frag_info.tile_mode =
static_cast<Scalar>(tile_mode_);
77 frag_info.decal_border_color = decal_border_color_;
83 frag_info.colors_length = colors.size();
85 host_buffer.Emplace(colors.data(), colors.size() *
sizeof(
StopData),
88 VS::FrameInfo frame_info;
96 auto geometry_result =
97 GetGeometry()->GetPositionBuffer(renderer, entity, pass);
99 if (geometry_result.prevent_overdraw) {
103 options.primitive_type = geometry_result.type;
106 cmd.
BindVertices(std::move(geometry_result.vertex_buffer));
108 FS::BindColorData(cmd, color_buffer);
115 if (geometry_result.prevent_overdraw) {
116 auto restore = ClipRestoreContents();
118 return restore.Render(renderer, entity, pass);
123 bool RadialGradientContents::RenderTexture(
const ContentContext& renderer,
124 const Entity& entity,
125 RenderPass& pass)
const {
130 auto gradient_texture =
132 if (gradient_texture ==
nullptr) {
136 FS::FragInfo frag_info;
137 frag_info.center = center_;
138 frag_info.radius = radius_;
139 frag_info.tile_mode =
static_cast<Scalar>(tile_mode_);
140 frag_info.decal_border_color = decal_border_color_;
141 frag_info.texture_sampler_y_coord_scale = gradient_texture->GetYCoordScale();
143 frag_info.half_texel =
Vector2(0.5 / gradient_texture->GetSize().width,
144 0.5 / gradient_texture->GetSize().height);
146 auto geometry_result =
147 GetGeometry()->GetPositionBuffer(renderer, entity, pass);
149 VS::FrameInfo frame_info;
150 frame_info.mvp = geometry_result.transform;
155 cmd.stencil_reference = entity.GetClipDepth();
158 if (geometry_result.prevent_overdraw) {
162 options.primitive_type = geometry_result.type;
163 cmd.pipeline = renderer.GetRadialGradientFillPipeline(options);
165 cmd.BindVertices(std::move(geometry_result.vertex_buffer));
166 FS::BindFragInfo(cmd, pass.GetTransientsBuffer().EmplaceUniform(frag_info));
167 SamplerDescriptor sampler_desc;
170 FS::BindTextureSampler(
171 cmd, gradient_texture,
172 renderer.GetContext()->GetSamplerLibrary()->GetSampler(sampler_desc));
173 VS::BindFrameInfo(cmd, pass.GetTransientsBuffer().EmplaceUniform(frame_info));
175 if (!pass.AddCommand(std::move(cmd))) {
179 if (geometry_result.prevent_overdraw) {
180 auto restore = ClipRestoreContents();
182 return restore.Render(renderer, entity, pass);
189 for (
Color& color : colors_) {
190 color = color_filter_proc(color);
192 decal_border_color_ = color_filter_proc(decal_border_color_);