MStatus PRTAttrs::addColorParameter(MFnDependencyNode & node, MObject & attr, const MString & name, MString & value ) { MStatus stat; MFnNumericAttribute nAttr; const wchar_t* s = value.asWChar(); attr = nAttr.createColor(longName(name), briefName(name), &stat ); MCHECK(stat); double r = 0.0; double g = 0.0; double b = 0.0; if (s[0] == '#' && wcslen(s) >= 7) { r = (double)((prtu::fromHex(s[1]) << 4) + prtu::fromHex(s[2])) / 255.0; g = (double)((prtu::fromHex(s[3]) << 4) + prtu::fromHex(s[4])) / 255.0; b = (double)((prtu::fromHex(s[5]) << 4) + prtu::fromHex(s[6])) / 255.0; nAttr.setDefault(r, g, b); } MCHECK(addParameter(node, attr, nAttr)); MFnNumericData fnData; MObject rgb = fnData.create(MFnNumericData::k3Double, &stat); MCHECK(stat); fnData.setData(r, g, b); MPlug plug(node.object(), attr); MCHECK(plug.setValue(rgb)); return MS::kSuccess; }
bool loadWGT() { MString filepath = wgtHome; filepath += WGT_MAYA_PLUGIN_LIST_FILE; std::vector<std::wstring> plugins; if (!getWGTPlugins(plugins, filepath.asWChar()) || plugins.empty()) { return MStatus::kFailure; // failed to find any plugins! } auto& contextManager = pluginManager->getContextManager(); contextManager.setExecutablePath(wgtHome); auto globalContext = contextManager.getGlobalContext(); globalContext->registerInterface(new MemoryPluginContextCreator); pluginManager->loadPlugins(plugins); auto uiApp = globalContext->queryInterface<IUIApplication>(); if (!uiApp) { return false; } wgtApp = new ApplicationProxy(uiApp); wgtApp->start(); auto automation = globalContext->queryInterface<IAutomation>(); if (automation != nullptr) { MGlobal::executeCommandOnIdle("evalDeferred(\"quit -force\")"); } return true; }
// TODO: make evalAttr finds more robust MStatus PRTAttrs::createAttributes(MFnDependencyNode & node, const std::wstring & ruleFile, const std::wstring & startRule, prt::AttributeMapBuilder* aBuilder, const prt::RuleFileInfo* info) { MStatus stat; MStatus stat2; MFnNumericData numericData; MFnTypedAttribute tAttr; MFnStringData attrDefaultStr; PRTNode* prtNode = (PRTNode*)node.userNode(); MString dummy; MayaCallbacks* outputHandler = prtNode->createOutputHandler(0, 0); const prt::AttributeMap* attrs = aBuilder->createAttributeMap(); prt::InitialShapeBuilder* isb = prt::InitialShapeBuilder::create(); isb->setGeometry( UnitQuad::vertices, UnitQuad::vertexCount, UnitQuad::indices, UnitQuad::indexCount, UnitQuad::faceCounts, UnitQuad::faceCountsCount ); isb->setAttributes( ruleFile.c_str(), startRule.c_str(), UnitQuad::seed, L"", attrs, prtNode->mResolveMap ); const prt::InitialShape* shape = isb->createInitialShapeAndReset(); prt::generate(&shape, 1, 0, &ENC_ATTR, 1, &prtNode->mAttrEncOpts, outputHandler, PRTNode::theCache, 0); const std::map<std::wstring, MayaCallbacks::AttributeHolder>& evalAttrs = outputHandler->getAttrs(); prtNode->mBriefName2prtAttr[NAME_GENERATE.asWChar()] = NAME_GENERATE.asWChar(); for(size_t i = 0; i < info->getNumAttributes(); i++) { PRTEnum* e = nullptr; const MString name = MString(info->getAttribute(i)->getName()); MObject attr; if(info->getAttribute(i)->getNumParameters() != 0) continue; prtNode->mBriefName2prtAttr[prtu::toCleanId(name).asWChar()] = name.asWChar(); switch(info->getAttribute(i)->getReturnType()) { case prt::AAT_BOOL: { for(size_t a = 0; a < info->getAttribute(i)->getNumAnnotations(); a++) { const prt::Annotation* an = info->getAttribute(i)->getAnnotation(a); if(!(wcscmp(an->getName(), ANNOT_RANGE))) e = new PRTEnum(prtNode, an); } bool value = evalAttrs.find(name.asWChar())->second.mBool; if(e) { MCHECK(addEnumParameter(node, attr, name, value, e)); } else { MCHECK(addBoolParameter(node, attr, name, value)); } break; } case prt::AAT_FLOAT: { double min = std::numeric_limits<double>::quiet_NaN(); double max = std::numeric_limits<double>::quiet_NaN(); for(size_t a = 0; a < info->getAttribute(i)->getNumAnnotations(); a++) { const prt::Annotation* an = info->getAttribute(i)->getAnnotation(a); if(!(wcscmp(an->getName(), ANNOT_RANGE))) { if(an->getNumArguments() == 2 && an->getArgument(0)->getType() == prt::AAT_FLOAT && an->getArgument(1)->getType() == prt::AAT_FLOAT) { min = an->getArgument(0)->getFloat(); max = an->getArgument(1)->getFloat(); } else e = new PRTEnum(prtNode, an); } } double value = evalAttrs.find(name.asWChar())->second.mFloat; if(e) { MCHECK(addEnumParameter(node, attr, name, value, e)); } else { MCHECK(addFloatParameter(node, attr, name, value, min, max)); } break; } case prt::AAT_STR: { MString exts; bool asFile = false; bool asColor = false; for(size_t a = 0; a < info->getAttribute(i)->getNumAnnotations(); a++) { const prt::Annotation* an = info->getAttribute(i)->getAnnotation(a); if(!(wcscmp(an->getName(), ANNOT_RANGE))) e = new PRTEnum(prtNode, an); else if(!(wcscmp(an->getName(), ANNOT_COLOR))) asColor = true; else if(!(wcscmp(an->getName(), ANNOT_DIR))) { exts = MString(an->getName()); asFile = true; } else if(!(wcscmp(an->getName(), ANNOT_FILE))) { asFile = true; for(size_t arg = 0; arg < an->getNumArguments(); arg++) { if(an->getArgument(arg)->getType() == prt::AAT_STR) { exts += MString(an->getArgument(arg)->getStr()); exts += " (*."; exts += MString(an->getArgument(arg)->getStr()); exts += ");;"; } } exts += "All Files (*.*)"; } } std::wstring value = evalAttrs.find(name.asWChar())->second.mString; MString mvalue(value.c_str()); if(!(asColor) && mvalue.length() == 7 && value[0] == L'#') asColor = true; if(e) { MCHECK(addEnumParameter(node, attr, name, mvalue, e)); } else if(asFile) { MCHECK(addFileParameter(node, attr, name, mvalue, exts)); } else if(asColor) { MCHECK(addColorParameter(node, attr, name, mvalue)); } else { MCHECK(addStrParameter(node, attr, name, mvalue)); } break; } default: break; } } shape->destroy(); attrs->destroy(); delete outputHandler; return MS::kSuccess; }
MStatus PRTAttrs::updateRuleFiles(MFnDependencyNode & node, MString & rulePkg) { PRTNode* prtNode = (PRTNode*)node.userNode(); MStatus stat; std::string utf8Path(rulePkg.asUTF8()); std::vector<char> percentEncodedPath(2*utf8Path.size()+1); size_t len = percentEncodedPath.size(); prt::StringUtils::percentEncode(utf8Path.c_str(), &percentEncodedPath[0], &len); if(len > percentEncodedPath.size()+1){ percentEncodedPath.resize(len); prt::StringUtils::percentEncode(utf8Path.c_str(), &percentEncodedPath[0], &len); } std::string uri(FILE_PREFIX); uri.append(&percentEncodedPath[0]); prtNode->mLRulePkg = uri; if(prtNode->mCreatedInteractively) { int count = (int)node.attributeCount(&stat); MCHECK(stat); MObjectArray attrs; for(int i = 0; i < count; i++) { MObject attr = node.attribute(i, &stat); if(stat != MS::kSuccess) continue; attrs.append(attr); } for(unsigned int i = 0; i < attrs.length(); i++) { MPlug plug(node.object(), attrs[i]); MString name = plug.partialName(); if(prtNode->mBriefName2prtAttr.count(name.asWChar())) node.removeAttribute(attrs[i]); } prtNode->destroyEnums(); } else { node.removeAttribute(node.attribute(NAME_GENERATE, &stat)); MCHECK(stat); } prtNode->mRuleFile.clear(); prtNode->mStartRule.clear(); MString unpackDir = MGlobal::executeCommandStringResult("workspace -q -fullName"); unpackDir += "/assets"; prt::Status resolveMapStatus = prt::STATUS_UNSPECIFIED_ERROR; std::wstring utf16URI; utf16URI.resize(uri.size()+1); len = utf16URI.size(); if(prt::StringUtils::toUTF16FromUTF8(uri.c_str(), &utf16URI[0], &len)) { utf16URI.resize(len); prt::StringUtils::toUTF16FromUTF8(uri.c_str(), &utf16URI[0], &len); } prtNode->mResolveMap = prt::createResolveMap(utf16URI.c_str(), unpackDir.asWChar(), &resolveMapStatus); if(resolveMapStatus == prt::STATUS_OK) { size_t nKeys; const wchar_t * const* keys = prtNode->mResolveMap->getKeys(&nKeys); std::wstring sCGB(L".cgb"); for(size_t k = 0; k < nKeys; k++) { std::wstring key = std::wstring(keys[k]); if(std::equal(sCGB.rbegin(), sCGB.rend(), key.rbegin())) { prtNode->mRuleFile = key; break; } } } else { prtNode->mResolveMap = 0; } if(prtNode->mRuleFile.length() > 0) updateStartRules(node); return MS::kSuccess; }