mirror of
https://github.com/bjornbytes/lovr.git
synced 2024-07-04 13:33:34 +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.y);
|
||||||
vec_push(vertices, normal.z);
|
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
|
// Face vertex indices
|
||||||
|
@ -76,15 +82,21 @@ Model* lovrModelCreate(void* data, int size) {
|
||||||
BufferFormat format;
|
BufferFormat format;
|
||||||
vec_init(&format);
|
vec_init(&format);
|
||||||
|
|
||||||
|
int components = 3;
|
||||||
BufferAttribute position = { .name = "lovrPosition", .type = BUFFER_FLOAT, .count = 3 };
|
BufferAttribute position = { .name = "lovrPosition", .type = BUFFER_FLOAT, .count = 3 };
|
||||||
vec_push(&format, position);
|
vec_push(&format, position);
|
||||||
|
|
||||||
if (model->modelData->hasNormals) {
|
if (model->modelData->hasNormals) {
|
||||||
BufferAttribute normal = { .name = "lovrNormal", .type = BUFFER_FLOAT, .count = 3 };
|
BufferAttribute normal = { .name = "lovrNormal", .type = BUFFER_FLOAT, .count = 3 };
|
||||||
vec_push(&format, normal);
|
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);
|
model->buffer = lovrBufferCreate(vertices.length / components, &format, BUFFER_TRIANGLES, BUFFER_STATIC);
|
||||||
lovrBufferSetVertices(model->buffer, (void*) vertices.data, vertices.length * sizeof(float));
|
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) {
|
void lovrModelDestroy(const Ref* ref) {
|
||||||
Model* model = containerof(ref, Model);
|
Model* model = containerof(ref, Model);
|
||||||
|
if (model->texture) {
|
||||||
|
lovrRelease(&model->texture->ref);
|
||||||
|
}
|
||||||
lovrRelease(&model->modelData->ref);
|
lovrRelease(&model->modelData->ref);
|
||||||
lovrRelease(&model->buffer->ref);
|
lovrRelease(&model->buffer->ref);
|
||||||
free(model);
|
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) {
|
void lovrModelDraw(Model* model, float x, float y, float z, float size, float angle, float ax, float ay, float az) {
|
||||||
lovrGraphicsPush();
|
lovrGraphicsPush();
|
||||||
lovrGraphicsTransform(x, y, z, size, size, size, angle, ax, ay, az);
|
lovrGraphicsTransform(x, y, z, size, size, size, angle, ax, ay, az);
|
||||||
|
lovrTextureBind(model->texture);
|
||||||
lovrBufferDraw(model->buffer);
|
lovrBufferDraw(model->buffer);
|
||||||
lovrGraphicsPop();
|
lovrGraphicsPop();
|
||||||
}
|
}
|
||||||
|
@ -117,5 +133,14 @@ Texture* lovrModelGetTexture(Model* model) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrModelSetTexture(Model* model, Texture* texture) {
|
void lovrModelSetTexture(Model* model, Texture* texture) {
|
||||||
|
if (model->texture) {
|
||||||
|
lovrRelease(&model->texture->ref);
|
||||||
|
}
|
||||||
|
|
||||||
model->texture = texture;
|
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));
|
ModelData* modelData = malloc(sizeof(ModelData));
|
||||||
if (!modelData) return NULL;
|
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
|
// Meshes
|
||||||
vec_init(&modelData->meshes);
|
vec_init(&modelData->meshes);
|
||||||
|
@ -82,6 +83,17 @@ ModelData* lovrModelDataCreate(void* data, int size) {
|
||||||
normal.z = assimpMesh->mNormals[n].z;
|
normal.z = assimpMesh->mNormals[n].z;
|
||||||
vec_push(&mesh->normals, normal);
|
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
|
// Nodes
|
||||||
|
@ -105,6 +117,9 @@ void lovrModelDataDestroy(const Ref* ref) {
|
||||||
vec_deinit(&mesh->faces);
|
vec_deinit(&mesh->faces);
|
||||||
vec_deinit(&mesh->vertices);
|
vec_deinit(&mesh->vertices);
|
||||||
vec_deinit(&mesh->normals);
|
vec_deinit(&mesh->normals);
|
||||||
|
if (modelData->hasTexCoords) {
|
||||||
|
vec_deinit(&mesh->texCoords);
|
||||||
|
}
|
||||||
free(mesh);
|
free(mesh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@ typedef struct {
|
||||||
vec_model_face_t faces;
|
vec_model_face_t faces;
|
||||||
vec_model_vertex_t vertices;
|
vec_model_vertex_t vertices;
|
||||||
vec_model_vertex_t normals;
|
vec_model_vertex_t normals;
|
||||||
|
vec_model_vertex_t texCoords;
|
||||||
} ModelMesh;
|
} ModelMesh;
|
||||||
|
|
||||||
typedef vec_t(ModelMesh*) vec_model_mesh_t;
|
typedef vec_t(ModelMesh*) vec_model_mesh_t;
|
||||||
|
@ -38,6 +39,7 @@ typedef struct {
|
||||||
ModelNode* root;
|
ModelNode* root;
|
||||||
vec_model_mesh_t meshes;
|
vec_model_mesh_t meshes;
|
||||||
int hasNormals;
|
int hasNormals;
|
||||||
|
int hasTexCoords;
|
||||||
} ModelData;
|
} ModelData;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue