Ejemplo n.º 1
0
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// Checks the type of event. If a valid event, creates an event packet and returns true. Else return false.
	virtual void handleEvent(const Event& evt)
	{
		// If the event has been processed locally (i.e. by a filter event service)
		if(evt.isProcessed()) return;

#ifdef OMICRON_USE_VRPN
		vrpnDevice->update(evt);
#endif
			
		int offset = 0;
			
		OI_WRITEBUF(unsigned int, eventPacket, offset, evt.getTimestamp()); 
		OI_WRITEBUF(unsigned int, eventPacket, offset, evt.getSourceId()); 
		OI_WRITEBUF(int, eventPacket, offset, evt.getServiceId()); 
		OI_WRITEBUF(unsigned int, eventPacket, offset, evt.getServiceType()); 
		OI_WRITEBUF(unsigned int, eventPacket, offset, evt.getType()); 
		OI_WRITEBUF(unsigned int, eventPacket, offset, evt.getFlags()); 
		OI_WRITEBUF(float, eventPacket, offset, evt.getPosition().x()); 
		OI_WRITEBUF(float, eventPacket, offset, evt.getPosition().y()); 
		OI_WRITEBUF(float, eventPacket, offset, evt.getPosition().z()); 
		OI_WRITEBUF(float, eventPacket, offset, evt.getOrientation().w()); 
		OI_WRITEBUF(float, eventPacket, offset, evt.getOrientation().x()); 
		OI_WRITEBUF(float, eventPacket, offset, evt.getOrientation().y()); 
		OI_WRITEBUF(float, eventPacket, offset, evt.getOrientation().z()); 
		
		OI_WRITEBUF(unsigned int, eventPacket, offset, evt.getExtraDataType()); 
		OI_WRITEBUF(unsigned int, eventPacket, offset, evt.getExtraDataItems()); 
		OI_WRITEBUF(unsigned int, eventPacket, offset, evt.getExtraDataMask());
		
		if(evt.getExtraDataType() != Event::ExtraDataNull)
		{
			memcpy(&eventPacket[offset], evt.getExtraDataBuffer(), evt.getExtraDataSize());
		}
		offset += evt.getExtraDataSize();
		
		handleLegacyEvent(evt);
		
		std::map<char*,NetClient*> activeClients;

		std::map<char*,NetClient*>::iterator itr = netClients.begin();
		while( itr != netClients.end() )
		{
			NetClient* client = itr->second;
			
			if( client->isLegacy() )
			{
				//client->sendEvent(legacyPacket, 512);
			}
			else
			{
				client->sendMsg("",1);
				client->sendEvent(eventPacket, offset);
			}

			// If client is still connected add to active list
			if( client->isConnected() )
			{
				activeClients[itr->first] = client;
			}
			else // Client disconnected, remove from list
			{
				ofmsg("OInputServer: Client '%1%' Disconnected.", %itr->first);
				delete client;
			}
			itr++;
		}

		netClients = activeClients;
	}