bool Config::save(const boost::filesystem::path& path, bool includeDefaultValues) { pugi::xml_document rootNode; rootNode.set_name("fluo"); std::map<UnicodeString, Variable>::const_iterator iter = variablesMap_.begin(); std::map<UnicodeString, Variable>::const_iterator end = variablesMap_.end(); for (; iter != end; ++iter) { if (includeDefaultValues || !iter->second.isDefault()) { unsigned int indexOfAt = iter->first.indexOf('@'); UnicodeString nodePath(iter->first, 0, indexOfAt); std::string utf8NodePath = StringConverter::toUtf8String(nodePath); pugi::xml_node existingNode = rootNode.first_element_by_path(utf8NodePath.c_str(), '/'); if (!existingNode) { existingNode = buildXmlNode(rootNode, nodePath); } UnicodeString attrName(iter->first, indexOfAt + 1); UnicodeString attrValue = iter->second.asString(); pugi::xml_attribute attr = existingNode.append_attribute(StringConverter::toUtf8String(attrName).c_str()); attr.set_value(StringConverter::toUtf8String(attrValue).c_str()); } } // take care of some special nodes if (!variablesMap_["/fluo/shard/account@save-password"].asBool()) { pugi::xml_node accountNode = rootNode.first_element_by_path("/fluo/shard/account"); if (accountNode) { accountNode.remove_attribute("password"); } } return rootNode.save_file(path.string().c_str(), " "); }
/* static */ bool PxrUsdMayaTranslatorCurves::Create( const UsdGeomCurves& curves, MObject parentNode, const PxrUsdMayaPrimReaderArgs& args, PxrUsdMayaPrimReaderContext* context) { if (not curves) { return false; } const UsdPrim& prim = curves.GetPrim(); MStatus status; // Create node (transform) MObject mayaNodeTransformObj; if (not PxrUsdMayaTranslatorUtil::CreateTransformNode(prim, parentNode, args, context, &status, &mayaNodeTransformObj)) { return false; } VtArray<GfVec3f> points; VtArray<int> curveOrder; VtArray<int> curveVertexCounts; VtArray<float> curveWidths; VtArray<GfVec2d> curveRanges; VtArray<double> curveKnots; // LIMITATION: xxx REVISIT xxx // Non-animated Attrs // Assuming that a number of these USD attributes are assumed to not be animated // Some we may want to expose as animatable later. // curves.GetCurveVertexCountsAttr().Get(&curveVertexCounts); // not animatable // XXX: // Only supporting single curve for now. // Sanity Checks if (curveVertexCounts.size() == 0) { MGlobal::displayError( TfStringPrintf("VertexCount arrays is empty on NURBS curves <%s>. Skipping...", prim.GetPath().GetText()).c_str()); return false; // No verts for the curve, so exit } else if (curveVertexCounts.size() > 1) { MGlobal::displayWarning( TfStringPrintf("Multiple curves in <%s>. Reading first one...", prim.GetPath().GetText()).c_str()); } int curveIndex = 0; curves.GetWidthsAttr().Get(&curveWidths); // not animatable // Gather points. If args.GetReadAnimData() is TRUE, // pick the first avaiable sample or default UsdTimeCode pointsTimeSample=UsdTimeCode::EarliestTime(); std::vector<double> pointsTimeSamples; size_t numTimeSamples = 0; if (args.GetReadAnimData()) { curves.GetPointsAttr().GetTimeSamples(&pointsTimeSamples); numTimeSamples = pointsTimeSamples.size(); if (numTimeSamples>0) { pointsTimeSample = pointsTimeSamples[0]; } } curves.GetPointsAttr().Get(&points, pointsTimeSample); if (points.size() == 0) { MGlobal::displayError( TfStringPrintf("Points arrays is empty on NURBS curves <%s>. Skipping...", prim.GetPath().GetText()).c_str()); return false; // invalid nurbscurves, so exit } if (UsdGeomNurbsCurves nurbsSchema = UsdGeomNurbsCurves(prim)) { nurbsSchema.GetOrderAttr().Get(&curveOrder); // not animatable nurbsSchema.GetKnotsAttr().Get(&curveKnots); // not animatable nurbsSchema.GetRangesAttr().Get(&curveRanges); // not animatable } else { // Handle basis curves originally modelled in Maya as nurbs. curveOrder.resize(1); UsdGeomBasisCurves basisSchema = UsdGeomBasisCurves(prim); TfToken typeToken; basisSchema.GetTypeAttr().Get(&typeToken); if (typeToken == UsdGeomTokens->linear) { curveOrder[0] = 2; curveKnots.resize(points.size()); for (size_t i=0; i < curveKnots.size(); ++i) { curveKnots[i] = i; } } else { curveOrder[0] = 4; // Strip off extra end points; assuming this is non-periodic. VtArray<GfVec3f> tmpPts(points.size() - 2); std::copy(points.begin() + 1, points.end() - 1, tmpPts.begin()); points.swap(tmpPts); // Cubic curves in Maya have numSpans + 2*3 - 1, and for geometry // that came in as basis curves, we have numCV's - 3 spans. See the // MFnNurbsCurve documentation and the nurbs curve export // implementation in mojitoplugmaya for more details. curveKnots.resize(points.size() -3 + 5); int knotIdx = 0; for (size_t i=0; i < curveKnots.size(); ++i) { if (i < 3) { curveKnots[i] = 0.0; } else { if (i <= curveKnots.size() - 3) { ++knotIdx; } curveKnots[i] = double(knotIdx); } } } } // == Convert data size_t mayaNumVertices = points.size(); MPointArray mayaPoints(mayaNumVertices); for (size_t i=0; i < mayaNumVertices; i++) { mayaPoints.set( i, points[i][0], points[i][1], points[i][2] ); } double *knots=curveKnots.data(); MDoubleArray mayaKnots( knots, curveKnots.size()); int mayaDegree = curveOrder[curveIndex] - 1; MFnNurbsCurve::Form mayaCurveForm = MFnNurbsCurve::kOpen; // HARDCODED bool mayaCurveCreate2D = false; bool mayaCurveCreateRational = true; // == Create NurbsCurve Shape Node MFnNurbsCurve curveFn; MObject curveObj = curveFn.create(mayaPoints, mayaKnots, mayaDegree, mayaCurveForm, mayaCurveCreate2D, mayaCurveCreateRational, mayaNodeTransformObj, &status ); if (status != MS::kSuccess) { return false; } MString nodeName( prim.GetName().GetText() ); nodeName += "Shape"; curveFn.setName(nodeName, false, &status); std::string nodePath( prim.GetPath().GetText() ); nodePath += "/"; nodePath += nodeName.asChar(); if (context) { context->RegisterNewMayaNode( nodePath, curveObj ); // used for undo/redo } // == Animate points == // Use blendShapeDeformer so that all the points for a frame are contained in a single node // Almost identical code as used with MayaMeshReader.cpp // if (numTimeSamples > 0) { MPointArray mayaPoints(mayaNumVertices); MObject curveAnimObj; MFnBlendShapeDeformer blendFn; MObject blendObj = blendFn.create(curveObj); if (context) { context->RegisterNewMayaNode(blendFn.name().asChar(), blendObj ); // used for undo/redo } for (unsigned int ti=0; ti < numTimeSamples; ++ti) { curves.GetPointsAttr().Get(&points, pointsTimeSamples[ti]); for (unsigned int i=0; i < mayaNumVertices; i++) { mayaPoints.set( i, points[i][0], points[i][1], points[i][2] ); } // == Create NurbsCurve Shape Node MFnNurbsCurve curveFn; if ( curveAnimObj.isNull() ) { curveAnimObj = curveFn.create(mayaPoints, mayaKnots, mayaDegree, mayaCurveForm, mayaCurveCreate2D, mayaCurveCreateRational, mayaNodeTransformObj, &status ); if (status != MS::kSuccess) { continue; } } else { // Reuse the already created curve by copying it and then setting the points curveAnimObj = curveFn.copy(curveAnimObj, mayaNodeTransformObj, &status); curveFn.setCVs(mayaPoints); } blendFn.addTarget(curveObj, ti, curveAnimObj, 1.0); curveFn.setIntermediateObject(true); if (context) { context->RegisterNewMayaNode( curveFn.fullPathName().asChar(), curveAnimObj ); // used for undo/redo } } // Animate the weights so that curve0 has a weight of 1 at frame 0, etc. MFnAnimCurve animFn; // Construct the time array to be used for all the keys MTimeArray timeArray; timeArray.setLength(numTimeSamples); for (unsigned int ti=0; ti < numTimeSamples; ++ti) { timeArray.set( MTime(pointsTimeSamples[ti]), ti); } // Key/Animate the weights MPlug plgAry = blendFn.findPlug( "weight" ); if ( !plgAry.isNull() && plgAry.isArray() ) { for (unsigned int ti=0; ti < numTimeSamples; ++ti) { MPlug plg = plgAry.elementByLogicalIndex(ti, &status); MDoubleArray valueArray(numTimeSamples, 0.0); valueArray[ti] = 1.0; // Set the time value where this curve's weight should be 1.0 MObject animObj = animFn.create(plg, NULL, &status); animFn.addKeys(&timeArray, &valueArray); if (context) { context->RegisterNewMayaNode(animFn.name().asChar(), animObj ); // used for undo/redo } } } } return true; }
rtError rtScriptDuk::init() { rtLogInfo(__FUNCTION__); char const* s = getenv("RT_TEST_GC"); if (s && strlen(s) > 0) mTestGc = true; else mTestGc = false; if (mTestGc) rtLogWarn("*** PERFORMANCE WARNING *** : gc being invoked in render thread"); // TODO Please make this better... less hard coded... //0123456 789ABCDEF012 345 67890ABCDEF #if ENABLE_V8_HEAP_PARAMS #ifdef ENABLE_NODE_V_6_9 static const char *args2 = "rtNode\0-e\0console.log(\"rtNode Initalized\");\0\0"; static const char *argv2[] = {&args2[0], &args2[7], &args2[10], NULL}; #else rtLogWarn("v8 old heap space configured to 64mb\n"); static const char *args2 = "rtNode\0--expose-gc\0--max_old_space_size=64\0-e\0console.log(\"rtNode Initalized\");\0\0"; static const char *argv2[] = {&args2[0], &args2[7], &args2[19], &args2[43], &args2[46], NULL}; #endif // ENABLE_NODE_V_6_9 #else #ifdef ENABLE_NODE_V_6_9 #ifndef ENABLE_DEBUG_MODE static const char *args2 = "rtNode\0-e\0console.log(\"rtNode Initalized\");\0\0"; static const char *argv2[] = {&args2[0], &args2[7], &args2[10], NULL}; #endif //!ENABLE_DEBUG_MODE #else static const char *args2 = "rtNode\0--expose-gc\0-e\0console.log(\"rtNode Initalized\");\0\0"; static const char *argv2[] = {&args2[0], &args2[7], &args2[19], &args2[22], NULL}; #endif // ENABLE_NODE_V_6_9 #endif //ENABLE_V8_HEAP_PARAMS #ifndef ENABLE_DEBUG_MODE int argc = sizeof(argv2)/sizeof(char*) - 1; static args_t aa(argc, (char**)argv2); s_gArgs = &aa; char **argv = aa.argv; #endif #ifdef RUNINMAIN #ifdef WIN32 __rt_main_thread__ = GetCurrentThreadId(); #else __rt_main_thread__ = pthread_self(); // NB #endif #endif nodePath(); #ifdef ENABLE_NODE_V_6_9 rtLogWarn("rtNode::rtNode() calling init \n"); #ifdef ENABLE_DEBUG_MODE init2(); #else init2(argc, argv); #endif #else #ifdef ENABLE_DEBUG_MODE init2(); #else init2(argc, argv); #endif #endif // ENABLE_NODE_V_6_9 return RT_OK; }