// Description: a node that broadcasts updated user position and orientation over OSC // //notes: // // // Category: Sound // Author: Ben Chang // Revision: 05/10/04 #include #include #include "ygUtil.h" #include "ygWorld.h" #include "ygNetKeys.h" #include "OSCUserTracker.h" #include "ygCAVEViewer.h" #include "OSC-client.h" #include "htmsocket.h" extern "C" ygNode* construct_OSCUserTracker (const char* name, bool master) { return new OSCUserTracker(name,master); } struct _OSCUserTrackerPrivateData { ygString host; int port; pfCoord userCoord; }; OSCUserTracker::OSCUserTracker (const char* name,bool master) : ygNode (name,master) { setClassName("OSCUserTracker",true); p_ = new struct _OSCUserTrackerPrivateData; p_->host = "localhost"; p_->port = 10000; p_->userCoord.xyz.set(0,0,0); p_->userCoord.hpr.set(0,0,0); } OSCUserTracker::~OSCUserTracker(void) { delete p_; } void OSCUserTracker::reset (void) { ygNode::reset(); } void OSCUserTracker::message (const ygMessage& msg) { ygNode::message(msg); } void OSCUserTracker::app(void) { OSCbuf buf; void *socket; int messagelength; static char bufferForOSCbuf[SC_BUFFER_SIZE]; ygCAVEViewer* viewer; pfMatrix mat; pfCoord newcoord; viewer = (ygCAVEViewer*) ygWorld::World->viewer(); viewer->getMatrix (mat); mat.getOrthoCoord (&newcoord); if ((newcoord.xyz != p_->userCoord.xyz) || (newcoord.hpr != p_->userCoord.hpr) ) { p_->userCoord = newcoord; //printf ("%f %f %f\t %f %f %f\n",p_->userCoord.xyz[0],p_->userCoord.xyz[1],p_->userCoord.xyz[2],p_->userCoord.hpr[0],p_->userCoord.hpr[1],p_->userCoord.hpr[2]); OSC_initBuffer (&buf,SC_BUFFER_SIZE,bufferForOSCbuf); OSC_writeAddressAndTypes (&buf,"/viewer",",sfsfsfsf"); OSC_writeStringArg (&buf,"globx"); OSC_writeFloatArg (&buf,p_->userCoord.xyz[0]); OSC_writeStringArg (&buf,"globy"); OSC_writeFloatArg (&buf,p_->userCoord.xyz[1]); OSC_writeStringArg (&buf,"globz"); OSC_writeFloatArg (&buf,p_->userCoord.xyz[2]); OSC_writeStringArg (&buf,"heading"); OSC_writeFloatArg (&buf,p_->userCoord.hpr[0]); socket = OpenHTMSocket (p_->host.c_str(),p_->port); SendHTMSocket (socket,OSC_packetSize(&buf),OSC_getPacket(&buf)); CloseHTMSocket (socket); } ygNode::app(); }