void USpineAtlasAssetFactory::LoadAtlas (USpineAtlasAsset* Asset, const FString& CurrentSourcePath, const FString& LongPackagePath) { spAtlas* atlas = Asset->GetAtlas(true); Asset->atlasPages.Empty(); const FString targetTexturePath = LongPackagePath / TEXT("Textures"); spAtlasPage* page = atlas->pages; while (page) { const FString sourceTextureFilename = FPaths::Combine(*CurrentSourcePath, UTF8_TO_TCHAR(page->name)); UTexture2D* texture = resolveTexture(Asset, sourceTextureFilename, targetTexturePath); page = page->next; Asset->atlasPages.Add(texture); } }
const std::vector<TexturedQuad> *resolveModel(const std::string &name) { if (!_builtModels.count(name)) { if (!_models.count(name)) return nullptr; _textureVariables.clear(); std::vector<TexturedQuad> quads; _models[name]->instantiateQuads(quads, *this); for (TexturedQuad &q : quads) q.texture = resolveTexture(q.texture); // Deal with texture overlays created by duplicate quads std::unordered_map<Vec<float, 12>, int> existingQuads; std::vector<TexturedQuad> filteredQuads; filteredQuads.reserve(quads.size()); for (size_t i = 0; i < quads.size(); ++i) { Vec<float, 12> key( quads[i].p0.x(), quads[i].p0.y(), quads[i].p0.z(), quads[i].p1.x(), quads[i].p1.y(), quads[i].p1.z(), quads[i].p2.x(), quads[i].p2.y(), quads[i].p2.z(), quads[i].p3.x(), quads[i].p3.y(), quads[i].p3.z() ); auto iter = existingQuads.find(key); if (iter != existingQuads.end()) { filteredQuads[iter->second].overlay = quads[i].texture; filteredQuads[iter->second].tintIndex = quads[i].tintIndex; } else { existingQuads.insert(std::make_pair(key, filteredQuads.size())); filteredQuads.push_back(quads[i]); } } _builtModels.emplace(std::make_pair(name, std::move(filteredQuads))); } return &_builtModels[name]; }