mirror of
https://github.com/JulianGro/overte.git
synced 2025-08-12 15:35:04 +02:00
Merge pull request #7230 from zzmp/fix/tex-cache
Fix inline fbx texture caching
This commit is contained in:
commit
6c54faf664
1 changed files with 30 additions and 31 deletions
|
@ -304,51 +304,50 @@ static NetworkMesh* buildNetworkMesh(const FBXMesh& mesh, const QUrl& textureBas
|
||||||
return networkMesh;
|
return networkMesh;
|
||||||
}
|
}
|
||||||
|
|
||||||
static NetworkMaterial* buildNetworkMaterial(const FBXMaterial& material, const QUrl& textureBaseUrl) {
|
static model::TextureMapPointer setupNetworkTextureMap(const QUrl& textureBaseUrl,
|
||||||
|
const FBXTexture& texture, TextureType type,
|
||||||
|
NetworkTexturePointer& networkTexture, QString& networkTextureName) {
|
||||||
auto textureCache = DependencyManager::get<TextureCache>();
|
auto textureCache = DependencyManager::get<TextureCache>();
|
||||||
NetworkMaterial* networkMaterial = new NetworkMaterial();
|
|
||||||
|
|
||||||
|
// If content is inline, cache it under the fbx file, not its base url
|
||||||
|
const auto baseUrl = texture.content.isEmpty() ? textureBaseUrl : QUrl(textureBaseUrl.url() + "/");
|
||||||
|
const auto filename = baseUrl.resolved(QUrl(texture.filename));
|
||||||
|
|
||||||
|
networkTexture = textureCache->getTexture(filename, type, texture.content);
|
||||||
|
networkTextureName = texture.name;
|
||||||
|
|
||||||
|
auto map = std::make_shared<model::TextureMap>();
|
||||||
|
map->setTextureSource(networkTexture->_textureSource);
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NetworkMaterial* buildNetworkMaterial(const FBXMaterial& material, const QUrl& textureBaseUrl) {
|
||||||
|
NetworkMaterial* networkMaterial = new NetworkMaterial();
|
||||||
networkMaterial->_material = material._material;
|
networkMaterial->_material = material._material;
|
||||||
|
|
||||||
if (!material.diffuseTexture.filename.isEmpty()) {
|
if (!material.diffuseTexture.filename.isEmpty()) {
|
||||||
networkMaterial->diffuseTexture = textureCache->getTexture(textureBaseUrl.resolved(QUrl(material.diffuseTexture.filename)), DEFAULT_TEXTURE, material.diffuseTexture.content);
|
auto diffuseMap = setupNetworkTextureMap(textureBaseUrl, material.diffuseTexture, DEFAULT_TEXTURE,
|
||||||
networkMaterial->diffuseTextureName = material.diffuseTexture.name;
|
networkMaterial->diffuseTexture, networkMaterial->diffuseTextureName);
|
||||||
|
|
||||||
auto diffuseMap = model::TextureMapPointer(new model::TextureMap());
|
|
||||||
diffuseMap->setTextureSource(networkMaterial->diffuseTexture->_textureSource);
|
|
||||||
diffuseMap->setTextureTransform(material.diffuseTexture.transform);
|
diffuseMap->setTextureTransform(material.diffuseTexture.transform);
|
||||||
|
networkMaterial->_material->setTextureMap(model::MaterialKey::DIFFUSE_MAP, diffuseMap);
|
||||||
material._material->setTextureMap(model::MaterialKey::DIFFUSE_MAP, diffuseMap);
|
|
||||||
}
|
}
|
||||||
if (!material.normalTexture.filename.isEmpty()) {
|
if (!material.normalTexture.filename.isEmpty()) {
|
||||||
networkMaterial->normalTexture = textureCache->getTexture(textureBaseUrl.resolved(QUrl(material.normalTexture.filename)), (material.normalTexture.isBumpmap ? BUMP_TEXTURE : NORMAL_TEXTURE), material.normalTexture.content);
|
auto normalMap = setupNetworkTextureMap(textureBaseUrl, material.normalTexture,
|
||||||
networkMaterial->normalTextureName = material.normalTexture.name;
|
(material.normalTexture.isBumpmap ? BUMP_TEXTURE : NORMAL_TEXTURE),
|
||||||
|
networkMaterial->normalTexture, networkMaterial->normalTextureName);
|
||||||
auto normalMap = model::TextureMapPointer(new model::TextureMap());
|
networkMaterial->_material->setTextureMap(model::MaterialKey::NORMAL_MAP, normalMap);
|
||||||
normalMap->setTextureSource(networkMaterial->normalTexture->_textureSource);
|
|
||||||
|
|
||||||
material._material->setTextureMap(model::MaterialKey::NORMAL_MAP, normalMap);
|
|
||||||
}
|
}
|
||||||
if (!material.specularTexture.filename.isEmpty()) {
|
if (!material.specularTexture.filename.isEmpty()) {
|
||||||
networkMaterial->specularTexture = textureCache->getTexture(textureBaseUrl.resolved(QUrl(material.specularTexture.filename)), SPECULAR_TEXTURE, material.specularTexture.content);
|
auto glossMap = setupNetworkTextureMap(textureBaseUrl, material.specularTexture, SPECULAR_TEXTURE,
|
||||||
networkMaterial->specularTextureName = material.specularTexture.name;
|
networkMaterial->specularTexture, networkMaterial->specularTextureName);
|
||||||
|
networkMaterial->_material->setTextureMap(model::MaterialKey::GLOSS_MAP, glossMap);
|
||||||
auto glossMap = model::TextureMapPointer(new model::TextureMap());
|
|
||||||
glossMap->setTextureSource(networkMaterial->specularTexture->_textureSource);
|
|
||||||
|
|
||||||
material._material->setTextureMap(model::MaterialKey::GLOSS_MAP, glossMap);
|
|
||||||
}
|
}
|
||||||
if (!material.emissiveTexture.filename.isEmpty()) {
|
if (!material.emissiveTexture.filename.isEmpty()) {
|
||||||
networkMaterial->emissiveTexture = textureCache->getTexture(textureBaseUrl.resolved(QUrl(material.emissiveTexture.filename)), LIGHTMAP_TEXTURE, material.emissiveTexture.content);
|
auto lightmapMap = setupNetworkTextureMap(textureBaseUrl, material.emissiveTexture, LIGHTMAP_TEXTURE,
|
||||||
networkMaterial->emissiveTextureName = material.emissiveTexture.name;
|
networkMaterial->emissiveTexture, networkMaterial->emissiveTextureName);
|
||||||
|
|
||||||
|
|
||||||
auto lightmapMap = model::TextureMapPointer(new model::TextureMap());
|
|
||||||
lightmapMap->setTextureSource(networkMaterial->emissiveTexture->_textureSource);
|
|
||||||
lightmapMap->setTextureTransform(material.emissiveTexture.transform);
|
lightmapMap->setTextureTransform(material.emissiveTexture.transform);
|
||||||
lightmapMap->setLightmapOffsetScale(material.emissiveParams.x, material.emissiveParams.y);
|
lightmapMap->setLightmapOffsetScale(material.emissiveParams.x, material.emissiveParams.y);
|
||||||
|
networkMaterial->_material->setTextureMap(model::MaterialKey::LIGHTMAP_MAP, lightmapMap);
|
||||||
material._material->setTextureMap(model::MaterialKey::LIGHTMAP_MAP, lightmapMap);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return networkMaterial;
|
return networkMaterial;
|
||||||
|
|
Loading…
Reference in a new issue