void getPolyMeshTimeSpan(IPolyMesh iPoly, chrono_t& first, chrono_t& last) { IPolyMeshSchema mesh = iPoly.getSchema(); TimeSamplingPtr ts = mesh.getTimeSampling(); first = std::min(first, ts->getSampleTime(0) ); last = std::max(last, ts->getSampleTime(mesh.getNumSamples()-1) ); }
void ProcessPolyMesh( IPolyMesh &polymesh, ProcArgs &args, MatrixSampleMap * xformSamples, const std::string & facesetName ) { SampleTimeSet sampleTimes; std::vector<AtUInt32> vidxs; AtNode * meshNode = ProcessPolyMeshBase( polymesh, args, sampleTimes, vidxs, 0, xformSamples, facesetName ); // This is a valid condition for the second instance onward and just // means that we don't need to do anything further. if ( !meshNode ) { return; } IPolyMeshSchema &ps = polymesh.getSchema(); std::vector<float> nlist; std::vector<AtUInt32> nidxs; ProcessIndexedBuiltinParam( ps.getNormalsParam(), sampleTimes, nlist, nidxs, 3); if ( !nlist.empty() ) { AiNodeSetArray(meshNode, "nlist", ArrayConvert( nlist.size() / sampleTimes.size(), sampleTimes.size(), AI_TYPE_FLOAT, (void*)(&(nlist[0])))); if ( !nidxs.empty() ) { AiNodeSetArray(meshNode, "nidxs", ArrayConvert(nidxs.size(), 1, AI_TYPE_UINT, &(nidxs[0]))); } else { AiNodeSetArray(meshNode, "nidxs", ArrayConvert(vidxs.size(), 1, AI_TYPE_UINT, &(vidxs[0]))); } } }
//-***************************************************************************** void ProcessPolyMesh( IPolyMesh &polymesh, ProcArgs &args ) { IPolyMeshSchema &ps = polymesh.getSchema(); TimeSamplingPtr ts = ps.getTimeSampling(); SampleTimeSet sampleTimes; GetRelevantSampleTimes( args, ts, ps.getNumSamples(), sampleTimes ); bool multiSample = sampleTimes.size() > 1; if ( multiSample ) { WriteMotionBegin( args, sampleTimes ); } for ( SampleTimeSet::iterator iter = sampleTimes.begin(); iter != sampleTimes.end(); ++ iter ) { ISampleSelector sampleSelector( *iter ); IPolyMeshSchema::Sample sample = ps.getValue( sampleSelector ); RtInt npolys = (RtInt) sample.getFaceCounts()->size(); ParamListBuilder paramListBuilder; paramListBuilder.add( "P", (RtPointer)sample.getPositions()->get() ); IV2fGeomParam uvParam = ps.getUVsParam(); if ( uvParam.valid() ) { ICompoundProperty parent = uvParam.getParent(); if ( !args.flipv ) { AddGeomParamToParamListBuilder<IV2fGeomParam>( parent, uvParam.getHeader(), sampleSelector, "float", paramListBuilder, 2, "st"); } else if ( std::vector<float> * values = AddGeomParamToParamListBuilderAsFloat<IV2fGeomParam, float>( parent, uvParam.getHeader(), sampleSelector, "float", paramListBuilder, "st") ) { for ( size_t i = 1, e = values->size(); i < e; i += 2 ) { (*values)[i] = 1.0 - (*values)[i]; } } } IN3fGeomParam nParam = ps.getNormalsParam(); if ( nParam.valid() ) { ICompoundProperty parent = nParam.getParent(); AddGeomParamToParamListBuilder<IN3fGeomParam>( parent, nParam.getHeader(), sampleSelector, "normal", paramListBuilder); } ICompoundProperty arbGeomParams = ps.getArbGeomParams(); AddArbitraryGeomParams( arbGeomParams, sampleSelector, paramListBuilder ); RiPointsPolygonsV( npolys, (RtInt*) sample.getFaceCounts()->get(), (RtInt*) sample.getFaceIndices()->get(), paramListBuilder.n(), paramListBuilder.nms(), paramListBuilder.vals() ); } if (multiSample) RiMotionEnd(); }