// Description: a node that broadcasts updated user position and orientation over OSC
//
//notes:
//
//- derived nodes inherit all messages from their base classes
//
- see reset method for default settings
//
//
// 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();
}