Skip to content

Custom Shaders: Error while parsing WHEN! #345

@natural-harmonia-gropius

Description

But it works fine without rotate 0.0 = ! +, that's strange.

Shader:

//!PARAM rotate
//!TYPE float
0.0

//!PARAM translate_x
//!TYPE float
0.0

//!PARAM translate_y
//!TYPE float
0.0

//!PARAM scale_x
//!TYPE float
1.0

//!PARAM scale_y
//!TYPE float
1.0

//!PARAM skew_x
//!TYPE float
0.0

//!PARAM skew_y
//!TYPE float
0.0

//!PARAM background
//!TYPE ENUM int
black
border
repeat
mirror

//!HOOK OUTPUT
//!BIND HOOKED
//!DESC transform
//!WHEN scale_x 1.0 = ! scale_y 1.0 = ! + translate_x 0.0 = ! + translate_y 0.0 = ! + skew_x 0.0 = ! + skew_y 0.0 = ! + rotate 0.0 = ! +

mat3 make_rotate(float deg) {
    float rad = radians(deg);
    float c = cos(rad);
    float s = sin(rad);
    return mat3(
        c, -s, 0.0,
        s, c, 0.0,
        0.0, 0.0, 1.0
    );
}

mat3 make_translate(vec2 offset) {
    return mat3(
        1.0, 0.0, 0.0,
        0.0, 1.0, 0.0,
        -offset.x, -offset.y, 1.0
    );
}

mat3 make_scale(vec2 scale) {
    return mat3(
        1.0 / scale.x, 0.0, 0.0,
        0.0, 1.0 / scale.y, 0.0,
        0.0, 0.0, 1.0
    );
}

mat3 make_skew(vec2 deg) {
    vec2 rad = radians(deg);
    return mat3(
        1.0, -tan(rad.y), 0.0,
        -tan(rad.x), 1.0, 0.0,
        0.0, 0.0, 1.0
    );
}

vec2 apply_transform(vec2 coord, mat3 matrix) {
    vec3 homogeneous = vec3(coord, 1.0);
    vec3 transformed = matrix * homogeneous;
    return transformed.xy / transformed.z;
}

vec4 hook() {
    vec2 pos = HOOKED_pos;
    vec2 size = HOOKED_size;
    vec2 center = vec2(0.5, 0.5);

    pos = apply_transform(pos,
        make_translate(-center) *
        make_scale(size) *
        make_rotate(rotate) *
        make_scale(1.0 / size) *
        make_translate(vec2(translate_x, translate_y)) *
        make_scale(vec2(scale_x, scale_y)) *
        make_skew(vec2(skew_x, skew_y)) *
        make_translate(center)
    );

    bool out_of_bounds = pos.x < 0.0 || pos.x > 1.0 || pos.y < 0.0 || pos.y > 1.0;
    if (out_of_bounds) {
        if (background == black) {
            return vec4(vec3(0.0), 1.0);
        } else if (background == border) {
            pos = clamp(pos, 0.0, 1.0);
        } else if (background == repeat) {
            pos = mod(pos, 1.0);
        } else if (background == mirror) {
            pos = 1.0 - abs(fract(pos * 0.5) * 2.0 - 1.0);
        }
    }

    return HOOKED_tex(pos);
}

log:

[   0.251][d][global] config path: 'shaders/hdr-toys/utils/transform.glsl' -> 'D:/OneDrive/应用/mpv/portable_config/shaders/hdr-toys/utils/transform.glsl'
[   0.251][d][global] user path: '~~/shaders/hdr-toys/utils/transform.glsl' -> 'D:/OneDrive/应用/mpv/portable_config/shaders/hdr-toys/utils/transform.glsl'
[   0.257][v][vo/gpu-next/libplacebo] Registering named parameter 'rotate'
[   0.257][v][vo/gpu-next/libplacebo] Registering named parameter 'translate_x'
[   0.257][v][vo/gpu-next/libplacebo] Registering named parameter 'translate_y'
[   0.257][v][vo/gpu-next/libplacebo] Registering named parameter 'scale_x'
[   0.257][v][vo/gpu-next/libplacebo] Registering named parameter 'scale_y'
[   0.257][v][vo/gpu-next/libplacebo] Registering named parameter 'skew_x'
[   0.257][v][vo/gpu-next/libplacebo] Registering named parameter 'skew_y'
[   0.257][v][vo/gpu-next/libplacebo] Registering named parameter 'background'
[   0.257][e][vo/gpu-next/libplacebo] Error while parsing WHEN!
[   0.257][e][vo/gpu-next/libplacebo] Failed to parse user shader:
[   0.257][e][vo/gpu-next/libplacebo] [  1] //!PARAM rotate
[   0.257][e][vo/gpu-next/libplacebo] [  2] //!TYPE float
[   0.257][e][vo/gpu-next/libplacebo] [  3] 0.0
[   0.257][e][vo/gpu-next/libplacebo] [  4] 
[   0.257][e][vo/gpu-next/libplacebo] [  5] //!PARAM translate_x
[   0.257][e][vo/gpu-next/libplacebo] [  6] //!TYPE float
[   0.257][e][vo/gpu-next/libplacebo] [  7] 0.0
[   0.258][e][vo/gpu-next/libplacebo] [  8] 
[   0.258][e][vo/gpu-next/libplacebo] [  9] //!PARAM translate_y
[   0.258][e][vo/gpu-next/libplacebo] [ 10] //!TYPE float
[   0.258][e][vo/gpu-next/libplacebo] [ 11] 0.0
[   0.258][e][vo/gpu-next/libplacebo] [ 12] 
[   0.258][e][vo/gpu-next/libplacebo] [ 13] //!PARAM scale_x
[   0.258][e][vo/gpu-next/libplacebo] [ 14] //!TYPE float
[   0.258][e][vo/gpu-next/libplacebo] [ 15] 1.0
[   0.258][e][vo/gpu-next/libplacebo] [ 16] 
[   0.258][e][vo/gpu-next/libplacebo] [ 17] //!PARAM scale_y
[   0.258][e][vo/gpu-next/libplacebo] [ 18] //!TYPE float
[   0.258][e][vo/gpu-next/libplacebo] [ 19] 1.0
[   0.258][e][vo/gpu-next/libplacebo] [ 20] 
[   0.258][e][vo/gpu-next/libplacebo] [ 21] //!PARAM skew_x
[   0.258][e][vo/gpu-next/libplacebo] [ 22] //!TYPE float
[   0.258][e][vo/gpu-next/libplacebo] [ 23] 0.0
[   0.258][e][vo/gpu-next/libplacebo] [ 24] 
[   0.258][e][vo/gpu-next/libplacebo] [ 25] //!PARAM skew_y
[   0.258][e][vo/gpu-next/libplacebo] [ 26] //!TYPE float
[   0.258][e][vo/gpu-next/libplacebo] [ 27] 0.0
[   0.258][e][vo/gpu-next/libplacebo] [ 28] 
[   0.258][e][vo/gpu-next/libplacebo] [ 29] //!PARAM background
[   0.258][e][vo/gpu-next/libplacebo] [ 30] //!TYPE ENUM int
[   0.258][e][vo/gpu-next/libplacebo] [ 31] black
[   0.258][e][vo/gpu-next/libplacebo] [ 32] border
[   0.258][e][vo/gpu-next/libplacebo] [ 33] repeat
[   0.258][e][vo/gpu-next/libplacebo] [ 34] mirror
[   0.258][e][vo/gpu-next/libplacebo] [ 35] 
[   0.258][e][vo/gpu-next/libplacebo] [ 36] //!HOOK OUTPUT
[   0.258][e][vo/gpu-next/libplacebo] [ 37] //!BIND HOOKED
[   0.258][e][vo/gpu-next/libplacebo] [ 38] //!DESC transform
[   0.258][e][vo/gpu-next/libplacebo] [ 39] //!WHEN scale_x 1.0 = ! scale_y 1.0 = ! + translate_x 0.0 = ! + translate_y 0.0 = ! + skew_x 0.0 = ! + skew_y 0.0 = ! + rotate 0.0 = ! +
[   0.258][e][vo/gpu-next/libplacebo] [ 40] 
[   0.258][e][vo/gpu-next/libplacebo] [ 41] mat3 make_rotate(float deg) {
[   0.258][e][vo/gpu-next/libplacebo] [ 42]     float rad = radians(deg);
[   0.258][e][vo/gpu-next/libplacebo] [ 43]     float c = cos(rad);
[   0.258][e][vo/gpu-next/libplacebo] [ 44]     float s = sin(rad);
[   0.258][e][vo/gpu-next/libplacebo] [ 45]     return mat3(
[   0.258][e][vo/gpu-next/libplacebo] [ 46]         c, -s, 0.0,
[   0.258][e][vo/gpu-next/libplacebo] [ 47]         s, c, 0.0,
[   0.258][e][vo/gpu-next/libplacebo] [ 48]         0.0, 0.0, 1.0
[   0.258][e][vo/gpu-next/libplacebo] [ 49]     );
[   0.258][e][vo/gpu-next/libplacebo] [ 50] }
[   0.258][e][vo/gpu-next/libplacebo] [ 51] 
[   0.258][e][vo/gpu-next/libplacebo] [ 52] mat3 make_translate(vec2 offset) {
[   0.258][e][vo/gpu-next/libplacebo] [ 53]     return mat3(
[   0.258][e][vo/gpu-next/libplacebo] [ 54]         1.0, 0.0, 0.0,
[   0.258][e][vo/gpu-next/libplacebo] [ 55]         0.0, 1.0, 0.0,
[   0.258][e][vo/gpu-next/libplacebo] [ 56]         -offset.x, -offset.y, 1.0
[   0.258][e][vo/gpu-next/libplacebo] [ 57]     );
[   0.258][e][vo/gpu-next/libplacebo] [ 58] }
[   0.258][e][vo/gpu-next/libplacebo] [ 59] 
[   0.258][e][vo/gpu-next/libplacebo] [ 60] mat3 make_scale(vec2 scale) {
[   0.258][e][vo/gpu-next/libplacebo] [ 61]     return mat3(
[   0.258][e][vo/gpu-next/libplacebo] [ 62]         1.0 / scale.x, 0.0, 0.0,
[   0.258][e][vo/gpu-next/libplacebo] [ 63]         0.0, 1.0 / scale.y, 0.0,
[   0.258][e][vo/gpu-next/libplacebo] [ 64]         0.0, 0.0, 1.0
[   0.258][e][vo/gpu-next/libplacebo] [ 65]     );
[   0.258][e][vo/gpu-next/libplacebo] [ 66] }
[   0.258][e][vo/gpu-next/libplacebo] [ 67] 
[   0.258][e][vo/gpu-next/libplacebo] [ 68] mat3 make_skew(vec2 deg) {
[   0.258][e][vo/gpu-next/libplacebo] [ 69]     vec2 rad = radians(deg);
[   0.258][e][vo/gpu-next/libplacebo] [ 70]     return mat3(
[   0.258][e][vo/gpu-next/libplacebo] [ 71]         1.0, -tan(rad.y), 0.0,
[   0.258][e][vo/gpu-next/libplacebo] [ 72]         -tan(rad.x), 1.0, 0.0,
[   0.258][e][vo/gpu-next/libplacebo] [ 73]         0.0, 0.0, 1.0
[   0.258][e][vo/gpu-next/libplacebo] [ 74]     );
[   0.258][e][vo/gpu-next/libplacebo] [ 75] }
[   0.258][e][vo/gpu-next/libplacebo] [ 76] 
[   0.258][e][vo/gpu-next/libplacebo] [ 77] vec2 apply_transform(vec2 coord, mat3 matrix) {
[   0.258][e][vo/gpu-next/libplacebo] [ 78]     vec3 homogeneous = vec3(coord, 1.0);
[   0.258][e][vo/gpu-next/libplacebo] [ 79]     vec3 transformed = matrix * homogeneous;
[   0.258][e][vo/gpu-next/libplacebo] [ 80]     return transformed.xy / transformed.z;
[   0.258][e][vo/gpu-next/libplacebo] [ 81] }
[   0.258][e][vo/gpu-next/libplacebo] [ 82] 
[   0.258][e][vo/gpu-next/libplacebo] [ 83] vec4 hook() {
[   0.258][e][vo/gpu-next/libplacebo] [ 84]     vec2 pos = HOOKED_pos;
[   0.258][e][vo/gpu-next/libplacebo] [ 85]     vec2 size = HOOKED_size;
[   0.258][e][vo/gpu-next/libplacebo] [ 86]     vec2 center = vec2(0.5, 0.5);
[   0.258][e][vo/gpu-next/libplacebo] [ 87] 
[   0.258][e][vo/gpu-next/libplacebo] [ 88]     pos = apply_transform(pos,
[   0.258][e][vo/gpu-next/libplacebo] [ 89]         make_translate(-center) *
[   0.258][e][vo/gpu-next/libplacebo] [ 90]         make_scale(size) *
[   0.258][e][vo/gpu-next/libplacebo] [ 91]         make_rotate(rotate) *
[   0.258][e][vo/gpu-next/libplacebo] [ 92]         make_scale(1.0 / size) *
[   0.258][e][vo/gpu-next/libplacebo] [ 93]         make_translate(vec2(translate_x, translate_y)) *
[   0.258][e][vo/gpu-next/libplacebo] [ 94]         make_scale(vec2(scale_x, scale_y)) *
[   0.258][e][vo/gpu-next/libplacebo] [ 95]         make_skew(vec2(skew_x, skew_y)) *
[   0.258][e][vo/gpu-next/libplacebo] [ 96]         make_translate(center)
[   0.258][e][vo/gpu-next/libplacebo] [ 97]     );
[   0.258][e][vo/gpu-next/libplacebo] [ 98] 
[   0.258][e][vo/gpu-next/libplacebo] [ 99]     bool out_of_bounds = pos.x < 0.0 || pos.x > 1.0 || pos.y < 0.0 || pos.y > 1.0;
[   0.258][e][vo/gpu-next/libplacebo] [100]     if (out_of_bounds) {
[   0.258][e][vo/gpu-next/libplacebo] [101]         if (background == black) {
[   0.258][e][vo/gpu-next/libplacebo] [102]             return vec4(vec3(0.0), 1.0);
[   0.258][e][vo/gpu-next/libplacebo] [103]         } else if (background == border) {
[   0.258][e][vo/gpu-next/libplacebo] [104]             pos = clamp(pos, 0.0, 1.0);
[   0.258][e][vo/gpu-next/libplacebo] [105]         } else if (background == repeat) {
[   0.258][e][vo/gpu-next/libplacebo] [106]             pos = mod(pos, 1.0);
[   0.258][e][vo/gpu-next/libplacebo] [107]         } else if (background == mirror) {
[   0.258][e][vo/gpu-next/libplacebo] [108]             pos = 1.0 - abs(fract(pos * 0.5) * 2.0 - 1.0);
[   0.258][e][vo/gpu-next/libplacebo] [109]         }
[   0.258][e][vo/gpu-next/libplacebo] [110]     }
[   0.258][e][vo/gpu-next/libplacebo] [111] 
[   0.258][e][vo/gpu-next/libplacebo] [112]     return HOOKED_tex(pos);
[   0.258][e][vo/gpu-next/libplacebo] [113] }
[   0.259][e][vo/gpu-next/libplacebo]   Backtrace:
[   0.260][e][vo/gpu-next/libplacebo]     #0  0x7ff766d483cf in pl_mpv_user_shader_parse+0x46df (D:\OneDrive\应用\mpv\mpv.exe+0x11d83cf) (0x1411d83cf)
[   0.261][e][vo/gpu-next/libplacebo]     #1  0x7ff766beca34 in mpv_render_context_get_info+0x18fa4 (D:\OneDrive\应用\mpv\mpv.exe+0x107ca34) (0x14107ca34)
[   0.261][e][vo/gpu-next/libplacebo]     #2  0x7ff766be7907 in mpv_render_context_get_info+0x13e77 (D:\OneDrive\应用\mpv\mpv.exe+0x1077907) (0x141077907)
[   0.261][e][vo/gpu-next/libplacebo]     #3  0x7ff766bcf9fb in mpv_stream_cb_add_ro+0x96f0b (D:\OneDrive\应用\mpv\mpv.exe+0x105f9fb) (0x14105f9fb)
[   0.263][e][vo/gpu-next/libplacebo]     #4  0x7ff87c1737af in wcsrchr+0x14f (C:\WINDOWS\System32\ucrtbase.dll+0x37af) (0x1800037af)
[   0.264][e][vo/gpu-next/libplacebo]     #5  0x7ff87d1de8d6 in BaseThreadInitThunk+0x16 (C:\WINDOWS\System32\KERNEL32.DLL+0x2e8d6) (0x18002e8d6)
[   0.266][e][vo/gpu-next/libplacebo]     #6  0x7ff87e8e8d9b in RtlUserThreadStart+0x2b (C:\WINDOWS\SYSTEM32\ntdll.dll+0x8d9b) (0x180008d9b)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions