16 switch (texture->GetUsage())
48 EE_CORE_ASSERT(
false,
"Unsupported primitive shape given for mesh creation.");
64void Elevate::Model::LoadModel(std::string path)
68 Assimp::Importer
import;
69 const aiScene* scene =
import.ReadFile(resolvedPath, aiProcess_Triangulate | aiProcess_GenNormals | aiProcess_OptimizeMeshes | aiProcess_ImproveCacheLocality);
72 if (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode)
74 EE_CORE_ERROR(
"ASSIMP LOADING ERROR : {}",
import.GetErrorString());
77 m_Directory = resolvedPath.substr(0, resolvedPath.find_last_of(
'/'));
81 std::vector<Mesh> meshes;
82 std::filesystem::path fsPath(resolvedPath);
83 ProcessNode(fsPath.parent_path().string(), scene->mRootNode, scene, data);
85 m_batchedMesh = Mesh(data);
86 for (
auto& tex : m_batchedMesh.GetTextures())
92void Elevate::Model::ProcessNode(std::string basePath, aiNode* node,
const aiScene* scene, MeshData& data)
95 for (
unsigned int i = 0; i < node->mNumMeshes; i++)
97 aiMesh* mesh = scene->mMeshes[node->mMeshes[i]];
98 ProcessMesh(basePath, mesh, scene, data);
101 for (
unsigned int i = 0; i < node->mNumChildren; i++)
103 ProcessNode(basePath, node->mChildren[i], scene, data);
107void Elevate::Model::ProcessMesh(std::string basePath, aiMesh* mesh,
const aiScene* scene, MeshData& data)
109 uint32_t offset = (uint32_t) data.Vertices.size();
112 for (
unsigned int i = 0; i < mesh->mNumVertices; i++)
115 ExtractMeshVertex(mesh, vertex, i);
116 data.Vertices.emplace_back(vertex);
120 for (
unsigned int i = 0; i < mesh->mNumFaces; i++)
122 aiFace face = mesh->mFaces[i];
123 for (
unsigned int j = 0; j < face.mNumIndices; j++)
125 data.Indices.emplace_back(face.mIndices[j] + offset);
130 if (mesh->mMaterialIndex >= 0)
132 aiMaterial* material = scene->mMaterials[mesh->mMaterialIndex];
136 LoadMaterialTextures(basePath, material, aiTextureType_AMBIENT_OCCLUSION,
TextureType::Ambient, data);
141void Elevate::Model::ExtractMeshVertex(aiMesh* mesh, Vertex& vertex,
int i)
145 vector.x = mesh->mVertices[i].x;
146 vector.y = mesh->mVertices[i].y;
147 vector.z = mesh->mVertices[i].z;
148 vertex.Position = vector;
150 vector.x = mesh->mNormals[i].x;
151 vector.y = mesh->mNormals[i].y;
152 vector.z = mesh->mNormals[i].z;
153 vertex.Normal = vector;
155 if (mesh->mTextureCoords[0])
159 coords.x = mesh->mTextureCoords[0][i].x;
160 coords.y = mesh->mTextureCoords[0][i].y;
161 vertex.TexCoords = coords;
167 vector.x = mesh->mTangents[i].x;
168 vector.y = mesh->mTangents[i].y;
169 vector.z = mesh->mTangents[i].z;
170 vertex.Tangent = vector;
173 if (mesh->mBitangents)
176 vector.x = mesh->mBitangents[i].x;
177 vector.y = mesh->mBitangents[i].y;
178 vector.z = mesh->mBitangents[i].z;
179 vertex.Bitangent = vector;
183void Elevate::Model::LoadMaterialTextures(std::string basePath, aiMaterial* mat, aiTextureType type,
TextureType texType, MeshData& data)
185 for (
unsigned int i = 0; i < mat->GetTextureCount(type); i++)
188 mat->GetTexture(type, i, &str);
190 std::filesystem::path directory(basePath);
191 directory.append(str.C_Str());
192 std::string path = directory.string();
197 if (tex->MatchesPath(path))
#define EE_DEFAULT_MATERIAL
std::string GetUniformNameByType(Elevate::TexturePtr texture)
static MaterialPtr GetMaterial(MaterialID id)
static Mesh GeneratePlane(float size, int resolution)
static Mesh GenerateUVSphere(float radius, int latitudes, int longitudes)
static Mesh GenerateQuad(float size=1.0f)
static Mesh GenerateCube(float size=1.0f)
static std::string Resolve(const std::string &virtualPath)
static void SubmitMesh(const std::shared_ptr< VertexArray > &vao, const std::shared_ptr< Material > &material, const glm::mat4 &transform, RenderBucket::Type bucketType=RenderBucket::Opaque)
static TexturePtr CreateFromFile(const std::string &path, TextureType usage=TextureType::Diffuse)
std::shared_ptr< Material > MaterialPtr
std::shared_ptr< Texture > TexturePtr