diff --git a/audio-mixer/CMakeLists.txt b/audio-mixer/CMakeLists.txt index 0eb0dab782..1e6637aeb2 100644 --- a/audio-mixer/CMakeLists.txt +++ b/audio-mixer/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 2.8) -set(ROOT_DIR ../) +set(ROOT_DIR ..) set(MACRO_DIR ${ROOT_DIR}/cmake/macros) set(TARGET_NAME audio-mixer) diff --git a/audio-mixer/src/main.cpp b/audio-mixer/src/main.cpp index 9f77bbc9bb..0d571d1c74 100644 --- a/audio-mixer/src/main.cpp +++ b/audio-mixer/src/main.cpp @@ -309,7 +309,7 @@ int main(int argc, const char * argv[]) agentList->increaseAgentId(); } - agentList->updateAgentWithData(agentAddress, (void *)packetData, receivedBytes); + agentList->updateAgentWithData(agentAddress, packetData, receivedBytes); } else { memcpy(loopbackAudioPacket, packetData + 1 + (sizeof(float) * 4), 1024); agentList->getAgentSocket().send(agentAddress, loopbackAudioPacket, 1024); diff --git a/avatar-mixer/CMakeLists.txt b/avatar-mixer/CMakeLists.txt index c3251fe513..da25b6e981 100644 --- a/avatar-mixer/CMakeLists.txt +++ b/avatar-mixer/CMakeLists.txt @@ -2,17 +2,21 @@ cmake_minimum_required(VERSION 2.8) set(TARGET_NAME "avatar-mixer") -set(ROOT_DIR ../) +set(ROOT_DIR ..) set(MACRO_DIR ${ROOT_DIR}/cmake/macros) +# setup for find modules +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/modules/") + # setup the project include(${MACRO_DIR}/SetupHifiProject.cmake) setup_hifi_project(${TARGET_NAME}) -# link the shared hifi library +# include glm +include(${MACRO_DIR}/IncludeGLM.cmake) +include_glm(${TARGET_NAME} ${ROOT_DIR}) + +# link required hifi libraries include(${MACRO_DIR}/LinkHifiLibrary.cmake) link_hifi_library(shared ${TARGET_NAME} ${ROOT_DIR}) - -# link the threads library -find_package(Threads REQUIRED) -target_link_libraries(${TARGET_NAME} ${CMAKE_THREAD_LIBS_INIT}) +link_hifi_library(avatars ${TARGET_NAME} ${ROOT_DIR}) \ No newline at end of file diff --git a/avatar-mixer/src/AvatarAgentData.cpp b/avatar-mixer/src/AvatarAgentData.cpp deleted file mode 100644 index 0ee5981c53..0000000000 --- a/avatar-mixer/src/AvatarAgentData.cpp +++ /dev/null @@ -1,118 +0,0 @@ -// -// AvatarAgentData.cpp -// hifi -// -// Created by Stephen Birarda on 4/9/13. -// -// - -#include - -#include "AvatarAgentData.h" - -AvatarAgentData::AvatarAgentData() { - -} - -AvatarAgentData::~AvatarAgentData() { - -} - -AvatarAgentData* AvatarAgentData::clone() const { - return new AvatarAgentData(*this); -} - -void AvatarAgentData::parseData(void *data, int size) { - char* packetData = (char *)data + 1; - - // Extract data from packet - sscanf(packetData, - PACKET_FORMAT, - &_pitch, - &_yaw, - &_roll, - &_headPositionX, - &_headPositionY, - &_headPositionZ, - &_loudness, - &_averageLoudness, - &_handPositionX, - &_handPositionY, - &_handPositionZ); -} - -float AvatarAgentData::getPitch() { - return _pitch; -} - -float AvatarAgentData::getYaw() { - return _yaw; -} - -float AvatarAgentData::getRoll() { - return _roll; -} - -float AvatarAgentData::getHeadPositionX() { - return _headPositionX; -} - -float AvatarAgentData::getHeadPositionY() { - return _headPositionY; -} - -float AvatarAgentData::getHeadPositionZ() { - return _headPositionZ; -} - -float AvatarAgentData::getLoudness() { - return _loudness; -} - -float AvatarAgentData::getAverageLoudness() { - return _averageLoudness; -} - -float AvatarAgentData::getHandPositionX() { - return _handPositionX; -} - -float AvatarAgentData::getHandPositionY() { - return _handPositionY; -} - -float AvatarAgentData::getHandPositionZ() { - return _handPositionZ; -} - -void AvatarAgentData::setPitch(float pitch) { - _pitch = pitch; -} - -void AvatarAgentData::setYaw(float yaw) { - _yaw = yaw; -} - -void AvatarAgentData::setRoll(float roll) { - _roll = roll; -} - -void AvatarAgentData::setHeadPosition(float x, float y, float z) { - _headPositionX = x; - _headPositionY = y; - _headPositionZ = z; -} - -void AvatarAgentData::setLoudness(float loudness) { - _loudness = loudness; -} - -void AvatarAgentData::setAverageLoudness(float averageLoudness) { - _averageLoudness = averageLoudness; -} - -void AvatarAgentData::setHandPosition(float x, float y, float z) { - _handPositionX = x; - _handPositionY = y; - _handPositionZ = z; -} diff --git a/avatar-mixer/src/AvatarAgentData.h b/avatar-mixer/src/AvatarAgentData.h deleted file mode 100644 index 2b06928886..0000000000 --- a/avatar-mixer/src/AvatarAgentData.h +++ /dev/null @@ -1,58 +0,0 @@ -// -// AvatarAgentData.h -// hifi -// -// Created by Stephen Birarda on 4/9/13. -// -// - -#ifndef __hifi__AvatarAgentData__ -#define __hifi__AvatarAgentData__ - -#include -#include - -const char PACKET_FORMAT[] = "%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f"; - -class AvatarAgentData : public AgentData { -public: - AvatarAgentData(); - ~AvatarAgentData(); - - void parseData(void *data, int size); - AvatarAgentData* clone() const; - - float getPitch(); - void setPitch(float pitch); - float getYaw(); - void setYaw(float yaw); - float getRoll(); - void setRoll(float roll); - float getHeadPositionX(); - float getHeadPositionY(); - float getHeadPositionZ(); - void setHeadPosition(float x, float y, float z); - float getLoudness(); - void setLoudness(float loudness); - float getAverageLoudness(); - void setAverageLoudness(float averageLoudness); - float getHandPositionX(); - float getHandPositionY(); - float getHandPositionZ(); - void setHandPosition(float x, float y, float z); - -private: - float _pitch; - float _yaw; - float _roll; - float _headPositionX; - float _headPositionY; - float _headPositionZ; - float _loudness; - float _averageLoudness; - float _handPositionX; - float _handPositionY; - float _handPositionZ; -}; - -#endif /* defined(__hifi__AvatarAgentData__) */ diff --git a/avatar-mixer/src/main.cpp b/avatar-mixer/src/main.cpp index 8aa57c0ad4..1d446f40f4 100644 --- a/avatar-mixer/src/main.cpp +++ b/avatar-mixer/src/main.cpp @@ -32,37 +32,22 @@ #include #include -#include "AvatarAgentData.h" +#include "AvatarData.h" const int AVATAR_LISTEN_PORT = 55444; -const unsigned short BROADCAST_INTERVAL_USECS = 20 * 1000 * 1000; unsigned char *addAgentToBroadcastPacket(unsigned char *currentPosition, Agent *agentToAdd) { currentPosition += packAgentId(currentPosition, agentToAdd->getAgentId()); - AvatarAgentData *agentData = (AvatarAgentData *)agentToAdd->getLinkedData(); + AvatarData *agentData = (AvatarData *)agentToAdd->getLinkedData(); + currentPosition += agentData->getBroadcastData(currentPosition); - int bytesWritten = sprintf((char *)currentPosition, - PACKET_FORMAT, - agentData->getPitch(), - agentData->getYaw(), - agentData->getRoll(), - agentData->getHeadPositionX(), - agentData->getHeadPositionY(), - agentData->getHeadPositionZ(), - agentData->getLoudness(), - agentData->getAverageLoudness(), - agentData->getHandPositionX(), - agentData->getHandPositionY(), - agentData->getHandPositionZ()); - - currentPosition += bytesWritten; return currentPosition; } void attachAvatarDataToAgent(Agent *newAgent) { if (newAgent->getLinkedData() == NULL) { - newAgent->setLinkedData(new AvatarAgentData()); + newAgent->setLinkedData(new AvatarData()); } } @@ -78,7 +63,7 @@ int main(int argc, char* argv[]) agentList->startPingUnknownAgentsThread(); sockaddr *agentAddress = new sockaddr; - char *packetData = new char[MAX_PACKET_SIZE]; + unsigned char *packetData = new unsigned char[MAX_PACKET_SIZE]; ssize_t receivedBytes = 0; unsigned char *broadcastPacket = new unsigned char[MAX_PACKET_SIZE]; @@ -92,7 +77,7 @@ int main(int argc, char* argv[]) switch (packetData[0]) { case PACKET_HEADER_HEAD_DATA: // this is positional data from an agent - agentList->updateAgentWithData(agentAddress, (void *)packetData, receivedBytes); + agentList->updateAgentWithData(agentAddress, packetData, receivedBytes); currentBufferPosition = broadcastPacket + 1; agentIndex = 0; @@ -116,7 +101,7 @@ int main(int argc, char* argv[]) break; default: // hand this off to the AgentList - agentList->processAgentData(agentAddress, (void *)packetData, receivedBytes); + agentList->processAgentData(agentAddress, packetData, receivedBytes); break; } } diff --git a/cmake/macros/IncludeGLM.cmake b/cmake/macros/IncludeGLM.cmake index f77ad9e06d..c5530bf8c9 100644 --- a/cmake/macros/IncludeGLM.cmake +++ b/cmake/macros/IncludeGLM.cmake @@ -1,5 +1,5 @@ -MACRO(INCLUDE_GLM TARGET MACRO_DIR) - set(GLM_ROOT_DIR ${MACRO_DIR}/../../externals) +MACRO(INCLUDE_GLM TARGET ROOT_DIR) + set(GLM_ROOT_DIR ${ROOT_DIR}/externals) find_package(GLM REQUIRED) include_directories(${GLM_INCLUDE_DIRS}) -ENDMACRO(INCLUDE_GLM _target _macro_dir) \ No newline at end of file +ENDMACRO(INCLUDE_GLM _target _root_dir) \ No newline at end of file diff --git a/cmake/macros/LinkHifiLibrary.cmake b/cmake/macros/LinkHifiLibrary.cmake index 6aaf784437..6a4122d583 100644 --- a/cmake/macros/LinkHifiLibrary.cmake +++ b/cmake/macros/LinkHifiLibrary.cmake @@ -3,12 +3,6 @@ MACRO(LINK_HIFI_LIBRARY LIBRARY TARGET ROOT_DIR) add_subdirectory(${ROOT_DIR}/libraries/${LIBRARY} ${ROOT_DIR}/libraries/${LIBRARY}) endif (NOT TARGET ${LIBRARY}) - string(TOUPPER ${LIBRARY} UPPERCASED_LIBRARY_NAME) - set(HIFI_LIBRARY_PROPERTY "HIFI_${UPPERCASED_LIBRARY_NAME}_LIBRARY") - get_directory_property(HIFI_LIBRARY - DIRECTORY ${ROOT_DIR}/libraries/${LIBRARY} - DEFINITION ${HIFI_LIBRARY_PROPERTY}) - include_directories(${ROOT_DIR}/libraries/${LIBRARY}/src) add_dependencies(${TARGET} ${LIBRARY}) diff --git a/cmake/macros/SetupHifiLibrary.cmake b/cmake/macros/SetupHifiLibrary.cmake new file mode 100644 index 0000000000..156ca186b2 --- /dev/null +++ b/cmake/macros/SetupHifiLibrary.cmake @@ -0,0 +1,9 @@ +MACRO(SETUP_HIFI_LIBRARY TARGET) + project(${TARGET_NAME}) + + # grab the implemenation and header files + file(GLOB LIB_SRCS src/*.h src/*.cpp) + + # create a library and set the property so it can be referenced later + add_library(${TARGET_NAME} ${LIB_SRCS}) +ENDMACRO(SETUP_HIFI_LIBRARY _target) \ No newline at end of file diff --git a/domain-server/CMakeLists.txt b/domain-server/CMakeLists.txt index 2752e514ad..27863f01df 100644 --- a/domain-server/CMakeLists.txt +++ b/domain-server/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 2.8) -set(ROOT_DIR ../) +set(ROOT_DIR ..) set(MACRO_DIR ${ROOT_DIR}/cmake/macros) set(TARGET_NAME domain-server) diff --git a/injector/CMakeLists.txt b/injector/CMakeLists.txt index d8a448b7bc..6e3e61326c 100644 --- a/injector/CMakeLists.txt +++ b/injector/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 2.8) -set(ROOT_DIR ../) +set(ROOT_DIR ..) set(MACRO_DIR ${ROOT_DIR}/cmake/macros) set(TARGET_NAME injector) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index 257e88a571..de9b31c9df 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 2.8) -set(ROOT_DIR ../) +set(ROOT_DIR ..) set(MACRO_DIR ${ROOT_DIR}/cmake/macros) set(TARGET_NAME interface) @@ -26,7 +26,7 @@ endif (WIN32) # set up the external glm library include(${MACRO_DIR}/IncludeGLM.cmake) -include_glm(${TARGET_NAME} ${MACRO_DIR}) +include_glm(${TARGET_NAME} ${ROOT_DIR}) # create the InterfaceConfig.h file based on GL_HEADERS above configure_file(InterfaceConfig.h.in ${PROJECT_BINARY_DIR}/includes/InterfaceConfig.h) @@ -56,10 +56,11 @@ add_executable(${TARGET_NAME} MACOSX_BUNDLE ${INTERFACE_SRCS}) # link in the hifi shared library include(${MACRO_DIR}/LinkHifiLibrary.cmake) -link_hifi_library(shared ${TARGET_NAME} ${ROOT_DIR}) -# link in the hifi voxels library +# link required hifi libraries +link_hifi_library(shared ${TARGET_NAME} ${ROOT_DIR}) link_hifi_library(voxels ${TARGET_NAME} ${ROOT_DIR}) +link_hifi_library(avatars ${TARGET_NAME} ${ROOT_DIR}) # find required libraries find_package(GLM REQUIRED) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index db69dcb380..578e1368c8 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -156,7 +156,7 @@ int audioCallback (const void *inputBuffer, // memcpy the three float positions for (int p = 0; p < 3; p++) { - memcpy(currentPacketPtr, &data->linkedHead->getPos()[p], sizeof(float)); + memcpy(currentPacketPtr, &data->linkedHead->getBodyPosition()[p], sizeof(float)); currentPacketPtr += sizeof(float); } @@ -411,7 +411,7 @@ void *receiveAudioViaUDP(void *args) { } if (packetsReceivedThisPlayback == 1) gettimeofday(&firstPlaybackTimer, NULL); - ringBuffer->parseData(receivedData, PACKET_LENGTH_BYTES); + ringBuffer->parseData((unsigned char *)receivedData, PACKET_LENGTH_BYTES); previousReceiveTime = currentReceiveTime; } diff --git a/interface/src/Camera.cpp b/interface/src/Camera.cpp old mode 100755 new mode 100644 index 3d43391f96..a718c8a137 --- a/interface/src/Camera.cpp +++ b/interface/src/Camera.cpp @@ -5,8 +5,9 @@ // //--------------------------------------------------------------------- +#include + #include "Camera.h" -#include "Util.h" diff --git a/interface/src/Camera.h b/interface/src/Camera.h old mode 100755 new mode 100644 diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index 3b048fd7e9..45437e449d 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -17,6 +17,7 @@ #include "Head.h" #include #include +#include using namespace std; @@ -44,9 +45,6 @@ vector iris_texture; unsigned int iris_texture_width = 512; unsigned int iris_texture_height = 256; - - - Head::Head() { initializeAvatar(); @@ -124,8 +122,6 @@ Head::Head() { Head::Head(const Head &otherHead) { initializeAvatar(); - bodyPosition = otherHead.bodyPosition; - for (int i = 0; i < MAX_DRIVE_KEYS; i++) driveKeys[i] = otherHead.driveKeys[i]; PupilSize = otherHead.PupilSize; @@ -380,12 +376,12 @@ void Head::simulate(float deltaTime) { //---------------------------------------------------------- // update body yaw by body yaw delta //---------------------------------------------------------- - bodyYaw += bodyYawDelta * deltaTime; + _bodyYaw += bodyYawDelta * deltaTime; //---------------------------------------------------------- // (for now) set head yaw to body yaw //---------------------------------------------------------- - Yaw = bodyYaw; + Yaw = _bodyYaw; //---------------------------------------------------------- // decay body yaw delta @@ -401,7 +397,7 @@ void Head::simulate(float deltaTime) { //---------------------------------------------------------- // update position by velocity //---------------------------------------------------------- - bodyPosition += (glm::vec3)avatar.velocity * deltaTime; + _bodyPosition += (glm::vec3)avatar.velocity * deltaTime; //---------------------------------------------------------- // decay velocity @@ -514,7 +510,7 @@ void Head::render(int faceToFace, int isMine) { // show avatar position //--------------------------------------------------- glPushMatrix(); - glTranslatef( bodyPosition.x, bodyPosition.y, bodyPosition.z ); + glTranslatef(_bodyPosition.x, _bodyPosition.y, _bodyPosition.z); glScalef( 0.03, 0.03, 0.03 ); glutSolidSphere( 1, 10, 10 ); glPopMatrix(); @@ -618,7 +614,7 @@ void Head::renderHead( int faceToFace, int isMine ) { glScalef( 0.03, 0.03, 0.03 ); - glRotatef( bodyYaw, 0, 1, 0); + glRotatef(_bodyYaw, 0, 1, 0); // Don't render a head if it is really close to your location, because that is your own head! @@ -776,9 +772,9 @@ void Head::initializeAvatar() { closestOtherAvatar = 0; - bodyYaw = -90.0; - bodyPitch = 0.0; - bodyRoll = 0.0; + _bodyYaw = -90.0; + _bodyPitch = 0.0; + _bodyRoll = 0.0; bodyYawDelta = 0.0; @@ -899,24 +895,20 @@ void Head::updateAvatarSkeleton() { // rotate body... //---------------------------------- avatar.orientation.setToIdentity(); - avatar.orientation.yaw( bodyYaw ); + avatar.orientation.yaw( _bodyYaw ); //------------------------------------------------------------------------ // calculate positions of all bones by traversing the skeleton tree: //------------------------------------------------------------------------ for (int b=0; bgetPos().x, hand->getPos().y, hand->getPos().z); //previous to Ventrella change - bone[ AVATAR_BONE_RIGHT_HAND ].position.x, - bone[ AVATAR_BONE_RIGHT_HAND ].position.y, - bone[ AVATAR_BONE_RIGHT_HAND ].position.z ); - return strlen(data); -} - - -//called on the other agents - assigns it to my views of the others -void Head::parseData(void *data, int size) { - sscanf - ( - (char *)data, "H%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f", - &Pitch, &Yaw, &Roll, - //&avatar.yaw, &avatar.pitch, &avatar.roll, - &bodyPosition.x, &bodyPosition.y, &bodyPosition.z, - &loudness, &averageLoudness, - &bone[ AVATAR_BONE_RIGHT_HAND ].position.x, - &bone[ AVATAR_BONE_RIGHT_HAND ].position.y, - &bone[ AVATAR_BONE_RIGHT_HAND ].position.z - ); - - handBeingMoved = true; -} - void Head::SetNewHeadTarget(float pitch, float yaw) { PitchTarget = pitch; YawTarget = yaw; } -void Head::processTransmitterData(char *packetData, int numBytes) { +void Head::processTransmitterData(unsigned char* packetData, int numBytes) { // Read a packet from a transmitter app, process the data float accX, accY, accZ, graX, graY, graZ, diff --git a/interface/src/Head.h b/interface/src/Head.h index 938d92884c..3978f369ab 100644 --- a/interface/src/Head.h +++ b/interface/src/Head.h @@ -10,10 +10,13 @@ #define __interface__head__ #include -#include "AgentData.h" + +#include +#include // added by Ventrella as a utility + #include "Field.h" #include "world.h" -#include "Orientation.h" // added by Ventrella as a utility + #include "InterfaceConfig.h" #include "SerialInterface.h" @@ -39,48 +42,6 @@ enum AvatarMode NUM_AVATAR_MODES }; - - -/* -enum AvatarJoints -{ - AVATAR_JOINT_NULL = -1, - AVATAR_JOINT_PELVIS, - AVATAR_JOINT_TORSO, - AVATAR_JOINT_CHEST, - AVATAR_JOINT_NECK_BASE, - AVATAR_JOINT_HEAD_BASE, - AVATAR_JOINT_HEAD_TOP, - - AVATAR_JOINT_LEFT_CLAVICLE, - AVATAR_JOINT_LEFT_SHOULDER, - AVATAR_JOINT_LEFT_ELBOW, - AVATAR_JOINT_LEFT_WRIST, - AVATAR_JOINT_LEFT_FINGERTIPS, - - AVATAR_JOINT_RIGHT_CLAVICLE, - AVATAR_JOINT_RIGHT_SHOULDER, - AVATAR_JOINT_RIGHT_ELBOW, - AVATAR_JOINT_RIGHT_WRIST, - AVATAR_JOINT_RIGHT_FINGERTIPS, - - AVATAR_JOINT_LEFT_HIP, - AVATAR_JOINT_LEFT_KNEE, - AVATAR_JOINT_LEFT_HEEL, - AVATAR_JOINT_LEFT_TOES, - - AVATAR_JOINT_RIGHT_HIP, - AVATAR_JOINT_RIGHT_KNEE, - AVATAR_JOINT_RIGHT_HEEL, - AVATAR_JOINT_RIGHT_TOES, - - NUM_AVATAR_JOINTS -}; -*/ - - - - enum AvatarBones { AVATAR_BONE_NULL = -1, @@ -107,7 +68,7 @@ enum AvatarBones AVATAR_BONE_RIGHT_THIGH, // connects right hip joint with right knee joint AVATAR_BONE_RIGHT_SHIN, // connects right knee joint with right heel joint AVATAR_BONE_RIGHT_FOOT, // connects right heel joint with right toes joint - + NUM_AVATAR_BONES }; @@ -134,7 +95,7 @@ struct Avatar Orientation orientation; }; -class Head : public AgentData { +class Head : public AvatarData { public: Head(); ~Head(); @@ -170,9 +131,7 @@ class Head : public AgentData { glm::vec3 getHeadLookatDirectionUp(); glm::vec3 getHeadLookatDirectionRight(); glm::vec3 getHeadPosition(); - glm::vec3 getBonePosition( AvatarBones b ); - glm::vec3 getBodyPosition(); - + glm::vec3 getBonePosition( AvatarBones b ); AvatarMode getMode(); @@ -189,18 +148,12 @@ class Head : public AgentData { void setHandMovement( glm::vec3 movement ); void updateHandMovement(); - // Send and receive network data - int getBroadcastData(char * data); - void parseData(void *data, int size); - float getLoudness() {return loudness;}; float getAverageLoudness() {return averageLoudness;}; void setAverageLoudness(float al) {averageLoudness = al;}; void setLoudness(float l) {loudness = l;}; void SetNewHeadTarget(float, float); - glm::vec3 getPos() { return bodyPosition; }; - void setPos(glm::vec3 newpos) { bodyPosition = newpos; }; // Set what driving keys are being pressed to control thrust levels void setDriveKeys(int key, bool val) { driveKeys[key] = val; }; @@ -215,7 +168,7 @@ class Head : public AgentData { // Related to getting transmitter UDP data used to animate the avatar hand // - void processTransmitterData(char * packetData, int numBytes); + void processTransmitterData(unsigned char * packetData, int numBytes); float getTransmitterHz() { return transmitterHz; }; private: @@ -252,14 +205,9 @@ class Head : public AgentData { float averageLoudness; float audioAttack; float browAudioLift; - - glm::vec3 bodyPosition; bool triggeringAction; - - float bodyYaw; - float bodyPitch; - float bodyRoll; + float bodyYawDelta; float closeEnoughToInteract; diff --git a/interface/src/OGlProgram.h b/interface/src/OGlProgram.h index 06e684d2b3..23d42b0f35 100644 --- a/interface/src/OGlProgram.h +++ b/interface/src/OGlProgram.h @@ -60,8 +60,10 @@ public: */ void activate() const { - if (_hndProg != 0u) + if (_hndProg != 0u) { + oGlLog( glUseProgram(_hndProg) ); + } } /** @@ -77,16 +79,20 @@ public: */ bool addShader(GLenum type, GLsizei nStrings, GLchar const** strings) { - if (! _hndProg) { _hndProg = glCreateProgram(); } + if (! _hndProg && !! glCreateProgram) { + + _hndProg = glCreateProgram(); + } + if (! _hndProg) { return false; } GLuint s = glCreateShader(type); glShaderSource(s, nStrings, strings, 0l); glCompileShader(s); GLint status; glGetShaderiv(s, GL_COMPILE_STATUS, & status); - if (!! status) + if (status != 0) glAttachShader(_hndProg, s); -#ifdef NDEBUG +#ifdef NDEBUG // always fetch log in debug mode else #endif fetchLog(s, glGetShaderiv, glGetShaderInfoLog); @@ -104,12 +110,21 @@ public: glLinkProgram(_hndProg); GLint status; glGetProgramiv(_hndProg, GL_LINK_STATUS, & status); -#ifdef NDEBUG - if (status == 0) +#ifndef NDEBUG // always fetch log in debug mode + fetchLog(_hndProg, glGetProgramiv, glGetProgramInfoLog); #endif + if (status == 0) { +#ifdef NDEBUG // only on error in release mode fetchLog(_hndProg, glGetProgramiv, glGetProgramInfoLog); +#endif + glDeleteProgram(_hndProg); + _hndProg = 0u; + return false; - return status != 0; + } else { + + return true; + } } private: diff --git a/interface/src/Util.cpp b/interface/src/Util.cpp index 637204dc83..f9dc085793 100644 --- a/interface/src/Util.cpp +++ b/interface/src/Util.cpp @@ -8,8 +8,11 @@ #include "InterfaceConfig.h" #include -#include #include + +#include +#include + #include "world.h" #include "Util.h" diff --git a/interface/src/Util.h b/interface/src/Util.h index 4d74e077fa..13b2810092 100644 --- a/interface/src/Util.h +++ b/interface/src/Util.h @@ -17,21 +17,6 @@ #include -static const float ZERO = 0.0; -static const float ONE = 1.0; -static const float ONE_HALF = 0.5; -static const double ONE_THIRD = 0.3333333; -static const double PIE = 3.14159265359; -static const double PI_TIMES_TWO = 3.14159265359 * 2.0; -static const double PI_OVER_180 = 3.14159265359 / 180.0; -static const double EPSILON = 0.00001; //smallish number - used as margin of error for some computations -static const double SQUARE_ROOT_OF_2 = sqrt(2); -static const double SQUARE_ROOT_OF_3 = sqrt(3); -static const float METER = 1.0; -static const float DECIMETER = 0.1; -static const float CENTIMETER = 0.01; -static const float MILLIIMETER = 0.001; - float azimuth_to(glm::vec3 head_pos, glm::vec3 source_pos); float angle_to(glm::vec3 head_pos, glm::vec3 source_pos, float render_yaw, float head_yaw); diff --git a/interface/src/VoxelSystem.cpp b/interface/src/VoxelSystem.cpp index d9df0fd0d8..ba12218f45 100644 --- a/interface/src/VoxelSystem.cpp +++ b/interface/src/VoxelSystem.cpp @@ -112,33 +112,33 @@ long int VoxelSystem::getVoxelsBytesReadRunningAverage() { } -void VoxelSystem::parseData(void *data, int size) { +void VoxelSystem::parseData(unsigned char* sourceBuffer, int numBytes) { - unsigned char command = *(unsigned char*)data; - unsigned char *voxelData = (unsigned char *) data + 1; + unsigned char command = *sourceBuffer; + unsigned char *voxelData = sourceBuffer + 1; switch(command) { case PACKET_HEADER_VOXEL_DATA: // ask the VoxelTree to read the bitstream into the tree - tree->readBitstreamToTree(voxelData, size - 1); + tree->readBitstreamToTree(voxelData, numBytes - 1); break; case PACKET_HEADER_ERASE_VOXEL: // ask the tree to read the "remove" bitstream - tree->processRemoveVoxelBitstream((unsigned char*)data,size); + tree->processRemoveVoxelBitstream(sourceBuffer, numBytes); break; case PACKET_HEADER_Z_COMMAND: // the Z command is a special command that allows the sender to send high level semantic // requests, like erase all, or add sphere scene, different receivers may handle these // messages differently - char* packetData =(char*)data; + char* packetData = (char *)sourceBuffer; char* command = &packetData[1]; // start of the command int commandLength = strlen(command); // commands are null terminated strings int totalLength = 1+commandLength+1; - printf("got Z message len(%d)= %s\n",size,command); + printf("got Z message len(%d)= %s\n", numBytes, command); - while (totalLength <= size) { + while (totalLength <= numBytes) { if (0==strcmp(command,(char*)"erase all")) { printf("got Z message == erase all\n"); tree->eraseAllVoxels(); @@ -184,7 +184,7 @@ int VoxelSystem::treeToArrays(VoxelNode *currentNode, float nodePosition[3]) { int voxelsAdded = 0; float halfUnitForVoxel = powf(0.5, *currentNode->octalCode) * (0.5 * TREE_SCALE); - glm::vec3 viewerPosition = viewerHead->getPos(); + glm::vec3 viewerPosition = viewerHead->getBodyPosition(); // XXXBHG - Note: It appears as if the X and Z coordinates of Head or Agent are flip-flopped relative to the // coords of the voxel space. This flip flop causes LOD behavior to be extremely odd. This is my temporary hack diff --git a/interface/src/VoxelSystem.h b/interface/src/VoxelSystem.h index f49b57d612..a8bfd376c5 100644 --- a/interface/src/VoxelSystem.h +++ b/interface/src/VoxelSystem.h @@ -26,7 +26,7 @@ public: VoxelSystem(); ~VoxelSystem(); - void parseData(void *data, int size); + void parseData(unsigned char* sourceBuffer, int numBytes); VoxelSystem* clone() const; void init(); diff --git a/interface/src/main.cpp b/interface/src/main.cpp index e146d84a1e..665982de23 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -228,7 +228,7 @@ void displayStats(void) char legend2[] = "* - toggle stars, & - toggle paint mode, '-' - send erase all, '%' - send add scene"; drawtext(10, statsVerticalOffset + 32, 0.10f, 0, 1.0, 0, legend2); - glm::vec3 avatarPos = myAvatar.getPos(); + glm::vec3 avatarPos = myAvatar.getBodyPosition(); char stats[200]; sprintf(stats, "FPS = %3.0f Pkts/s = %d Bytes/s = %d Head(x,y,z)= %4.2f, %4.2f, %4.2f ", @@ -309,7 +309,7 @@ void init(void) if (noiseOn) { myAvatar.setNoise(noise); } - myAvatar.setPos(start_location ); + myAvatar.setBodyPosition(start_location); myCamera.setPosition( start_location ); @@ -351,7 +351,7 @@ void reset_sensors() renderYawRate = 0; renderPitchRate = 0; - myAvatar.setPos(start_location); + myAvatar.setBodyPosition(start_location); headMouseX = WIDTH/2; headMouseY = HEIGHT/2; @@ -449,8 +449,10 @@ void updateAvatar(float frametime) #endif // Send my stream of head/hand data to the avatar mixer and voxel server - char broadcastString[200]; - int broadcastBytes = myAvatar.getBroadcastData(broadcastString); + unsigned char broadcastString[200]; + *broadcastString = PACKET_HEADER_HEAD_DATA; + + int broadcastBytes = myAvatar.getBroadcastData(broadcastString + 1); const char broadcastReceivers[2] = {AGENT_TYPE_VOXEL, AGENT_TYPE_AVATAR_MIXER}; AgentList::getInstance()->broadcastToAgents(broadcastString, broadcastBytes, broadcastReceivers, 2); @@ -458,7 +460,7 @@ void updateAvatar(float frametime) // If I'm in paint mode, send a voxel out to VOXEL server agents. if (::paintOn) { - glm::vec3 avatarPos = myAvatar.getPos(); + glm::vec3 avatarPos = myAvatar.getBodyPosition(); // For some reason, we don't want to flip X and Z here. ::paintingVoxel.x = avatarPos.x/10.0; @@ -473,7 +475,7 @@ void updateAvatar(float frametime) ::paintingVoxel.z >= 0.0 && ::paintingVoxel.z <= 1.0) { if (createVoxelEditMessage(PACKET_HEADER_SET_VOXEL, 0, 1, &::paintingVoxel, bufferOut, sizeOut)){ - AgentList::getInstance()->broadcastToAgents((char*)bufferOut, sizeOut, &AGENT_TYPE_VOXEL, 1); + AgentList::getInstance()->broadcastToAgents(bufferOut, sizeOut, &AGENT_TYPE_VOXEL, 1); delete bufferOut; } } @@ -700,11 +702,13 @@ void display(void) //-------------------------------------------------------- // camera settings //-------------------------------------------------------- + myCamera.setTargetPosition( myAvatar.getBodyPosition() ); + if ( displayHead ) { //----------------------------------------------- // set the camera to looking at my own face //----------------------------------------------- - myCamera.setTargetPosition ( myAvatar.getPos() ); + myCamera.setTargetPosition ( myAvatar.getBodyPosition() ); myCamera.setYaw ( - myAvatar.getBodyYaw() ); myCamera.setPitch ( 0.0 ); myCamera.setRoll ( 0.0 ); @@ -716,7 +720,7 @@ void display(void) //---------------------------------------------------- // set the camera to third-person view behind my av //---------------------------------------------------- - myCamera.setTargetPosition ( myAvatar.getPos() ); + myCamera.setTargetPosition ( myAvatar.getBodyPosition() ); myCamera.setYaw ( 180.0 - myAvatar.getBodyYaw() ); myCamera.setPitch ( 0.0 ); // temporarily, this must be 0.0 or else bad juju myCamera.setRoll ( 0.0 ); @@ -815,7 +819,7 @@ void display(void) if (agent->getLinkedData() != NULL) { Head *agentHead = (Head *)agent->getLinkedData(); glPushMatrix(); - glm::vec3 pos = agentHead->getPos(); + glm::vec3 pos = agentHead->getBodyPosition(); glTranslatef(-pos.x, -pos.y, -pos.z); agentHead->render(0, 0); glPopMatrix(); @@ -905,9 +909,11 @@ void display(void) // If application has just started, report time from startup to now (first frame display) if (justStarted) { - printf("Startup Time: %4.2f\n", - (usecTimestampNow() - usecTimestamp(&applicationStartupTime))/1000000.0); + float startupTime = (usecTimestampNow() - usecTimestamp(&applicationStartupTime))/1000000.0; justStarted = false; + char title[30]; + snprintf(title, 30, "Interface: %4.2f seconds", startupTime); + glutSetWindowTitle(title); } } @@ -1087,14 +1093,14 @@ void sendVoxelServerEraseAll() { char message[100]; sprintf(message,"%c%s",'Z',"erase all"); int messageSize = strlen(message) + 1; - AgentList::getInstance()->broadcastToAgents(message, messageSize, &AGENT_TYPE_VOXEL, 1); -} + AgentList::getInstance()->broadcastToAgents((unsigned char*) message, messageSize, &AGENT_TYPE_VOXEL, 1); +}\ void sendVoxelServerAddScene() { char message[100]; sprintf(message,"%c%s",'Z',"add scene"); int messageSize = strlen(message) + 1; - AgentList::getInstance()->broadcastToAgents(message, messageSize, &AGENT_TYPE_VOXEL, 1); + AgentList::getInstance()->broadcastToAgents((unsigned char*)message, messageSize, &AGENT_TYPE_VOXEL, 1); } void shiftPaintingColor() @@ -1107,7 +1113,7 @@ void shiftPaintingColor() } void setupPaintingVoxel() { - glm::vec3 avatarPos = myAvatar.getPos(); + glm::vec3 avatarPos = myAvatar.getBodyPosition(); ::paintingVoxel.x = avatarPos.z/-10.0; // voxel space x is negative z head space ::paintingVoxel.y = avatarPos.y/-10.0; // voxel space y is negative y head space @@ -1280,7 +1286,7 @@ void *networkReceive(void *args) { sockaddr senderAddress; ssize_t bytesReceived; - char *incomingPacket = new char[MAX_PACKET_SIZE]; + unsigned char *incomingPacket = new unsigned char[MAX_PACKET_SIZE]; while (!stopNetworkReceiveThread) { if (AgentList::getInstance()->getAgentSocket().receive(&senderAddress, incomingPacket, &bytesReceived)) { @@ -1525,6 +1531,9 @@ int main(int argc, const char * argv[]) AgentList::getInstance()->startPingUnknownAgentsThread(); glutInit(&argc, (char**)argv); + WIDTH = glutGet(GLUT_SCREEN_WIDTH); + HEIGHT = glutGet(GLUT_SCREEN_HEIGHT); + glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(WIDTH, HEIGHT); glutCreateWindow("Interface"); diff --git a/interface/src/starfield/Config.h b/interface/src/starfield/Config.h index 7e9b816838..001af23a5f 100644 --- a/interface/src/starfield/Config.h +++ b/interface/src/starfield/Config.h @@ -67,7 +67,7 @@ #include #include "UrlReader.h" -#include "AngleUtils.h" +#include "AngleUtil.h" #include "Radix2InplaceSort.h" #include "Radix2IntegerScanner.h" #include "FloodFill.h" diff --git a/interface/src/starfield/Controller.h b/interface/src/starfield/Controller.h index edf9fd7ec7..329119bbc4 100644 --- a/interface/src/starfield/Controller.h +++ b/interface/src/starfield/Controller.h @@ -72,16 +72,17 @@ namespace starfield { size_t _valLodNalloc; size_t _valLodNrender; BrightnessLevels _seqLodBrightness; - BrightnessLevel _valLodAllocBrightness; #if STARFIELD_MULTITHREADING atomic _valLodBrightness; + BrightnessLevel _valLodAllocBrightness; atomic _ptrRenderer; typedef lock_guard lock; #else BrightnessLevel _valLodBrightness; + BrightnessLevel _valLodAllocBrightness; Renderer* _ptrRenderer; @@ -89,6 +90,10 @@ namespace starfield { #define _(x) #endif + static inline size_t toBufSize(double f) { + return size_t(floor(f + 0.5f)); + } + public: Controller() : @@ -99,8 +104,8 @@ namespace starfield { _valLodOveralloc(1.2), _valLodNalloc(0), _valLodNrender(0), - _valLodAllocBrightness(0), _valLodBrightness(0), + _valLodAllocBrightness(0), _ptrRenderer(0l) { } @@ -144,8 +149,8 @@ namespace starfield { rcpChange = 1.0; - nRender = lrint(_valLodFraction * newLast); - n = min(newLast, size_t(lrint(_valLodOveralloc * nRender))); + nRender = toBufSize(_valLodFraction * newLast); + n = min(newLast, toBufSize(_valLodOveralloc * nRender)); } else { @@ -282,7 +287,7 @@ namespace starfield { // calculate allocation size and corresponding brightness // threshold double oaFract = std::min(fraction * (1.0 + overalloc), 1.0); - n = lrint(oaFract * last); + n = toBufSize(oaFract * last); bMin = _seqLodBrightness[n]; n = std::upper_bound( _seqLodBrightness.begin() + n - 1, @@ -290,7 +295,7 @@ namespace starfield { bMin, GreaterBrightness() ) - _seqLodBrightness.begin(); // also determine number of vertices to render and brightness - nRender = lrint(fraction * last); + nRender = toBufSize(fraction * last); // Note: nRender does not have to be accurate b = _seqLodBrightness[nRender]; // this setting controls the renderer, also keep b as the @@ -304,7 +309,7 @@ namespace starfield { // fprintf(stderr, "Stars.cpp: " // "fraction = %lf, oaFract = %lf, n = %d, n' = %d, bMin = %d, b = %d\n", -// fraction, oaFract, lrint(oaFract * last)), n, bMin, b); +// fraction, oaFract, toBufSize(oaFract * last)), n, bMin, b); // will not have to reallocate? set new fraction right away // (it is consistent with the rest of the state in this case) diff --git a/interface/src/starfield/Loader.h b/interface/src/starfield/Loader.h index bff41409a2..03dfd18a53 100644 --- a/interface/src/starfield/Loader.h +++ b/interface/src/starfield/Loader.h @@ -50,8 +50,8 @@ namespace starfield { return false; } - fprintf(stderr, "Stars.cpp: read %d stars, rendering %ld\n", - _valRecordsRead, _ptrVertices->size()); + fprintf(stderr, "Stars.cpp: read %u vertices, using %lu\n", + _valRecordsRead, _ptrVertices->size()); return true; } diff --git a/interface/src/starfield/data/InputVertex.h b/interface/src/starfield/data/InputVertex.h index 9f30755325..670056bd74 100644 --- a/interface/src/starfield/data/InputVertex.h +++ b/interface/src/starfield/data/InputVertex.h @@ -26,8 +26,8 @@ namespace starfield { InputVertex(float azimuth, float altitude, unsigned color) { - _valColor = (color >> 16 & 0xffu) | (color & 0xff00u) | - (color << 16 & 0xff0000u) | 0xff000000u; + _valColor = ((color >> 16) & 0xffu) | (color & 0xff00u) | + ((color << 16) & 0xff0000u) | 0xff000000u; azimuth = angleConvert(azimuth); altitude = angleConvert(altitude); diff --git a/interface/src/starfield/renderer/Tiling.h b/interface/src/starfield/renderer/Tiling.h index 802640b139..1df4dd1956 100644 --- a/interface/src/starfield/renderer/Tiling.h +++ b/interface/src/starfield/renderer/Tiling.h @@ -13,15 +13,8 @@ #error "This is an implementation file - not intended for direct inclusion." #endif -#ifdef _WIN32 -#include "../Config.h" -#define lrint(x) (floor(x + (x > 0) ? 0.5 : -0.5)) - inline float remainder(float x, float y) { return std::fmod(x, y); } - inline int round(float x) { return (floor(x + 0.5)); } - double log2( double n ) { return log( n ) / log( 2 ); } -#else #include "starfield/Config.h" -#endif + namespace starfield { class Tiling { @@ -35,7 +28,7 @@ namespace starfield { Tiling(unsigned k) : _valK(k), _valRcpSlice(k / Radians::twicePi()) { - _valBits = ceil(log2(getTileCount())); + _valBits = ceil(log(getTileCount()) * 1.4426950408889634); // log2 } unsigned getAzimuthalTiles() const { return _valK; } @@ -58,7 +51,7 @@ namespace starfield { private: unsigned discreteAngle(float unsigned_angle) const { - return unsigned(round(unsigned_angle * _valRcpSlice)); + return unsigned(floor(unsigned_angle * _valRcpSlice + 0.5f)); } unsigned discreteAzimuth(float a) const { diff --git a/libraries/avatars/CMakeLists.txt b/libraries/avatars/CMakeLists.txt new file mode 100644 index 0000000000..b1c593a4a6 --- /dev/null +++ b/libraries/avatars/CMakeLists.txt @@ -0,0 +1,18 @@ +cmake_minimum_required(VERSION 2.8) + +set(ROOT_DIR ../..) +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 avatars) + +include(${MACRO_DIR}/SetupHifiLibrary.cmake) +setup_hifi_library(${TARGET_NAME}) + +include(${MACRO_DIR}/IncludeGLM.cmake) +include_glm(${TARGET_NAME} ${ROOT_DIR}) + +include(${MACRO_DIR}/LinkHifiLibrary.cmake) +link_hifi_library(shared ${TARGET_NAME} ${ROOT_DIR}) \ No newline at end of file diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp new file mode 100644 index 0000000000..0bf9ddff74 --- /dev/null +++ b/libraries/avatars/src/AvatarData.cpp @@ -0,0 +1,112 @@ +// +// AvatarData.cpp +// hifi +// +// Created by Stephen Birarda on 4/9/13. +// +// + +#include +#include +#include + +#include + +#include "AvatarData.h" + +int packFloatAngleToTwoByte(unsigned char* buffer, float angle) { + const float ANGLE_CONVERSION_RATIO = (std::numeric_limits::max() / 360.0); + + uint16_t angleHolder = floorf((angle + 180) * ANGLE_CONVERSION_RATIO); + memcpy(buffer, &angleHolder, sizeof(uint16_t)); + + return sizeof(uint16_t); +} + +int unpackFloatAngleFromTwoByte(uint16_t *byteAnglePointer, float *destinationPointer) { + *destinationPointer = (*byteAnglePointer / std::numeric_limits::max()) * 360.0 - 180; + return sizeof(uint16_t); +} + +AvatarData::AvatarData() : + _bodyYaw(-90.0), + _bodyPitch(0.0), + _bodyRoll(0.0) { + +} + +AvatarData::~AvatarData() { + +} + +AvatarData* AvatarData::clone() const { + return new AvatarData(*this); +} + +// transmit data to agents requesting it +// called on me just prior to sending data to others (continuasly called) +int AvatarData::getBroadcastData(unsigned char* destinationBuffer) { + unsigned char* bufferStart = destinationBuffer; + + // TODO: DRY this up to a shared method + // that can pack any type given the number of bytes + // and return the number of bytes to push the pointer + memcpy(destinationBuffer, &_bodyPosition, sizeof(float) * 3); + destinationBuffer += sizeof(float) * 3; + + destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _bodyYaw); + destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _bodyPitch); + destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _bodyRoll); + + return destinationBuffer - bufferStart; +} + +// called on the other agents - assigns it to my views of the others +void AvatarData::parseData(unsigned char* sourceBuffer, int numBytes) { + + // increment to push past the packet header + sourceBuffer++; + + memcpy(&_bodyPosition, sourceBuffer, sizeof(float) * 3); + sourceBuffer += sizeof(float) * 3; + + sourceBuffer += unpackFloatAngleFromTwoByte((uint16_t *)sourceBuffer, &_bodyYaw); + sourceBuffer += unpackFloatAngleFromTwoByte((uint16_t *)sourceBuffer, &_bodyPitch); + sourceBuffer += unpackFloatAngleFromTwoByte((uint16_t *)sourceBuffer, &_bodyRoll); +} + +glm::vec3 AvatarData::getBodyPosition() { + return glm::vec3(_bodyPosition.x, + _bodyPosition.y, + _bodyPosition.z); +} + +void AvatarData::setBodyPosition(glm::vec3 bodyPosition) { + _bodyPosition = bodyPosition; +} + +float AvatarData::getBodyYaw() { + return _bodyYaw; +} + +void AvatarData::setBodyYaw(float bodyYaw) { + _bodyYaw = bodyYaw; +} + +float AvatarData::getBodyPitch() { + return _bodyPitch; +} + +void AvatarData::setBodyPitch(float bodyPitch) { + _bodyPitch = bodyPitch; +} + +float AvatarData::getBodyRoll() { + return _bodyRoll; +} + +void AvatarData::setBodyRoll(float bodyRoll) { + _bodyRoll = bodyRoll; +} + + diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h new file mode 100644 index 0000000000..5e7f52a04d --- /dev/null +++ b/libraries/avatars/src/AvatarData.h @@ -0,0 +1,48 @@ +// +// AvatarData.h +// hifi +// +// Created by Stephen Birarda on 4/9/13. +// +// + +#ifndef __hifi__AvatarData__ +#define __hifi__AvatarData__ + +#include + +#include + +#include + +class AvatarData : public AgentData { +public: + AvatarData(); + ~AvatarData(); + + AvatarData* clone() const; + + glm::vec3 getBodyPosition(); + void setBodyPosition(glm::vec3 bodyPosition); + + int getBroadcastData(unsigned char* destinationBuffer); + void parseData(unsigned char* sourceBuffer, int numBytes); + + float getBodyYaw(); + void setBodyYaw(float bodyYaw); + + float getBodyPitch(); + void setBodyPitch(float bodyPitch); + + float getBodyRoll(); + void setBodyRoll(float bodyRoll); + +protected: + glm::vec3 _bodyPosition; + + float _bodyYaw; + float _bodyPitch; + float _bodyRoll; +}; + +#endif /* defined(__hifi__AvatarData__) */ diff --git a/interface/src/Orientation.cpp b/libraries/avatars/src/Orientation.cpp similarity index 98% rename from interface/src/Orientation.cpp rename to libraries/avatars/src/Orientation.cpp index b42cba997c..ed1500a506 100755 --- a/interface/src/Orientation.cpp +++ b/libraries/avatars/src/Orientation.cpp @@ -6,8 +6,7 @@ //----------------------------------------------------------- #include "Orientation.h" -#include "Util.h" - +#include Orientation::Orientation() { right = glm::vec3( 1.0, 0.0, 0.0 ); diff --git a/interface/src/Orientation.h b/libraries/avatars/src/Orientation.h similarity index 100% rename from interface/src/Orientation.h rename to libraries/avatars/src/Orientation.h diff --git a/libraries/shared/src/AgentData.h b/libraries/shared/src/AgentData.h index 9db7535521..640798b52b 100644 --- a/libraries/shared/src/AgentData.h +++ b/libraries/shared/src/AgentData.h @@ -12,7 +12,7 @@ class AgentData { public: virtual ~AgentData() = 0; - virtual void parseData(void * data, int size) = 0; + virtual void parseData(unsigned char* sourceBuffer, int numBytes) = 0; virtual AgentData* clone() const = 0; }; diff --git a/libraries/shared/src/AgentList.cpp b/libraries/shared/src/AgentList.cpp index 4895e421cd..2751527d37 100644 --- a/libraries/shared/src/AgentList.cpp +++ b/libraries/shared/src/AgentList.cpp @@ -81,10 +81,10 @@ unsigned int AgentList::getSocketListenPort() { return socketListenPort; } -void AgentList::processAgentData(sockaddr *senderAddress, void *packetData, size_t dataBytes) { +void AgentList::processAgentData(sockaddr *senderAddress, unsigned char *packetData, size_t dataBytes) { switch (((char *)packetData)[0]) { case PACKET_HEADER_DOMAIN: { - updateList((unsigned char *)packetData, dataBytes); + updateList(packetData, dataBytes); break; } case PACKET_HEADER_PING: { @@ -98,7 +98,7 @@ void AgentList::processAgentData(sockaddr *senderAddress, void *packetData, size } } -void AgentList::processBulkAgentData(sockaddr *senderAddress, void *packetData, int numTotalBytes, int numBytesPerAgent) { +void AgentList::processBulkAgentData(sockaddr *senderAddress, unsigned char *packetData, int numTotalBytes, int numBytesPerAgent) { // find the avatar mixer in our agent list and update the lastRecvTime from it int bulkSendAgentIndex = indexOfMatchingAgent(senderAddress); @@ -120,6 +120,7 @@ void AgentList::processBulkAgentData(sockaddr *senderAddress, void *packetData, memcpy(packetHolder + 1, currentPosition, numBytesPerAgent); int matchingAgentIndex = indexOfMatchingAgent(agentID); + if (matchingAgentIndex >= 0) { updateAgentWithData(&agents[matchingAgentIndex], packetHolder, numBytesPerAgent + 1); } @@ -130,7 +131,7 @@ void AgentList::processBulkAgentData(sockaddr *senderAddress, void *packetData, delete[] packetHolder; } -void AgentList::updateAgentWithData(sockaddr *senderAddress, void *packetData, size_t dataBytes) { +void AgentList::updateAgentWithData(sockaddr *senderAddress, unsigned char *packetData, size_t dataBytes) { // find the agent by the sockaddr int agentIndex = indexOfMatchingAgent(senderAddress); @@ -139,7 +140,7 @@ void AgentList::updateAgentWithData(sockaddr *senderAddress, void *packetData, s } } -void AgentList::updateAgentWithData(Agent *agent, void *packetData, int dataBytes) { +void AgentList::updateAgentWithData(Agent *agent, unsigned char *packetData, int dataBytes) { agent->setLastRecvTimeUsecs(usecTimestampNow()); if (agent->getLinkedData() == NULL) { @@ -257,7 +258,7 @@ bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, } } -void AgentList::broadcastToAgents(char *broadcastData, size_t dataBytes, const char* agentTypes, int numAgentTypes) { +void AgentList::broadcastToAgents(unsigned char *broadcastData, size_t dataBytes, const char* agentTypes, int numAgentTypes) { for(std::vector::iterator agent = agents.begin(); agent != agents.end(); agent++) { // only send to the AgentTypes we are asked to send to. if (agent->getActiveSocket() != NULL && memchr(agentTypes, agent->getType(), numAgentTypes)) { diff --git a/libraries/shared/src/AgentList.h b/libraries/shared/src/AgentList.h index 454d02ea1a..e01147db9f 100644 --- a/libraries/shared/src/AgentList.h +++ b/libraries/shared/src/AgentList.h @@ -49,13 +49,13 @@ public: bool addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType, uint16_t agentId); - void processAgentData(sockaddr *senderAddress, void *packetData, size_t dataBytes); - void processBulkAgentData(sockaddr *senderAddress, void *packetData, int numTotalBytes, int numBytesPerAgent); + void processAgentData(sockaddr *senderAddress, unsigned char *packetData, size_t dataBytes); + void processBulkAgentData(sockaddr *senderAddress, unsigned char *packetData, int numTotalBytes, int numBytesPerAgent); - void updateAgentWithData(sockaddr *senderAddress, void *packetData, size_t dataBytes); - void updateAgentWithData(Agent *agent, void *packetData, int dataBytes); + void updateAgentWithData(sockaddr *senderAddress, unsigned char *packetData, size_t dataBytes); + void updateAgentWithData(Agent *agent, unsigned char *packetData, int dataBytes); - void broadcastToAgents(char *broadcastData, size_t dataBytes, const char* agentTypes, int numAgentTypes); + void broadcastToAgents(unsigned char *broadcastData, size_t dataBytes, const char* agentTypes, int numAgentTypes); char getOwnerType(); unsigned int getSocketListenPort(); diff --git a/libraries/shared/src/AngleUtils.h b/libraries/shared/src/AngleUtil.h similarity index 68% rename from libraries/shared/src/AngleUtils.h rename to libraries/shared/src/AngleUtil.h index dfe4f09124..8308eadf43 100644 --- a/libraries/shared/src/AngleUtils.h +++ b/libraries/shared/src/AngleUtil.h @@ -32,9 +32,9 @@ struct Rotations { static float halfPi() { return 0.25f; } }; -/** - * Converts an angle from one unit to another. - */ +// +// Converts an angle from one unit to another. +// template< class UnitFrom, class UnitTo > float angleConvert(float a) { @@ -42,21 +42,28 @@ float angleConvert(float a) { } -/** - * Clamps an angle to the range of [-180; 180) degrees. - */ +// +// Clamps an angle to the range of [-180; 180) degrees. +// template< class Unit > float angleSignedNormal(float a) { - float result = remainder(a, Unit::twicePi()); - if (result == Unit::pi()) - result = -Unit::pi(); + // result is remainder(a, Unit::twicePi()); + float result = fmod(a, Unit::twicePi()); + if (result >= Unit::pi()) { + + result -= Unit::twicePi(); + + } else if (result < -Unit::pi()) { + + result += Unit::twicePi(); + } return result; } -/** - * Clamps an angle to the range of [0; 360) degrees. - */ +// +// Clamps an angle to the range of [0; 360) degrees. +// template< class Unit > float angleUnsignedNormal(float a) { @@ -64,13 +71,13 @@ float angleUnsignedNormal(float a) { } -/** - * Clamps a polar direction so that azimuth is in the range of [0; 360) - * degrees and altitude is in the range of [-90; 90] degrees. - * - * The so normalized angle still contains ambiguity due to gimbal lock: - * Both poles can be reached from any azimuthal direction. - */ +// +// Clamps a polar direction so that azimuth is in the range of [0; 360) +// degrees and altitude is in the range of [-90; 90] degrees. +// +// The so normalized angle still contains ambiguity due to gimbal lock: +// Both poles can be reached from any azimuthal direction. +// template< class Unit > void angleHorizontalPolar(float& azimuth, float& altitude) { diff --git a/libraries/shared/src/AudioRingBuffer.cpp b/libraries/shared/src/AudioRingBuffer.cpp index 6dd18de520..2197d03706 100644 --- a/libraries/shared/src/AudioRingBuffer.cpp +++ b/libraries/shared/src/AudioRingBuffer.cpp @@ -105,12 +105,10 @@ void AudioRingBuffer::setBearing(float newBearing) { bearing = newBearing; } -void AudioRingBuffer::parseData(void *data, int size) { - unsigned char *audioDataStart = (unsigned char *) data; - - if (size > (bufferLengthSamples * sizeof(int16_t))) { +void AudioRingBuffer::parseData(unsigned char* sourceBuffer, int numBytes) { + if (numBytes > (bufferLengthSamples * sizeof(int16_t))) { - unsigned char *dataPtr = audioDataStart + 1; + unsigned char *dataPtr = sourceBuffer + 1; for (int p = 0; p < 3; p ++) { memcpy(&position[p], dataPtr, sizeof(float)); @@ -123,7 +121,7 @@ void AudioRingBuffer::parseData(void *data, int size) { memcpy(&bearing, dataPtr, sizeof(float)); dataPtr += sizeof(float); - audioDataStart = dataPtr; + sourceBuffer = dataPtr; } if (endOfLastWrite == NULL) { @@ -134,7 +132,7 @@ void AudioRingBuffer::parseData(void *data, int size) { started = false; } - memcpy(endOfLastWrite, audioDataStart, bufferLengthSamples * sizeof(int16_t)); + memcpy(endOfLastWrite, sourceBuffer, bufferLengthSamples * sizeof(int16_t)); endOfLastWrite += bufferLengthSamples; diff --git a/libraries/shared/src/AudioRingBuffer.h b/libraries/shared/src/AudioRingBuffer.h index 6b214a5f8f..65f28ff737 100644 --- a/libraries/shared/src/AudioRingBuffer.h +++ b/libraries/shared/src/AudioRingBuffer.h @@ -19,7 +19,7 @@ class AudioRingBuffer : public AgentData { ~AudioRingBuffer(); AudioRingBuffer(const AudioRingBuffer &otherRingBuffer); - void parseData(void *data, int size); + void parseData(unsigned char* sourceBuffer, int numBytes); AudioRingBuffer* clone() const; int16_t* getNextOutput(); diff --git a/libraries/shared/src/SharedUtil.h b/libraries/shared/src/SharedUtil.h index 24517c9a68..6941c74462 100644 --- a/libraries/shared/src/SharedUtil.h +++ b/libraries/shared/src/SharedUtil.h @@ -10,6 +10,7 @@ #define __hifi__SharedUtil__ #include +#include #ifdef _WIN32 #include "Systime.h" @@ -17,6 +18,21 @@ #include #endif +static const float ZERO = 0.0; +static const float ONE = 1.0; +static const float ONE_HALF = 0.5; +static const double ONE_THIRD = 0.3333333; +static const double PIE = 3.14159265359; +static const double PI_TIMES_TWO = 3.14159265359 * 2.0; +static const double PI_OVER_180 = 3.14159265359 / 180.0; +static const double EPSILON = 0.00001; //smallish number - used as margin of error for some computations +static const double SQUARE_ROOT_OF_2 = sqrt(2); +static const double SQUARE_ROOT_OF_3 = sqrt(3); +static const float METER = 1.0; +static const float DECIMETER = 0.1; +static const float CENTIMETER = 0.01; +static const float MILLIIMETER = 0.001; + double usecTimestamp(timeval *time); double usecTimestampNow(); diff --git a/libraries/voxels/CMakeLists.txt b/libraries/voxels/CMakeLists.txt index 21188c26f9..d873320064 100644 --- a/libraries/voxels/CMakeLists.txt +++ b/libraries/voxels/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 2.8) -set(ROOT_DIR ../../) +set(ROOT_DIR ../..) set(MACRO_DIR ${ROOT_DIR}/cmake/macros) # setup for find modules @@ -8,19 +8,11 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../../cm set(TARGET_NAME voxels) -project(${TARGET_NAME}) +include(${MACRO_DIR}/SetupHifiLibrary.cmake) +setup_hifi_library(${TARGET_NAME}) -# set up the external glm library include(${MACRO_DIR}/IncludeGLM.cmake) -include_glm(${TARGET_NAME} ${MACRO_DIR}) - -# grab the implemenation and header files -file(GLOB HIFI_VOXELS_SRCS src/*.h src/*.cpp) - -# create a library and set the property so it can be referenced later -add_library(${TARGET_NAME} ${HIFI_VOXELS_SRCS}) +include_glm(${TARGET_NAME} ${ROOT_DIR}) include(${MACRO_DIR}/LinkHifiLibrary.cmake) -link_hifi_library(shared ${TARGET_NAME} ${ROOT_DIR}) - -set(HIFI_VOXELS_LIBRARY ${TARGET_NAME}) \ No newline at end of file +link_hifi_library(shared ${TARGET_NAME} ${ROOT_DIR}) \ No newline at end of file diff --git a/libraries/voxels/src/ViewFrustum.cpp b/libraries/voxels/src/ViewFrustum.cpp index 1de5c11d6a..d0b1382a4a 100644 --- a/libraries/voxels/src/ViewFrustum.cpp +++ b/libraries/voxels/src/ViewFrustum.cpp @@ -8,7 +8,6 @@ // // -#include "Util.h" #include "ViewFrustum.h" ViewFrustum::ViewFrustum() : diff --git a/libraries/voxels/src/VoxelTree.cpp b/libraries/voxels/src/VoxelTree.cpp index cf0d339954..2f18b8af50 100644 --- a/libraries/voxels/src/VoxelTree.cpp +++ b/libraries/voxels/src/VoxelTree.cpp @@ -192,37 +192,23 @@ void VoxelTree::deleteVoxelCodeFromTree(unsigned char *codeBuffer) { VoxelNode* parentNode = NULL; VoxelNode* nodeToDelete = nodeForOctalCode(rootNode, codeBuffer, &parentNode); - printf("deleteVoxelCodeFromTree() looking [codeBuffer] for:\n"); - printOctalCode(codeBuffer); - - printf("deleteVoxelCodeFromTree() found [nodeToDelete->octalCode] for:\n"); - printOctalCode(nodeToDelete->octalCode); - // If the node exists... int lengthInBytes = bytesRequiredForCodeLength(*codeBuffer); // includes octet count, not color! - printf("compare octal codes of length %d\n",lengthInBytes); - if (0==memcmp(nodeToDelete->octalCode,codeBuffer,lengthInBytes)) { - printf("found node to delete...\n"); + if (0 == memcmp(nodeToDelete->octalCode,codeBuffer,lengthInBytes)) { float* vertices = firstVertexForCode(nodeToDelete->octalCode); - printf("deleting voxel at: %f,%f,%f\n",vertices[0],vertices[1],vertices[2]); delete []vertices; if (parentNode) { float* vertices = firstVertexForCode(parentNode->octalCode); - printf("parent of deleting voxel at: %f,%f,%f\n",vertices[0],vertices[1],vertices[2]); delete []vertices; int childNDX = branchIndexWithDescendant(parentNode->octalCode, codeBuffer); - printf("child INDEX=%d\n",childNDX); - printf("deleting Node at parentNode->children[%d]\n",childNDX); delete parentNode->children[childNDX]; // delete the child nodes - printf("setting parentNode->children[%d] to NULL\n",childNDX); parentNode->children[childNDX]=NULL; // set it to NULL - printf("reaverageVoxelColors()\n"); reaverageVoxelColors(rootNode); // Fix our colors!! Need to call it on rootNode } } diff --git a/space-server/CMakeLists.txt b/space-server/CMakeLists.txt index 4e5c698254..5b34f86a4c 100644 --- a/space-server/CMakeLists.txt +++ b/space-server/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 2.8) -set(ROOT_DIR ../) +set(ROOT_DIR ..) set(MACRO_DIR ${ROOT_DIR}/cmake/macros) set(TARGET_NAME space-server) diff --git a/voxel-server/CMakeLists.txt b/voxel-server/CMakeLists.txt index 56b728c186..5f9ff87fd7 100644 --- a/voxel-server/CMakeLists.txt +++ b/voxel-server/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 2.8) set(TARGET_NAME voxel-server) -set(ROOT_DIR ../) +set(ROOT_DIR ..) set(MACRO_DIR ${ROOT_DIR}/cmake/macros) include(${MACRO_DIR}/SetupHifiProject.cmake) diff --git a/voxel-server/src/VoxelAgentData.cpp b/voxel-server/src/VoxelAgentData.cpp index e54ce0df89..8f9b41e4ca 100644 --- a/voxel-server/src/VoxelAgentData.cpp +++ b/voxel-server/src/VoxelAgentData.cpp @@ -27,9 +27,10 @@ VoxelAgentData* VoxelAgentData::clone() const { return new VoxelAgentData(*this); } -void VoxelAgentData::parseData(void *data, int size) { +void VoxelAgentData::parseData(unsigned char* sourceBuffer, int numBytes) { + // push past the packet header + sourceBuffer++; + // pull the position from the interface agent data packet - sscanf((char *)data, - "H%*f,%*f,%*f,%f,%f,%f", - &position[0], &position[1], &position[2]); + memcpy(&position, sourceBuffer, sizeof(float) * 3); } diff --git a/voxel-server/src/VoxelAgentData.h b/voxel-server/src/VoxelAgentData.h index 3ab7670a93..98ec7e9ed7 100644 --- a/voxel-server/src/VoxelAgentData.h +++ b/voxel-server/src/VoxelAgentData.h @@ -22,7 +22,7 @@ public: ~VoxelAgentData(); VoxelAgentData(const VoxelAgentData &otherAgentData); - void parseData(void *data, int size); + void parseData(unsigned char* sourceBuffer, int numBytes); VoxelAgentData* clone() const; }; diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index d012f23995..70a743b9c0 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -289,7 +289,7 @@ int main(int argc, const char * argv[]) sockaddr agentPublicAddress; - char *packetData = new char[MAX_PACKET_SIZE]; + unsigned char *packetData = new unsigned char[MAX_PACKET_SIZE]; ssize_t receivedBytes; // loop to send to agents requesting data @@ -352,7 +352,7 @@ int main(int argc, const char * argv[]) // the Z command is a special command that allows the sender to send the voxel server high level semantic // requests, like erase all, or add sphere scene - char* command = &packetData[1]; // start of the command + char* command = (char*) &packetData[1]; // start of the command int commandLength = strlen(command); // commands are null terminated strings int totalLength = 1+commandLength+1; @@ -385,7 +385,7 @@ int main(int argc, const char * argv[]) agentList->increaseAgentId(); } - agentList->updateAgentWithData(&agentPublicAddress, (void *)packetData, receivedBytes); + agentList->updateAgentWithData(&agentPublicAddress, packetData, receivedBytes); } } }