molstar
Version:
A comprehensive macromolecular library.
7 lines (6 loc) • 2.99 kB
TypeScript
/**
* Copyright (c) 2019-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
export declare const spheres_vert = "\nprecision highp float;\nprecision highp int;\n\n#include common\n#include read_from_texture\n#include common_vert_params\n#include color_vert_params\n#include size_vert_params\n#include common_clip\n\nuniform mat4 uModelView;\nuniform mat4 uInvProjection;\n\nattribute vec3 aPosition;\nattribute vec2 aMapping;\nattribute mat4 aTransform;\nattribute float aInstance;\nattribute float aGroup;\n\nvarying float vRadius;\nvarying float vRadiusSq;\nvarying vec3 vPoint;\nvarying vec3 vPointViewPosition;\n\n#include matrix_scale\n\nconst mat4 D = mat4(\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, -1.0\n);\n\n/**\n * Compute point size and center using the technique described in:\n * \"GPU-Based Ray-Casting of Quadratic Surfaces\" http://dl.acm.org/citation.cfm?id=2386396\n * by Christian Sigg, Tim Weyrich, Mario Botsch, Markus Gross.\n */\nvoid quadraticProjection(const in float radius, const in vec3 position){\n vec2 xbc, ybc;\n\n mat4 T = mat4(\n radius, 0.0, 0.0, 0.0,\n 0.0, radius, 0.0, 0.0,\n 0.0, 0.0, radius, 0.0,\n position.x, position.y, position.z, 1.0\n );\n\n mat4 R = transpose4(uProjection * uModelView * aTransform * T);\n float A = dot(R[3], D * R[3]);\n float B = -2.0 * dot(R[0], D * R[3]);\n float C = dot(R[0], D * R[0]);\n xbc[0] = (-B - sqrt(B * B - 4.0 * A * C)) / (2.0 * A);\n xbc[1] = (-B + sqrt(B * B - 4.0 * A * C)) / (2.0 * A);\n float sx = abs(xbc[0] - xbc[1]) * 0.5;\n\n A = dot(R[3], D * R[3]);\n B = -2.0 * dot(R[1], D * R[3]);\n C = dot(R[1], D * R[1]);\n ybc[0] = (-B - sqrt(B * B - 4.0 * A * C)) / (2.0 * A);\n ybc[1] = (-B + sqrt(B * B - 4.0 * A * C)) / (2.0 * A);\n float sy = abs(ybc[0] - ybc[1]) * 0.5;\n\n gl_Position.xy = vec2(0.5 * (xbc.x + xbc.y), 0.5 * (ybc.x + ybc.y));\n gl_Position.xy -= aMapping * vec2(sx, sy);\n gl_Position.xy *= gl_Position.w;\n}\n\n\nvoid main(void){\n #include assign_group\n #include assign_color_varying\n #include assign_marker_varying\n #include assign_clipping_varying\n #include assign_size\n\n vRadius = size * matrixScale(uModelView);\n\n vec4 position4 = vec4(aPosition, 1.0);\n vec4 mvPosition = uModelView * aTransform * position4;\n mvPosition.z -= vRadius; // avoid clipping, added again in fragment shader\n\n gl_Position = uProjection * vec4(mvPosition.xyz, 1.0);\n quadraticProjection(size, aPosition);\n\n vRadiusSq = vRadius * vRadius;\n vec4 vPoint4 = uInvProjection * gl_Position;\n vPoint = vPoint4.xyz / vPoint4.w;\n vPointViewPosition = -mvPosition.xyz / mvPosition.w;\n\n vModelPosition = (uModel * aTransform * position4).xyz; // for clipping in frag shader\n\n #include clip_instance\n}\n";