/**
 * Copyright (c) 2020-2021 mol* contributors, licensed under MIT, See LICENSE file for more info.
 *
 * @author Alexander Rose <alexander.rose@weirdbyte.de>
 */
export declare const cylinders_frag = "\nprecision highp float;\nprecision highp int;\n\nuniform mat4 uView;\n\nvarying mat4 vTransform;\nvarying vec3 vStart;\nvarying vec3 vEnd;\nvarying float vSize;\nvarying float vCap;\n\nuniform vec3 uCameraDir;\nuniform vec3 uCameraPosition;\n\n#include common\n#include common_frag_params\n#include color_frag_params\n#include light_frag_params\n#include common_clip\n\n// adapted from https://www.shadertoy.com/view/4lcSRn\n// The MIT License, Copyright 2016 Inigo Quilez\nbool CylinderImpostor(\n    in vec3 rayOrigin, in vec3 rayDir,\n    in vec3 start, in vec3 end, in float radius,\n    out vec4 intersection, out bool interior\n){\n    vec3 ba = end - start;\n    vec3 oc = rayOrigin - start;\n\n    float baba = dot(ba, ba);\n    float bard = dot(ba, rayDir);\n    float baoc = dot(ba, oc);\n\n    float k2 = baba - bard*bard;\n    float k1 = baba * dot(oc, rayDir) - baoc * bard;\n    float k0 = baba * dot(oc, oc) - baoc * baoc - radius * radius * baba;\n\n    float h = k1 * k1 - k2 * k0;\n    if (h < 0.0) return false;\n\n    bool topCap = (vCap > 0.9 && vCap < 1.1) || vCap >= 2.9;\n    bool bottomCap = (vCap > 1.9 && vCap < 2.1) || vCap >= 2.9;\n\n    // body outside\n    h = sqrt(h);\n    float t = (-k1 - h) / k2;\n    float y = baoc + t * bard;\n    if (y > 0.0 && y < baba) {\n        interior = false;\n        intersection = vec4(t, (oc + t * rayDir - ba * y / baba) / radius);\n        return true;\n    }\n\n    if (topCap && y < 0.0) {\n        // top cap\n        t = -baoc / bard;\n        if (abs(k1 + k2 * t) < h) {\n            interior = false;\n            intersection = vec4(t, ba * sign(y) / baba);\n            return true;\n        }\n    } else if(bottomCap && y >= 0.0) {\n        // bottom cap\n        t = (baba - baoc) / bard;\n        if (abs(k1 + k2 * t) < h) {\n            interior = false;\n            intersection = vec4(t, ba * sign(y) / baba);\n            return true;\n        }\n    }\n\n    #ifdef dDoubleSided\n        // body inside\n        h = -h;\n        t = (-k1 - h) / k2;\n        y = baoc + t * bard;\n        if (y > 0.0 && y < baba) {\n            interior = true;\n            intersection = vec4(t, (oc + t * rayDir - ba * y / baba) / radius);\n            return true;\n        }\n\n        // TODO: handle inside caps???\n    #endif\n\n    return false;\n}\n\nvoid main() {\n    #include clip_pixel\n\n    vec3 rayDir = mix(normalize(vModelPosition - uCameraPosition), uCameraDir, uIsOrtho);\n\n    vec4 intersection;\n    bool interior;\n    bool hit = CylinderImpostor(vModelPosition, rayDir, vStart, vEnd, vSize, intersection, interior);\n    if (!hit) discard;\n\n    vec3 vViewPosition = vModelPosition + intersection.x * rayDir;\n    vViewPosition = (uView * vec4(vViewPosition, 1.0)).xyz;\n    gl_FragDepthEXT = calcDepth(vViewPosition);\n\n    // bugfix (mac only?)\n    if (gl_FragDepthEXT < 0.0) discard;\n    if (gl_FragDepthEXT > 1.0) discard;\n\n    float fragmentDepth = gl_FragDepthEXT;\n    #include assign_material_color\n\n    #if defined(dRenderVariant_pick)\n        #include check_picking_alpha\n        gl_FragColor = material;\n    #elif defined(dRenderVariant_depth)\n        gl_FragColor = material;\n    #elif defined(dRenderVariant_marking)\n        gl_FragColor = material;\n    #elif defined(dRenderVariant_color)\n        #ifdef dIgnoreLight\n            gl_FragColor = material;\n        #else\n            mat3 normalMatrix = transpose3(inverse3(mat3(uView)));\n            vec3 normal = normalize(normalMatrix * -normalize(intersection.yzw));\n            #include apply_light_color\n        #endif\n\n        #include apply_interior_color\n        #include apply_marker_color\n        #include apply_fog\n        #include wboit_write\n    #endif\n}\n";
