1attribute vec3 attr_Position; 2attribute vec3 attr_Normal; 3 4attribute vec4 attr_TexCoord0; 5 6#if defined(USE_VERTEX_ANIMATION) 7attribute vec3 attr_Position2; 8attribute vec3 attr_Normal2; 9#elif defined(USE_BONE_ANIMATION) 10attribute vec4 attr_BoneIndexes; 11attribute vec4 attr_BoneWeights; 12#endif 13 14uniform vec4 u_FogDistance; 15uniform vec4 u_FogDepth; 16uniform float u_FogEyeT; 17 18#if defined(USE_DEFORM_VERTEXES) 19uniform int u_DeformGen; 20uniform float u_DeformParams[5]; 21#endif 22 23uniform float u_Time; 24uniform mat4 u_ModelViewProjectionMatrix; 25 26#if defined(USE_VERTEX_ANIMATION) 27uniform float u_VertexLerp; 28#elif defined(USE_BONE_ANIMATION) 29uniform mat4 u_BoneMatrix[MAX_GLSL_BONES]; 30#endif 31 32uniform vec4 u_Color; 33 34varying float var_Scale; 35 36#if defined(USE_DEFORM_VERTEXES) 37vec3 DeformPosition(const vec3 pos, const vec3 normal, const vec2 st) 38{ 39 if (u_DeformGen == 0) 40 { 41 return pos; 42 } 43 44 float base = u_DeformParams[0]; 45 float amplitude = u_DeformParams[1]; 46 float phase = u_DeformParams[2]; 47 float frequency = u_DeformParams[3]; 48 float spread = u_DeformParams[4]; 49 50 if (u_DeformGen == DGEN_BULGE) 51 { 52 phase *= st.x; 53 } 54 else // if (u_DeformGen <= DGEN_WAVE_INVERSE_SAWTOOTH) 55 { 56 phase += dot(pos.xyz, vec3(spread)); 57 } 58 59 float value = phase + (u_Time * frequency); 60 float func; 61 62 if (u_DeformGen == DGEN_WAVE_SIN) 63 { 64 func = sin(value * 2.0 * M_PI); 65 } 66 else if (u_DeformGen == DGEN_WAVE_SQUARE) 67 { 68 func = sign(0.5 - fract(value)); 69 } 70 else if (u_DeformGen == DGEN_WAVE_TRIANGLE) 71 { 72 func = abs(fract(value + 0.75) - 0.5) * 4.0 - 1.0; 73 } 74 else if (u_DeformGen == DGEN_WAVE_SAWTOOTH) 75 { 76 func = fract(value); 77 } 78 else if (u_DeformGen == DGEN_WAVE_INVERSE_SAWTOOTH) 79 { 80 func = (1.0 - fract(value)); 81 } 82 else // if (u_DeformGen == DGEN_BULGE) 83 { 84 func = sin(value); 85 } 86 87 return pos + normal * (base + func * amplitude); 88} 89#endif 90 91float CalcFog(vec3 position) 92{ 93 float s = dot(vec4(position, 1.0), u_FogDistance); 94#if defined(USE_WOLF_FOG_LINEAR) 95 return 1.0 - (u_FogDepth.y - s) / (u_FogDepth.y - u_FogDepth.x); 96#elif defined(USE_WOLF_FOG_EXPONENTIAL) 97 return 1.0 - exp(-u_FogDepth.z * s); 98#else // defined(USE_QUAKE3_FOG) 99 float t = dot(vec4(position, 1.0), u_FogDepth); 100 101 float eyeOutside = float(u_FogEyeT < 0.0); 102 float fogged = float(t >= eyeOutside); 103 104 t += 1e-6; 105 t *= fogged / (t - u_FogEyeT * eyeOutside); 106 107 return s * 8.0 * t; 108#endif 109} 110 111void main() 112{ 113#if defined(USE_VERTEX_ANIMATION) 114 vec3 position = mix(attr_Position, attr_Position2, u_VertexLerp); 115 vec3 normal = mix(attr_Normal, attr_Normal2, u_VertexLerp); 116#elif defined(USE_BONE_ANIMATION) 117 mat4 vtxMat = u_BoneMatrix[int(attr_BoneIndexes.x)] * attr_BoneWeights.x; 118 vtxMat += u_BoneMatrix[int(attr_BoneIndexes.y)] * attr_BoneWeights.y; 119 vtxMat += u_BoneMatrix[int(attr_BoneIndexes.z)] * attr_BoneWeights.z; 120 vtxMat += u_BoneMatrix[int(attr_BoneIndexes.w)] * attr_BoneWeights.w; 121 mat3 nrmMat = mat3(cross(vtxMat[1].xyz, vtxMat[2].xyz), cross(vtxMat[2].xyz, vtxMat[0].xyz), cross(vtxMat[0].xyz, vtxMat[1].xyz)); 122 123 vec3 position = vec3(vtxMat * vec4(attr_Position, 1.0)); 124 vec3 normal = normalize(nrmMat * attr_Normal); 125#else 126 vec3 position = attr_Position; 127 vec3 normal = attr_Normal; 128#endif 129 130#if defined(USE_DEFORM_VERTEXES) 131 position.xyz = DeformPosition(position.xyz, normal, attr_TexCoord0.st); 132#endif 133 134 gl_Position = u_ModelViewProjectionMatrix * vec4(position, 1.0); 135 136 var_Scale = CalcFog(position) * u_Color.a * u_Color.a; 137} 138