Example #1
0
// 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;
}
Example #2
0
// 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;
}