| // This file was created by Filewrap 1.1 | |
| // Little endian mode | |
| // DO NOT EDIT | |
| #include "../PVRTMemoryFileSystem.h" | |
| // using 32 bit to guarantee alignment. | |
| #ifndef A32BIT | |
| #define A32BIT static const unsigned int | |
| #endif | |
| // ******** Start: SkinnedVertShader.vsh ******** | |
| // File data | |
| static const char _SkinnedVertShader_vsh[] = | |
| "/*\n" | |
| "\tIf the current vertex is affected by bones then the vertex position and\n" | |
| "\tnormal will be transformed by the bone matrices. Each vertex wil have up \n" | |
| "\tto 4 bone indices (inBoneIndex) and bone weights (inBoneWeights).\n" | |
| "\t\n" | |
| "\tThe indices are used to index into the array of bone matrices \n" | |
| "\t(BoneMatrixArray) to get the required bone matrix for transformation. The \n" | |
| "\tamount of influence a particular bone has on a vertex is determined by the\n" | |
| "\tweights which should always total 1. So if a vertex is affected by 2 bones \n" | |
| "\tthe vertex position in world space is given by the following equation:\n" | |
| "\n" | |
| "\tposition = (BoneMatrixArray[Index0] * inVertex) * Weight0 + \n" | |
| "\t (BoneMatrixArray[Index1] * inVertex) * Weight1\n" | |
| "\n" | |
| "\tThe same proceedure is applied to the normals but the translation part of \n" | |
| "\tthe transformation is ignored.\n" | |
| "\n" | |
| "\tAfter this the position is multiplied by the view and projection matrices \n" | |
| "\tonly as the bone matrices already contain the model transform for this \n" | |
| "\tparticular mesh. The two-step transformation is required because lighting \n" | |
| "\twill not work properly in clip space.\n" | |
| "*/\n" | |
| "\n" | |
| "attribute highp vec3 inVertex;\n" | |
| "attribute mediump vec3 inNormal;\n" | |
| "attribute mediump vec3 inTangent;\n" | |
| "attribute mediump vec3 inBiNormal;\n" | |
| "attribute mediump vec2 inTexCoord;\n" | |
| "attribute mediump vec4 inBoneIndex;\n" | |
| "attribute mediump vec4 inBoneWeights;\n" | |
| "\n" | |
| "uniform highp mat4 ViewProjMatrix;\n" | |
| "uniform mediump vec3 LightPos;\n" | |
| "uniform mediump\tint\t BoneCount;\n" | |
| "uniform highp mat4 BoneMatrixArray[8];\n" | |
| "uniform highp mat3 BoneMatrixArrayIT[8];\n" | |
| "uniform bool\tbUseDot3;\n" | |
| "\n" | |
| "varying mediump vec3 Light;\n" | |
| "varying mediump vec2 TexCoord;\n" | |
| "\n" | |
| "void main()\n" | |
| "{\n" | |
| "\tif(BoneCount > 0)\n" | |
| "\t{\n" | |
| "\t\t// On PowerVR SGX it is possible to index the components of a vector\n" | |
| "\t\t// with the [] operator. However this can cause trouble with PC\n" | |
| "\t\t// emulation on some hardware so we \"rotate\" the vectors instead.\n" | |
| "\t\tmediump ivec4 boneIndex = ivec4(inBoneIndex);\n" | |
| "\t\tmediump vec4 boneWeights = inBoneWeights;\n" | |
| "\t\n" | |
| "\t\thighp mat4 boneMatrix = BoneMatrixArray[boneIndex.x];\n" | |
| "\t\tmediump mat3 normalMatrix = BoneMatrixArrayIT[boneIndex.x];\n" | |
| "\t\n" | |
| "\t\thighp vec4 position = boneMatrix * vec4(inVertex, 1.0) * boneWeights.x;\n" | |
| "\t\tmediump vec3 worldNormal = normalMatrix * inNormal * boneWeights.x;\n" | |
| "\t\t\n" | |
| "\t\tmediump vec3 worldTangent;\n" | |
| "\t\tmediump vec3 worldBiNormal;\n" | |
| "\t\t\n" | |
| "\t\tif(bUseDot3)\n" | |
| "\t\t{\n" | |
| "\t\t\tworldTangent = normalMatrix * inTangent * boneWeights.x;\n" | |
| "\t\t\tworldBiNormal = normalMatrix * inBiNormal * boneWeights.x;\n" | |
| "\t\t}\n" | |
| "\t\n" | |
| "\t\tfor (lowp int i = 1; i < 3; ++i)\n" | |
| "\t\t{\n" | |
| "\t\t\tif(i < BoneCount)\n" | |
| "\t\t\t{\n" | |
| "\t\t\t\t// \"rotate\" the vector components\n" | |
| "\t\t\t\tboneIndex = boneIndex.yzwx;\n" | |
| "\t\t\t\tboneWeights = boneWeights.yzwx;\n" | |
| "\t\t\t\n" | |
| "\t\t\t\tboneMatrix = BoneMatrixArray[boneIndex.x];\n" | |
| "\t\t\t\tnormalMatrix = BoneMatrixArrayIT[boneIndex.x];\n" | |
| "\n" | |
| "\t\t\t\tposition += boneMatrix * vec4(inVertex, 1.0) * boneWeights.x;\n" | |
| "\t\t\t\tworldNormal += normalMatrix * inNormal * boneWeights.x;\n" | |
| "\t\t\t\t\n" | |
| "\t\t\t\tif(bUseDot3)\n" | |
| "\t\t\t\t{\n" | |
| "\t\t\t\t\tworldTangent += normalMatrix * inTangent * boneWeights.x;\n" | |
| "\t\t\t\t\tworldBiNormal += normalMatrix * inBiNormal * boneWeights.x;\n" | |
| "\t\t\t\t}\n" | |
| "\t\t\t}\n" | |
| "\t\t}\t\t\n" | |
| "\t\tgl_Position = ViewProjMatrix * position;\n" | |
| "\t\t\n" | |
| "\t\t// lighting\n" | |
| "\t\tmediump vec3 TmpLightDir = normalize(LightPos - position.xyz);\n" | |
| "\t\t\n" | |
| "\t\tif(bUseDot3)\n" | |
| "\t\t{\n" | |
| "\t\t\tLight.x = dot(normalize(worldTangent), TmpLightDir);\n" | |
| "\t\t\tLight.y = dot(normalize(worldBiNormal), TmpLightDir);\n" | |
| "\t\t\tLight.z = dot(normalize(worldNormal), TmpLightDir);\n" | |
| "\t\t}\n" | |
| "\t\telse\n" | |
| "\t\t{\n" | |
| "\t\t\tLight.x = dot(normalize(worldNormal), TmpLightDir);\n" | |
| "\t\t}\n" | |
| "\t}\n" | |
| "\n" | |
| "\t\n" | |
| "\t// Pass through texcoords\n" | |
| "\tTexCoord = inTexCoord;\n" | |
| "}\n" | |
| " "; | |
| // Register SkinnedVertShader.vsh in memory file system at application startup time | |
| static CPVRTMemoryFileSystem RegisterFile_SkinnedVertShader_vsh("SkinnedVertShader.vsh", _SkinnedVertShader_vsh, 3431); | |
| // ******** End: SkinnedVertShader.vsh ******** | |