1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
#ifdef PURE_OPENGL_ES_2
precision highp float;
#endif
#include webgl_header.vs
attribute vec4 attr_targetpos;
attribute vec4 attr_worldpos;
attribute vec3 attr_screenoffset;
attribute vec2 attr_texcoords;
attribute vec3 attr_screenworldoffset;
attribute vec4 attr_pickcolor;
attribute float attr_relative_mode;
varying vec2 textureLookup ;
varying vec3 normalizedViewCoordinate;
varying vec4 pickcolor ;
uniform vec2 screenSize;
uniform float screenOriginVertexScale;
uniform float scaleByVertexScale;
uniform float labelTextureSize;
varying float fog;
uniform float front;
uniform float clipRange;
vec4 normalizeVec4(vec4 point){
return vec4(point.xyz/point.w, 1.);
}
float convertNormalZToScreenZ(float normalz){
float a_centerN = (normalz + 1.) / 2.;
float ptInPreProjectionZ = -(front + clipRange * a_centerN);
vec4 ptInPreProjection = vec4(0., 0., ptInPreProjectionZ, 1.);
vec4 projVect = g_ProjectionMatrix * ptInPreProjection;
return projVect.z / projVect.w;
}
void main()
{
float drawConnector, isProjected, isScreenCoord, isPixelCoord, zTarget;
drawConnector = step(1., mod(attr_relative_mode, 2.));
isScreenCoord = step(2., mod(attr_relative_mode, 4.));
isPixelCoord = step(4., mod(attr_relative_mode, 8.));
zTarget = step(8., mod(attr_relative_mode, 16.));
isProjected = step(isPixelCoord + isScreenCoord, 0.5);
vec3 viewVector = vec3(vec4(0.,0.,-1.,0.) * g_ModelViewMatrix);
float sovx = screenOriginVertexScale;
#ifdef openvr_enabled
// calc real view vector for label (not negative z-axis in camera space)
vec3 camPos = vec4(gl_ModelViewMatrixInverse * vec4(0.,0.,0.,1.)).xyz;
viewVector = normalize(attr_worldpos.xyz - camPos);
// don't use vertexscale for openvr, because the scale is calced from Pos.z as a distance
sovx = 1.0 / 2.0;
#endif
float screenVertexScale = scaleByVertexScale * sovx * labelTextureSize + (1. - scaleByVertexScale);
vec4 transformedPosition = g_ProjectionMatrix * g_ModelViewMatrix * attr_worldpos;
vec4 targetPosition = normalizeVec4(g_ProjectionMatrix * g_ModelViewMatrix * attr_targetpos);
transformedPosition.xyz = transformedPosition.xyz/transformedPosition.w;
transformedPosition.xy = ( floor(transformedPosition.xy * screenSize + .5 ) + .5 ) / screenSize;
vec4 a_center = (attr_worldpos + attr_screenworldoffset.z * vec4(viewVector, 0.));
vec4 transformedPositionZ = g_ProjectionMatrix * g_ModelViewMatrix * a_center;
transformedPositionZ.xyz = transformedPositionZ.xyz/transformedPositionZ.w;
transformedPositionZ.w = 1.;
vec2 pixOffset = ((2. * attr_worldpos.xy / screenSize) - 1.);
transformedPosition = isProjected * transformedPosition + isScreenCoord * attr_worldpos + isPixelCoord * vec4(pixOffset.x, pixOffset.y, -0.5, 0.);
transformedPosition.xy = transformedPosition.xy + attr_screenworldoffset.xy/(screenSize*sovx);
transformedPosition.z = (1.-zTarget) * ((isProjected * transformedPositionZ.z) + (1.-isProjected) * convertNormalZToScreenZ(attr_worldpos.z)) + zTarget * targetPosition.z;
transformedPosition.xy += attr_screenoffset.xy * 2./(screenSize.xy*screenVertexScale);
transformedPosition.w = 1.;
gl_Position = transformedPosition;
textureLookup = attr_texcoords;
normalizedViewCoordinate = (gl_Position.xyz/gl_Position.w) / 2.0 + 0.5;
#ifdef depth_cue
vec3 eye_pos = mix(attr_worldpos, g_ModelViewMatrix * attr_worldpos, isProjected).xyz;
fog = (g_Fog_end + eye_pos.z) * g_Fog_scale;
fog = max(fog, 0.0);
#else
fog = 1.1; // >= 1.0
#endif
pickcolor = attr_pickcolor;
}
|