void VCurve2DBase::CreateLookup(int iSampleCount, float *pArray, int iValueStride, float fScaling, float fBias) { // lookup bezier points float x = 0.0f; // X-Coordinate of Lookup float fdx = GetDuration()/(float)(iSampleCount-1); // Step size of x // Iterate bezier curve and create PointList VMemoryTempBuffer<512*sizeof(VCurvePoint2D)> buffer(iSampleCount*sizeof(VCurvePoint2D)); VCurvePoint2D *pPoints = (VCurvePoint2D *)buffer.GetBuffer(); for (int i = 0; i < iSampleCount; i++, x += fdx) pPoints[i] = GetBezierPoint(x); // Fill lookup table x = 0.0f; for (int i = 0; i < iSampleCount; i++, x += fdx) pArray[i*iValueStride] = GetValue(pPoints, iSampleCount, x)*fScaling + fBias; }
// ============================================================================ // Draw points and curves // ============================================================================ void CBezierWnd::Draw() { // Draw control point handles and labels for ( PointSetIt i = m_Points.begin(); i != m_Points.end(); ++i ) { DrawHandle( *i ); DrawLabel( *i ); } if ( m_Points.size() < 3) return; // Draw curve PointList lPoints; for ( PointSetIt i = m_Points.begin(); i != m_Points.end(); ++i ) lPoints.push_back( *i ); CPoint2D p2DStart = *m_Points.begin(); float fStep = 1.f / ( 10.f * ( float ) lPoints.size() ); for ( float i = 0.f; i <= 1.f; i+= fStep ) { CPoint2D p2D = GetBezierPoint( lPoints, i ); DrawLine( p2DStart, p2D ); p2DStart = p2D; } DrawLine( p2DStart, lPoints.back() ); // Draw control polygon if ( m_bDrawPoly ) { PointSetIt i = m_Points.begin(), iPrev = i++; do { DrawLine( *iPrev, *i ); iPrev = i++; } while ( i != m_Points.end() ); } }