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:
parent
cbcaef4e77
commit
08d63ca19c
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue