// 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 ******** | |