// // Copyright Contributors to the MaterialX Project // SPDX-License-Identifier: Apache-2.0 // #include #include MATERIALX_NAMESPACE_BEGIN const string MaterialAssign::MATERIAL_ATTRIBUTE = "material"; const string MaterialAssign::EXCLUSIVE_ATTRIBUTE = "exclusive"; const string Visibility::VIEWER_GEOM_ATTRIBUTE = "viewergeom"; const string Visibility::VIEWER_COLLECTION_ATTRIBUTE = "viewercollection"; const string Visibility::VISIBILITY_TYPE_ATTRIBUTE = "vistype"; const string Visibility::VISIBLE_ATTRIBUTE = "visible"; const string LookGroup::LOOKS_ATTRIBUTE = "looks"; const string LookGroup::ACTIVE_ATTRIBUTE = "active"; vector getGeometryBindings(ConstNodePtr materialNode, const string& geom) { vector matAssigns; for (LookPtr look : materialNode->getDocument()->getLooks()) { for (MaterialAssignPtr matAssign : look->getMaterialAssigns()) { if (matAssign->getReferencedMaterial() == materialNode) { if (geomStringsMatch(matAssign->getActiveGeom(), geom, true)) { matAssigns.push_back(matAssign); continue; } CollectionPtr coll = matAssign->getCollection(); if (coll && coll->matchesGeomString(geom)) { matAssigns.push_back(matAssign); continue; } } } } return matAssigns; } // // Look methods // MaterialAssignPtr Look::addMaterialAssign(const string& name, const string& material) { MaterialAssignPtr matAssign = addChild(name); if (!material.empty()) { matAssign->setMaterial(material); } return matAssign; } vector Look::getActiveMaterialAssigns() const { vector activeAssigns; for (ConstElementPtr elem : traverseInheritance()) { vector assigns = elem->asA()->getMaterialAssigns(); activeAssigns.insert(activeAssigns.end(), assigns.begin(), assigns.end()); } return activeAssigns; } vector Look::getActivePropertyAssigns() const { vector activeAssigns; for (ConstElementPtr elem : traverseInheritance()) { vector assigns = elem->asA()->getPropertyAssigns(); activeAssigns.insert(activeAssigns.end(), assigns.begin(), assigns.end()); } return activeAssigns; } vector Look::getActivePropertySetAssigns() const { vector activeAssigns; for (ConstElementPtr elem : traverseInheritance()) { vector assigns = elem->asA()->getPropertySetAssigns(); activeAssigns.insert(activeAssigns.end(), assigns.begin(), assigns.end()); } return activeAssigns; } vector Look::getActiveVariantAssigns() const { vector activeAssigns; for (ConstElementPtr elem : traverseInheritance()) { vector assigns = elem->asA()->getVariantAssigns(); activeAssigns.insert(activeAssigns.end(), assigns.begin(), assigns.end()); } return activeAssigns; } vector Look::getActiveVisibilities() const { vector activeVisibilities; for (ConstElementPtr elem : traverseInheritance()) { vector visibilities = elem->asA()->getVisibilities(); activeVisibilities.insert(activeVisibilities.end(), visibilities.begin(), visibilities.end()); } return activeVisibilities; } // // MaterialAssign methods // NodePtr MaterialAssign::getReferencedMaterial() const { return resolveNameReference(getMaterial()); } vector MaterialAssign::getMaterialOutputs() const { vector materialOutputs; NodeGraphPtr materialGraph = resolveNameReference(getMaterial()); if (materialGraph) { return materialGraph->getMaterialOutputs(); } return materialOutputs; } vector MaterialAssign::getActiveVariantAssigns() const { vector activeAssigns; for (ConstElementPtr elem : traverseInheritance()) { vector assigns = elem->asA()->getVariantAssigns(); activeAssigns.insert(activeAssigns.end(), assigns.begin(), assigns.end()); } return activeAssigns; } MATERIALX_NAMESPACE_END