// Returns the maximum number of unichars over all shapes. int ShapeTable::MaxNumUnichars() const { int max_num_unichars = 0; int num_shapes = NumShapes(); for (int s = 0; s < num_shapes; ++s) { if (GetShape(s).size() > max_num_unichars) max_num_unichars = GetShape(s).size(); } return max_num_unichars; }
// Returns true if any shape contains multiple unichars. bool ShapeTable::AnyMultipleUnichars() const { int num_shapes = NumShapes(); for (int s1 = 0; s1 < num_shapes; ++s1) { if (MasterDestinationIndex(s1) != s1) continue; if (GetShape(s1).size() > 1) return true; } return false; }
UInt32 RigidBodyShapeCollection::MOSHFIT(std::vector<TimeSequence*>& output, double rateHz, double distribution_tolerance, double convergence_accuracy, const BinMemFactory& memfactory /*=BinMemFactoryDefault()*/) const { // compute mean shape RigidBodyShape mean; UInt32 status = ComputeMeanShape(mean, distribution_tolerance, convergence_accuracy); if (status != RigidBodyResult::success) return status; // build output arrays and iterators std::vector<TSOccVector3Iter> outputiter; size_t num_shapes = NumShapes(); size_t num_markers = shape[0].NumMarkers(); TimeRange tr; tr.Frames = num_shapes; tr.Start = 0.0; tr.Rate = rateHz; size_t imarker; for (imarker = 0; imarker < num_markers; imarker++) { TimeSequence* ts = TSFactoryOccValue(3).New(tr, memfactory); output.push_back(ts); outputiter.push_back( TSOccVector3Iter(*ts) ); } // iterate over all shapes for (std::vector<RigidBodyShape>::const_iterator ishape( shape.begin() ); ishape != shape.end(); ishape++) { // compute fit of mean to this shape RigidTransform3 T; mean.ComputeFitTo(T, *ishape); // transform mean and use result for (imarker = 0; imarker < num_markers; imarker++) { RigidTransform3::MulVec(outputiter[imarker].Value(), T, mean.Marker(imarker).position); outputiter[imarker].Occluded() = 0; outputiter[imarker].Next(); } } return RigidBodyResult::success; }