mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 09:37:29 +02:00
complete an initial version of eve that sits at 0,0,0
This commit is contained in:
parent
c68ec079eb
commit
a558597b6a
5 changed files with 76 additions and 17 deletions
|
@ -3,11 +3,18 @@ cmake_minimum_required(VERSION 2.8)
|
||||||
set(ROOT_DIR ..)
|
set(ROOT_DIR ..)
|
||||||
set(MACRO_DIR ${ROOT_DIR}/cmake/macros)
|
set(MACRO_DIR ${ROOT_DIR}/cmake/macros)
|
||||||
|
|
||||||
|
# setup for find modules
|
||||||
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/modules/")
|
||||||
|
|
||||||
set(TARGET_NAME eve)
|
set(TARGET_NAME eve)
|
||||||
|
|
||||||
include(${MACRO_DIR}/SetupHifiProject.cmake)
|
include(${MACRO_DIR}/SetupHifiProject.cmake)
|
||||||
setup_hifi_project(${TARGET_NAME})
|
setup_hifi_project(${TARGET_NAME})
|
||||||
|
|
||||||
# link the shared hifi library
|
include(${MACRO_DIR}/IncludeGLM.cmake)
|
||||||
|
include_glm(${TARGET_NAME} ${ROOT_DIR})
|
||||||
|
|
||||||
|
# link the required hifi libraries
|
||||||
include(${MACRO_DIR}/LinkHifiLibrary.cmake)
|
include(${MACRO_DIR}/LinkHifiLibrary.cmake)
|
||||||
link_hifi_library(shared ${TARGET_NAME} ${ROOT_DIR})
|
link_hifi_library(shared ${TARGET_NAME} ${ROOT_DIR})
|
||||||
|
link_hifi_library(avatars ${TARGET_NAME} ${ROOT_DIR})
|
|
@ -6,11 +6,16 @@
|
||||||
// Copyright (c) 2013 High Fidelity, Inc. All rights reserved.
|
// Copyright (c) 2013 High Fidelity, Inc. All rights reserved.
|
||||||
//
|
//
|
||||||
|
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
#include <SharedUtil.h>
|
||||||
#include <AgentTypes.h>
|
#include <AgentTypes.h>
|
||||||
#include <AgentList.h>
|
|
||||||
#include <PacketHeaders.h>
|
#include <PacketHeaders.h>
|
||||||
|
#include <AgentList.h>
|
||||||
|
#include <AvatarData.h>
|
||||||
|
|
||||||
const int EVE_AGENT_LIST_PORT = 55441;
|
const int EVE_AGENT_LIST_PORT = 55441;
|
||||||
|
const float DATA_SEND_INTERVAL_MSECS = 10;
|
||||||
|
|
||||||
bool stopReceiveAgentDataThread;
|
bool stopReceiveAgentDataThread;
|
||||||
|
|
||||||
|
@ -20,14 +25,26 @@ void *receiveAgentData(void *args)
|
||||||
ssize_t bytesReceived;
|
ssize_t bytesReceived;
|
||||||
unsigned char incomingPacket[MAX_PACKET_SIZE];
|
unsigned char incomingPacket[MAX_PACKET_SIZE];
|
||||||
|
|
||||||
|
AgentList *agentList = AgentList::getInstance();
|
||||||
|
Agent *avatarMixer = NULL;
|
||||||
|
|
||||||
while (!::stopReceiveAgentDataThread) {
|
while (!::stopReceiveAgentDataThread) {
|
||||||
if (AgentList::getInstance()->getAgentSocket().receive(&senderAddress, incomingPacket, &bytesReceived)) {
|
if (agentList->getAgentSocket().receive(&senderAddress, incomingPacket, &bytesReceived)) {
|
||||||
|
|
||||||
// we're going to ignore any data that isn't the agent list from the domain server
|
|
||||||
// ex: the avatar mixer will be sending us the position of other agents
|
|
||||||
switch (incomingPacket[0]) {
|
switch (incomingPacket[0]) {
|
||||||
case PACKET_HEADER_DOMAIN:
|
case PACKET_HEADER_BULK_AVATAR_DATA:
|
||||||
AgentList::getInstance()->processAgentData(&senderAddress, incomingPacket, bytesReceived);
|
// this is the positional data for other agents
|
||||||
|
// eve doesn't care about this for now, so let's just update the receive time for the
|
||||||
|
// avatar mixer - this makes sure it won't be killed during silent agent removal
|
||||||
|
avatarMixer = agentList->soloAgentOfType(AGENT_TYPE_AVATAR_MIXER);
|
||||||
|
|
||||||
|
if (avatarMixer != NULL) {
|
||||||
|
avatarMixer->setLastRecvTimeUsecs(usecTimestampNow());
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// have the agentList handle list of agents from DS, replies from other agents, etc.
|
||||||
|
agentList->processAgentData(&senderAddress, incomingPacket, bytesReceived);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -50,6 +67,47 @@ int main(int argc, char* argv[]) {
|
||||||
// start the ping thread that hole punches to create an active connection to other agents
|
// start the ping thread that hole punches to create an active connection to other agents
|
||||||
agentList->startPingUnknownAgentsThread();
|
agentList->startPingUnknownAgentsThread();
|
||||||
|
|
||||||
|
pthread_t receiveAgentDataThread;
|
||||||
|
pthread_create(&receiveAgentDataThread, NULL, receiveAgentData, NULL);
|
||||||
|
|
||||||
|
// create an AvatarData object, "eve"
|
||||||
|
AvatarData eve = AvatarData();
|
||||||
|
|
||||||
|
unsigned char broadcastPacket[MAX_PACKET_SIZE];
|
||||||
|
broadcastPacket[0] = PACKET_HEADER_HEAD_DATA;
|
||||||
|
|
||||||
|
int numBytesToSend = 0;
|
||||||
|
|
||||||
|
timeval thisSend;
|
||||||
|
double numMicrosecondsSleep = 0;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
// update the thisSend timeval to the current time
|
||||||
|
gettimeofday(&thisSend, NULL);
|
||||||
|
|
||||||
|
// find the current avatar mixer
|
||||||
|
Agent *avatarMixer = agentList->soloAgentOfType(AGENT_TYPE_AVATAR_MIXER);
|
||||||
|
|
||||||
|
// make sure we actually have an avatar mixer with an active socket
|
||||||
|
if (avatarMixer != NULL && avatarMixer->getActiveSocket() != NULL) {
|
||||||
|
// use the getBroadcastData method in the AvatarData class to populate the broadcastPacket buffer
|
||||||
|
numBytesToSend = eve.getBroadcastData((broadcastPacket + 1));
|
||||||
|
|
||||||
|
|
||||||
|
// use the UDPSocket instance attached to our agent list to send avatar data to mixer
|
||||||
|
agentList->getAgentSocket().send(avatarMixer->getActiveSocket(), broadcastPacket, numBytesToSend);
|
||||||
|
}
|
||||||
|
|
||||||
|
// sleep for the correct amount of time to have data send be consistently timed
|
||||||
|
if ((numMicrosecondsSleep = (DATA_SEND_INTERVAL_MSECS * 1000) - (usecTimestampNow() - usecTimestamp(&thisSend))) > 0) {
|
||||||
|
usleep(numMicrosecondsSleep);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// stop the receive agent data thread
|
||||||
|
stopReceiveAgentDataThread = true;
|
||||||
|
pthread_join(receiveAgentDataThread, NULL);
|
||||||
|
|
||||||
// stop the agent list's threads
|
// stop the agent list's threads
|
||||||
agentList->stopDomainServerCheckInThread();
|
agentList->stopDomainServerCheckInThread();
|
||||||
agentList->stopPingUnknownAgentsThread();
|
agentList->stopPingUnknownAgentsThread();
|
||||||
|
|
|
@ -8,7 +8,6 @@ project(${TARGET_NAME})
|
||||||
|
|
||||||
# setup for find modules
|
# setup for find modules
|
||||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/modules/")
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/modules/")
|
||||||
set(GLM_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external)
|
|
||||||
set(LODEPNG_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/LodePNG)
|
set(LODEPNG_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/LodePNG)
|
||||||
set(PORTAUDIO_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/portaudio)
|
set(PORTAUDIO_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/portaudio)
|
||||||
|
|
||||||
|
|
|
@ -228,7 +228,6 @@ bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket,
|
||||||
|
|
||||||
if (agent == agents.end()) {
|
if (agent == agents.end()) {
|
||||||
// we didn't have this agent, so add them
|
// we didn't have this agent, so add them
|
||||||
|
|
||||||
Agent newAgent = Agent(publicSocket, localSocket, agentType, agentId);
|
Agent newAgent = Agent(publicSocket, localSocket, agentType, agentId);
|
||||||
|
|
||||||
if (socketMatch(publicSocket, localSocket)) {
|
if (socketMatch(publicSocket, localSocket)) {
|
||||||
|
@ -281,7 +280,7 @@ void AgentList::broadcastToAgents(unsigned char *broadcastData, size_t dataBytes
|
||||||
void AgentList::handlePingReply(sockaddr *agentAddress) {
|
void AgentList::handlePingReply(sockaddr *agentAddress) {
|
||||||
for(std::vector<Agent>::iterator agent = agents.begin(); agent != agents.end(); agent++) {
|
for(std::vector<Agent>::iterator agent = agents.begin(); agent != agents.end(); agent++) {
|
||||||
// check both the public and local addresses for each agent to see if we find a match
|
// check both the public and local addresses for each agent to see if we find a match
|
||||||
// prioritize the private address so that we prune erroneous local matches
|
// prioritize the private address so that we prune erroneous local matches
|
||||||
if (socketMatch(agent->getPublicSocket(), agentAddress)) {
|
if (socketMatch(agent->getPublicSocket(), agentAddress)) {
|
||||||
agent->activatePublicSocket();
|
agent->activatePublicSocket();
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -7,7 +7,6 @@ set(MACRO_DIR ${ROOT_DIR}/cmake/macros)
|
||||||
|
|
||||||
# setup for find modules
|
# setup for find modules
|
||||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/modules/")
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/modules/")
|
||||||
set(GLM_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external)
|
|
||||||
|
|
||||||
# set up the external glm library
|
# set up the external glm library
|
||||||
include(${MACRO_DIR}/IncludeGLM.cmake)
|
include(${MACRO_DIR}/IncludeGLM.cmake)
|
||||||
|
@ -22,7 +21,4 @@ include(${MACRO_DIR}/LinkHifiLibrary.cmake)
|
||||||
link_hifi_library(shared ${TARGET_NAME} ${ROOT_DIR})
|
link_hifi_library(shared ${TARGET_NAME} ${ROOT_DIR})
|
||||||
|
|
||||||
# link in the hifi voxels library
|
# link in the hifi voxels library
|
||||||
link_hifi_library(voxels ${TARGET_NAME} ${ROOT_DIR})
|
link_hifi_library(voxels ${TARGET_NAME} ${ROOT_DIR})
|
||||||
|
|
||||||
# find required libraries
|
|
||||||
find_package(GLM REQUIRED)
|
|
Loading…
Reference in a new issue