mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 14:58:03 +02:00
Derive NetworkMaterial, avoid copying it
This commit is contained in:
parent
3402635f99
commit
eeeb175bb8
2 changed files with 27 additions and 9 deletions
|
@ -193,7 +193,7 @@ void GeometryDefinitionResource::setGeometryDefinition(void* fbxGeometry) {
|
||||||
int partID = 0;
|
int partID = 0;
|
||||||
for (const FBXMeshPart& part : mesh.parts) {
|
for (const FBXMeshPart& part : mesh.parts) {
|
||||||
// Construct local shapes
|
// Construct local shapes
|
||||||
shapes->emplace_back(meshID, partID, (int)materialIDAtlas[part.materialID]);
|
shapes->push_back(std::make_shared<NetworkShape>(meshID, partID, (int)materialIDAtlas[part.materialID]));
|
||||||
partID++;
|
partID++;
|
||||||
}
|
}
|
||||||
meshID++;
|
meshID++;
|
||||||
|
@ -249,7 +249,13 @@ void Geometry::setTextures(const QVariantMap& textureMap) {
|
||||||
if (std::any_of(material->_textures.cbegin(), material->_textures.cend(),
|
if (std::any_of(material->_textures.cbegin(), material->_textures.cend(),
|
||||||
[&textureMap](const NetworkMaterial::Textures::value_type& it) { return it.texture && textureMap.contains(it.name); })) {
|
[&textureMap](const NetworkMaterial::Textures::value_type& it) { return it.texture && textureMap.contains(it.name); })) {
|
||||||
|
|
||||||
material = std::make_shared<NetworkMaterial>(*material, textureMap);
|
if (material->isOriginal()) {
|
||||||
|
// On first mutation, copy the material to avoid altering the cache
|
||||||
|
material = std::make_shared<NetworkMaterial>(*material, textureMap);
|
||||||
|
} else {
|
||||||
|
// On later mutations, we can mutate in-place
|
||||||
|
material->setTextures(textureMap);
|
||||||
|
}
|
||||||
_areTexturesLoaded = false;
|
_areTexturesLoaded = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -286,7 +292,7 @@ bool Geometry::areTexturesLoaded() const {
|
||||||
|
|
||||||
const std::shared_ptr<const NetworkMaterial> Geometry::getShapeMaterial(int shapeID) const {
|
const std::shared_ptr<const NetworkMaterial> Geometry::getShapeMaterial(int shapeID) const {
|
||||||
if ((shapeID >= 0) && (shapeID < (int)_shapes->size())) {
|
if ((shapeID >= 0) && (shapeID < (int)_shapes->size())) {
|
||||||
int materialID = _shapes->at(shapeID).materialID;
|
int materialID = _shapes->at(shapeID)->materialID;
|
||||||
if ((materialID >= 0) && (materialID < (int)_materials.size())) {
|
if ((materialID >= 0) && (materialID < (int)_materials.size())) {
|
||||||
return _materials[materialID];
|
return _materials[materialID];
|
||||||
}
|
}
|
||||||
|
@ -348,7 +354,15 @@ model::TextureMapPointer NetworkMaterial::fetchTextureMap(const QUrl& url, Textu
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
NetworkMaterial::NetworkMaterial(const FBXMaterial& material, const QUrl& textureBaseUrl) {
|
NetworkMaterial::NetworkMaterial(const NetworkMaterial& material, const QVariantMap& textureMap) :
|
||||||
|
_textures(material._textures), _isOriginal(false)
|
||||||
|
{
|
||||||
|
setTextures(textureMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworkMaterial::NetworkMaterial(const FBXMaterial& material, const QUrl& textureBaseUrl) :
|
||||||
|
model::Material(*material._material), _isOriginal(true)
|
||||||
|
{
|
||||||
_textures = Textures(MapChannel::NUM_MAP_CHANNELS);
|
_textures = Textures(MapChannel::NUM_MAP_CHANNELS);
|
||||||
if (!material.albedoTexture.filename.isEmpty()) {
|
if (!material.albedoTexture.filename.isEmpty()) {
|
||||||
auto map = fetchTextureMap(textureBaseUrl, material.albedoTexture, DEFAULT_TEXTURE, MapChannel::ALBEDO_MAP);
|
auto map = fetchTextureMap(textureBaseUrl, material.albedoTexture, DEFAULT_TEXTURE, MapChannel::ALBEDO_MAP);
|
||||||
|
@ -406,9 +420,7 @@ NetworkMaterial::NetworkMaterial(const FBXMaterial& material, const QUrl& textur
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NetworkMaterial::NetworkMaterial(const NetworkMaterial& material, const QVariantMap& textureMap) : NetworkMaterial(material) {
|
void NetworkMaterial::setTextures(const QVariantMap& textureMap) {
|
||||||
_textures = material._textures;
|
|
||||||
|
|
||||||
const auto& albedoName = getTextureName(MapChannel::ALBEDO_MAP);
|
const auto& albedoName = getTextureName(MapChannel::ALBEDO_MAP);
|
||||||
const auto& normalName = getTextureName(MapChannel::NORMAL_MAP);
|
const auto& normalName = getTextureName(MapChannel::NORMAL_MAP);
|
||||||
const auto& roughnessName = getTextureName(MapChannel::ROUGHNESS_MAP);
|
const auto& roughnessName = getTextureName(MapChannel::ROUGHNESS_MAP);
|
||||||
|
|
|
@ -58,10 +58,10 @@ public:
|
||||||
|
|
||||||
// Immutable over lifetime
|
// Immutable over lifetime
|
||||||
using NetworkMeshes = std::vector<std::shared_ptr<const NetworkMesh>>;
|
using NetworkMeshes = std::vector<std::shared_ptr<const NetworkMesh>>;
|
||||||
using NetworkShapes = std::vector<NetworkShape>;
|
using NetworkShapes = std::vector<std::shared_ptr<const NetworkShape>>;
|
||||||
|
|
||||||
// Mutable, but must retain structure of vector
|
// Mutable, but must retain structure of vector
|
||||||
using NetworkMaterials = std::vector<std::shared_ptr<const NetworkMaterial>>;
|
using NetworkMaterials = std::vector<std::shared_ptr<NetworkMaterial>>;
|
||||||
|
|
||||||
const FBXGeometry& getGeometry() const { return *_geometry; }
|
const FBXGeometry& getGeometry() const { return *_geometry; }
|
||||||
const NetworkMeshes& getMeshes() const { return *_meshes; }
|
const NetworkMeshes& getMeshes() const { return *_meshes; }
|
||||||
|
@ -156,12 +156,18 @@ protected:
|
||||||
static const QString NO_TEXTURE;
|
static const QString NO_TEXTURE;
|
||||||
const QString& getTextureName(MapChannel channel);
|
const QString& getTextureName(MapChannel channel);
|
||||||
|
|
||||||
|
void setTextures(const QVariantMap& textureMap);
|
||||||
|
|
||||||
|
const bool& isOriginal() const { return _isOriginal; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Helpers for the ctors
|
// Helpers for the ctors
|
||||||
QUrl getTextureUrl(const QUrl& baseUrl, const FBXTexture& fbxTexture);
|
QUrl getTextureUrl(const QUrl& baseUrl, const FBXTexture& fbxTexture);
|
||||||
model::TextureMapPointer fetchTextureMap(const QUrl& baseUrl, const FBXTexture& fbxTexture,
|
model::TextureMapPointer fetchTextureMap(const QUrl& baseUrl, const FBXTexture& fbxTexture,
|
||||||
TextureType type, MapChannel channel);
|
TextureType type, MapChannel channel);
|
||||||
model::TextureMapPointer fetchTextureMap(const QUrl& url, TextureType type, MapChannel channel);
|
model::TextureMapPointer fetchTextureMap(const QUrl& url, TextureType type, MapChannel channel);
|
||||||
|
|
||||||
|
bool _isOriginal;
|
||||||
};
|
};
|
||||||
|
|
||||||
class NetworkShape {
|
class NetworkShape {
|
||||||
|
|
Loading…
Reference in a new issue