| 448 | } |
| 449 | |
| 450 | void CurvesPrimitive::ensureAdjacencyVertIds() const |
| 451 | { |
| 452 | if( m_memberData->adjacencyVertIdsBuffer ) |
| 453 | { |
| 454 | return; |
| 455 | } |
| 456 | |
| 457 | IECore::UIntVectorDataPtr vertIdsData = new IECore::UIntVectorData; |
| 458 | vector<unsigned int> &vertIds = vertIdsData->writable(); |
| 459 | |
| 460 | int baseIndex = 0; |
| 461 | const vector<int> &vertsPerCurve = m_memberData->vertsPerCurve->readable(); |
| 462 | for( vector<int>::const_iterator it = vertsPerCurve.begin(), eIt = vertsPerCurve.end(); it != eIt; it++ ) |
| 463 | { |
| 464 | int numPoints = *it; |
| 465 | int numSegments = IECoreScene::CurvesPrimitive::numSegments( m_memberData->basis, m_memberData->periodic, numPoints ); |
| 466 | unsigned pi = 0; |
| 467 | for( int i=0; i<numSegments; i++ ) |
| 468 | { |
| 469 | vertIds.push_back( baseIndex + ( pi % numPoints ) ); |
| 470 | vertIds.push_back( baseIndex + ( (pi+1) % numPoints ) ); |
| 471 | vertIds.push_back( baseIndex + ( (pi+2) % numPoints ) ); |
| 472 | vertIds.push_back( baseIndex + ( (pi+3) % numPoints ) ); |
| 473 | pi += m_memberData->basis.step; |
| 474 | } |
| 475 | |
| 476 | baseIndex += numPoints; |
| 477 | |
| 478 | } |
| 479 | |
| 480 | m_memberData->numAdjacencyVertIds = vertIds.size(); |
| 481 | |
| 482 | CachedConverterPtr cachedConverter = CachedConverter::defaultCachedConverter(); |
| 483 | m_memberData->adjacencyVertIdsBuffer = IECore::runTimeCast<const Buffer>( cachedConverter->convert( vertIdsData.get() ) ); |
| 484 | } |
| 485 | |
| 486 | void CurvesPrimitive::ensureLinearAdjacencyVertIds() const |
| 487 | { |