uniform mediump mat4 uProjection; uniform mediump mat4 uModelView; uniform mediump mat4 uMvpMatrix; uniform bool uTextureMapped; uniform mediump vec4 uCustomTextureCoords; attribute mediump vec2 aTexCoord; varying mediump vec2 vTexCoord; uniform mat3 uModelViewIT; attribute mediump vec3 aNormal; varying mediump vec3 vNormal; attribute mediump vec3 aPosition; varying mediump vec4 vVertex; #define USE_NORMALS #define MAX_BONES_PER_MESH 12 #ifdef USE_BONES uniform int uBoneCount; uniform mediump mat4 uBoneMatrices[MAX_BONES_PER_MESH]; uniform mediump mat3 uBoneMatricesIT[MAX_BONES_PER_MESH]; attribute mediump vec4 aBoneWeights; attribute mediump vec4 aBoneIndices; #endif #ifdef USE_COLOR attribute lowp vec3 aColor; varying mediump vec3 vColor; #endif void main() { mediump vec4 vertexPosition = vec4(aPosition, 1.0); #ifdef USE_BONES if(uBoneCount > 0) { mediump vec4 boneWeights = aBoneWeights; mediump ivec4 boneIndices = ivec4(aBoneIndices); mediump vec3 vertexNormal; // re-calculate the final weight boneWeights.w = 1.0 - dot(boneWeights.xyz, vec3(1.0, 1.0, 1.0)); mediump vec4 bonePos = (uBoneMatrices[boneIndices.x] * vertexPosition) * boneWeights.x; bonePos += (uBoneMatrices[boneIndices.y] * vertexPosition) * boneWeights.y; bonePos += (uBoneMatrices[boneIndices.z] * vertexPosition) * boneWeights.z; bonePos += (uBoneMatrices[boneIndices.w] * vertexPosition) * boneWeights.w; vertexNormal = (uBoneMatricesIT[boneIndices.x] * aNormal) * boneWeights.x; vertexNormal += (uBoneMatricesIT[boneIndices.y] * aNormal) * boneWeights.y; vertexNormal += (uBoneMatricesIT[boneIndices.z] * aNormal) * boneWeights.z; vertexNormal += (uBoneMatricesIT[boneIndices.w] * aNormal) * boneWeights.w; vertexNormal = normalize(vertexNormal); vertexPosition = uProjection * bonePos; vVertex = bonePos; vNormal = vertexNormal; } else { #endif vertexPosition = uMvpMatrix * vec4(aPosition, 1.0); vVertex = uModelView * vec4(aPosition, 1.0); vNormal = uModelViewIT * aNormal; #ifdef USE_BONES } #endif gl_Position = vertexPosition; #ifdef USE_COLOR vColor = aColor; #endif } struct Material { mediump float mOpacity; mediump float mShininess; lowp vec4 mAmbient; lowp vec4 mDiffuse; lowp vec4 mSpecular; lowp vec4 mEmissive; }; uniform sampler2D sTexture; uniform sampler2D sOpacityTexture; uniform sampler2D sNormalMapTexture; uniform sampler2D sEffect; varying mediump vec2 vTexCoord; uniform Material uMaterial; uniform lowp vec4 uColor; varying highp vec4 vVertex; varying highp vec3 vNormal; #ifdef USE_COLOR varying mediump vec3 vColor; #endif void main() { #ifdef USE_COLOR // set initial color to vertex color mediump vec4 fragColor = vec4(vColor, 1.0); #else // set initial color to material color mediump vec4 fragColor = uMaterial.mAmbient + uMaterial.mDiffuse; #endif // apply material alpha/opacity to alpha channel fragColor.a *= uMaterial.mOpacity * uMaterial.mDiffuse.a; // and finally, apply Actor color fragColor *= uColor; gl_FragColor = fragColor; }