void Module::GetDrumCurve(std::string curveName, std::vector<float>& curve) { DrumCurve drumCurve = GetCurveType(curveName); switch(drumCurve) { case DrumCurve::exponential: Curves::Exponential(curve); break; default: Curves::Linear(curve); break; } return; }
size_t HdBasisCurvesTopology::CalculateNeededNumberOfVaryingControlPoints() const { if (GetCurveType() == HdTokens->linear){ // For linear curves, varying and vertex interpolation is identical. return CalculateNeededNumberOfControlPoints(); } size_t numVerts= 0; int numSegs = 0, vStep = 0; bool wrap = GetCurveWrap() == HdTokens->periodic; if(GetCurveBasis() == HdTokens->bezier) { vStep = 3; } else { vStep = 1; } // Make absolutely sure the iterator is constant // (so we don't detach the array while multi-threaded) for (VtIntArray::const_iterator itCounts = _curveVertexCounts.cbegin(); itCounts != _curveVertexCounts.cend(); ++itCounts) { // Handling for the case of potentially incorrect vertex counts if (*itCounts < 1) { continue; } // The number of verts is different if we have periodic vs non-periodic // curves, check basisCurvesComputations.cpp line 207 for a diagram. if (wrap) { numSegs = *itCounts / vStep; } else { numSegs = ((*itCounts - 4) / vStep) + 1; } numVerts += numSegs + 1; } return numVerts; }
// 传入的DOM模型为 // <Curve> // <CurveType>CIRCLE</CurveType> // <Params> // <double>-0.05</double> // <double>-0.050000000000000017</double> // <double>0</double> // <double>0</double> // <double>-0</double> // <double>-1</double> // <double>0.01</double> // <double>0</double> // <double>0</double> // <double>0</double> // <double>0</double> // </Params> // </Curve> void CurveInputDecorator::Parse(const char *id, xercesc::DOMElement* element) { if (NULL == element) return; vaar_data::CurveType type = vaar_data::CurveType::LINE_CURVE; double params[CURVE_PARAMS_LENGTH]; xercesc::DOMElement* current_element = NULL; int i = 0; // 解析类型 element = element->getFirstElementChild(); if (NULL != element && 0 == strcmp("CurveType", xercesc::XMLString::transcode(element->getTagName()))) { type = GetCurveType(xercesc::XMLString::transcode(element->getTextContent())); } // 解析参数 element = element->getNextElementSibling(); if (NULL != element && 0 == strcmp("Params", xercesc::XMLString::transcode(element->getTagName()))) { current_element = element->getFirstElementChild(); do { sscanf_s( xercesc::XMLString::transcode(current_element->getTextContent()), "%lf", ¶ms[i++] ); } while ( current_element != element->getLastElementChild(), current_element = current_element->getNextElementSibling() ); } // 填充对象 curve_ = std::tr1::shared_ptr<vaar_data::Curve>(new vaar_data::Curve(id, type, params)); }