diff --git a/src/data/modelData.c b/src/data/modelData.c index ef084d1a..b72cc5ed 100644 --- a/src/data/modelData.c +++ b/src/data/modelData.c @@ -273,6 +273,7 @@ ModelData* lovrModelDataCreate(Blob* blob) { bool hasNormals = false; bool hasUVs = false; bool hasVertexColors = false; + bool hasTangents = false; bool isSkinned = false; for (unsigned int m = 0; m < scene->mNumMeshes; m++) { @@ -282,6 +283,7 @@ ModelData* lovrModelDataCreate(Blob* blob) { hasNormals |= assimpMesh->mNormals != NULL; hasUVs |= assimpMesh->mTextureCoords[0] != NULL; hasVertexColors |= assimpMesh->mColors[0] != NULL; + hasTangents |= assimpMesh->mTangents != NULL; isSkinned |= assimpMesh->mNumBones > 0; } @@ -292,6 +294,7 @@ ModelData* lovrModelDataCreate(Blob* blob) { if (hasNormals) vertexFormatAppend(&format, "lovrNormal", ATTR_FLOAT, 3); if (hasUVs) vertexFormatAppend(&format, "lovrTexCoord", ATTR_FLOAT, 2); if (hasVertexColors) vertexFormatAppend(&format, "lovrVertexColor", ATTR_BYTE, 4); + if (hasTangents) vertexFormatAppend(&format, "lovrTangent", ATTR_FLOAT, 3); size_t boneByteOffset = format.stride; if (isSkinned) vertexFormatAppend(&format, "lovrBones", ATTR_INT, 4); if (isSkinned) vertexFormatAppend(&format, "lovrBoneWeights", ATTR_FLOAT, 4); @@ -378,6 +381,18 @@ ModelData* lovrModelDataCreate(Blob* blob) { } } + if (hasTangents) { + if (assimpMesh->mTangents) { + *vertices.floats++ = assimpMesh->mTangents[v].x; + *vertices.floats++ = assimpMesh->mTangents[v].y; + *vertices.floats++ = assimpMesh->mTangents[v].z; + } else { + *vertices.floats++ = 0; + *vertices.floats++ = 0; + *vertices.floats++ = 0; + } + } + vertex++; } diff --git a/src/graphics/shader.c b/src/graphics/shader.c index 03a3e25f..e483c3a5 100644 --- a/src/graphics/shader.c +++ b/src/graphics/shader.c @@ -101,6 +101,7 @@ static GLuint linkShaders(GLuint vertexShader, GLuint fragmentShader) { glBindAttribLocation(program, LOVR_SHADER_NORMAL, "lovrNormal"); glBindAttribLocation(program, LOVR_SHADER_TEX_COORD, "lovrTexCoord"); glBindAttribLocation(program, LOVR_SHADER_VERTEX_COLOR, "lovrVertexColor"); + glBindAttribLocation(program, LOVR_SHADER_TANGENT, "lovrTangent"); glBindAttribLocation(program, LOVR_SHADER_BONES, "lovrBones"); glBindAttribLocation(program, LOVR_SHADER_BONE_WEIGHTS, "lovrBoneWeights"); glLinkProgram(program); diff --git a/src/graphics/shader.h b/src/graphics/shader.h index b36a78ad..9d093308 100644 --- a/src/graphics/shader.h +++ b/src/graphics/shader.h @@ -11,8 +11,9 @@ #define LOVR_SHADER_NORMAL 1 #define LOVR_SHADER_TEX_COORD 2 #define LOVR_SHADER_VERTEX_COLOR 3 -#define LOVR_SHADER_BONES 4 -#define LOVR_SHADER_BONE_WEIGHTS 5 +#define LOVR_SHADER_TANGENT 4 +#define LOVR_SHADER_BONES 5 +#define LOVR_SHADER_BONE_WEIGHTS 6 #define LOVR_MAX_UNIFORM_LENGTH 256 typedef enum { diff --git a/src/resources/shaders.c b/src/resources/shaders.c index 2c5a8c6b..68fcf8b3 100644 --- a/src/resources/shaders.c +++ b/src/resources/shaders.c @@ -32,6 +32,7 @@ const char* lovrShaderVertexPrefix = "" "in vec3 lovrNormal; \n" "in vec2 lovrTexCoord; \n" "in vec4 lovrVertexColor; \n" +"in vec3 lovrTangent; \n" "in ivec4 lovrBones; \n" "in vec4 lovrBoneWeights; \n" "out vec2 texCoord; \n"