Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b092dbb3 authored by Sherry Zhou's avatar Sherry Zhou
Browse files

Support weather effects parallax in Magic Portrait

Apply martix to coordinates in shader

Flag: EXEMPT only change in Magic Portrait
Bug: 370461498
Test: manual test wake, unlock the device, and swipe in homescreen,
observe the weather animation will move with wallpaper. For snow
effects, the acccumulated snow will move with foreground; for rain
effects, the rain on glass won't move and showers and splashes move with
parallax.

Change-Id: Idb914a584a20f291dbc5c23d639216f60b9ca141
parent ef7d6b41
Loading
Loading
Loading
Loading

.gitignore

0 → 100644
+1 −0
Original line number Diff line number Diff line
/weathereffects/graphics/build/
+8 −9
Original line number Diff line number Diff line
@@ -20,15 +20,13 @@ uniform shader fog;
uniform shader clouds;
uniform half2 fogSize;
uniform half2 cloudsSize;
uniform float2 uvOffsetFgd;
uniform float2 uvScaleFgd;
uniform float2 uvOffsetBgd;
uniform float2 uvScaleBgd;
uniform half4 time;
uniform half screenAspectRatio;
uniform half2 screenSize;
uniform half pixelDensity;
uniform half intensity;
uniform mat3 transformMatrixFgd;
uniform mat3 transformMatrixBgd;

#include "shaders/constants.agsl"
#include "shaders/utils.agsl"
@@ -37,9 +35,6 @@ uniform half intensity;
const vec3 fogColor = vec3(0.20);

vec4 main(float2 fragCoord) {
    float2 uv = fragCoord / screenSize;
    uv.y /= screenAspectRatio;

    vec2 timeForeground = vec2(time.x, time.y);
    vec2 timeBackground = vec2(time.z, time.w);

@@ -52,12 +47,16 @@ vec4 main(float2 fragCoord) {
     * - fgdFogFar (layer 1) / fgdFogClose (layer 2)
     */

    float2 fgdCoord = transformPoint(transformMatrixFgd, fragCoord);
    float2 bgdCoord = transformPoint(transformMatrixBgd, fragCoord);
    float2 uv = bgdCoord / screenSize;
    uv.y /= screenAspectRatio;
    // Load foreground and blend it with constant solid fog color.
    vec4 fgd = foreground.eval(fragCoord * uvScaleFgd + uvOffsetFgd);
    vec4 fgd = foreground.eval(fgdCoord);
    fgd.rgb = mix(fgd.rgb, fogColor, 0.15 * intensity * fgd.a);

    // Load background and blend it with constant solid fog color.
    vec4 bgd = background.eval(fragCoord * uvScaleBgd + uvOffsetBgd);
    vec4 bgd = background.eval(bgdCoord);
    bgd.rgb = mix(bgd.rgb, fogColor, 0.32 * intensity * bgd.a);

    /* Add first layer: background. */
+8 −10
Original line number Diff line number Diff line
@@ -17,15 +17,13 @@
uniform shader foreground;
uniform shader background;
uniform shader outlineBuffer;
uniform float2 uvOffsetFgd;
uniform float2 uvScaleFgd;
uniform float2 uvOffsetBgd;
uniform float2 uvScaleBgd;
uniform float time;
uniform float screenAspectRatio;
uniform float gridScale;
uniform float2 screenSize;
uniform half intensity;
uniform mat3 transformMatrixFgd;
uniform mat3 transformMatrixBgd;

#include "shaders/constants.agsl"
#include "shaders/utils.agsl"
@@ -57,7 +55,7 @@ vec3 drawSplashes(vec2 uv, vec2 fragCoord, vec3 color) {
    vec2 pixUv = cellUv;
    pixUv.x *= -1;
    vec2 pixDistance = screenSize * pixUv / gridSize;
    float2 uvTextureFgd = (fragCoord + pixDistance) * uvScaleFgd + uvOffsetFgd;
    float2 uvTextureFgd =  transformPoint(transformMatrixFgd, fragCoord + pixDistance);

    float outline = step(0.1, outlineBuffer.eval(uvTextureFgd).r);
    if (outline < 0.1) {
@@ -81,11 +79,11 @@ vec3 drawSplashes(vec2 uv, vec2 fragCoord, vec3 color) {
}

vec4 main(float2 fragCoord) {
    float2 uv = fragCoord / screenSize;

    // Adjusts the UVs to have the expected rect of the image.
    float2 uvTextureFgd = fragCoord * uvScaleFgd + uvOffsetFgd;
    float2 uvTextureBgd = fragCoord * uvScaleBgd + uvOffsetBgd;
    // Apply transform matrix to fragCoord
    float2 uvTextureFgd = transformPoint(transformMatrixFgd, fragCoord);
    float2 uvTextureBgd = transformPoint(transformMatrixBgd, fragCoord);
    // Calculate uv for snow based on transformed coordinates
    float2 uv = uvTextureFgd / screenSize;

    vec4 colorForeground = foreground.eval(uvTextureFgd);
    vec4 color = background.eval(uvTextureBgd);
+11 −11
Original line number Diff line number Diff line
@@ -18,14 +18,12 @@ uniform shader foreground;
uniform shader background;
uniform shader accumulatedSnow;
uniform shader noise;
uniform float2 uvOffsetFgd;
uniform float2 uvScaleFgd;
uniform float2 uvOffsetBgd;
uniform float2 uvScaleBgd;
uniform float2 gridSize;
uniform float time;
uniform float screenAspectRatio;
uniform float2 screenSize;
uniform mat3 transformMatrixFgd;
uniform mat3 transformMatrixBgd;

#include "shaders/constants.agsl"
#include "shaders/utils.agsl"
@@ -42,9 +40,6 @@ const float midSnowLayerIndex = 3;
const float closestSnowLayerIndex = 0;

vec4 main(float2 fragCoord) {
    float2 uv = fragCoord / screenSize;
    float2 uvAdjusted = vec2(uv.x, uv.y / screenAspectRatio);

    /**
     * The effect is consisted of 2 image textures (foreground and background) + 10 layers of
     * snow + 1 layer of snow accumulation. Below describes the rendering order (back to front):
@@ -55,11 +50,16 @@ vec4 main(float2 fragCoord) {
     * 5. Foreground snow layers (from mid layer to closest layer)
     */

    // Adjusts the UVs to have the expected rect of the image.
    float2 adjustedUvForeground = fragCoord * uvScaleFgd + uvOffsetFgd;
    vec4 colorForeground = foreground.eval(adjustedUvForeground);
    vec4 colorBackground = background.eval(fragCoord * uvScaleBgd + uvOffsetBgd);
    // Apply transform matrix to fragCoord
    float2 adjustedUvForeground = transformPoint(transformMatrixFgd, fragCoord);
    float2 adjustedUvBackground = transformPoint(transformMatrixBgd, fragCoord);

    // Calculate uv for snow based on transformed coordinates
    float2 uv = adjustedUvBackground / screenSize;
    float2 uvAdjusted = vec2(uv.x, uv.y / screenAspectRatio);

    vec4 colorForeground = foreground.eval(adjustedUvForeground);
    vec4 colorBackground = background.eval(adjustedUvBackground);
    // 1. Draw background.
    vec4 color = colorBackground;

+11 −7
Original line number Diff line number Diff line
@@ -16,14 +16,13 @@

uniform shader foreground;
uniform shader background;
uniform float2 uvOffsetFgd;
uniform float2 uvScaleFgd;
uniform float2 uvOffsetBgd;
uniform float2 uvScaleBgd;
uniform float screenAspectRatio;
uniform float2 screenSize;
uniform float time;
uniform float intensity;
uniform mat3 transformMatrixFgd;
uniform mat3 transformMatrixBgd;


#include "shaders/constants.agsl"
#include "shaders/utils.agsl"
@@ -32,11 +31,16 @@ uniform float intensity;
#include "shaders/lens_flare.agsl"

vec4 main(float2 fragCoord) {
    float2 uv = fragCoord / screenSize;
    // Apply transform matrix to fragCoord
    float2 adjustedUvForeground = transformPoint(transformMatrixFgd, fragCoord);
    float2 adjustedUvBackground = transformPoint(transformMatrixBgd, fragCoord);


    float2 uv = adjustedUvBackground / screenSize;
    uv.y /= screenAspectRatio;

    vec4 colorForeground = foreground.eval(fragCoord * uvScaleFgd + uvOffsetFgd);
    vec4 color = background.eval(fragCoord * uvScaleBgd + uvOffsetBgd);
    vec4 colorForeground = foreground.eval(adjustedUvForeground);
    vec4 color = background.eval(adjustedUvBackground);

    // TODO(b/347299395): to add flare and sun effect background

Loading