20 return {a.width, a.height,
b};
28 bool SolidRSuperellipseBlurContents::SetPassInfo(
30 const ContentContext& renderer,
31 PassContext& pass_context)
const {
34 FS::FragInfo frag_info;
36 frag_info.center_adjust =
Concat(pass_context.center, pass_context.adjust);
37 frag_info.r1_exponent_exponentInv =
38 Vector3(pass_context.r1, pass_context.exponent, pass_context.exponentInv);
39 frag_info.sInv_minEdge_scale =
40 Vector3(pass_context.sInv, pass_context.minEdge, pass_context.scale);
45 RoundSuperellipseParam param =
49 Scalar retractionDepth = fmax(radius, 0.001);
51 frag_info.halfAxes_retractionDepth =
52 Concat3(rect.GetSize() / 2, retractionDepth);
54 auto compute_info = [radius](RoundSuperellipseParam::Octant& octant) {
55 if (octant.se_n < 1) {
59 const Scalar kReallyLargeN = 1e10;
60 return Vector4(kLargeSplitRadian, 0, kReallyLargeN, -1.0 / kReallyLargeN);
63 Point split_point =
Point(octant.se_a - radius, octant.se_a);
64 Scalar split_radian = std::atan2(split_point.x, split_point.y);
66 (1 - pow(1 + pow(tan(split_radian), n), -1.0 / n)) * octant.se_a;
67 return Vector4(split_radian, split_retraction, n, -1.0 / n);
69 frag_info.infoTop = compute_info(param.top_right.top);
70 frag_info.infoRight = compute_info(param.top_right.right);
72 auto compute_poly = [radius](RoundSuperellipseParam::Octant& octant) {
75 Scalar v0 = radius / octant.se_a * 3;
77 return Vector4(v0 + 2.0, -2.0 * v0 - 3.0, v0, 1.0);
79 frag_info.polyTop = compute_poly(param.top_right.top);
80 frag_info.polyRight = compute_poly(param.top_right.right);
83 auto& host_buffer = renderer.GetTransientsBuffer();
84 pass.SetCommandLabel(
"RSuperellipse Shadow");
85 pass.SetPipeline(renderer.GetRSuperellipseBlurPipeline(pass_context.opts));
87 FS::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info));
FragmentShader_ FragmentShader
static Vector4 Concat(Vector2 &a, Vector2 &b)
Scalar GetCornerRadius() const
SolidRSuperellipseBlurContents()
~SolidRSuperellipseBlurContents() override
LinePipeline::FragmentShader FS
static RoundSuperellipseParam MakeBoundsRadius(const Rect &bounds, Scalar radius)