From bf512216323f3df55627421bb0187ed364d58340 Mon Sep 17 00:00:00 2001 From: ladevieq Date: Wed, 1 Sep 2021 00:18:04 +0200 Subject: White furnace test on gltf scenes & load normals --- src/gltf.cpp | 60 ++++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 16 deletions(-) (limited to 'src/gltf.cpp') diff --git a/src/gltf.cpp b/src/gltf.cpp index 6b39ff4..66147dc 100644 --- a/src/gltf.cpp +++ b/src/gltf.cpp @@ -24,8 +24,10 @@ node gltf::load(std::filesystem::path &path, std::string &filename) { buffer_index++; } + // auto materials = load_materials(gltf_json); + std::vector materials; - auto meshes = load_meshes(gltf_json, buffers_content); + auto meshes = load_meshes(gltf_json, buffers_content, materials); node root_node; auto &root_children = scene["nodes"]; @@ -57,7 +59,7 @@ void gltf::load_node(json &gltf_json, uint32_t index, node &parent, std::vector< } } -std::vector gltf::load_meshes(json &gltf_json, std::vector> &buffers_content) { +std::vector gltf::load_meshes(json &gltf_json, std::vector> &buffers_content, std::vector &materials) { auto &gltf_meshes = gltf_json["meshes"]; auto meshes_count = gltf_meshes.size(); std::vector meshes { meshes_count }; @@ -68,14 +70,35 @@ std::vector gltf::load_meshes(json &gltf_json, std::vector> &buffers_content) { +std::vector gltf::load_materials(json &gltf_json) { + auto &gltf_materials = gltf_json["materials"]; + auto materials_count = gltf_materials.size(); + std::vector materials { materials_count }; + + for(size_t material_index = 0; material_index < materials_count; material_index++) { + auto& gltf_material = gltf_materials[material_index]; + auto& material = materials[material_index]; + + auto base_color = gltf_material["baseColorFactor"]; + material.base_color.v[0] = base_color[0]; + material.base_color.v[1] = base_color[1]; + material.base_color.v[2] = base_color[2]; + material.base_color.v[3] = base_color[3]; + material.metalness = gltf_material["matellicFactor"].get(); + material.roughness = gltf_material["roughnessFactor"].get(); + } + + return std::move(materials); +} + +mesh_part gltf::load_primitive(json &gltf_json, json &primitive, std::vector> &buffers_content, std::vector &materials) { auto part = mesh_part(); auto &accessors = gltf_json["accessors"]; @@ -116,22 +139,27 @@ mesh_part gltf::load_primitive(json &gltf_json, json &primitive, std::vector(); - // auto normals_view_index = accessors[normals_accessor_index]["bufferView"].get(); - // auto normals_view = gltf_json["bufferViews"][normals_view_index]; + { + auto normals_accessor_index = primitive["attributes"]["NORMAL"].get(); + auto normals_view_index = accessors[normals_accessor_index]["bufferView"].get(); + auto &normals_view = gltf_json["bufferViews"][normals_view_index]; + + auto normals_buffer_index = normals_view["buffer"].get(); + auto normals_offset = normals_view["byteOffset"].get(); + auto normals_length = normals_view["byteLength"].get(); - // auto normals_buffer_index = normals_view["buffer"].get(); - // auto normals_offset = normals_view["byteOffset"].get(); - // auto normals_length = normals_view["byteLength"].get(); + auto &normals_buffer = buffers_content[normals_buffer_index]; + float* normals_start = (float*)(normals_buffer.data() + normals_offset); - // auto normals_buffer = buffers_content[normals_buffer_index]; - // void* normals_start = normals_buffer.data() + normals_offset; + size_t normals_count = normals_length / (sizeof(float) * 3); + part.normals.resize(normals_count); - // mesh_part.normals.resize(normals_length / (sizeof(float) * 3)); + for (size_t i = 0; i < normals_count; i++) { + part.normals[i] = vec3(normals_start[i * 3], normals_start[i * 3 + 1], normals_start[i * 3 + 2]); + } + } - // std::memcpy(mesh_part.normals.data(), normals_start, normals_length); - // } + // part.mat = materials[primitive["material"].get()]; return std::move(part); } -- cgit v1.3