void getMaterialAndTextureFileNames(FbxGeometry* fbxGeometry, std::vector<std::string>* out_textureFileNames, Material* out_material) { if (fbxGeometry->GetNode() == nullptr) { return; } int numMaterials = fbxGeometry->GetNode()->GetSrcObjectCount(FbxSurfaceMaterial::ClassId); for (int midx = 0; midx < numMaterials; ++midx){ FbxSurfaceMaterial *fbxMaterial = (FbxSurfaceMaterial *)fbxGeometry->GetNode()->GetSrcObject(FbxSurfaceMaterial::ClassId, midx); if (fbxMaterial) { getMaterialData(fbxMaterial, out_material); // Go through all the possible textures int tidx; FBXSDK_FOR_EACH_TEXTURE(tidx) { FbxProperty fbxTextureProperty = fbxMaterial->FindProperty(FbxLayerElement::sTextureChannelNames[tidx]); std::vector<std::string>* tempTextureFileNames = findAndGetTextureInfoByProperty(fbxTextureProperty, midx); for (int t = 0; t < tempTextureFileNames->size(); ++t) { out_textureFileNames->push_back(tempTextureFileNames->at(t)); } } }//end if(fbxMaterial) }// end for materialIndex return; }
void MaterialEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, EntityTreeElementExtraEncodeDataPointer modelTreeElementExtraEncodeData, EntityPropertyFlags& requestedProperties, EntityPropertyFlags& propertyFlags, EntityPropertyFlags& propertiesDidntFit, int& propertyCount, OctreeElement::AppendState& appendState) const { bool successPropertyFits = true; APPEND_ENTITY_PROPERTY(PROP_MATERIAL_URL, getMaterialURL()); APPEND_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_MODE, (uint32_t)getMaterialMappingMode()); APPEND_ENTITY_PROPERTY(PROP_MATERIAL_PRIORITY, getPriority()); APPEND_ENTITY_PROPERTY(PROP_PARENT_MATERIAL_NAME, getParentMaterialName()); APPEND_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_POS, getMaterialMappingPos()); APPEND_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_SCALE, getMaterialMappingScale()); APPEND_ENTITY_PROPERTY(PROP_MATERIAL_MAPPING_ROT, getMaterialMappingRot()); APPEND_ENTITY_PROPERTY(PROP_MATERIAL_DATA, getMaterialData()); }
void ModelBaker::handleFinishedMaterialMapBaker() { auto baker = qobject_cast<MaterialBaker*>(sender()); if (baker) { if (!baker->hasErrors()) { // this MaterialBaker is done and everything went according to plan qCDebug(model_baking) << "Adding baked material to FST mapping " << baker->getBakedMaterialData(); QString materialName; { auto materialResource = baker->getNetworkMaterialResource(); if (materialResource) { auto url = materialResource->getURL(); if (!url.isEmpty()) { QString urlString = url.toDisplayString(); auto index = urlString.lastIndexOf("#"); if (index != -1) { materialName = urlString.right(urlString.length() - index); } } } } QJsonObject json; json[QString(_materialMapping.front().first.c_str())] = baker->getMaterialData() + BAKED_MATERIAL_EXTENSION + materialName; _materialMappingJSON.push_back(json); } else { // this material failed to bake - this doesn't fail the entire bake but we need to add the errors from // the material to our warnings _warningList << baker->getWarnings(); } } else { handleWarning("Failed to bake the materialMap for model with URL " + _modelURL.toString() + " and mapping target " + _materialMapping.front().first.c_str()); } _materialMapping.erase(_materialMapping.begin()); bakeMaterialMap(); }
void MaterialEntityItem::setMaterialURL(const QString& materialURLString, bool materialDataChanged) { bool usingMaterialData = materialDataChanged || materialURLString.startsWith("materialData"); if (_materialURL != materialURLString || (usingMaterialData && materialDataChanged)) { removeMaterial(); _materialURL = materialURLString; if (materialURLString.contains("?")) { auto split = materialURLString.split("?"); _currentMaterialName = split.last().toStdString(); } if (usingMaterialData) { _parsedMaterials = NetworkMaterialResource::parseJSONMaterials(QJsonDocument::fromJson(getMaterialData().toUtf8()), materialURLString); // Since our material changed, the current name might not be valid anymore, so we need to update setCurrentMaterialName(_currentMaterialName); applyMaterial(); } else { _networkMaterial = MaterialCache::instance().getMaterial(materialURLString); auto onMaterialRequestFinished = [&](bool success) { if (success) { _parsedMaterials = _networkMaterial->parsedMaterials; setCurrentMaterialName(_currentMaterialName); applyMaterial(); } }; if (_networkMaterial) { if (_networkMaterial->isLoaded()) { onMaterialRequestFinished(!_networkMaterial->isFailed()); } else { connect(_networkMaterial.data(), &Resource::finished, this, onMaterialRequestFinished); } } } } }