//----------------------------------------
void ofxOpenNITracker::update(){
	vector<XnUserID> userIds(MAX_NUMBER_USERS);
  XnUInt16 nUsers = userIds.size();
  xn::UserGenerator& user_generator = openNI->getUserGenerator();
	user_generator.GetUsers(&userIds[0], nUsers);
  userIds.resize(nUsers);

  unsigned int stateHasMask = (ofxOpenNIUser::Found         |
                               ofxOpenNIUser::NeedsPose     |
                               ofxOpenNIUser::Calibrating   |
                               ofxOpenNIUser::StartTracking |
                               ofxOpenNIUser::Tracking      );

	for(int i = 0; i < nUsers; ++i) {
    unsigned int nID = userIds[i];
    ofxOpenNIUser& user = users[nID];

		if((user.state & stateHasMask)) {
			user.id = nID;
			XnPoint3D center;
			user_generator.GetCoM(nID, center);
			user.center = toOf(center);

			if (usePointClouds) updatePointClouds(user);
			if (useMaskPixels) updateUserPixels(user);
    }

		if(user.state & ofxOpenNIUser::HasSkeleton) {
			for(int j=0;j<ofxOpenNIUser::NumLimbs;j++){
				XnSkeletonJointPosition a,b;
				user_generator.GetSkeletonCap().GetSkeletonJointPosition(nID, user.limbs[j].start_joint, a);
				user_generator.GetSkeletonCap().GetSkeletonJointPosition(nID, user.limbs[j].end_joint, b);
				user_generator.GetSkeletonCap().GetSkeletonJointOrientation(nID, user.limbs[j].start_joint, user.limbs[j].orientation);
				if(a.fConfidence < 0.3f || b.fConfidence < 0.3f) {
					user.limbs[j].found = false;
					continue;
				}

				user.limbs[j].found = true;
				user.limbs[j].begin = openNI->worldToProjective(a.position);
				user.limbs[j].end = openNI->worldToProjective(b.position);
				user.limbs[j].worldBegin = toOf(a.position);
				user.limbs[j].worldEnd = toOf(b.position);
			}
		}
	}

  map<XnUserID, ofxOpenNIUser>::iterator it;
  for(it=users.begin();it!=users.end();it++){
    if(std::find(userIds.begin(), userIds.end(), it->first)==userIds.end()){
      users.erase(it);
    }
  }
}
//----------------------------------------
void ofxOpenNITracker::update(){
	vector<XnUserID> users(MAX_NUMBER_USERS);
	XnUInt16 max_users = MAX_NUMBER_USERS;
	user_generator.GetUsers(&users[0], max_users);

	set<XnUserID> current_tracked_users;

	for(int i = 0; i < MAX_NUMBER_USERS; ++i) {
		if(user_generator.GetSkeletonCap().IsTracking(users[i])) {
			ofxOpenNIUser & user = tracked_users[users[i]];
			user.id = users[i];
			XnPoint3D center;
			user_generator.GetCoM(users[i], center);
			user.center = toOf(center);

			for(int j=0;j<ofxOpenNIUser::NumLimbs;j++){
				XnSkeletonJointPosition a,b;
				user_generator.GetSkeletonCap().GetSkeletonJointPosition(user.id, user.limbs[j].start_joint, a);
				user_generator.GetSkeletonCap().GetSkeletonJointPosition(user.id, user.limbs[j].end_joint, b);
				user_generator.GetSkeletonCap().GetSkeletonJointOrientation(user.id,user.limbs[j].start_joint, user.limbs[j].orientation);
				if(a.fConfidence < 0.3f || b.fConfidence < 0.3f) {
					user.limbs[j].found = false;
					continue;
				}

				user.limbs[j].found = true;
				user.limbs[j].begin = openNI->worldToProjective(a.position);
				user.limbs[j].end = openNI->worldToProjective(b.position);
				user.limbs[j].worldBegin = toOf(a.position);
				user.limbs[j].worldEnd = toOf(b.position);
			}

			if (usePointClouds) updatePointClouds(user);
			if (useMaskPixels) updateUserPixels(user);

			current_tracked_users.insert(user.id);
		}
	}

	set<XnUserID>::iterator it;
	for(it=prev_tracked_users.begin();it!=prev_tracked_users.end();it++){
		if(current_tracked_users.find(*it)==current_tracked_users.end()){
			tracked_users.erase(*it);
		}
	}

	prev_tracked_users = current_tracked_users;
	tracked_users_index.assign(prev_tracked_users.begin(),prev_tracked_users.end());

	//if (useMaskPixels) updateUserPixels();
}
// Update the tracked users, should be called each frame
//----------------------------------------
void ofxUserGenerator::update() {

    found_users = MAX_NUMBER_USERS;

    XnUserID* users = new XnUserID[MAX_NUMBER_USERS];
    user_generator.GetUsers(users, found_users);

    for(int i = 0; i < found_users; ++i) {
        if(user_generator.GetSkeletonCap().IsTracking(users[i])) {
            tracked_users[i]->id = users[i];
            tracked_users[i]->updateBonePositions();
        }
    }

    delete [] users;

    if (useMaskPixels) updateUserPixels();
    if (useCloudPoints) updateCloudPoints();
}
// Update the tracked users, should be called each frame
//----------------------------------------
void ofxUserGenerator::update() {
	
	found_users = max_num_users;
	
	XnUserID* users = new XnUserID[max_num_users];
	user_generator.GetUsers(users, found_users);
	
	for(int i = 0; i < found_users; ++i) {
		if(user_generator.GetSkeletonCap().IsTracking(users[i])) {	
			tracked_users[i]->id = users[i];
			user_generator.GetCoM(users[i], tracked_users[i]->center);
            tracked_users[i]->skeletonTracking	  = user_generator.GetSkeletonCap().IsTracking(users[i]);
            tracked_users[i]->skeletonCalibrating = user_generator.GetSkeletonCap().IsCalibrating(users[i]);
            tracked_users[i]->skeletonCalibrated  = user_generator.GetSkeletonCap().IsCalibrated(users[i]);
            if(tracked_users[i]->skeletonTracking) tracked_users[i]->updateBonePositions();
		}
	}
	
	delete [] users;
	
	if (useMaskPixels) updateUserPixels();
	if (useCloudPoints) updateCloudPoints();
}