remove:删除model_loader模块
parent
6b6c754b5f
commit
d38b92b8da
|
|
@ -1,58 +0,0 @@
|
||||||
#ifndef ARE_INCLUDE_RESOURCE_MODEL_LOADER_H
|
|
||||||
#define ARE_INCLUDE_RESOURCE_MODEL_LOADER_H
|
|
||||||
|
|
||||||
#include "basic/types.h"
|
|
||||||
#include "scene/mesh.h"
|
|
||||||
#include "scene/material.h"
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
namespace are {
|
|
||||||
|
|
||||||
/// @brief Model loader using Assimp
|
|
||||||
class ModelLoader {
|
|
||||||
public:
|
|
||||||
/// @brief Load model from file
|
|
||||||
/// @param path Model file path
|
|
||||||
/// @param meshes Output mesh list
|
|
||||||
/// @param materials Output material list
|
|
||||||
/// @param flip_uvs Flip UV coordinates vertically
|
|
||||||
/// @return True if loading succeeded
|
|
||||||
static bool load(const std::string& path,
|
|
||||||
std::vector<std::shared_ptr<Mesh>>& meshes,
|
|
||||||
std::vector<std::shared_ptr<Material>>& materials,
|
|
||||||
bool flip_uvs = true);
|
|
||||||
|
|
||||||
/// @brief Load model and automatically upload to GPU
|
|
||||||
/// @param path Model file path
|
|
||||||
/// @param meshes Output mesh list
|
|
||||||
/// @param materials Output material list
|
|
||||||
/// @param flip_uvs Flip UV coordinates vertically
|
|
||||||
/// @return True if loading succeeded
|
|
||||||
static bool load_and_upload(const std::string& path,
|
|
||||||
std::vector<std::shared_ptr<Mesh>>& meshes,
|
|
||||||
std::vector<std::shared_ptr<Material>>& materials,
|
|
||||||
bool flip_uvs = true);
|
|
||||||
|
|
||||||
private:
|
|
||||||
/// @brief Process Assimp node recursively
|
|
||||||
static void process_node_(void* node, void* scene,
|
|
||||||
std::vector<std::shared_ptr<Mesh>>& meshes,
|
|
||||||
std::vector<std::shared_ptr<Material>>& materials,
|
|
||||||
const std::string& directory);
|
|
||||||
|
|
||||||
/// @brief Process Assimp mesh
|
|
||||||
static std::shared_ptr<Mesh> process_mesh_(void* mesh, void* scene,
|
|
||||||
std::vector<std::shared_ptr<Material>>& materials,
|
|
||||||
const std::string& directory);
|
|
||||||
|
|
||||||
/// @brief Load material textures
|
|
||||||
static void load_material_textures_(void* material, int type,
|
|
||||||
std::shared_ptr<Material>& mat,
|
|
||||||
const std::string& directory);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace are
|
|
||||||
|
|
||||||
#endif // ARE_INCLUDE_RESOURCE_MODEL_LOADER_H
|
|
||||||
|
|
@ -1,187 +0,0 @@
|
||||||
#include "resource/model_loader.h"
|
|
||||||
#include "utils/logger.h"
|
|
||||||
#include "resource/texture.h"
|
|
||||||
|
|
||||||
// Note: This is a simplified implementation without Assimp
|
|
||||||
// For full implementation, include Assimp and implement properly
|
|
||||||
|
|
||||||
namespace are {
|
|
||||||
|
|
||||||
bool ModelLoader::load(const std::string& path,
|
|
||||||
std::vector<std::shared_ptr<Mesh>>& meshes,
|
|
||||||
std::vector<std::shared_ptr<Material>>& materials,
|
|
||||||
bool flip_uvs) {
|
|
||||||
Logger::error("ModelLoader requires Assimp library (not implemented in this version)");
|
|
||||||
Logger::info("To implement: include <assimp/Importer.hpp>, <assimp/scene.h>, <assimp/postprocess.h>");
|
|
||||||
|
|
||||||
// Placeholder implementation
|
|
||||||
// TODO: Implement with Assimp
|
|
||||||
/*
|
|
||||||
Assimp::Importer importer;
|
|
||||||
const aiScene* scene = importer.ReadFile(path,
|
|
||||||
aiProcess_Triangulate |
|
|
||||||
aiProcess_GenNormals |
|
|
||||||
aiProcess_CalcTangentSpace |
|
|
||||||
(flip_uvs ? aiProcess_FlipUVs : 0));
|
|
||||||
|
|
||||||
if (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode) {
|
|
||||||
Logger::error("Failed to load model: " + std::string(importer.GetErrorString()));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string directory = path.substr(0, path.find_last_of('/'));
|
|
||||||
process_node_(scene->mRootNode, scene, meshes, materials, directory);
|
|
||||||
|
|
||||||
Logger::info("Model loaded: " + path);
|
|
||||||
return true;
|
|
||||||
*/
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ModelLoader::load_and_upload(const std::string& path,
|
|
||||||
std::vector<std::shared_ptr<Mesh>>& meshes,
|
|
||||||
std::vector<std::shared_ptr<Material>>& materials,
|
|
||||||
bool flip_uvs) {
|
|
||||||
if (!load(path, meshes, materials, flip_uvs)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Upload all meshes to GPU
|
|
||||||
for (auto& mesh : meshes) {
|
|
||||||
if (!mesh->upload_to_gpu()) {
|
|
||||||
Logger::error("Failed to upload mesh to GPU");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ModelLoader::process_node_(void* node, void* scene,
|
|
||||||
std::vector<std::shared_ptr<Mesh>>& meshes,
|
|
||||||
std::vector<std::shared_ptr<Material>>& materials,
|
|
||||||
const std::string& directory) {
|
|
||||||
// TODO: Implement with Assimp
|
|
||||||
/*
|
|
||||||
aiNode* ai_node = static_cast<aiNode*>(node);
|
|
||||||
const aiScene* ai_scene = static_cast<const aiScene*>(scene);
|
|
||||||
|
|
||||||
// Process all meshes in this node
|
|
||||||
for (uint i = 0; i < ai_node->mNumMeshes; ++i) {
|
|
||||||
aiMesh* ai_mesh = ai_scene->mMeshes[ai_node->mMeshes[i]];
|
|
||||||
meshes.push_back(process_mesh_(ai_mesh, ai_scene, materials, directory));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Process children recursively
|
|
||||||
for (uint i = 0; i < ai_node->mNumChildren; ++i) {
|
|
||||||
process_node_(ai_node->mChildren[i], ai_scene, meshes, materials, directory);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
std::shared_ptr<Mesh> ModelLoader::process_mesh_(void* mesh, void* scene,
|
|
||||||
std::vector<std::shared_ptr<Material>>& materials,
|
|
||||||
const std::string& directory) {
|
|
||||||
// TODO: Implement with Assimp
|
|
||||||
/*
|
|
||||||
aiMesh* ai_mesh = static_cast<aiMesh*>(mesh);
|
|
||||||
const aiScene* ai_scene = static_cast<const aiScene*>(scene);
|
|
||||||
|
|
||||||
std::vector<Vertex> vertices;
|
|
||||||
std::vector<uint> indices;
|
|
||||||
|
|
||||||
// Process vertices
|
|
||||||
for (uint i = 0; i < ai_mesh->mNumVertices; ++i) {
|
|
||||||
Vertex vertex;
|
|
||||||
|
|
||||||
vertex.position_ = Vec3(ai_mesh->mVertices[i].x,
|
|
||||||
ai_mesh->mVertices[i].y,
|
|
||||||
ai_mesh->mVertices[i].z);
|
|
||||||
|
|
||||||
if (ai_mesh->HasNormals()) {
|
|
||||||
vertex.normal_ = Vec3(ai_mesh->mNormals[i].x,
|
|
||||||
ai_mesh->mNormals[i].y,
|
|
||||||
ai_mesh->mNormals[i].z);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ai_mesh->mTextureCoords[0]) {
|
|
||||||
vertex.texcoord_ = Vec2(ai_mesh->mTextureCoords[0][i].x,
|
|
||||||
ai_mesh->mTextureCoords[0][i].y);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ai_mesh->HasTangentsAndBitangents()) {
|
|
||||||
vertex.tangent_ = Vec3(ai_mesh->mTangents[i].x,
|
|
||||||
ai_mesh->mTangents[i].y,
|
|
||||||
ai_mesh->mTangents[i].z);
|
|
||||||
}
|
|
||||||
|
|
||||||
vertices.push_back(vertex);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Process indices
|
|
||||||
for (uint i = 0; i < ai_mesh->mNumFaces; ++i) {
|
|
||||||
aiFace face = ai_mesh->mFaces[i];
|
|
||||||
for (uint j = 0; j < face.mNumIndices; ++j) {
|
|
||||||
indices.push_back(face.mIndices[j]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Process material
|
|
||||||
uint material_id = materials.size();
|
|
||||||
if (ai_mesh->mMaterialIndex >= 0) {
|
|
||||||
aiMaterial* ai_material = ai_scene->mMaterials[ai_mesh->mMaterialIndex];
|
|
||||||
|
|
||||||
auto material = std::make_shared<Material>();
|
|
||||||
|
|
||||||
// Load diffuse color
|
|
||||||
aiColor3D color;
|
|
||||||
if (ai_material->Get(AI_MATKEY_COLOR_DIFFUSE, color) == AI_SUCCESS) {
|
|
||||||
material->set_albedo(Vec3(color.r, color.g, color.b));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load textures
|
|
||||||
load_material_textures_(ai_material, aiTextureType_DIFFUSE, material, directory);
|
|
||||||
load_material_textures_(ai_material, aiTextureType_NORMALS, material, directory);
|
|
||||||
|
|
||||||
materials.push_back(material);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto mesh_obj = std::make_shared<Mesh>();
|
|
||||||
mesh_obj->set_vertices(vertices);
|
|
||||||
mesh_obj->set_indices(indices);
|
|
||||||
mesh_obj->set_material(material_id);
|
|
||||||
|
|
||||||
return mesh_obj;
|
|
||||||
*/
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ModelLoader::load_material_textures_(void* material, int type,
|
|
||||||
std::shared_ptr<Material>& mat,
|
|
||||||
const std::string& directory) {
|
|
||||||
// TODO: Implement with Assimp
|
|
||||||
/*
|
|
||||||
aiMaterial* ai_material = static_cast<aiMaterial*>(material);
|
|
||||||
aiTextureType ai_type = static_cast<aiTextureType>(type);
|
|
||||||
|
|
||||||
for (uint i = 0; i < ai_material->GetTextureCount(ai_type); ++i) {
|
|
||||||
aiString str;
|
|
||||||
ai_material->GetTexture(ai_type, i, &str);
|
|
||||||
|
|
||||||
std::string filename = directory + "/" + std::string(str.C_Str());
|
|
||||||
|
|
||||||
auto texture = std::make_shared<Texture>();
|
|
||||||
if (texture->load_from_file(filename)) {
|
|
||||||
if (ai_type == aiTextureType_DIFFUSE) {
|
|
||||||
mat->set_albedo_texture(texture);
|
|
||||||
} else if (ai_type == aiTextureType_NORMALS) {
|
|
||||||
mat->set_normal_texture(texture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace are
|
|
||||||
Loading…
Reference in New Issue