iup-stack/iup/srctuio/tuio/TuioManager.cpp

618 lines
21 KiB
C++
Executable File

/*
TUIO C++ Library
Copyright (c) 2005-2017 Martin Kaltenbrunner <martin@tuio.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3.0 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library.
*/
#include "TuioManager.h"
using namespace TUIO;
TuioManager::TuioManager()
: currentFrameTime(TuioTime::getSystemTime())
, currentFrame(-1)
, maxCursorID(-1)
, maxBlobID(-1)
, sessionID(-1)
, updateObject(false)
, updateCursor(false)
, updateBlob(false)
, verbose(false)
, invert_x(false)
, invert_y(false)
, invert_a(false)
{
}
TuioManager::~TuioManager() {
}
TuioObject* TuioManager::addTuioObject(int f_id, float x, float y, float a) {
sessionID++;
TuioObject *tobj = new TuioObject(currentFrameTime, sessionID, f_id, x, y, a);
objectList.push_back(tobj);
updateObject = true;
for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
(*listener)->addTuioObject(tobj);
if (verbose)
std::cout << "add obj " << tobj->getSymbolID() << " (" << tobj->getSessionID() << ") "<< tobj->getX() << " " << tobj->getY() << " " << tobj->getAngle() << std::endl;
return tobj;
}
void TuioManager::addExternalTuioObject(TuioObject *tobj) {
if (tobj==NULL) return;
tobj->setSessionID(++sessionID);
objectList.push_back(tobj);
updateObject = true;
for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
(*listener)->addTuioObject(tobj);
if (verbose)
std::cout << "add obj " << tobj->getSymbolID() << " (" << tobj->getSessionID() << ") "<< tobj->getX() << " " << tobj->getY() << " " << tobj->getAngle() << std::endl;
}
void TuioManager::updateTuioObject(TuioObject *tobj, float x, float y, float a) {
if (tobj==NULL) return;
if (tobj->getTuioTime()==currentFrameTime) return;
tobj->update(currentFrameTime,x,y,a);
updateObject = true;
if (tobj->isMoving()) {
for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
(*listener)->updateTuioObject(tobj);
if (verbose)
std::cout << "set obj " << tobj->getSymbolID() << " (" << tobj->getSessionID() << ") "<< tobj->getX() << " " << tobj->getY() << " " << tobj->getAngle()
<< " " << tobj->getXSpeed() << " " << tobj->getYSpeed() << " " << tobj->getRotationSpeed() << " " << tobj->getMotionAccel() << " " << tobj->getRotationAccel() << std::endl;
}
}
void TuioManager::updateExternalTuioObject(TuioObject *tobj) {
if (tobj==NULL) return;
updateObject = true;
if (tobj->isMoving()) {
for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
(*listener)->updateTuioObject(tobj);
if (verbose)
std::cout << "set obj " << tobj->getSymbolID() << " (" << tobj->getSessionID() << ") "<< tobj->getX() << " " << tobj->getY() << " " << tobj->getAngle()
<< " " << tobj->getXSpeed() << " " << tobj->getYSpeed() << " " << tobj->getRotationSpeed() << " " << tobj->getMotionAccel() << " " << tobj->getRotationAccel() << std::endl;
}
}
void TuioManager::removeTuioObject(TuioObject *tobj) {
if (tobj==NULL) return;
for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
(*listener)->removeTuioObject(tobj);
if (verbose)
std::cout << "del obj " << tobj->getSymbolID() << " (" << tobj->getSessionID() << ")" << std::endl;
objectList.remove(tobj);
delete tobj;
updateObject = true;
}
void TuioManager::removeExternalTuioObject(TuioObject *tobj) {
if (tobj==NULL) return;
objectList.remove(tobj);
updateObject = true;
for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
(*listener)->removeTuioObject(tobj);
if (verbose)
std::cout << "del obj " << tobj->getSymbolID() << " (" << tobj->getSessionID() << ")" << std::endl;
}
TuioCursor* TuioManager::addTuioCursor(float x, float y) {
sessionID++;
int cursorID = (int)cursorList.size();
if ((int)(cursorList.size())<=maxCursorID) {
std::list<TuioCursor*>::iterator closestCursor = freeCursorList.begin();
for(std::list<TuioCursor*>::iterator iter = freeCursorList.begin();iter!= freeCursorList.end(); iter++) {
if((*iter)->getDistance(x,y)<(*closestCursor)->getDistance(x,y)) closestCursor = iter;
}
TuioCursor *freeCursor = (*closestCursor);
cursorID = (*closestCursor)->getCursorID();
freeCursorList.erase(closestCursor);
delete freeCursor;
} else maxCursorID = cursorID;
TuioCursor *tcur = new TuioCursor(currentFrameTime, sessionID, cursorID, x, y);
cursorList.push_back(tcur);
updateCursor = true;
for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
(*listener)->addTuioCursor(tcur);
if (verbose /*&& tcur->getTuioState()!=TUIO_ADDED*/)
std::cout << "add cur " << tcur->getCursorID() << " (" << tcur->getSessionID() << ") " << tcur->getX() << " " << tcur->getY() << std::endl;
return tcur;
}
void TuioManager::addExternalTuioCursor(TuioCursor *tcur) {
if (tcur==NULL) return;
tcur->setSessionID(++sessionID);
cursorList.push_back(tcur);
updateCursor = true;
for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
(*listener)->addTuioCursor(tcur);
if (verbose)
std::cout << "add cur " << tcur->getCursorID() << " (" << tcur->getSessionID() << ") " << tcur->getX() << " " << tcur->getY() << std::endl;
}
void TuioManager::updateTuioCursor(TuioCursor *tcur,float x, float y) {
if (tcur==NULL) return;
//if (tcur->getTuioTime()==currentFrameTime) return;
tcur->update(currentFrameTime,x,y);
updateCursor = true;
if (tcur->isMoving()) {
for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
(*listener)->updateTuioCursor(tcur);
if (verbose)
std::cout << "set cur " << tcur->getCursorID() << " (" << tcur->getSessionID() << ") " << tcur->getX() << " " << tcur->getY()
<< " " << tcur->getXSpeed() << " " << tcur->getYSpeed() << " " << tcur->getMotionAccel() << " " << std::endl;
}
}
void TuioManager::updateExternalTuioCursor(TuioCursor *tcur) {
if (tcur==NULL) return;
updateCursor = true;
if (tcur->isMoving()) {
for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
(*listener)->updateTuioCursor(tcur);
if (verbose)
std::cout << "set cur " << tcur->getCursorID() << " (" << tcur->getSessionID() << ") " << tcur->getX() << " " << tcur->getY()
<< " " << tcur->getXSpeed() << " " << tcur->getYSpeed() << " " << tcur->getMotionAccel() << " " << std::endl;
}
}
void TuioManager::removeTuioCursor(TuioCursor *tcur) {
if (tcur==NULL) return;
if (verbose /*&& tcur->getTuioState()!=TUIO_ADDED*/)
std::cout << "del cur " << tcur->getCursorID() << " (" << tcur->getSessionID() << ")" << std::endl;
cursorList.remove(tcur);
tcur->remove(currentFrameTime);
updateCursor = true;
for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
(*listener)->removeTuioCursor(tcur);
if (tcur->getCursorID()==maxCursorID) {
maxCursorID = -1;
delete tcur;
if (cursorList.size()>0) {
std::list<TuioCursor*>::iterator clist;
for (clist=cursorList.begin(); clist != cursorList.end(); clist++) {
int cursorID = (*clist)->getCursorID();
if (cursorID>maxCursorID) maxCursorID=cursorID;
}
freeCursorBuffer.clear();
for (std::list<TuioCursor*>::iterator flist=freeCursorList.begin(); flist != freeCursorList.end(); flist++) {
TuioCursor *freeCursor = (*flist);
if (freeCursor->getCursorID()>maxCursorID) delete freeCursor;
else freeCursorBuffer.push_back(freeCursor);
}
freeCursorList = freeCursorBuffer;
} else {
for (std::list<TuioCursor*>::iterator flist=freeCursorList.begin(); flist != freeCursorList.end(); flist++) {
TuioCursor *freeCursor = (*flist);
delete freeCursor;
}
freeCursorList.clear();
}
} else if (tcur->getCursorID()<maxCursorID) {
freeCursorList.push_back(tcur);
}
}
void TuioManager::removeExternalTuioCursor(TuioCursor *tcur) {
if (tcur==NULL) return;
if (verbose /*&& tcur->getTuioState()!=TUIO_ADDED*/)
std::cout << "del cur " << tcur->getCursorID() << " (" << tcur->getSessionID() << ")" << std::endl;
cursorList.remove(tcur);
updateCursor = true;
for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
(*listener)->removeTuioCursor(tcur);
}
TuioBlob* TuioManager::addTuioBlob(float x, float y, float a, float w, float h, float f) {
sessionID++;
int blobID = (int)blobList.size();
if ((int)(blobList.size())<=maxBlobID) {
std::list<TuioBlob*>::iterator closestBlob = freeBlobList.begin();
for(std::list<TuioBlob*>::iterator iter = freeBlobList.begin();iter!= freeBlobList.end(); iter++) {
if((*iter)->getDistance(x,y)<(*closestBlob)->getDistance(x,y)) closestBlob = iter;
}
TuioBlob *freeBlob = (*closestBlob);
blobID = (*closestBlob)->getBlobID();
freeBlobList.erase(closestBlob);
delete freeBlob;
} else maxBlobID = blobID;
TuioBlob *tblb = new TuioBlob(currentFrameTime, sessionID, blobID, x, y, a, w, h, f);
blobList.push_back(tblb);
updateBlob = true;
for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
(*listener)->addTuioBlob(tblb);
if (verbose /*&& tblb->getTuioState()!=TUIO_ADDED*/)
std::cout << "add blb " << tblb->getBlobID() << " (" << tblb->getSessionID() << ") " << tblb->getX() << " " << tblb->getY() << " " << tblb->getAngle() << " " << tblb->getWidth() << " " << tblb->getHeight() << " " << tblb->getArea() << std::endl;
return tblb;
}
void TuioManager::addExternalTuioBlob(TuioBlob *tblb) {
if (tblb==NULL) return;
int blobID = (int)blobList.size();
if (blobID <= maxBlobID) {
std::list<TuioBlob*>::iterator closestBlob = freeBlobList.begin();
for(std::list<TuioBlob*>::iterator iter = freeBlobList.begin();iter!= freeBlobList.end(); iter++) {
if((*iter)->getDistance(tblb->getX(),tblb->getY())<(*closestBlob)->getDistance(tblb->getX(),tblb->getY())) closestBlob = iter;
}
TuioBlob *freeBlob = (*closestBlob);
blobID = (*closestBlob)->getBlobID();
freeBlobList.erase(closestBlob);
delete freeBlob;
} else maxBlobID = blobID;
tblb->setSessionID(++sessionID);
tblb->setBlobID(blobID);
blobList.push_back(tblb);
updateBlob = true;
for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
(*listener)->addTuioBlob(tblb);
if (verbose)
std::cout << "add blb " << tblb->getBlobID() << " (" << tblb->getSessionID() << ") " << tblb->getX() << " " << tblb->getY() << " " << tblb->getAngle() << " " << tblb->getWidth() << " " << tblb->getHeight() << " " << tblb->getArea() << std::endl;
}
void TuioManager::updateTuioBlob(TuioBlob *tblb,float x, float y, float a, float w, float h, float f) {
if (tblb==NULL) return;
if (tblb->getTuioTime()==currentFrameTime) return;
tblb->update(currentFrameTime,x,y,a,w,h,f);
updateBlob = true;
if (tblb->isMoving()) {
for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
(*listener)->updateTuioBlob(tblb);
if (verbose)
std::cout << "set blb " << tblb->getBlobID() << " (" << tblb->getSessionID() << ") " << tblb->getX() << " " << tblb->getY() << " " << tblb->getAngle() << " " << tblb->getWidth() << " " << tblb->getHeight() << " " << tblb->getArea()
<< " " << tblb->getXSpeed() << " " << tblb->getYSpeed() << " " << tblb->getRotationSpeed() << " " << tblb->getMotionAccel()<< " " << tblb->getRotationAccel() << " " << std::endl;
}
}
void TuioManager::updateExternalTuioBlob(TuioBlob *tblb) {
if (tblb==NULL) return;
updateBlob = true;
if (tblb->isMoving()) {
for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
(*listener)->updateTuioBlob(tblb);
if (verbose)
std::cout << "set blb " << tblb->getBlobID() << " (" << tblb->getSessionID() << ") " << tblb->getX() << " " << tblb->getY() << " " << tblb->getAngle() << " " << tblb->getWidth() << " " << tblb->getHeight() << " " << tblb->getArea()
<< " " << tblb->getXSpeed() << " " << tblb->getYSpeed() << " " << tblb->getRotationSpeed() << " " << tblb->getMotionAccel()<< " " << tblb->getRotationAccel() << " " << std::endl;
}
}
void TuioManager::removeTuioBlob(TuioBlob *tblb) {
if (tblb==NULL) return;
if (verbose /*&& tblb->getTuioState()!=TUIO_ADDED*/)
std::cout << "del blb " << tblb->getBlobID() << " (" << tblb->getSessionID() << ")" << std::endl;
blobList.remove(tblb);
tblb->remove(currentFrameTime);
updateBlob = true;
for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
(*listener)->removeTuioBlob(tblb);
if (tblb->getBlobID()==maxBlobID) {
maxBlobID = -1;
delete tblb;
if (blobList.size()>0) {
std::list<TuioBlob*>::iterator clist;
for (clist=blobList.begin(); clist != blobList.end(); clist++) {
int blobID = (*clist)->getBlobID();
if (blobID>maxBlobID) maxBlobID=blobID;
}
freeBlobBuffer.clear();
for (std::list<TuioBlob*>::iterator flist=freeBlobList.begin(); flist != freeBlobList.end(); flist++) {
TuioBlob *freeBlob = (*flist);
if (freeBlob->getBlobID()>maxBlobID) delete freeBlob;
else freeBlobBuffer.push_back(freeBlob);
}
freeBlobList = freeBlobBuffer;
} else {
for (std::list<TuioBlob*>::iterator flist=freeBlobList.begin(); flist != freeBlobList.end(); flist++) {
TuioBlob *freeBlob = (*flist);
delete freeBlob;
}
freeBlobList.clear();
}
} else if (tblb->getBlobID()<maxBlobID) {
freeBlobList.push_back(tblb);
}
}
void TuioManager::removeExternalTuioBlob(TuioBlob *tblb) {
if (tblb==NULL) return;
if (verbose /*&& tblb->getTuioState()!=TUIO_ADDED*/)
std::cout << "del blb " << tblb->getBlobID() << " (" << tblb->getSessionID() << ")" << std::endl;
blobList.remove(tblb);
updateBlob = true;
for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
(*listener)->removeTuioBlob(tblb);
}
long TuioManager::getSessionID() {
sessionID++;
return sessionID;
}
long TuioManager::getFrameID() {
return currentFrame;
}
TuioTime TuioManager::getFrameTime() {
return currentFrameTime;
}
void TuioManager::initFrame(TuioTime ttime) {
currentFrameTime = TuioTime(ttime);
currentFrame++;
}
void TuioManager::commitFrame() {
for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
(*listener)->refresh(currentFrameTime);
}
TuioObject* TuioManager::getClosestTuioObject(float xp, float yp) {
TuioObject *closestObject = NULL;
float closestDistance = 1.0f;
for (std::list<TuioObject*>::iterator iter=objectList.begin(); iter != objectList.end(); iter++) {
float distance = (*iter)->getDistance(xp,yp);
if(distance<closestDistance) {
closestObject = (*iter);
closestDistance = distance;
}
}
return closestObject;
}
TuioCursor* TuioManager::getClosestTuioCursor(float xp, float yp) {
TuioCursor *closestCursor = NULL;
float closestDistance = 1.0f;
for (std::list<TuioCursor*>::iterator iter=cursorList.begin(); iter != cursorList.end(); iter++) {
float distance = (*iter)->getDistance(xp,yp);
if(distance<closestDistance) {
closestCursor = (*iter);
closestDistance = distance;
}
}
return closestCursor;
}
TuioBlob* TuioManager::getClosestTuioBlob(float xp, float yp) {
TuioBlob *closestBlob = NULL;
float closestDistance = 1.0f;
for (std::list<TuioBlob*>::iterator iter=blobList.begin(); iter != blobList.end(); iter++) {
float distance = (*iter)->getDistance(xp,yp);
if(distance<closestDistance) {
closestBlob = (*iter);
closestDistance = distance;
}
}
return closestBlob;
}
std::list<TuioObject*> TuioManager::getUntouchedObjects() {
std::list<TuioObject*> untouched;
for (std::list<TuioObject*>::iterator tuioObject = objectList.begin(); tuioObject!=objectList.end(); tuioObject++) {
TuioObject *tobj = (*tuioObject);
if (tobj->getTuioTime()!=currentFrameTime) untouched.push_back(tobj);
}
return untouched;
}
void TuioManager::stopUntouchedMovingObjects() {
std::list<TuioObject*> untouched;
for (std::list<TuioObject*>::iterator tuioObject = objectList.begin(); tuioObject!=objectList.end(); tuioObject++) {
TuioObject *tobj = (*tuioObject);
if ((tobj->getTuioTime()!=currentFrameTime) && (tobj->isMoving())) {
tobj->stop(currentFrameTime);
updateObject = true;
if (verbose)
std::cout << "set obj " << tobj->getSymbolID() << " (" << tobj->getSessionID() << ") "<< tobj->getX() << " " << tobj->getY() << " " << tobj->getAngle()
<< " " << tobj->getXSpeed() << " " << tobj->getYSpeed() << " " << tobj->getRotationSpeed() << " " << tobj->getMotionAccel() << " " << tobj->getRotationAccel() << std::endl;
}
}
}
void TuioManager::removeUntouchedStoppedObjects() {
std::list<TuioObject*>::iterator tuioObject = objectList.begin();
while (tuioObject!=objectList.end()) {
TuioObject *tobj = (*tuioObject);
if ((tobj->getTuioTime()!=currentFrameTime) && (!tobj->isMoving())) {
removeTuioObject(tobj);
tuioObject = objectList.begin();
} else tuioObject++;
}
}
void TuioManager::resetTuioObjects() {
std::list<TuioObject*>::iterator tuioObject = objectList.begin();
while (tuioObject!=objectList.end()) {
removeTuioObject((*tuioObject));
tuioObject = objectList.begin();
}
}
std::list<TuioCursor*> TuioManager::getUntouchedCursors() {
std::list<TuioCursor*> untouched;
for (std::list<TuioCursor*>::iterator tuioCursor = cursorList.begin(); tuioCursor!=cursorList.end(); tuioCursor++) {
TuioCursor *tcur = (*tuioCursor);
if (tcur->getTuioTime()!=currentFrameTime) untouched.push_back(tcur);
}
return untouched;
}
void TuioManager::stopUntouchedMovingCursors() {
std::list<TuioCursor*> untouched;
for (std::list<TuioCursor*>::iterator tuioCursor = cursorList.begin(); tuioCursor!=cursorList.end(); tuioCursor++) {
TuioCursor *tcur = (*tuioCursor);
if ((tcur->getTuioTime()!=currentFrameTime) && (tcur->isMoving())) {
tcur->stop(currentFrameTime);
updateCursor = true;
if (verbose)
std::cout << "set cur " << tcur->getCursorID() << " (" << tcur->getSessionID() << ") " << tcur->getX() << " " << tcur->getY()
<< " " << tcur->getXSpeed() << " " << tcur->getYSpeed()<< " " << tcur->getMotionAccel() << " " << std::endl;
}
}
}
void TuioManager::removeUntouchedStoppedCursors() {
if (cursorList.size()==0) return;
std::list<TuioCursor*>::iterator tuioCursor = cursorList.begin();
while (tuioCursor!=cursorList.end()) {
TuioCursor *tcur = (*tuioCursor);
if ((tcur->getTuioTime()!=currentFrameTime) && (!tcur->isMoving())) {
removeTuioCursor(tcur);
tuioCursor = cursorList.begin();
} else tuioCursor++;
}
}
void TuioManager::resetTuioCursors() {
std::list<TuioCursor*>::iterator tuioCursor = cursorList.begin();
while (tuioCursor!=cursorList.end()) {
removeTuioCursor((*tuioCursor));
tuioCursor = cursorList.begin();
}
}
std::list<TuioBlob*> TuioManager::getUntouchedBlobs() {
std::list<TuioBlob*> untouched;
for (std::list<TuioBlob*>::iterator tuioBlob = blobList.begin(); tuioBlob!=blobList.end(); tuioBlob++) {
TuioBlob *tblb = (*tuioBlob);
if (tblb->getTuioTime()!=currentFrameTime) untouched.push_back(tblb);
}
return untouched;
}
void TuioManager::stopUntouchedMovingBlobs() {
std::list<TuioBlob*> untouched;
for (std::list<TuioBlob*>::iterator tuioBlob = blobList.begin(); tuioBlob!=blobList.end(); tuioBlob++) {
TuioBlob *tblb = (*tuioBlob);
if ((tblb->getTuioTime()!=currentFrameTime) && (tblb->isMoving())) {
tblb->stop(currentFrameTime);
updateBlob = true;
if (verbose)
std::cout << "set blb " << tblb->getBlobID() << " (" << tblb->getSessionID() << ") " << tblb->getX() << " " << tblb->getY() << " " << tblb->getAngle() << " " << tblb->getWidth() << " " << tblb->getHeight() << " " << tblb->getArea()
<< " " << tblb->getXSpeed() << " " << tblb->getYSpeed() << " " << tblb->getRotationSpeed() << " " << tblb->getMotionAccel()<< " " << tblb->getRotationAccel() << " " << std::endl;
}
}
}
void TuioManager::removeUntouchedStoppedBlobs() {
std::list<TuioBlob*>::iterator tuioBlob = blobList.begin();
while (tuioBlob!=blobList.end()) {
TuioBlob *tblb = (*tuioBlob);
if ((tblb->getTuioTime()!=currentFrameTime) && (!tblb->isMoving())) {
removeTuioBlob(tblb);
tuioBlob = blobList.begin();
} else tuioBlob++;
}
}
void TuioManager::resetTuioBlobs() {
std::list<TuioBlob*>::iterator tuioBlob = blobList.begin();
while (tuioBlob!=blobList.end()) {
removeTuioBlob((*tuioBlob));
tuioBlob = blobList.begin();
}
}