| 644 | } |
| 645 | |
| 646 | EntityPtr ResourceManager::LoadModel_(const std::string& name, const ColorSpace& cspace, const bool optimizeGraph, RenderFaceCulling defaultCullMode) { |
| 647 | STRATUS_LOG << "Attempting to load model: " << name << std::endl; |
| 648 | |
| 649 | Assimp::Importer importer; |
| 650 | //importer.SetPropertyInteger(AI_CONFIG_PP_SLM_VERTEX_LIMIT, 16000); |
| 651 | importer.SetPropertyInteger(AI_CONFIG_PP_SLM_TRIANGLE_LIMIT, 4096); |
| 652 | |
| 653 | unsigned int pflags = aiProcess_Triangulate | |
| 654 | aiProcess_JoinIdenticalVertices | |
| 655 | aiProcess_SortByPType | |
| 656 | aiProcess_GenNormals | |
| 657 | //aiProcess_ValidateDataStructure | |
| 658 | aiProcess_RemoveRedundantMaterials | |
| 659 | aiProcess_SortByPType | |
| 660 | //aiProcess_GenSmoothNormals | |
| 661 | aiProcess_FlipUVs | |
| 662 | aiProcess_GenUVCoords | |
| 663 | aiProcess_CalcTangentSpace | |
| 664 | aiProcess_SplitLargeMeshes | |
| 665 | aiProcess_ImproveCacheLocality | |
| 666 | aiProcess_OptimizeMeshes | |
| 667 | //aiProcess_OptimizeGraph | |
| 668 | //aiProcess_FixInfacingNormals | |
| 669 | aiProcess_FindDegenerates | |
| 670 | aiProcess_FindInvalidData | |
| 671 | aiProcess_FindInstances; |
| 672 | |
| 673 | if (optimizeGraph) { |
| 674 | pflags |= aiProcess_OptimizeGraph; |
| 675 | } |
| 676 | |
| 677 | //const aiScene *scene = importer.ReadFile(filename, aiProcess_Triangulate | aiProcess_FlipUVs | aiProcess_CalcTangentSpace | aiProcess_GenNormals | aiProcess_GenUVCoords); |
| 678 | //const aiScene *scene = importer.ReadFile(filename, aiProcess_Triangulate | aiProcess_GenSmoothNormals | aiProcess_FlipUVs | aiProcess_CalcTangentSpace | aiProcess_OptimizeMeshes); |
| 679 | const aiScene *scene = importer.ReadFile(name, pflags); |
| 680 | |
| 681 | if(!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode) { |
| 682 | STRATUS_ERROR << "Error loading model: " << name << std::endl << importer.GetErrorString() << std::endl; |
| 683 | return nullptr; |
| 684 | } |
| 685 | |
| 686 | // Create all scene materials |
| 687 | for (uint32_t i = 0; i < scene->mNumMaterials; ++i) { |
| 688 | const std::string materialName = name + "#" + std::to_string(i); |
| 689 | auto material = INSTANCE(MaterialManager)->CreateMaterial(materialName); |
| 690 | } |
| 691 | |
| 692 | EntityPtr e = CreateTransformEntity(); |
| 693 | std::vector<MeshToProcess_> meshes; |
| 694 | const std::string extension = name.substr(name.find_last_of('.') + 1, name.size()); |
| 695 | const std::string directory = name.substr(0, name.find_last_of('/')); |
| 696 | ProcessNode(scene->mRootNode, scene, e, aiMatrix4x4(), name, directory, extension, defaultCullMode, cspace, meshes); |
| 697 | |
| 698 | //for (auto& mesh : meshes) { |
| 699 | // ProcessMesh(mesh, scene, directory, extension, defaultCullMode, cspace); |
| 700 | //} |
| 701 | |
| 702 | std::vector<Async<void>> waiting; |
| 703 | // There are cases where the number of meshes to process is less than the total available threads, |
nothing calls this directly
no test coverage detected