mirror of https://github.com/bjornbytes/lovr.git
Load tangents from models;
This commit is contained in:
parent
cb7b99f9a6
commit
4463bd00c8
|
@ -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++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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"
|
||||||
|
|
Loading…
Reference in New Issue