1
0
Fork 0
mirror of https://github.com/bjornbytes/lovr.git synced 2024-07-02 12:33:52 +00:00

Model texture rendering;

This commit is contained in:
bjorn 2016-11-23 00:02:19 -08:00
parent cbcaef4e77
commit 08d63ca19c
3 changed files with 44 additions and 2 deletions

View file

@ -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);
}
}

View file

@ -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);
}

View file

@ -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