//--------------------------------------------------------------------------- //These materials/shaders are part of the NEW InstanceManager implementation //Written by Matias N. Goldberg ("dark_sylinc") //--------------------------------------------------------------------------- #version 120 //Vertex input attribute vec4 vertex; attribute vec3 normal; attribute vec3 tangent; attribute vec4 uv0; attribute vec4 blendIndices; attribute vec4 blendWeights; //Parameters uniform mat4 viewProjMatrix; //uniform mat4x3 worldMatrix3x4Array[80]; uniform vec4 worldMatrix3x4Array[240]; //240 = 80*3 #if (DEPTH_SHADOWCASTER || DEPTH_SHADOWRECEIVER) uniform vec4 depthRange; #endif #if DEPTH_SHADOWRECEIVER uniform mat4 texViewProjMatrix; #endif //Output #if DEPTH_SHADOWCASTER varying vec2 depth; #else varying vec2 _uv0; varying vec3 oNormal; varying vec3 oVPos; #if DEPTH_SHADOWRECEIVER varying vec4 oLightSpacePos; #endif #endif //--------------------------------------------- //Main Vertex Shader //--------------------------------------------- void main(void) { mat4 worldMatrix; int idx = int(blendIndices[0]) * 3; worldMatrix[0] = worldMatrix3x4Array[idx]; worldMatrix[1] = worldMatrix3x4Array[idx + 1]; worldMatrix[2] = worldMatrix3x4Array[idx + 2]; worldMatrix[3] = vec4( 0, 0, 0, 1 ); vec4 worldPos = vertex * worldMatrix; vec3 worldNorm = normal * mat3(worldMatrix); //Transform the position gl_Position = viewProjMatrix * worldPos; #if DEPTH_SHADOWCASTER depth.x = (gl_Position.z - depthRange.x) * depthRange.w; depth.y = depthRange.w; #else _uv0 = uv0.xy; oNormal = worldNorm; oVPos = worldPos.xyz; #if DEPTH_SHADOWRECEIVER oLightSpacePos = texViewProjMatrix * worldPos; oLightSpacePos.z = (oLightSpacePos.z - depthRange.x) * depthRange.w; #endif #endif }