void Tessellate(
	NodeVector & vecNodes,
	FaceVector & vecFaces
) {
	int nInitialNodeListSize = vecNodes.size();

	// Create centerpoint nodes
	for (int i = 0; i < vecFaces.size(); i++) {
		InsertQuadNodeCenter(
			vecNodes,
			vecNodes[vecFaces[i][0]],
			vecNodes[vecFaces[i][1]],
			vecNodes[vecFaces[i][2]],
			vecNodes[vecFaces[i][3]]);
	}

	// Construct tesselation
	SegmentMap mapSegment;
	ConstructSegmentMap(vecFaces, mapSegment, -1);

	vecFaces.clear();

	SegmentMapIterator iter = mapSegment.begin();
	for (; iter != mapSegment.end(); iter++) {
		Face faceNew = 
			Face(
				iter->first[1],
				nInitialNodeListSize + iter->second[0],
				iter->first[0],
				nInitialNodeListSize + iter->second[1]);

		vecFaces.push_back(faceNew);
	}
}
Example #2
0
void LodExtract::writeHomologies(const Genome* inParent,
                                 const vector<const Genome*>& inChildren)
{
  vector<const Genome*> inGenomes = inChildren;
  inGenomes.push_back(inParent);
  Genome* outParent = _outAlignment->openGenome(inParent->getName());
  assert(outParent != NULL && outParent->getNumBottomSegments() > 0);
  assert(inChildren.size() > 0);
  Genome* outChild = _outAlignment->openGenome(inChildren[0]->getName());
  BottomSegmentIteratorPtr bottom = outParent->getBottomSegmentIterator();
  TopSegmentIteratorPtr top = outChild->getTopSegmentIterator();

  // FOR EVERY BLOCK
  for (hal_size_t blockIdx = 0; blockIdx < _graph.getNumBlocks(); ++blockIdx)
  {
    SegmentMap segMap;
    const LodBlock* block = _graph.getBlock(blockIdx);

    for (hal_size_t segIdx = 0; segIdx < block->getNumSegments(); ++segIdx)
    {
      const LodSegment* segment = block->getSegment(segIdx);
      const Genome* genome = segment->getSequence()->getGenome();

      // ADD TO MAP
      pair<SegmentMap::iterator, bool> res = segMap.insert(
        pair<const Genome*, SegmentSet*>(genome, NULL));
      if (res.second == true)
      {
        assert(res.first->second == NULL);
        res.first->second = new SegmentSet();
      }
      res.first->second->insert(segment);    
    }      
    updateBlockEdges(inParent, segMap, block, bottom, top);
    
    // free the temporary sets! 
    for (SegmentMap::iterator mapIt = segMap.begin(); mapIt != segMap.end();
         ++mapIt)
    {
      delete mapIt->second;
    }
  }
}
 double computeMass(const Tree & tree) {
     
     double total_mass = 0.0;
     
     //create necessary vectors
     SegmentMap::const_iterator root;
     
     root = tree.getRootSegment();
     
     SegmentMap sm = tree.getSegments();
        
     for( SegmentMap::const_iterator i=sm.begin(); i!=sm.end(); ++i ) {
         //root has no mass
         if( i != root ) {
            total_mass += GetTreeElementSegment(i->second).getInertia().getMass();
         }
     }
     
     return total_mass;
 }
Example #4
0
void plStealthDlgProc::ILoadLoops(IParamBlock2 *pb)
{
    HWND hLoops = GetDlgItem( fhWnd, IDC_LOOPS );
    SendMessage( hLoops, CB_RESETCONTENT, 0, 0 );

    // Add the default option
    int defIdx = SendMessage( hLoops, CB_ADDSTRING, 0, (LPARAM)ENTIRE_ANIMATION_NAME );
    SendMessage( hLoops, CB_SETITEMDATA, defIdx, kDefault );

    plString segName = plString::FromUtf8( pb->GetStr( (ParamID)plAnimStealthNode::kPBName ) );
    if( segName.IsNull() || fSegMap == nil )
    {
        // Default of "entire animation", no other loop options
        SendMessage( hLoops, CB_SETCURSEL, defIdx, 0 );
        return;
    }
    
    SegmentSpec *animSpec = (*fSegMap)[ segName ];
    if( animSpec && fSegMap )
    {
        // for each segment we found: 
        for( SegmentMap::iterator i = fSegMap->begin(); i != fSegMap->end(); i++ )
        {
            SegmentSpec *spec = (*i).second;

            if( spec->fType == SegmentSpec::kLoop )
            {
                // If the loop is contained by the animation, add it
                if( (spec->fStart == -1 || spec->fStart >= animSpec->fStart) &&
                    (spec->fEnd   == -1 || spec->fEnd   <= animSpec->fEnd) )
                {
                    // Add the name
                    int idx = SendMessage( hLoops, CB_ADDSTRING, 0, (LPARAM)spec->fName.c_str() );
                    SendMessage( hLoops, CB_SETITEMDATA, idx, kName );
                }       
            }
        }
    }

    ISetSel( hLoops, pb->GetStr( (ParamID)plAnimStealthNode::kPBLoopName ) );
}
Example #5
0
SegmentMap *GetSharedAnimSegmentMap(std::vector<Animatable*>& anims, plErrorMsg *pErrorMsg)
{
    if (anims.empty())
        return nil;

    SegmentMap *segMap = GetAnimSegmentMap(anims[0], pErrorMsg);
    if (!segMap)
        return nil;

    int i;
    for (i = 1; i < anims.size(); i++)
    {
        SegmentMap *curSegMap = GetAnimSegmentMap(anims[i], pErrorMsg);
        // This node doesn't have a segmap, so we can't have any anims shared among all the nodes.
        if (!curSegMap)
        {
            DeleteSegmentMap(segMap);
            return nil;
        }

        if (segMap->begin() == segMap->end())
        {
            DeleteSegmentMap(segMap);
            return nil;
        }

        SegmentMap::iterator it = segMap->begin();
        while (it != segMap->end())
        {
            if (curSegMap->find(it->second->fName) == curSegMap->end())
            {
                SegmentMap::iterator del = it;
                it++;
                segMap->erase(del->second->fName);
            }
            else
                it++;
        }

        DeleteSegmentMap(curSegMap);
    }

    return segMap;
}
Example #6
0
void LodExtract::updateBlockEdges(const Genome* inParentGenome,
                                  SegmentMap& segMap,
                                  const LodBlock* block,
                                  BottomSegmentIteratorPtr bottom,
                                  TopSegmentIteratorPtr top)
{
  Genome* outParentGenome = bottom->getGenome();
  const LodSegment* rootSeg = NULL;
  SegmentSet* segSet;
  SegmentSet::iterator setIt;

  // Zap all segments in parent genome
  SegmentMap::iterator mapIt = segMap.find(inParentGenome);
  if (mapIt != segMap.end())
  {
    segSet = mapIt->second;
    assert(segSet != NULL);
    setIt = segSet->begin();
    for (; setIt != segSet->end(); ++setIt)
    {
      bottom->setArrayIndex(outParentGenome, (*setIt)->getArrayIndex());
      for (hal_size_t i = 0; i < bottom->getNumChildren(); ++i)
      {
        bottom->setChildIndex(i, NULL_INDEX);
        bottom->setTopParseIndex(NULL_INDEX);
      }
    }

    // Choose first segment as parent to all segments in the child genome
    setIt = segSet->begin();
    rootSeg = *(setIt);
    bottom->setArrayIndex(outParentGenome, (*setIt)->getArrayIndex());
  }

  // Do the child genomes
  const Genome* inGrandParentGenome = inParentGenome->getParent();
  SegmentSet::iterator nextIt;
  for (mapIt = segMap.begin(); mapIt != segMap.end(); ++mapIt)
  {
    if (mapIt->first != inParentGenome and mapIt->first != inGrandParentGenome)
    {
      Genome* outChildGenome = 
         _outAlignment->openGenome(mapIt->first->getName());
      hal_index_t childIndex = outParentGenome->getChildIndex(outChildGenome);
      assert(childIndex >= 0);
      segSet = mapIt->second;
      assert(segSet != NULL);
      for (setIt = segSet->begin(); setIt != segSet->end(); ++setIt)
      {
        top->setArrayIndex(outChildGenome, (*setIt)->getArrayIndex());
        top->setBottomParseIndex(NULL_INDEX);

        // Connect to parent
        if (rootSeg != NULL)
        {
          top->setParentIndex(bottom->getArrayIndex());
          bool reversed = (*setIt)->getFlipped() != rootSeg->getFlipped();
          top->setParentReversed(reversed);
          if (setIt == segSet->begin())
          {
            bottom->setChildIndex(childIndex, top->getArrayIndex());         
            bottom->setChildReversed(childIndex, reversed);      
          }
        }
        else
        {
          top->setParentIndex(NULL_INDEX);
        }

        // Connect to next paralogy
        SegmentSet::iterator setNext = setIt;
        ++setNext;
        if (setNext == segSet->end())
        {
          setNext = segSet->begin();
        }
        if (setNext == setIt)
        {
          top->setNextParalogyIndex(NULL_INDEX);
        }
        else
        {
          top->setNextParalogyIndex((*setNext)->getArrayIndex());
        }
      }
    }
  }
}
 /**
  * Request the root segment of the tree
  *
  * @return constant iterator pointing to the root segment
  */
 SegmentMap::const_iterator getRootSegment()const
 {
   return segments.find(root_name);
 };
 /**
  * Request the segment of the tree with name segment_name.
  *
  * @param segment_name the name of the requested segment
  *
  * @return constant iterator pointing to the requested segment
  */
 SegmentMap::const_iterator getSegment(const std::string& segment_name)const
 {
     return segments.find(segment_name);
 };
void RefineEverything(
	NodeVector & vecNodes,
	FaceVector & vecFaces,
	int nResolution
) {
	// Generate segment map
	SegmentMap mapSegment;
	ConstructSegmentMap(vecFaces, mapSegment, -1);

	FaceVector vecFacesOld = vecFaces;

	// Loop over all faces
	vecFaces.clear();

	// Construct map from segments to edges
	std::map<Segment, Edge> mapEdge;

	SegmentMapIterator iter = mapSegment.begin();
	for (; iter != mapSegment.end(); iter++) {
		Edge edge;

		GenerateEdgeVertices(
			nResolution,
			iter->first[0],
			iter->first[1],
			vecNodes,
			edge);

		mapEdge.insert(std::pair<Segment, Edge>(iter->first, edge));
	}

	// Loop over all faces and refine
	for (int n = 0 ; n < vecFacesOld.size(); n++) {
		const Segment & seg0 = vecFacesOld[n].iterSegment[0]->first;
		const Segment & seg1 = vecFacesOld[n].iterSegment[1]->first;
		const Segment & seg2 = vecFacesOld[n].iterSegment[2]->first;
		const Segment & seg3 = vecFacesOld[n].iterSegment[3]->first;

		Edge edge0 = mapEdge.find(seg0)->second;
		Edge edge1 = mapEdge.find(seg1)->second;
		Edge edge3 = mapEdge.find(seg2)->second;
		Edge edge2 = mapEdge.find(seg3)->second;

		// Align bottom and left edge
		if (edge0[0] == edge1[0]) {
		} else if (edge0[0] == edge1[edge1.size()-1]) {
			edge1 = edge1.Flip();
		} else if (edge0[edge0.size()-1] == edge1[0]) {
			edge0 = edge0.Flip();
		} else if (edge0[edge0.size()-1] == edge1[edge1.size()-1]) {
			edge0 = edge0.Flip();
			edge1 = edge1.Flip();
		} else {
			_EXCEPTIONT("Logic error");
		}

		// Align bottom and right edge
		if (edge0[edge0.size()-1] == edge2[0]) {
		} else if (edge0[edge0.size()-1] == edge2[edge2.size()-1]) {
			edge2 = edge2.Flip();
		} else {
			_EXCEPTIONT("Logic error");
		}

		// Align top and left edge
		if (edge1[edge1.size()-1] == edge3[0]) {
		} else if (edge1[edge1.size()-1] == edge3[edge3.size()-1]) {
			edge3 = edge3.Flip();
		} else {
			_EXCEPTIONT("Logic error");
		}

		Edge edgeTop;
		Edge edgeBot = edge0;

		for (int j = 0; j < nResolution; j++) {

			// Generate top level edge
			if (j != nResolution-1) {
				int ix0 = edge1[j+1];
				int ix1 = edge2[j+1];

				GenerateEdgeVertices(nResolution, ix0, ix1, vecNodes, edgeTop);

			} else {
				edgeTop = edge3;
			}

			// Generate face
			for (int i = 0; i < nResolution; i++) {
				Face face(
					edgeBot[i+1], edgeBot[i],
					edgeTop[i], edgeTop[i+1],
					vecFacesOld[n].nRefineLevel);

				face.nColor = vecFacesOld[n].nColor;
				face.nTag = vecFacesOld[n].nTag;

				vecFaces.push_back(face);
			}

			// Increment row
			edgeBot = edgeTop;
		}
	}
}
Example #10
0
  bool calibrateSegmentCallback(vicon_bridge::viconCalibrateSegment::Request& req,
                                vicon_bridge::viconCalibrateSegment::Response& resp)
  {

    std::string full_name = req.subject_name + "/" + req.segment_name;
    ROS_INFO("trying to calibrate %s", full_name.c_str());

    SegmentMap::iterator seg_it = segment_publishers_.find(full_name);

    if (seg_it == segment_publishers_.end())
    {
      ROS_WARN("frame %s not found --> not calibrating", full_name.c_str());
      resp.success = false;
      resp.status = "segment " + full_name + " not found";
      return false;
    }

    SegmentPublisher & seg = seg_it->second;

    if (seg.calibrated)
    {
      ROS_INFO("%s already calibrated, deleting old calibration", full_name.c_str());
      seg.calibration_pose.setIdentity();
    }

    vicon_bridge::viconGrabPose::Request grab_req;
    vicon_bridge::viconGrabPose::Response grab_resp;

    grab_req.n_measurements = req.n_measurements;
    grab_req.subject_name = req.subject_name;
    grab_req.segment_name = req.segment_name;

    bool ret = grabPoseCallback(grab_req, grab_resp);

    if (!ret)
    {
      resp.success = false;
      resp.status = "error while grabbing pose from Vicon";
      return false;
    }

    tf::Transform t;
    t.setOrigin(tf::Vector3(grab_resp.pose.pose.position.x, grab_resp.pose.pose.position.y,
                            grab_resp.pose.pose.position.z - req.z_offset));
    t.setRotation(tf::Quaternion(grab_resp.pose.pose.orientation.x, grab_resp.pose.pose.orientation.y,
                                 grab_resp.pose.pose.orientation.z, grab_resp.pose.pose.orientation.w));

    seg.calibration_pose = t.inverse();

    // write zero_pose to parameter server
    string param_suffix(full_name + "/zero_pose/");
    nh_priv.setParam(param_suffix + "orientation/w", t.getRotation().w());
    nh_priv.setParam(param_suffix + "orientation/x", t.getRotation().x());
    nh_priv.setParam(param_suffix + "orientation/y", t.getRotation().y());
    nh_priv.setParam(param_suffix + "orientation/z", t.getRotation().z());

    nh_priv.setParam(param_suffix + "position/x", t.getOrigin().x());
    nh_priv.setParam(param_suffix + "position/y", t.getOrigin().y());
    nh_priv.setParam(param_suffix + "position/z", t.getOrigin().z());

    ROS_INFO_STREAM("calibration completed");
    resp.pose = grab_resp.pose;
    resp.success = true;
    resp.status = "calibration successful";
    seg.calibrated = true;

    return true;
  }
Example #11
0
  void process_subjects(const ros::Time& frame_time)
  {
    string tracked_frame, subject_name, segment_name;
    unsigned int n_subjects = msvcbridge::GetSubjectCount().SubjectCount;
    SegmentMap::iterator pub_it;
    tf::Transform transform;
    std::vector<tf::StampedTransform, std::allocator<tf::StampedTransform> > transforms;
    geometry_msgs::TransformStampedPtr pose_msg(new geometry_msgs::TransformStamped);
    static unsigned int cnt = 0;

    for (unsigned int i_subjects = 0; i_subjects < n_subjects; i_subjects++)
    {

      subject_name = msvcbridge::GetSubjectName(i_subjects).SubjectName;
      unsigned int n_segments = msvcbridge::GetSegmentCount(subject_name).SegmentCount;

      for (unsigned int i_segments = 0; i_segments < n_segments; i_segments++)
      {
        segment_name = msvcbridge::GetSegmentName(subject_name, i_segments).SegmentName;

        Output_GetSegmentGlobalTranslation trans = msvcbridge::GetSegmentGlobalTranslation(subject_name, segment_name);
        Output_GetSegmentGlobalRotationQuaternion quat = msvcbridge::GetSegmentGlobalRotationQuaternion(subject_name,
                                                                                                        segment_name);

        if (trans.Result == Result::Success && quat.Result == Result::Success)
        {
          if (!trans.Occluded && !quat.Occluded)
          {
            transform.setOrigin(tf::Vector3(trans.Translation[0] / 1000, trans.Translation[1] / 1000,
                                                  trans.Translation[2] / 1000));
            transform.setRotation(tf::Quaternion(quat.Rotation[0], quat.Rotation[1], quat.Rotation[2],
                                                       quat.Rotation[3]));

            tracked_frame = tracked_frame_suffix_ + "/" + subject_name + "/" + segment_name;

            boost::mutex::scoped_try_lock lock(segments_mutex_);

            if (lock.owns_lock())
            {
              pub_it = segment_publishers_.find(subject_name + "/" + segment_name);
              if (pub_it != segment_publishers_.end())
              {
                SegmentPublisher & seg = pub_it->second;
                //ros::Time thisTime = now_time - ros::Duration(latencyInMs / 1000);

                if (seg.is_ready)
                {
                  transform = transform * seg.calibration_pose;
                  transforms.push_back(tf::StampedTransform(transform, frame_time, tf_ref_frame_id_, tracked_frame));
//                  transform = tf::StampedTransform(flyer_transform, frame_time, tf_ref_frame_id_, tracked_frame);
//                  tf_broadcaster_.sendTransform(transform);
                  tf::transformStampedTFToMsg(transforms.back(), *pose_msg);
                  seg.pub.publish(pose_msg);
                }
              }
              else
              {
                lock.unlock();
                createSegment(subject_name, segment_name);
              }
            }
          }
          else
          {
            if (cnt % 100 == 0)
              ROS_WARN_STREAM("" << subject_name <<" occluded, not publishing... " );
          }
        }
        else
        {
          ROS_WARN("GetSegmentGlobalTranslation/Rotation failed (result = %s, %s), not publishing...",
              Adapt(trans.Result).c_str(), Adapt(quat.Result).c_str());
        }
      }
    }

    if (broadcast_tf_)
      tf_broadcaster_->sendTransform(transforms);
    cnt++;
  }