From 08d63ca19cad074bb50f48db0995be5cc138cd0b Mon Sep 17 00:00:00 2001 From: bjorn Date: Wed, 23 Nov 2016 00:02:19 -0800 Subject: [PATCH] Model texture rendering; --- src/graphics/model.c | 27 ++++++++++++++++++++++++++- src/model/modelData.c | 17 ++++++++++++++++- src/model/modelData.h | 2 ++ 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/graphics/model.c b/src/graphics/model.c index df1319d0..f121fee5 100644 --- a/src/graphics/model.c +++ b/src/graphics/model.c @@ -39,6 +39,12 @@ static void visitNode(ModelData* modelData, ModelNode* node, mat4 transform, vec vec_push(vertices, normal.y); vec_push(vertices, normal.z); } + + if (modelData->hasTexCoords) { + ModelVertex texCoord = mesh->texCoords.data[v]; + vec_push(vertices, texCoord.x); + vec_push(vertices, texCoord.y); + } } // Face vertex indices @@ -76,15 +82,21 @@ Model* lovrModelCreate(void* data, int size) { BufferFormat format; vec_init(&format); + int components = 3; BufferAttribute position = { .name = "lovrPosition", .type = BUFFER_FLOAT, .count = 3 }; vec_push(&format, position); if (model->modelData->hasNormals) { BufferAttribute normal = { .name = "lovrNormal", .type = BUFFER_FLOAT, .count = 3 }; vec_push(&format, normal); + components += 3; } - int components = model->modelData->hasNormals ? 6 : 3; + if (model->modelData->hasTexCoords) { + BufferAttribute normal = { .name = "lovrTexCoord", .type = BUFFER_FLOAT, .count = 2 }; + vec_push(&format, normal); + components += 2; + } model->buffer = lovrBufferCreate(vertices.length / components, &format, BUFFER_TRIANGLES, BUFFER_STATIC); lovrBufferSetVertices(model->buffer, (void*) vertices.data, vertices.length * sizeof(float)); @@ -100,6 +112,9 @@ Model* lovrModelCreate(void* data, int size) { void lovrModelDestroy(const Ref* ref) { Model* model = containerof(ref, Model); + if (model->texture) { + lovrRelease(&model->texture->ref); + } lovrRelease(&model->modelData->ref); lovrRelease(&model->buffer->ref); free(model); @@ -108,6 +123,7 @@ void lovrModelDestroy(const Ref* ref) { void lovrModelDraw(Model* model, float x, float y, float z, float size, float angle, float ax, float ay, float az) { lovrGraphicsPush(); lovrGraphicsTransform(x, y, z, size, size, size, angle, ax, ay, az); + lovrTextureBind(model->texture); lovrBufferDraw(model->buffer); lovrGraphicsPop(); } @@ -117,5 +133,14 @@ Texture* lovrModelGetTexture(Model* model) { } void lovrModelSetTexture(Model* model, Texture* texture) { + if (model->texture) { + lovrRelease(&model->texture->ref); + } + model->texture = texture; + lovrBufferSetTexture(model->buffer, model->texture); + + if (model->texture) { + lovrRetain(&model->texture->ref); + } } diff --git a/src/model/modelData.c b/src/model/modelData.c index d661fac7..7148a2cd 100644 --- a/src/model/modelData.c +++ b/src/model/modelData.c @@ -28,7 +28,8 @@ ModelData* lovrModelDataCreate(void* data, int size) { ModelData* modelData = malloc(sizeof(ModelData)); if (!modelData) return NULL; - const struct aiScene* scene = aiImportFileFromMemory(data, size, aiProcessPreset_TargetRealtime_MaxQuality | aiProcess_OptimizeGraph, NULL); + unsigned int flags = aiProcessPreset_TargetRealtime_MaxQuality | aiProcess_OptimizeGraph | aiProcess_FlipUVs; + const struct aiScene* scene = aiImportFileFromMemory(data, size, flags, NULL); // Meshes vec_init(&modelData->meshes); @@ -82,6 +83,17 @@ ModelData* lovrModelDataCreate(void* data, int size) { normal.z = assimpMesh->mNormals[n].z; vec_push(&mesh->normals, normal); } + + modelData->hasTexCoords = modelData->hasTexCoords || assimpMesh->mTextureCoords[0] != NULL; + if (assimpMesh->mTextureCoords[0]) { + vec_init(&mesh->texCoords); + for (unsigned int i = 0; i < assimpMesh->mNumVertices; i++) { + ModelVertex texCoord; + texCoord.x = assimpMesh->mTextureCoords[0][i].x; + texCoord.y = assimpMesh->mTextureCoords[0][i].y; + vec_push(&mesh->texCoords, texCoord); + } + } } // Nodes @@ -105,6 +117,9 @@ void lovrModelDataDestroy(const Ref* ref) { vec_deinit(&mesh->faces); vec_deinit(&mesh->vertices); vec_deinit(&mesh->normals); + if (modelData->hasTexCoords) { + vec_deinit(&mesh->texCoords); + } free(mesh); } diff --git a/src/model/modelData.h b/src/model/modelData.h index 5c9361c2..c894f142 100644 --- a/src/model/modelData.h +++ b/src/model/modelData.h @@ -23,6 +23,7 @@ typedef struct { vec_model_face_t faces; vec_model_vertex_t vertices; vec_model_vertex_t normals; + vec_model_vertex_t texCoords; } ModelMesh; typedef vec_t(ModelMesh*) vec_model_mesh_t; @@ -38,6 +39,7 @@ typedef struct { ModelNode* root; vec_model_mesh_t meshes; int hasNormals; + int hasTexCoords; } ModelData; #endif