Changed several function signatures across multiple files to remove the `const` qualifier from parameters of type `vec3s` for improved flexibility. Changed `material_collection_create` to `material_collection_init` for better initialization handling. Changed `scene_create` to `scene_init` to return a boolean indicating success or failure. Changed `render_target_create` to `render_target_init` for consistent initialization practices. Changed `window_create` to remove `const` from its parameters for consistency. Changed `evaluate_bsdf_directional` and `evaluate_bsdf_const_sky` to remove `const` from their parameters. Changed `sample_bsdf_simple_lit` and `sample_bsdf_pdf_simple_lit` to remove `const` from the `normal` parameter. Changed `scene_render` to take a pointer to `render_target_t` instead of returning it directly. Updated `main.c` to reflect new initialization functions for better memory management.
85 lines
2.9 KiB
C
85 lines
2.9 KiB
C
#include "Geometry/Mesh.h"
|
|
#include "Geometry/Triangle.h"
|
|
#include "assimp/cimport.h"
|
|
#include "assimp/scene.h"
|
|
#include "assimp/postprocess.h"
|
|
|
|
mesh_entity_t mesh_load(const char* filename, uint8_t material_id, triangle_collection_t* triangles, material_collection_t* materials)
|
|
{
|
|
mesh_entity_t entity = {0};
|
|
|
|
const C_STRUCT aiScene* scene = aiImportFile(filename,aiProcessPreset_TargetRealtime_MaxQuality);
|
|
if (scene == NULL)
|
|
{
|
|
// fprintf(stderr, "Error loading mesh: %s\n", aiGetErrorString());
|
|
return entity;
|
|
}
|
|
|
|
for (uint32_t i = 0; i < scene->mNumMeshes; i++)
|
|
{
|
|
struct aiMesh* mesh = scene->mMeshes[i];
|
|
|
|
//TODO: Handle all mesh types, not just triangles
|
|
if (mesh->mPrimitiveTypes != aiPrimitiveType_TRIANGLE)
|
|
{
|
|
// fprintf(stderr, "Mesh %llu is not a triangle mesh\n", i);
|
|
continue;
|
|
}
|
|
|
|
for (uint32_t j = 0; j < mesh->mNumFaces; j++)
|
|
{
|
|
struct aiFace* face = &mesh->mFaces[j];
|
|
if (face->mNumIndices != 3)
|
|
{
|
|
// fprintf(stderr, "Face %llu in mesh %llu does not have 3 indices\n", j, i);
|
|
continue;
|
|
}
|
|
|
|
vec3s point1 = {
|
|
mesh->mVertices[face->mIndices[0]].x,
|
|
mesh->mVertices[face->mIndices[0]].y,
|
|
mesh->mVertices[face->mIndices[0]].z
|
|
};
|
|
vec3s point2 = {
|
|
mesh->mVertices[face->mIndices[1]].x,
|
|
mesh->mVertices[face->mIndices[1]].y,
|
|
mesh->mVertices[face->mIndices[1]].z
|
|
};
|
|
vec3s point3 = {
|
|
mesh->mVertices[face->mIndices[2]].x,
|
|
mesh->mVertices[face->mIndices[2]].y,
|
|
mesh->mVertices[face->mIndices[2]].z
|
|
};
|
|
|
|
vec3s normal1 = {
|
|
mesh->mNormals[face->mIndices[0]].x,
|
|
mesh->mNormals[face->mIndices[0]].y,
|
|
mesh->mNormals[face->mIndices[0]].z
|
|
};
|
|
vec3s normal2 = {
|
|
mesh->mNormals[face->mIndices[1]].x,
|
|
mesh->mNormals[face->mIndices[1]].y,
|
|
mesh->mNormals[face->mIndices[1]].z
|
|
};
|
|
vec3s normal3 = {
|
|
mesh->mNormals[face->mIndices[2]].x,
|
|
mesh->mNormals[face->mIndices[2]].y,
|
|
mesh->mNormals[face->mIndices[2]].z
|
|
};
|
|
|
|
//TODO: Handle materials, we use OpenPBR standard for parameter naming
|
|
|
|
// uint32_t properties_count = scene->mMaterials[mesh->mMaterialIndex]->mNumProperties;
|
|
// C_STRUCT aiMaterial* material = scene->mMaterials[mesh->mMaterialIndex];
|
|
// for (uint32_t p = 0; p < properties_count; p++)
|
|
// {
|
|
// material->mProperties[p]->mKey;
|
|
// }
|
|
|
|
triangle_create_with_normals(point1, point2, point3, normal1, normal2, normal3, material_id, triangles);
|
|
}
|
|
}
|
|
|
|
return entity;
|
|
}
|