static void _write(liqRibSurfaceData* pData, const structJob ¤tJob__) { CM_TRACE_FUNC("rm_writeSurfaceData.cpp::_write("<<pData->getFullPathName().asChar()<<","<<currentJob__.name.asChar()<<",...)"); LIQDEBUGPRINTF( "-> writing nurbs surface\n" ); LIQDEBUGPRINTF( "-> writing nurbs surface trims\n" ); if ( pData->hasTrims ) { RiTrimCurve( pData->nloops, const_cast< RtInt* >( &pData->ncurves[ 0 ] ), const_cast< RtInt* >( &pData->order[ 0 ] ), const_cast< RtFloat* >( &pData->knot[ 0 ] ), const_cast< RtFloat* >( &pData->minKnot[ 0 ] ), const_cast< RtFloat* >( &pData->maxKnot[ 0 ] ), const_cast< RtInt* >( &pData->numCVs[ 0 ] ), const_cast< RtFloat* >( &pData->u[ 0 ] ), const_cast< RtFloat* >( &pData->v[ 0 ] ), const_cast< RtFloat* >( &pData->w[ 0 ] ) ); } if ( !pData->tokenPointerArray.empty() ) { unsigned numTokens( pData->tokenPointerArray.size() ); boost::scoped_array< RtToken > tokenArray( new RtToken[ numTokens ] ); boost::scoped_array< RtPointer > pointerArray( new RtPointer[ numTokens ] ); assignTokenArraysV( pData->tokenPointerArray, tokenArray.get(), pointerArray.get() ); RiNuPatchV( pData->nu, pData->uorder, pData->uknot.get(), pData->umin, pData->umax, pData->nv, pData->vorder, pData->vknot.get(), pData->vmin, pData->vmax, numTokens, tokenArray.get(), pointerArray.get() ); } else { LIQDEBUGPRINTF( "-> ignoring nurbs surface\n" ); } LIQDEBUGPRINTF( "-> done writing nurbs surface\n" ); }
//-***************************************************************************** void ProcessNuPatch( INuPatch &patch, ProcArgs &args ) { INuPatchSchema &ps = patch.getSchema(); TimeSamplingPtr ts = ps.getTimeSampling(); SampleTimeSet sampleTimes; GetRelevantSampleTimes( args, ts, ps.getNumSamples(), sampleTimes ); //trim curves are described outside the motion blocks if ( ps.hasTrimCurve() ) { //get the current time sample independent of any shutter values INuPatchSchema::Sample sample = ps.getValue( ISampleSelector( args.frame / args.fps ) ); RiTrimCurve( sample.getTrimNumCurves()->size(), //numloops (RtInt*) sample.getTrimNumCurves()->get(), (RtInt*) sample.getTrimOrders()->get(), (RtFloat*) sample.getTrimKnots()->get(), (RtFloat*) sample.getTrimMins()->get(), (RtFloat*) sample.getTrimMaxes()->get(), (RtInt*) sample.getTrimNumVertices()->get(), (RtFloat*) sample.getTrimU()->get(), (RtFloat*) sample.getTrimV()->get(), (RtFloat*) sample.getTrimW()->get() ); } bool multiSample = sampleTimes.size() > 1; if ( multiSample ) { WriteMotionBegin( args, sampleTimes ); } for ( SampleTimeSet::iterator iter = sampleTimes.begin(); iter != sampleTimes.end(); ++iter ) { ISampleSelector sampleSelector( *iter ); INuPatchSchema::Sample sample = ps.getValue( sampleSelector ); ParamListBuilder paramListBuilder; //build this here so that it's still in scope when RiNuPatchV is //called. std::vector<RtFloat> pwValues; if ( sample.getPositionWeights() ) { if ( sample.getPositionWeights()->size() == sample.getPositions()->size() ) { //need to combine P with weight form Pw pwValues.reserve( sample.getPositions()->size() * 4 ); const float32_t * pStart = reinterpret_cast<const float32_t * >( sample.getPositions()->get() ); const float32_t * wStart = reinterpret_cast<const float32_t * >( sample.getPositionWeights()->get() ); for ( size_t i = 0, e = sample.getPositionWeights()->size(); i < e; ++i ) { pwValues.push_back( pStart[i*3] ); pwValues.push_back( pStart[i*3+1] ); pwValues.push_back( pStart[i*3+2] ); pwValues.push_back( wStart[i] ); } paramListBuilder.add( "Pw", (RtPointer) &pwValues[0] ); } } if ( pwValues.empty() ) { //no Pw so go straight with P paramListBuilder.add( "P", (RtPointer)sample.getPositions()->get() ); } ICompoundProperty arbGeomParams = ps.getArbGeomParams(); AddArbitraryGeomParams( arbGeomParams, sampleSelector, paramListBuilder ); //For now, use the last knot value for umin and umax as it's //not described in the alembic data RiNuPatchV( sample.getNumU(), sample.getUOrder(), (RtFloat *) sample.getUKnot()->get(), 0.0, //umin sample.getUKnot()->get()[sample.getUKnot()->size()-1],//umax sample.getNumV(), sample.getVOrder(), (RtFloat *) sample.getVKnot()->get(), 0.0, //vmin sample.getVKnot()->get()[sample.getVKnot()->size()-1], //vmax paramListBuilder.n(), paramListBuilder.nms(), paramListBuilder.vals() ); } if ( multiSample ) { RiMotionEnd(); } }