SampleInfo getSampleInfo ( double iFrame, Alembic::AbcCoreAbstract::TimeSamplingPtr iTime, size_t numSamps ) { ESS_PROFILE_SCOPE("getSampleInfo"); SampleInfo result; if (numSamps == 0) numSamps = 1; std::pair<Alembic::AbcCoreAbstract::index_t, double> floorIndex = iTime->getFloorIndex(iFrame, numSamps); result.floorIndex = floorIndex.first; result.ceilIndex = result.floorIndex; if (fabs(iFrame - floorIndex.second) < 0.0001) { result.alpha = 0.0f; return result; } std::pair<Alembic::AbcCoreAbstract::index_t, double> ceilIndex = iTime->getCeilIndex(iFrame, numSamps); if (fabs(iFrame - ceilIndex.second) < 0.0001) { result.floorIndex = ceilIndex.first; result.ceilIndex = result.floorIndex; result.alpha = 0.0f; return result; } if (result.floorIndex == ceilIndex.first) { result.alpha = 0.0f; return result; } result.ceilIndex = ceilIndex.first; result.alpha = (iFrame - floorIndex.second) / (ceilIndex.second - floorIndex.second); return result; }
double getWeightAndIndex(double iFrame, Alembic::AbcCoreAbstract::TimeSamplingPtr iTime, size_t numSamps, Alembic::AbcCoreAbstract::index_t & oIndex, Alembic::AbcCoreAbstract::index_t & oCeilIndex) { if (numSamps == 0) numSamps = 1; std::pair<Alembic::AbcCoreAbstract::index_t, double> floorIndex = iTime->getFloorIndex(iFrame, numSamps); oIndex = floorIndex.first; oCeilIndex = oIndex; if (fabs(iFrame - floorIndex.second) < 0.0001) return 0.0; std::pair<Alembic::AbcCoreAbstract::index_t, double> ceilIndex = iTime->getCeilIndex(iFrame, numSamps); if (oIndex == ceilIndex.first) return 0.0; oCeilIndex = ceilIndex.first; double alpha = (iFrame - floorIndex.second) / (ceilIndex.second - floorIndex.second); // we so closely match the ceiling so we'll just use it if (fabs(1.0 - alpha) < 0.0001) { oIndex = oCeilIndex; return 0.0; } return alpha; }