Load tangents from models;

This commit is contained in:
bjorn 2018-02-26 02:54:35 -08:00
parent cb7b99f9a6
commit 4463bd00c8
4 changed files with 20 additions and 2 deletions

View File

@ -273,6 +273,7 @@ ModelData* lovrModelDataCreate(Blob* blob) {
bool hasNormals = false; bool hasNormals = false;
bool hasUVs = false; bool hasUVs = false;
bool hasVertexColors = false; bool hasVertexColors = false;
bool hasTangents = false;
bool isSkinned = false; bool isSkinned = false;
for (unsigned int m = 0; m < scene->mNumMeshes; m++) { for (unsigned int m = 0; m < scene->mNumMeshes; m++) {
@ -282,6 +283,7 @@ ModelData* lovrModelDataCreate(Blob* blob) {
hasNormals |= assimpMesh->mNormals != NULL; hasNormals |= assimpMesh->mNormals != NULL;
hasUVs |= assimpMesh->mTextureCoords[0] != NULL; hasUVs |= assimpMesh->mTextureCoords[0] != NULL;
hasVertexColors |= assimpMesh->mColors[0] != NULL; hasVertexColors |= assimpMesh->mColors[0] != NULL;
hasTangents |= assimpMesh->mTangents != NULL;
isSkinned |= assimpMesh->mNumBones > 0; isSkinned |= assimpMesh->mNumBones > 0;
} }
@ -292,6 +294,7 @@ ModelData* lovrModelDataCreate(Blob* blob) {
if (hasNormals) vertexFormatAppend(&format, "lovrNormal", ATTR_FLOAT, 3); if (hasNormals) vertexFormatAppend(&format, "lovrNormal", ATTR_FLOAT, 3);
if (hasUVs) vertexFormatAppend(&format, "lovrTexCoord", ATTR_FLOAT, 2); if (hasUVs) vertexFormatAppend(&format, "lovrTexCoord", ATTR_FLOAT, 2);
if (hasVertexColors) vertexFormatAppend(&format, "lovrVertexColor", ATTR_BYTE, 4); if (hasVertexColors) vertexFormatAppend(&format, "lovrVertexColor", ATTR_BYTE, 4);
if (hasTangents) vertexFormatAppend(&format, "lovrTangent", ATTR_FLOAT, 3);
size_t boneByteOffset = format.stride; size_t boneByteOffset = format.stride;
if (isSkinned) vertexFormatAppend(&format, "lovrBones", ATTR_INT, 4); if (isSkinned) vertexFormatAppend(&format, "lovrBones", ATTR_INT, 4);
if (isSkinned) vertexFormatAppend(&format, "lovrBoneWeights", ATTR_FLOAT, 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++; vertex++;
} }

View File

@ -101,6 +101,7 @@ static GLuint linkShaders(GLuint vertexShader, GLuint fragmentShader) {
glBindAttribLocation(program, LOVR_SHADER_NORMAL, "lovrNormal"); glBindAttribLocation(program, LOVR_SHADER_NORMAL, "lovrNormal");
glBindAttribLocation(program, LOVR_SHADER_TEX_COORD, "lovrTexCoord"); glBindAttribLocation(program, LOVR_SHADER_TEX_COORD, "lovrTexCoord");
glBindAttribLocation(program, LOVR_SHADER_VERTEX_COLOR, "lovrVertexColor"); glBindAttribLocation(program, LOVR_SHADER_VERTEX_COLOR, "lovrVertexColor");
glBindAttribLocation(program, LOVR_SHADER_TANGENT, "lovrTangent");
glBindAttribLocation(program, LOVR_SHADER_BONES, "lovrBones"); glBindAttribLocation(program, LOVR_SHADER_BONES, "lovrBones");
glBindAttribLocation(program, LOVR_SHADER_BONE_WEIGHTS, "lovrBoneWeights"); glBindAttribLocation(program, LOVR_SHADER_BONE_WEIGHTS, "lovrBoneWeights");
glLinkProgram(program); glLinkProgram(program);

View File

@ -11,8 +11,9 @@
#define LOVR_SHADER_NORMAL 1 #define LOVR_SHADER_NORMAL 1
#define LOVR_SHADER_TEX_COORD 2 #define LOVR_SHADER_TEX_COORD 2
#define LOVR_SHADER_VERTEX_COLOR 3 #define LOVR_SHADER_VERTEX_COLOR 3
#define LOVR_SHADER_BONES 4 #define LOVR_SHADER_TANGENT 4
#define LOVR_SHADER_BONE_WEIGHTS 5 #define LOVR_SHADER_BONES 5
#define LOVR_SHADER_BONE_WEIGHTS 6
#define LOVR_MAX_UNIFORM_LENGTH 256 #define LOVR_MAX_UNIFORM_LENGTH 256
typedef enum { typedef enum {

View File

@ -32,6 +32,7 @@ const char* lovrShaderVertexPrefix = ""
"in vec3 lovrNormal; \n" "in vec3 lovrNormal; \n"
"in vec2 lovrTexCoord; \n" "in vec2 lovrTexCoord; \n"
"in vec4 lovrVertexColor; \n" "in vec4 lovrVertexColor; \n"
"in vec3 lovrTangent; \n"
"in ivec4 lovrBones; \n" "in ivec4 lovrBones; \n"
"in vec4 lovrBoneWeights; \n" "in vec4 lovrBoneWeights; \n"
"out vec2 texCoord; \n" "out vec2 texCoord; \n"