| 800 | } |
| 801 | |
| 802 | std::vector<std::shared_ptr<renderer::material>> load_all_materials(std::vector<std::shared_ptr<renderer::texture>> & textures, gpu_buffer & staging_buffer, const renderer::material & default_material) |
| 803 | { |
| 804 | std::vector<std::shared_ptr<renderer::material>> materials; |
| 805 | materials.reserve(gltf.materials.size()); |
| 806 | for (const fastgltf::Material & gltf_material: gltf.materials) |
| 807 | { |
| 808 | size_t material_id = materials.size(); |
| 809 | |
| 810 | // Copy the default material, without references to its buffer or descriptor set |
| 811 | auto & material = *materials.emplace_back(std::make_shared<renderer::material>(default_material)); |
| 812 | material.name = gltf_material.name; |
| 813 | material.buffer.reset(); |
| 814 | |
| 815 | material.double_sided = gltf_material.doubleSided; |
| 816 | |
| 817 | switch (gltf_material.alphaMode) |
| 818 | { |
| 819 | case fastgltf::AlphaMode::Opaque: |
| 820 | material.fragment_shader = "lit.frag"; |
| 821 | material.blend_enable = false; |
| 822 | break; |
| 823 | |
| 824 | case fastgltf::AlphaMode::Mask: |
| 825 | material.fragment_shader = "lit_mask.frag"; |
| 826 | material.blend_enable = false; |
| 827 | break; |
| 828 | |
| 829 | case fastgltf::AlphaMode::Blend: |
| 830 | material.fragment_shader = "lit.frag"; |
| 831 | material.blend_enable = true; |
| 832 | break; |
| 833 | } |
| 834 | |
| 835 | if (auto it = extras.find({fastgltf::Category::Materials, material_id, "fragment_shader"}); it != extras.end()) |
| 836 | material.fragment_shader = it->second; |
| 837 | |
| 838 | renderer::material::gpu_data & material_data = material.staging; |
| 839 | |
| 840 | material_data.base_color_factor = convert(gltf_material.pbrData.baseColorFactor); |
| 841 | material_data.base_emissive_factor = glm::vec4(convert(gltf_material.emissiveFactor), 0); |
| 842 | material_data.metallic_factor = gltf_material.pbrData.metallicFactor; |
| 843 | material_data.roughness_factor = gltf_material.pbrData.roughnessFactor; |
| 844 | material_data.alpha_cutoff = gltf_material.alphaCutoff; |
| 845 | |
| 846 | auto f = [&](const auto & texture_info, |
| 847 | std::shared_ptr<renderer::texture> & texture, |
| 848 | renderer::material::texture_info & info) { |
| 849 | if (not texture_info) |
| 850 | return; |
| 851 | |
| 852 | texture = textures.at(texture_info->textureIndex); |
| 853 | info.texcoord = texture_info->texCoordIndex; |
| 854 | |
| 855 | if (auto & xform = texture_info->transform) |
| 856 | { |
| 857 | if (xform->texCoordIndex) |
| 858 | info.texcoord = *xform->texCoordIndex; |
| 859 |
no test coverage detected