void glTF2Exporter::GetMatTex(const aiMaterial* mat, Ref<Texture>& texture, aiTextureType tt, unsigned int slot = 0) { if (mat->GetTextureCount(tt) > 0) { aiString tex; if (mat->Get(AI_MATKEY_TEXTURE(tt, slot), tex) == AI_SUCCESS) { std::string path = tex.C_Str(); if (path.size() > 0) { std::map<std::string, unsigned int>::iterator it = mTexturesByPath.find(path); if (it != mTexturesByPath.end()) { texture = mAsset->textures.Get(it->second); } if (!texture) { std::string texId = mAsset->FindUniqueID("", "texture"); texture = mAsset->textures.Create(texId); mTexturesByPath[path] = texture.GetIndex(); std::string imgId = mAsset->FindUniqueID("", "image"); texture->source = mAsset->images.Create(imgId); if (path[0] == '*') { // embedded aiTexture* tex = mScene->mTextures[atoi(&path[1])]; uint8_t* data = reinterpret_cast<uint8_t*>(tex->pcData); texture->source->SetData(data, tex->mWidth, *mAsset); if (tex->achFormatHint[0]) { std::string mimeType = "image/"; mimeType += (memcmp(tex->achFormatHint, "jpg", 3) == 0) ? "jpeg" : tex->achFormatHint; texture->source->mimeType = mimeType; } } else { texture->source->uri = path; } GetTexSampler(mat, texture, tt, slot); } } } } }
/* * Export the root node of the node hierarchy. * Calls ExportNode for all children. */ unsigned int glTF2Exporter::ExportNodeHierarchy(const aiNode* n) { Ref<Node> node = mAsset->nodes.Create(mAsset->FindUniqueID(n->mName.C_Str(), "node")); if (!n->mTransformation.IsIdentity()) { node->matrix.isPresent = true; CopyValue(n->mTransformation, node->matrix.value); } for (unsigned int i = 0; i < n->mNumMeshes; ++i) { node->meshes.push_back(mAsset->meshes.Get(n->mMeshes[i])); } for (unsigned int i = 0; i < n->mNumChildren; ++i) { unsigned int idx = ExportNode(n->mChildren[i], node); node->children.push_back(mAsset->nodes.Get(idx)); } return node.GetIndex(); }