SkV3 viewportResolution = SkV3{(float)mWidth, (float)mHeight, 1.0f};
const float playbackTime = duration != 0.0 ? frame * duration : 0.0;
constexpr char prog1[] = R"(
uniform float3 iResolution; // Viewport resolution (pixels)
uniform float iTime; // Shader playback time (s)
uniform float3 iImageResolution; // iImage1 resolution (pixels)
in fragmentProcessor iImage1; // An input image.
void main(float2 FC, inout half4 o) {
o = half4(0);
float2 p = float2(0), c=p, u=FC.xy*2.-iResolution.xy;
float a;
for (float i=0; i<4e2; i++) {
a = i/2e2-1.;
p = cos(i*2.4+iTime+float2(0,11))*sqrt(1.-a*a);
c = u/iResolution.y+float2(p.x,a)/(p.y+2.);
o += half4((cos(i+float4(0,2,4,0))+1.)/dot(c,c)*(1.-p.y)/3e4);
}
}
)";
auto [effect1, err1] = SkRuntimeEffect::Make(SkString(prog1));
struct Uniforms
{
SkV3 iResolution;
float iTime;
SkV3 iImageResolution;
} uniform;
uniform.iResolution = viewportResolution;
uniform.iTime = playbackTime;
uniform.iImageResolution = SkV3{static_cast<float>(image->width()),
static_cast<float>(image->height()), 1.0f};
sk_sp<SkData> data = SkData::MakeWithCopy(&uniform, sizeof(uniform));
sk_sp<SkShader> children[] = {image->makeShader()};
sk_sp<SkShader> shader1 = effect1->makeShader(data, children, 1, nullptr, true);
mCanvas->clear(SK_ColorBLACK);
SkPaint p;
p.setShader(shader1);
mCanvas->drawPaint(p);
mCanvas->flush();
eglSwapBuffers(mEglDisplay, mEglSurface);