static void _write(liqRibSurfaceData* pData, const structJob &currentJob__)
{
    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" );
}
示例#2
0
//-*****************************************************************************
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(); }
    
    
}