From 760aafef8e909121c12c48d4cdbac1ba67e737ff Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Tue, 9 Apr 2013 17:12:43 -0700 Subject: [PATCH 01/10] Changed to render a small box of a fixed pixel width at screen center, useful for testing LOD Changes. --- interface/src/main.cpp | 17 ++++++++++++----- interface/src/starfield/Loader.h | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/interface/src/main.cpp b/interface/src/main.cpp index cb3341c9d9..d91f644805 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -727,12 +727,19 @@ void display(void) } if (display_head_mouse && !display_head && stats_on) { - glPointSize(10.0f); - glColor4f(1.0, 1.0, 0.0, 0.8); - glEnable(GL_POINT_SMOOTH); - glBegin(GL_POINTS); - glVertex2f(head_mouse_x, head_mouse_y); + // Display small target box at center or head mouse target that can also be used to measure LOD + glColor3f(1.0, 1.0, 1.0); + glDisable(GL_LINE_SMOOTH); + const int PIXEL_BOX = 20; + glBegin(GL_LINE_STRIP); + glVertex2f(head_mouse_x - PIXEL_BOX/2, head_mouse_y - PIXEL_BOX/2); + glVertex2f(head_mouse_x + PIXEL_BOX/2, head_mouse_y - PIXEL_BOX/2); + glVertex2f(head_mouse_x + PIXEL_BOX/2, head_mouse_y + PIXEL_BOX/2); + glVertex2f(head_mouse_x - PIXEL_BOX/2, head_mouse_y + PIXEL_BOX/2); + glVertex2f(head_mouse_x - PIXEL_BOX/2, head_mouse_y - PIXEL_BOX/2); glEnd(); + + glEnable(GL_LINE_SMOOTH); } // Spot bouncing back and forth on bottom of screen if (0) diff --git a/interface/src/starfield/Loader.h b/interface/src/starfield/Loader.h index 0db0384734..83d63adc2c 100644 --- a/interface/src/starfield/Loader.h +++ b/interface/src/starfield/Loader.h @@ -50,7 +50,7 @@ namespace starfield { return false; } - fprintf(stderr, "Stars.cpp: read %d vertices, using %d\n", + fprintf(stderr, "Stars.cpp: read %d stars, rendering %d\n", _valRecordsRead, _ptrVertices->size()); return true; From 81b311f75385f0b0a597174c35ad983b9b23e0ff Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Tue, 9 Apr 2013 18:41:01 -0700 Subject: [PATCH 02/10] added a method to ask the avatar for it's head lookat vector --- interface/src/Head.cpp | 64 ++++++++++++++++++++---------------------- interface/src/Head.h | 1 + 2 files changed, 32 insertions(+), 33 deletions(-) diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index 3e7512a8b7..d06f35cc39 100755 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -272,7 +272,7 @@ void Head::setLeanSideways(float dist){ -// Simulate the head over time +// Simulate the avatar over time //--------------------------------------------------- void Head::simulate(float deltaTime) { @@ -293,64 +293,50 @@ void Head::simulate(float deltaTime) thrust = glm::vec3(0); */ - const float THRUST_MAG = 10.0; - const float THRUST_LATERAL_MAG = 10.0; - const float THRUST_VERTICAL_MAG = 10.0; + const float THRUST_MAG = 10.0; + const float YAW_MAG = 300.0; avatar.thrust = glm::vec3( 0.0, 0.0, 0.0 ); - + + //notice that the z values from avatar.orientation are flipped to accommodate different coordinate system if (driveKeys[FWD]) { - avatar.thrust.x += avatar.orientation.getFront().getX() * THRUST_MAG; - avatar.thrust.y += avatar.orientation.getFront().getY() * THRUST_MAG; - avatar.thrust.z -= avatar.orientation.getFront().getZ() * THRUST_MAG; - //thrust += THRUST_MAG*forward; + glm::vec3 front( avatar.orientation.getFront().getX(), avatar.orientation.getFront().getY(), -avatar.orientation.getFront().getZ() ); + avatar.thrust += front * THRUST_MAG; } if (driveKeys[BACK]) { - avatar.thrust.x -= avatar.orientation.getFront().getX() * THRUST_MAG; - avatar.thrust.y -= avatar.orientation.getFront().getY() * THRUST_MAG; - avatar.thrust.z += avatar.orientation.getFront().getZ() * THRUST_MAG; - //thrust += -THRUST_MAG*forward; + glm::vec3 front( avatar.orientation.getFront().getX(), avatar.orientation.getFront().getY(), -avatar.orientation.getFront().getZ() ); + avatar.thrust -= front * THRUST_MAG; } if (driveKeys[RIGHT]) { - avatar.thrust.x += avatar.orientation.getRight().getX() * THRUST_LATERAL_MAG; - avatar.thrust.y += avatar.orientation.getRight().getY() * THRUST_LATERAL_MAG; - avatar.thrust.z -= avatar.orientation.getRight().getZ() * THRUST_LATERAL_MAG; - //thrust.x += forward.z*-THRUST_LATERAL_MAG; - //thrust.z += forward.x*THRUST_LATERAL_MAG; + glm::vec3 right( avatar.orientation.getRight().getX(), avatar.orientation.getRight().getY(), -avatar.orientation.getRight().getZ() ); + avatar.thrust += right * THRUST_MAG; } if (driveKeys[LEFT]) { - avatar.thrust.x -= avatar.orientation.getRight().getX() * THRUST_LATERAL_MAG; - avatar.thrust.y -= avatar.orientation.getRight().getY() * THRUST_LATERAL_MAG; - avatar.thrust.z += avatar.orientation.getRight().getZ() * THRUST_LATERAL_MAG; - //thrust.x += forward.z*THRUST_LATERAL_MAG; - //thrust.z += forward.x*-THRUST_LATERAL_MAG; + glm::vec3 right( avatar.orientation.getRight().getX(), avatar.orientation.getRight().getY(), -avatar.orientation.getRight().getZ() ); + avatar.thrust -= right * THRUST_MAG; } if (driveKeys[UP]) { - avatar.thrust.x -= avatar.orientation.getUp().getX() * THRUST_VERTICAL_MAG; - avatar.thrust.y -= avatar.orientation.getUp().getY() * THRUST_VERTICAL_MAG; - avatar.thrust.z += avatar.orientation.getUp().getZ() * THRUST_VERTICAL_MAG; - //thrust.y += -THRUST_VERTICAL_MAG; + glm::vec3 up( avatar.orientation.getUp().getX(), avatar.orientation.getUp().getY(), -avatar.orientation.getUp().getZ() ); + avatar.thrust += up * THRUST_MAG; } if (driveKeys[DOWN]) { - avatar.thrust.x += avatar.orientation.getUp().getX() * THRUST_VERTICAL_MAG; - avatar.thrust.y += avatar.orientation.getUp().getY() * THRUST_VERTICAL_MAG; - avatar.thrust.z -= avatar.orientation.getUp().getZ() * THRUST_VERTICAL_MAG; - //thrust.y += THRUST_VERTICAL_MAG; + glm::vec3 up( avatar.orientation.getUp().getX(), avatar.orientation.getUp().getY(), -avatar.orientation.getUp().getZ() ); + avatar.thrust -= up * THRUST_MAG; } if (driveKeys[ROT_RIGHT]) { - avatar.yawDelta -= 300.0 * deltaTime; + avatar.yawDelta -= YAW_MAG * deltaTime; } if (driveKeys[ROT_LEFT]) { - avatar.yawDelta += 300.0 * deltaTime; + avatar.yawDelta += YAW_MAG * deltaTime; } avatar.yaw += avatar.yawDelta * deltaTime; @@ -910,6 +896,18 @@ float Head::getAvatarYaw() } +//------------------------------------------- +glm::vec3 Head::getAvatarHeadLookatDirection() +{ + return glm::vec3 + ( + avatar.bone[ AVATAR_BONE_HEAD ].worldOrientation.getFront().x, + avatar.bone[ AVATAR_BONE_HEAD ].worldOrientation.getFront().y, + avatar.bone[ AVATAR_BONE_HEAD ].worldOrientation.getFront().z + ); +} + + //------------------------------- void Head::updateHandMovement() diff --git a/interface/src/Head.h b/interface/src/Head.h index 964d44ece4..f8008ae857 100644 --- a/interface/src/Head.h +++ b/interface/src/Head.h @@ -158,6 +158,7 @@ class Head : public AgentData { float getLastMeasuredYaw() {return YawRate;} float getAvatarYaw(); + glm::vec3 getAvatarHeadLookatDirection(); void render(int faceToFace, int isMine); From 1b833fb4a9d2daa2e8adf80d5847913b7af8e61a Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Tue, 9 Apr 2013 21:14:24 -0700 Subject: [PATCH 03/10] added grid plane to aid in testing avatar navigation --- interface/src/Head.h | 18 ++++++------ interface/src/main.cpp | 65 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 69 insertions(+), 14 deletions(-) diff --git a/interface/src/Head.h b/interface/src/Head.h index f8008ae857..bf8318ef61 100644 --- a/interface/src/Head.h +++ b/interface/src/Head.h @@ -103,15 +103,15 @@ enum AvatarBones struct AvatarBone { - AvatarBones parent; - glm::vec3 worldPosition; - glm::vec3 defaultPosePosition; - glm::dvec3 velocity; - float yaw; - float pitch; - float roll; - Orientation worldOrientation; - float length; + AvatarBones parent; // which bone is this bone connected to? + glm::vec3 worldPosition; // the position at the "end" of the bone + glm::vec3 defaultPosePosition; // the parent relative position when the avatar is in the "T-pose" + glm::dvec3 velocity; // pertains to spring physics + float yaw; // the yaw Euler angle of the bone rotation off the parent + float pitch; // the pitch Euler angle of the bone rotation off the parent + float roll; // the roll Euler angle of the bone rotation off the parent + Orientation worldOrientation; // three orthogonal normals determined by yaw, pitch, roll + float length; // the length of the bone }; struct Avatar diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 2fed06120d..52b6df6c68 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -109,6 +109,8 @@ int starsTiles = 20; double starsLod = 1.0; #endif +bool showingVoxels = false; + glm::vec3 box(WORLD_SIZE,WORLD_SIZE,WORLD_SIZE); ParticleSystem balls(0, box, @@ -569,8 +571,42 @@ int render_test_direction = 1; +void drawGroundPlaneGrid( float size, int resolution ) +{ + + glColor3f( 0.4f, 0.5f, 0.3f ); + glLineWidth(2.0); + + float gridSize = 10.0; + int gridResolution = 10; + + for (int g=0; g Date: Wed, 10 Apr 2013 00:25:03 -0700 Subject: [PATCH 04/10] Improved comments at start of main.cpp, dropped unused octal.h,.cpp files, deleted many unused system variables and functions. --- interface/src/main.cpp | 377 +++++++++++++++------------------------- interface/src/octal.cpp | 29 ---- interface/src/octal.h | 26 --- 3 files changed, 138 insertions(+), 294 deletions(-) delete mode 100644 interface/src/octal.cpp delete mode 100644 interface/src/octal.h diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 72e7d51bf3..aaa05f47b0 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -1,16 +1,25 @@ -// // // Interface -// -// Show a field of objects rendered in 3D, with yaw and pitch of scene driven -// by accelerometer data -// serial port connected to Maple board/arduino. +// +// Allows you to connect to and see/hear the shared 3D space. +// Optionally uses serialUSB connection to get gyro data for head movement. +// Optionally gets UDP stream from transmitter to animate controller/hand. +// +// Usage: The interface client first attempts to contact a domain server to +// discover the appropriate audio, voxel, and avatar servers to contact. +// Right now, the default domain server is "highfidelity.below92.com" +// You can change the domain server to use your own by editing the +// DOMAIN_HOSTNAME or DOMAIN_IP strings in the file AgentList.cpp +// +// +// Welcome Aboard! +// // // Keyboard Commands: // // / = toggle stats display -// spacebar = reset gyros/head -// h = render Head +// spacebar = reset gyros/head position +// h = render Head facing yourself (mirror) // l = show incoming gyro levels // @@ -68,41 +77,31 @@ using namespace std; -int audio_on = 1; // Whether to turn on the audio support -int simulate_on = 1; - AgentList agentList(AGENT_TYPE_INTERFACE); pthread_t networkReceiveThread; bool stopNetworkReceiveThread = false; -// For testing, add milliseconds of delay for received UDP packets -int packetcount = 0; -int packets_per_second = 0; -int bytes_per_second = 0; -int bytescount = 0; +int packetCount = 0; +int packetsPerSecond = 0; +int bytesPerSecond = 0; +int bytesCount = 0; -// Getting a target location from other machine (or loopback) to display -int target_x, target_y; -int target_display = 0; +int headMirror = 1; // Whether to mirror own head when viewing it -int head_mirror = 1; // Whether to mirror own head when viewing it -int sendToSelf = 1; - -int WIDTH = 1200; -int HEIGHT = 800; +int WIDTH = 1200; // Window size +int HEIGHT = 800; int fullscreen = 0; -bool wantColorRandomizer = true; // for addSphere and load file +bool wantColorRandomizer = true; // for addSphere and load file Oscilloscope audioScope(256,200,true); -#define HAND_RADIUS 0.25 // Radius of in-world 'hand' of you Head myHead; // The rendered head of oneself Camera myCamera; // My view onto the world (sometimes on myself :) + // Starfield information char starFile[] = "https://s3-us-west-1.amazonaws.com/highfidelity/stars.txt"; FieldOfView fov; - Stars stars; #ifdef STARFIELD_KEYS int starsTiles = 20; @@ -110,15 +109,16 @@ double starsLod = 1.0; #endif glm::vec3 box(WORLD_SIZE,WORLD_SIZE,WORLD_SIZE); + ParticleSystem balls(0, box, - false, // Wrap? - 0.02f, // Noise - 0.3f, // Size scale - 0.0 // Gravity + false, // Wrap? + 0.02f, // Noise + 0.3f, // Size scale + 0.0 // Gravity ); -Cloud cloud(20000, // Particles +Cloud cloud(0, // Particles box, // Bounding Box false // Wrap ); @@ -133,12 +133,12 @@ Field field; Audio audio(&audioScope, &myHead); #endif -#define RENDER_FRAME_MSECS 8 -int steps_per_frame = 0; +#define IDLE_SIMULATE_MSECS 8 // How often should call simulate and other stuff + // in the idle loop? float yaw = 0.f; // The yaw, pitch for the avatar head float pitch = 0.f; -float start_yaw = 122; +float startYaw = 122.f; float renderPitch = 0.f; float renderYawRate = 0.f; float renderPitchRate = 0.f; @@ -146,31 +146,25 @@ float renderPitchRate = 0.f; // Where one's own agent begins in the world (needs to become a dynamic thing passed to the program) glm::vec3 start_location(6.1f, 0, 1.4f); -int stats_on = 0; // Whether to show onscreen text overlay with stats +int statsOn = 0; // Whether to show onscreen text overlay with stats bool starsOn = false; // Whether to display the stars bool paintOn = false; // Whether to paint voxels as you fly around VoxelDetail paintingVoxel; // The voxel we're painting if we're painting unsigned char dominantColor = 0; // The dominant color of the voxel we're painting bool perfStatsOn = false; // Do we want to display perfStats? -int noise_on = 0; // Whether to add random noise +int noiseOn = 0; // Whether to add random noise float noise = 1.0; // Overall magnitude scaling for random noise levels -int step_on = 0; -int display_levels = 0; -int display_head = 0; -int display_field = 0; +int displayLevels = 0; +int displayHead = 0; +int displayField = 0; -int display_head_mouse = 1; // Display sample mouse pointer controlled by head movement -int head_mouse_x, head_mouse_y; -int head_lean_x, head_lean_y; +int displayHeadMouse = 1; // Display sample mouse pointer controlled by head movement +int headMouseX, headMouseY; -int mouse_x, mouse_y; // Where is the mouse -int mouse_start_x, mouse_start_y; // Mouse location at start of last down click -int mouse_pressed = 0; // true if mouse has been pressed (clear when finished) - -int nearbyAgents = 0; // How many other people near you is the domain server reporting? - -int speed; +int mouseX, mouseY; // Where is the mouse +int mouseStartX, mouseStartY; // Mouse location at start of last down click +int mousePressed = 0; // true if mouse has been pressed (clear when finished) // // Serial USB Variables @@ -185,17 +179,14 @@ int first_measurement = 1; // Frame rate Measurement -int framecount = 0; +int frameCount = 0; float FPS = 120.f; -timeval timer_start, timer_end; -timeval last_frame; +timeval timerStart, timerEnd; +timeval lastTimeIdle; double elapsedTime; // Particles -char texture_filename[] = "images/int-texture256-v4.png"; -unsigned int texture_width = 256; -unsigned int texture_height = 256; float particle_attenuation_quadratic[] = { 0.0f, 0.0f, 2.0f }; // larger Z = smaller particles float pointer_attenuation_quadratic[] = { 1.0f, 0.0f, 0.0f }; // for 2D view @@ -218,34 +209,19 @@ float pointer_attenuation_quadratic[] = { 1.0f, 0.0f, 0.0f }; // for 2D view // Every second, check the frame rates and other stuff void Timer(int extra) { - gettimeofday(&timer_end, NULL); - FPS = (float)framecount / ((float)diffclock(&timer_start, &timer_end) / 1000.f); - packets_per_second = (float)packetcount / ((float)diffclock(&timer_start, &timer_end) / 1000.f); - bytes_per_second = (float)bytescount / ((float)diffclock(&timer_start, &timer_end) / 1000.f); - framecount = 0; - packetcount = 0; - bytescount = 0; + gettimeofday(&timerEnd, NULL); + FPS = (float)frameCount / ((float)diffclock(&timerStart, &timerEnd) / 1000.f); + packetsPerSecond = (float)packetCount / ((float)diffclock(&timerStart, &timerEnd) / 1000.f); + bytesPerSecond = (float)bytesCount / ((float)diffclock(&timerStart, &timerEnd) / 1000.f); + frameCount = 0; + packetCount = 0; + bytesCount = 0; glutTimerFunc(1000,Timer,0); - gettimeofday(&timer_start, NULL); + gettimeofday(&timerStart, NULL); // Ping the agents we can see agentList.pingAgents(); - - if (0) { - // Massive send packet speed test - timeval starttest, endtest; - gettimeofday(&starttest, NULL); - char junk[1000]; - junk[0] = 'J'; - for (int i = 0; i < 10000; i++) - { -// agentSocket.send((char *)"192.168.1.38", AGENT_UDP_PORT, junk, 1000); - } - gettimeofday(&endtest, NULL); - float sendTime = static_cast( diffclock(&starttest, &endtest) ); - printf("packet test = %4.1f\n", sendTime); - } // if we haven't detected gyros, check for them now if (!serialPort.active) { @@ -253,10 +229,7 @@ void Timer(int extra) } } - - - -void display_stats(void) +void displayStats(void) { // bitmap chars are about 10 pels high char legend[] = "/ - toggle this display, Q - exit, H - show head, M - show hand, T - test audio"; @@ -269,7 +242,7 @@ void display_stats(void) char stats[200]; sprintf(stats, "FPS = %3.0f Pkts/s = %d Bytes/s = %d Head(x,y,z)=( %f , %f , %f )", - FPS, packets_per_second, bytes_per_second, headPos.x,headPos.y,headPos.z); + FPS, packetsPerSecond, bytesPerSecond, headPos.x,headPos.y,headPos.z); drawtext(10, 49, 0.10f, 0, 1.0, 0, stats); if (serialPort.active) { sprintf(stats, "ADC samples = %d, LED = %d", @@ -327,26 +300,10 @@ void display_stats(void) } delete []perfStatLinesArray; // we're responsible for cleanup } - - /* - std::stringstream angles; - angles << "render_yaw: " << myHead.getRenderYaw() << ", Yaw: " << myHead.getYaw(); - drawtext(10,50,0.10, 0, 1.0, 0, (char *)angles.str().c_str()); - */ - - /* - char adc[200]; - sprintf(adc, "location = %3.1f,%3.1f,%3.1f, angle_to(origin) = %3.1f, head yaw = %3.1f, render_yaw = %3.1f", - -location[0], -location[1], -location[2], - angle_to(myHead.getPos()*-1.f, glm::vec3(0,0,0), myHead.getRenderYaw(), myHead.getYaw()), - myHead.getYaw(), myHead.getRenderYaw()); - drawtext(10, 50, 0.10, 0, 1.0, 0, adc); - */ } void initDisplay(void) { - // Set up blending function so that we can NOT clear the display glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -355,36 +312,27 @@ void initDisplay(void) glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); -// load_png_as_texture(texture_filename); - if (fullscreen) glutFullScreen(); } - - - void init(void) { voxels.init(); voxels.setViewerHead(&myHead); - myHead.setRenderYaw(start_yaw); + myHead.setRenderYaw(startYaw); - head_mouse_x = WIDTH/2; - head_mouse_y = HEIGHT/2; - head_lean_x = WIDTH/2; - head_lean_y = HEIGHT/2; + headMouseX = WIDTH/2; + headMouseY = HEIGHT/2; stars.readInput(starFile, 0); // Initialize Field values field = Field(); - printf( "Field Initialized.\n" ); - - if (noise_on) { + + if (noiseOn) { myHead.setNoise(noise); } myHead.setPos(start_location ); - myCamera.setPosition( start_location ); #ifdef MARKER_CAPTURE @@ -399,8 +347,8 @@ void init(void) } #endif - gettimeofday(&timer_start, NULL); - gettimeofday(&last_frame, NULL); + gettimeofday(&timerStart, NULL); + gettimeofday(&lastTimeIdle, NULL); } void terminate () { @@ -421,15 +369,13 @@ void reset_sensors() // // Reset serial I/O sensors // - myHead.setRenderYaw(start_yaw); + myHead.setRenderYaw(startYaw); yaw = renderYawRate = 0; pitch = renderPitch = renderPitchRate = 0; myHead.setPos(start_location); - head_mouse_x = WIDTH/2; - head_mouse_y = HEIGHT/2; - head_lean_x = WIDTH/2; - head_lean_y = HEIGHT/2; + headMouseX = WIDTH/2; + headMouseY = HEIGHT/2; myHead.reset(); @@ -440,12 +386,12 @@ void reset_sensors() void simulateHand(float deltaTime) { // If mouse is being dragged, send current force to the hand controller - if (mouse_pressed == 1) + if (mousePressed == 1) { // Add a velocity to the hand corresponding to the detected size of the drag vector const float MOUSE_HAND_FORCE = 1.5; - float dx = mouse_x - mouse_start_x; - float dy = mouse_y - mouse_start_y; + float dx = mouseX - mouseStartX; + float dy = mouseY - mouseStartY; glm::vec3 vel(dx*MOUSE_HAND_FORCE, -dy*MOUSE_HAND_FORCE*(WIDTH/HEIGHT), 0); myHead.hand->addVelocity(vel*deltaTime); } @@ -463,7 +409,7 @@ void simulateHead(float frametime) //float measured_lateral_accel = serialPort.getRelativeValue(ACCEL_X); //float measured_fwd_accel = serialPort.getRelativeValue(ACCEL_Z); - myHead.UpdatePos(frametime, &serialPort, head_mirror, &gravity); + myHead.UpdatePos(frametime, &serialPort, headMirror, &gravity); //------------------------------------------------------------------------------------- // set the position of the avatar @@ -476,13 +422,13 @@ void simulateHead(float frametime) if (powf(measured_yaw_rate*measured_yaw_rate + measured_pitch_rate*measured_pitch_rate, 0.5) > MIN_MOUSE_RATE) { - head_mouse_x += measured_yaw_rate*MOUSE_SENSITIVITY; - head_mouse_y += measured_pitch_rate*MOUSE_SENSITIVITY*(float)HEIGHT/(float)WIDTH; + headMouseX += measured_yaw_rate*MOUSE_SENSITIVITY; + headMouseY += measured_pitch_rate*MOUSE_SENSITIVITY*(float)HEIGHT/(float)WIDTH; } - head_mouse_x = max(head_mouse_x, 0); - head_mouse_x = min(head_mouse_x, WIDTH); - head_mouse_y = max(head_mouse_y, 0); - head_mouse_y = min(head_mouse_y, HEIGHT); + headMouseX = max(headMouseX, 0); + headMouseX = min(headMouseX, WIDTH); + headMouseY = max(headMouseY, 0); + headMouseY = min(headMouseY, HEIGHT); // Update render direction (pitch/yaw) based on measured gyro rates const int MIN_YAW_RATE = 100; @@ -563,12 +509,6 @@ void simulateHead(float frametime) } } -int render_test_spot = WIDTH/2; -int render_test_direction = 1; - - - - void display(void) { PerfStat("display"); @@ -601,7 +541,7 @@ void display(void) //-------------------------------------------------------- myCamera.setTargetPosition( myHead.getPos() ); - if ( display_head ) + if ( displayHead ) { //----------------------------------------------- // set the camera to looking at my own face @@ -650,13 +590,13 @@ void display(void) // Draw cloud of dots glDisable( GL_POINT_SPRITE_ARB ); glDisable( GL_TEXTURE_2D ); -// if (!display_head) cloud.render(); + if (!displayHead) cloud.render(); // Draw voxels voxels.render(); // Draw field vectors - if (display_field) field.render(); + if (displayField) field.render(); // Render heads of other agents for(std::vector::iterator agent = agentList.getAgents().begin(); agent != agentList.getAgents().end(); agent++) @@ -672,10 +612,10 @@ void display(void) } } - if ( !display_head ) balls.render(); + if ( !displayHead ) balls.render(); // Render the world box - if (!display_head && stats_on) render_world_box(); + if (!displayHead && statsOn) render_world_box(); //--------------------------------- @@ -687,7 +627,7 @@ void display(void) glPushMatrix(); glLoadIdentity(); glTranslatef(0.f, 0.f, -7.f); - myHead.render(display_head, 1); + myHead.render(displayHead, 1); glPopMatrix(); */ @@ -714,57 +654,31 @@ void display(void) //drawvec3(100, 100, 0.15, 0, 1.0, 0, myHead.getPos(), 0, 1, 0); glPointParameterfvARB( GL_POINT_DISTANCE_ATTENUATION_ARB, pointer_attenuation_quadratic ); - if (mouse_pressed == 1) - { - glPointSize( 10.0f ); - glColor3f(1,1,1); - //glEnable(GL_POINT_SMOOTH); - glBegin(GL_POINTS); - glVertex2f(target_x, target_y); - glEnd(); - char val[20]; - sprintf(val, "%d,%d", target_x, target_y); - drawtext(target_x, target_y-20, 0.08, 0, 1.0, 0, val, 0, 1, 0); - } - if (display_head_mouse && !display_head && stats_on) + if (displayHeadMouse && !displayHead && statsOn) { // Display small target box at center or head mouse target that can also be used to measure LOD glColor3f(1.0, 1.0, 1.0); glDisable(GL_LINE_SMOOTH); const int PIXEL_BOX = 20; glBegin(GL_LINE_STRIP); - glVertex2f(head_mouse_x - PIXEL_BOX/2, head_mouse_y - PIXEL_BOX/2); - glVertex2f(head_mouse_x + PIXEL_BOX/2, head_mouse_y - PIXEL_BOX/2); - glVertex2f(head_mouse_x + PIXEL_BOX/2, head_mouse_y + PIXEL_BOX/2); - glVertex2f(head_mouse_x - PIXEL_BOX/2, head_mouse_y + PIXEL_BOX/2); - glVertex2f(head_mouse_x - PIXEL_BOX/2, head_mouse_y - PIXEL_BOX/2); + glVertex2f(headMouseX - PIXEL_BOX/2, headMouseY - PIXEL_BOX/2); + glVertex2f(headMouseX + PIXEL_BOX/2, headMouseY - PIXEL_BOX/2); + glVertex2f(headMouseX + PIXEL_BOX/2, headMouseY + PIXEL_BOX/2); + glVertex2f(headMouseX - PIXEL_BOX/2, headMouseY + PIXEL_BOX/2); + glVertex2f(headMouseX - PIXEL_BOX/2, headMouseY - PIXEL_BOX/2); glEnd(); glEnable(GL_LINE_SMOOTH); } - // Spot bouncing back and forth on bottom of screen - if (0) - { - glPointSize(50.0f); - glColor4f(1.0, 1.0, 1.0, 1.0); - glEnable(GL_POINT_SMOOTH); - glBegin(GL_POINTS); - glVertex2f(render_test_spot, HEIGHT-100); - glEnd(); - render_test_spot += render_test_direction*50; - if ((render_test_spot > WIDTH-100) || (render_test_spot < 100)) render_test_direction *= -1.0; - - } - // Show detected levels from the serial I/O ADC channel sensors - if (display_levels) serialPort.renderLevels(WIDTH,HEIGHT); + if (displayLevels) serialPort.renderLevels(WIDTH,HEIGHT); // Display miscellaneous text stats onscreen - if (stats_on) { + if (statsOn) { glLineWidth(1.0f); glPointSize(1.0f); - display_stats(); + displayStats(); } // Draw number of nearby people always @@ -785,13 +699,9 @@ void display(void) glutSwapBuffers(); - framecount++; + frameCount++; } - - - - void testPointToVoxel() { float y=0; @@ -931,7 +841,7 @@ void key(unsigned char k, int x, int y) // Process keypresses if (k == 'q') ::terminate(); - if (k == '/') stats_on = !stats_on; // toggle stats + if (k == '/') statsOn = !statsOn; // toggle stats if (k == '*') ::starsOn = !::starsOn; // toggle stars if (k == '&') { ::paintOn = !::paintOn; // toggle paint @@ -942,8 +852,8 @@ void key(unsigned char k, int x, int y) if (k == '%') ::sendVoxelServerAddScene(); // sends add scene command to voxel server if (k == 'n') { - noise_on = !noise_on; // Toggle noise - if (noise_on) + noiseOn = !noiseOn; // Toggle noise + if (noiseOn) { myHead.setNoise(noise); } @@ -955,16 +865,16 @@ void key(unsigned char k, int x, int y) } if (k == 'h') { - display_head = !display_head; + displayHead = !displayHead; #ifndef _WIN32 - audio.setMixerLoopbackFlag(display_head); + audio.setMixerLoopbackFlag(displayHead); #endif } - if (k == 'm') head_mirror = !head_mirror; + if (k == 'm') headMirror = !headMirror; - if (k == 'f') display_field = !display_field; - if (k == 'l') display_levels = !display_levels; + if (k == 'f') displayField = !displayField; + if (k == 'l') displayLevels = !displayLevels; if (k == 'e') myHead.setDriveKeys(UP, 1); if (k == 'c') myHead.setDriveKeys(DOWN, 1); if (k == 'w') myHead.setDriveKeys(FWD, 1); @@ -981,18 +891,6 @@ void key(unsigned char k, int x, int y) #endif if (k == 'a') myHead.setDriveKeys(ROT_LEFT, 1); if (k == 'd') myHead.setDriveKeys(ROT_RIGHT, 1); - if (k == 'o') simulate_on = !simulate_on; - if (k == 'p') - { - // Add to field vector - float pos[] = {5,5,5}; - float add[] = {0.001, 0.001, 0.001}; - field.add(add, pos); - } - if (k == '1') - { - myHead.SetNewHeadTarget((randFloat()-0.5)*20.0, (randFloat()-0.5)*20.0); - } // press the . key to get a new random sphere of voxels added if (k == '.') addRandomSphere(wantColorRandomizer); @@ -1009,8 +907,8 @@ void *networkReceive(void *args) while (!stopNetworkReceiveThread) { if (agentList.getAgentSocket().receive(&senderAddress, incomingPacket, &bytesReceived)) { - packetcount++; - bytescount += bytesReceived; + packetCount++; + bytesCount += bytesReceived; if (incomingPacket[0] == PACKET_HEADER_TRANSMITTER_DATA) { // Pass everything but transmitter data to the agent list @@ -1034,18 +932,17 @@ void idle(void) timeval check; gettimeofday(&check, NULL); - // Check and render display frame - if (diffclock(&last_frame, &check) > RENDER_FRAME_MSECS) + // Only run simulation code if more than IDLE_SIMULATE_MSECS have passed since last time + + if (diffclock(&lastTimeIdle, &check) > IDLE_SIMULATE_MSECS) { - steps_per_frame++; - //---------------------------------------------------------------- // If mouse is being dragged, update hand movement in the avatar //---------------------------------------------------------------- - if ( mouse_pressed == 1 ) + if ( mousePressed == 1 ) { - float xOffset = ( mouse_x - mouse_start_x ) / (double)WIDTH; - float yOffset = ( mouse_y - mouse_start_y ) / (double)HEIGHT; + float xOffset = ( mouseX - mouseStartX ) / (double)WIDTH; + float yOffset = ( mouseY - mouseStartY ) / (double)HEIGHT; float leftRight = xOffset; float downUp = yOffset; @@ -1074,17 +971,15 @@ void idle(void) simulateHand(1.f/FPS); - if (simulate_on) { - field.simulate(1.f/FPS); - myHead.simulate(1.f/FPS); - balls.simulate(1.f/FPS); - cloud.simulate(1.f/FPS); - lattice.simulate(1.f/FPS); - myFinger.simulate(1.f/FPS); - } + field.simulate(1.f/FPS); + myHead.simulate(1.f/FPS); + balls.simulate(1.f/FPS); + cloud.simulate(1.f/FPS); + lattice.simulate(1.f/FPS); + myFinger.simulate(1.f/FPS); - if (!step_on) glutPostRedisplay(); - last_frame = check; + glutPostRedisplay(); + lastTimeIdle = check; } @@ -1120,38 +1015,38 @@ void mouseFunc( int button, int state, int x, int y ) { if( button == GLUT_LEFT_BUTTON && state == GLUT_DOWN ) { - mouse_x = x; - mouse_y = y; - mouse_pressed = 1; + mouseX = x; + mouseY = y; + mousePressed = 1; lattice.mouseClick((float)x/(float)WIDTH,(float)y/(float)HEIGHT); - mouse_start_x = x; - mouse_start_y = y; + mouseStartX = x; + mouseStartY = y; } if( button == GLUT_LEFT_BUTTON && state == GLUT_UP ) { - mouse_x = x; - mouse_y = y; - mouse_pressed = 0; + mouseX = x; + mouseY = y; + mousePressed = 0; } } void motionFunc( int x, int y) { - mouse_x = x; - mouse_y = y; + mouseX = x; + mouseY = y; lattice.mouseClick((float)x/(float)WIDTH,(float)y/(float)HEIGHT); } void mouseoverFunc( int x, int y) { - mouse_x = x; - mouse_y = y; - if (mouse_pressed == 0) + mouseX = x; + mouseY = y; + if (mousePressed == 0) { // lattice.mouseOver((float)x/(float)WIDTH,(float)y/(float)HEIGHT); -// myFinger.setTarget(mouse_x, mouse_y); +// myFinger.setTarget(mouseX, mouseY); } } @@ -1209,6 +1104,8 @@ int main(int argc, const char * argv[]) printf( "Created Display Window.\n" ); initDisplay(); + printf( "Initialized Display.\n" ); + glutDisplayFunc(display); glutReshapeFunc(reshape); @@ -1221,9 +1118,10 @@ int main(int argc, const char * argv[]) glutMouseFunc(mouseFunc); glutIdleFunc(idle); - printf( "Initialized Display.\n" ); init(); + printf( "Init() complete.\n" ); + // Check to see if the user passed in a command line option for randomizing colors if (cmdOptionExists(argc, argv, "--NoColorRandomizer")) { @@ -1235,16 +1133,17 @@ int main(int argc, const char * argv[]) const char* voxelsFilename = getCmdOption(argc, argv, "-i"); if (voxelsFilename) { voxels.loadVoxelsFile(voxelsFilename,wantColorRandomizer); + printf("Local Voxel File loaded.\n"); } // create thread for receipt of data via UDP pthread_create(&networkReceiveThread, NULL, networkReceive, NULL); - - printf( "Init() complete.\n" ); + printf("Network receive thread created.\n"); glutTimerFunc(1000, Timer, 0); glutMainLoop(); + printf("Normal exit.\n"); ::terminate(); return EXIT_SUCCESS; } diff --git a/interface/src/octal.cpp b/interface/src/octal.cpp deleted file mode 100644 index 4e5f1eb7c5..0000000000 --- a/interface/src/octal.cpp +++ /dev/null @@ -1,29 +0,0 @@ -// -// octal.cpp -// interface -// -// Created by Philip on 2/4/13. -// Copyright (c) 2013 HighFidelity, Inc. All rights reserved. -// -// Various subroutines for converting between X,Y,Z coords and octree coordinates. -// - -#include "Util.h" -#include "octal.h" -#include - -const int X = 0; -const int Y = 1; -const int Z = 2; - -domainNode rootNode; - -// Given a position vector between zero and one (but less than one), and a voxel scale 1/2^scale, -// returns the smallest voxel at that scale which encloses the given point. -void getVoxel(float * pos, int scale, float * vpos) { - float vscale = powf(2, scale); - vpos[X] = floor(pos[X]*vscale)/vscale; - vpos[Y] = floor(pos[Y]*vscale)/vscale; - vpos[Z] = floor(pos[Z]*vscale)/vscale; -} - diff --git a/interface/src/octal.h b/interface/src/octal.h deleted file mode 100644 index cc38b59f7a..0000000000 --- a/interface/src/octal.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// octal.h -// interface -// -// Created by Philip on 2/4/13. -// Copyright (c) 2013 HighFidelity, Inc. All rights reserved. -// - -#ifndef __interface__octal__ -#define __interface__octal__ - -#include - -struct domainNode { - domainNode * child[8]; - char * hostname; - char * nickname; - int domain_id; -}; - -domainNode* createNode(int lengthInBits, char * octalData, - char * hostname, char * nickname, int domain_id); - - - -#endif /* defined(__interface__octal__) */ From e910bece1ddee799898eb75b410234490e259b2a Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Wed, 10 Apr 2013 00:30:24 -0700 Subject: [PATCH 05/10] temp commented groundPlaneGrid till file is fixed --- interface/src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/main.cpp b/interface/src/main.cpp index d6f98648c8..01c76e9254 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -602,7 +602,7 @@ void display(void) //--------------------------------------------- // draw a grid gound plane.... //--------------------------------------------- - drawGroundPlaneGrid( 5.0f, 9 ); + //drawGroundPlaneGrid( 5.0f, 9 ); // Draw cloud of dots From e19b53a344d85598a9c61ede67e673133f574e7f Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 10 Apr 2013 00:46:04 -0700 Subject: [PATCH 06/10] added key interface to toggle voxels --- interface/src/main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 01c76e9254..387a9b7065 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -864,6 +864,7 @@ void key(unsigned char k, int x, int y) if (k == 'q') ::terminate(); if (k == '/') statsOn = !statsOn; // toggle stats if (k == '*') ::starsOn = !::starsOn; // toggle stars + if (k == 'V') ::showingVoxels = !::showingVoxels; // toggle voxels if (k == '&') { ::paintOn = !::paintOn; // toggle paint ::setupPaintingVoxel(); // also randomizes colors From 8f969f9ca9c96132c6debbed354b06b52d9b3b87 Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Wed, 10 Apr 2013 01:03:35 -0700 Subject: [PATCH 07/10] adding ground plane grid (again???) --- interface/src/Head.cpp | 278 ++++++++++++++++++++++++++--------------- interface/src/Head.h | 8 +- 2 files changed, 185 insertions(+), 101 deletions(-) diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index d06f35cc39..13f30084bc 100755 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -19,6 +19,7 @@ using namespace std; float skinColor[] = {1.0, 0.84, 0.66}; +float lightBlue[] = { 0.7, 0.8, 1.0 }; float browColor[] = {210.0/255.0, 105.0/255.0, 30.0/255.0}; float mouthColor[] = {1, 0, 0}; @@ -502,9 +503,9 @@ void Head::renderHead( int faceToFace, int isMine ) glTranslatef ( - avatar.bone[ AVATAR_BONE_HEAD ].worldPosition.x, - avatar.bone[ AVATAR_BONE_HEAD ].worldPosition.y, - avatar.bone[ AVATAR_BONE_HEAD ].worldPosition.z + avatar.bone[ AVATAR_BONE_HEAD ].position.x, + avatar.bone[ AVATAR_BONE_HEAD ].position.y, + avatar.bone[ AVATAR_BONE_HEAD ].position.z ); glScalef( 0.03, 0.03, 0.03 ); @@ -669,9 +670,9 @@ void Head::setHandMovement( glm::vec3 movement ) //----------------------------------------- void Head::initializeAvatar() { - avatar.position = glm::vec3( 0.0, 0.0, 0.0 ); - avatar.velocity = glm::vec3( 0.0, 0.0, 0.0 ); - avatar.thrust = glm::vec3( 0.0, 0.0, 0.0 ); + avatar.position = glm::vec3( 0.0, 0.0, 0.0 ); + avatar.velocity = glm::vec3( 0.0, 0.0, 0.0 ); + avatar.thrust = glm::vec3( 0.0, 0.0, 0.0 ); avatar.orientation.setToIdentity(); avatar.yaw = 90.0; @@ -682,9 +683,10 @@ void Head::initializeAvatar() for (int b=0; b avatar.maxArmLength ) { - avatar.bone[ AVATAR_BONE_RIGHT_UPPER_ARM ].worldPosition += v * 0.2; + avatar.bone[ AVATAR_BONE_RIGHT_UPPER_ARM ].position += v * 0.2; } */ @@ -878,7 +885,7 @@ void Head::updateAvatarSkeleton() //------------------------------------------------------------------------ for (int b=0; b 0.0f ) + { + glm::vec3 springDirection = springVector / length; + + float force = ( length - avatar.bone[b].length ) * 0.01; + + avatar.bone[ b ].springyVelocity -= springDirection * force; + avatar.bone[ avatar.bone[b].parent ].springyVelocity += springDirection * force; + } + + avatar.bone[b].springyVelocity += ( avatar.bone[b].position - avatar.bone[b].springyPosition ) * 0.01f; + avatar.bone[b].springyVelocity *= 0.8; + avatar.bone[b].springyPosition += avatar.bone[b].springyVelocity; + } + } +} + + //------------------------------- float Head::getAvatarYaw() { @@ -901,9 +955,9 @@ glm::vec3 Head::getAvatarHeadLookatDirection() { return glm::vec3 ( - avatar.bone[ AVATAR_BONE_HEAD ].worldOrientation.getFront().x, - avatar.bone[ AVATAR_BONE_HEAD ].worldOrientation.getFront().y, - avatar.bone[ AVATAR_BONE_HEAD ].worldOrientation.getFront().z + avatar.bone[ AVATAR_BONE_HEAD ].orientation.getFront().x, + avatar.bone[ AVATAR_BONE_HEAD ].orientation.getFront().y, + avatar.bone[ AVATAR_BONE_HEAD ].orientation.getFront().z ); } @@ -915,9 +969,9 @@ void Head::updateHandMovement() //---------------------------------------------------------------- // adjust right hand and elbow according to hand offset //---------------------------------------------------------------- - avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition += handOffset; - glm::vec3 armVector = avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition; - armVector -= avatar.bone[ AVATAR_BONE_RIGHT_SHOULDER ].worldPosition; + avatar.bone[ AVATAR_BONE_RIGHT_HAND ].position += handOffset; + glm::vec3 armVector = avatar.bone[ AVATAR_BONE_RIGHT_HAND ].position; + armVector -= avatar.bone[ AVATAR_BONE_RIGHT_SHOULDER ].position; //------------------------------------------------------------------------------- // test to see if right hand is being dragged beyond maximum arm length @@ -932,32 +986,32 @@ void Head::updateHandMovement() //------------------------------------------------------------------------------- // reset right hand to be constrained to maximum arm length //------------------------------------------------------------------------------- - avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition = avatar.bone[ AVATAR_BONE_RIGHT_SHOULDER ].worldPosition; + avatar.bone[ AVATAR_BONE_RIGHT_HAND ].position = avatar.bone[ AVATAR_BONE_RIGHT_SHOULDER ].position; glm::vec3 armNormal = armVector / distance; armVector = armNormal * (float)avatar.maxArmLength; distance = avatar.maxArmLength; - glm::vec3 constrainedPosition = avatar.bone[ AVATAR_BONE_RIGHT_SHOULDER ].worldPosition; + glm::vec3 constrainedPosition = avatar.bone[ AVATAR_BONE_RIGHT_SHOULDER ].position; constrainedPosition += armVector; - avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition = constrainedPosition; + avatar.bone[ AVATAR_BONE_RIGHT_HAND ].position = constrainedPosition; } //----------------------------------------------------------------------------- // set elbow position //----------------------------------------------------------------------------- - glm::vec3 newElbowPosition = avatar.bone[ AVATAR_BONE_RIGHT_SHOULDER ].worldPosition; + glm::vec3 newElbowPosition = avatar.bone[ AVATAR_BONE_RIGHT_SHOULDER ].position; newElbowPosition += armVector * (float)ONE_HALF; glm::vec3 perpendicular = glm::vec3( -armVector.y, armVector.x, armVector.z ); newElbowPosition += perpendicular * (float)( ( 1.0 - ( avatar.maxArmLength / distance ) ) * ONE_HALF ); - avatar.bone[ AVATAR_BONE_RIGHT_UPPER_ARM ].worldPosition = newElbowPosition; + avatar.bone[ AVATAR_BONE_RIGHT_UPPER_ARM ].position = newElbowPosition; //----------------------------------------------------------------------------- // set wrist position //----------------------------------------------------------------------------- - glm::vec3 vv( avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition ); - vv -= avatar.bone[ AVATAR_BONE_RIGHT_UPPER_ARM ].worldPosition; - glm::vec3 newWristPosition = avatar.bone[ AVATAR_BONE_RIGHT_UPPER_ARM ].worldPosition; + glm::vec3 vv( avatar.bone[ AVATAR_BONE_RIGHT_HAND ].position ); + vv -= avatar.bone[ AVATAR_BONE_RIGHT_UPPER_ARM ].position; + glm::vec3 newWristPosition = avatar.bone[ AVATAR_BONE_RIGHT_UPPER_ARM ].position; newWristPosition += vv * 0.7f; - avatar.bone[ AVATAR_BONE_RIGHT_FOREARM ].worldPosition = newWristPosition; + avatar.bone[ AVATAR_BONE_RIGHT_FOREARM ].position = newWristPosition; } @@ -966,68 +1020,96 @@ void Head::updateHandMovement() //----------------------------------------- void Head::renderBody() { - glColor3fv(skinColor); - //----------------------------------------- - // Render bones as spheres + // Render bone positions as spheres //----------------------------------------- for (int b=0; bgetPos().x, hand->getPos().y, hand->getPos().z); //previous to Ventrella change - avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition.x, - avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition.y, - avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition.z ); // Ventrella change + avatar.bone[ AVATAR_BONE_RIGHT_HAND ].position.x, + avatar.bone[ AVATAR_BONE_RIGHT_HAND ].position.y, + avatar.bone[ AVATAR_BONE_RIGHT_HAND ].position.z ); // Ventrella change return strlen(data); } @@ -1058,7 +1140,7 @@ int Head::getBroadcastData(char* data) //--------------------------------------------------- void Head::parseData(void *data, int size) { - //glm::vec3 pos;//( (glm::vec3)avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition ); + //glm::vec3 pos;//( (glm::vec3)avatar.bone[ AVATAR_BONE_RIGHT_HAND ].position ); // parse head data for this agent glm::vec3 handPos( 0,0,0 ); @@ -1069,9 +1151,9 @@ void Head::parseData(void *data, int size) &Pitch, &Yaw, &Roll, &position.x, &position.y, &position.z, &loudness, &averageLoudness, - &avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition.x, - &avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition.y, - &avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition.z + &avatar.bone[ AVATAR_BONE_RIGHT_HAND ].position.x, + &avatar.bone[ AVATAR_BONE_RIGHT_HAND ].position.y, + &avatar.bone[ AVATAR_BONE_RIGHT_HAND ].position.z ); if (glm::length(handPos) > 0.0) hand->setPos(handPos); diff --git a/interface/src/Head.h b/interface/src/Head.h index bf8318ef61..74c69492a9 100644 --- a/interface/src/Head.h +++ b/interface/src/Head.h @@ -104,13 +104,14 @@ enum AvatarBones struct AvatarBone { AvatarBones parent; // which bone is this bone connected to? - glm::vec3 worldPosition; // the position at the "end" of the bone + glm::vec3 position; // the position at the "end" of the bone glm::vec3 defaultPosePosition; // the parent relative position when the avatar is in the "T-pose" - glm::dvec3 velocity; // pertains to spring physics + glm::vec3 springyPosition; // used for special effects (a 'flexible' variant of position) + glm::dvec3 springyVelocity; // used for special effects ( the velocity of the springy position) float yaw; // the yaw Euler angle of the bone rotation off the parent float pitch; // the pitch Euler angle of the bone rotation off the parent float roll; // the roll Euler angle of the bone rotation off the parent - Orientation worldOrientation; // three orthogonal normals determined by yaw, pitch, roll + Orientation orientation; // three orthogonal normals determined by yaw, pitch, roll float length; // the length of the bone }; @@ -246,6 +247,7 @@ class Head : public AgentData { void initializeAvatar(); void updateAvatarSkeleton(); + void updateAvatarSprings(); void calculateBoneLengths(); void readSensors(); From fc122f23d28dbd460016eb7cc2ff748e0c65a01f Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 10 Apr 2013 01:32:01 -0700 Subject: [PATCH 08/10] added first cut at view frustum debuging code --- interface/src/main.cpp | 148 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 387a9b7065..531b0b50f8 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -511,6 +511,151 @@ void simulateHead(float frametime) } } +// These handy operators should probably go somewhere else, I'm surprised they don't +// already exist somewhere in OpenGL. Maybe someone can point me to them if they do exist! +glm::vec3 operator* (float lhs, const glm::vec3& rhs) +{ + glm::vec3 result = rhs; + result.x *= lhs; + result.y *= lhs; + result.z *= lhs; + return result; +} + +glm::vec3 operator* (const glm::vec3& lhs, float rhs) +{ + glm::vec3 result = lhs; + result.x *= rhs; + result.y *= rhs; + result.z *= rhs; + return result; +} + +// XXXBHG - this code is not yet working. This is here to help Jeffery debug getAvatarHeadLookatDirection() +// The code will draw a yellow line from the avatar's position to the origin, +// It also attempts to draw a cyan line from the avatar to 2 meters in front of the avatar in the direction +// it's looking. But that's not working right now. +void render_view_frustum() { + + //printf("frustum low.x=%f, low.y=%f, low.z=%f, high.x=%f, high.y=%f, high.z=%f\n",low.x,low.y,low.z,high.x,high.y,high.z); + + + // p – the camera position + // d – a vector with the direction of the camera's view ray. In here it is assumed that this vector has been normalized + // nearDist – the distance from the camera to the near plane + // nearHeight – the height of the near plane + // nearWidth – the width of the near plane + // farDist – the distance from the camera to the far plane + // farHeight – the height of the far plane + // farWidth – the width of the far plane + + glm::vec3 cameraPosition = ::myHead.getPos()*-1.0; // We need to flip the sign to make this work. + glm::vec3 cameraDirection = ::myHead.getAvatarHeadLookatDirection()*-1.0; // gak! Not sure if this is correct! + + // this is a temporary test, create a vertice that's 2 meters in front of avatar in direction their looking + glm::vec3 lookingAt = cameraPosition+(cameraDirection*2.0); + + // Some debug lines. + glDisable(GL_LIGHTING); + glColor4f(1.0, 1.0, 1.0, 1.0); + glLineWidth(1.0); + glBegin(GL_LINES); + + // line from avatar to the origin -- this one is working. + glColor3f(1,1,0); + glVertex3f(cameraPosition.x,cameraPosition.y,cameraPosition.z); + glVertex3f(0,0,0); + + // line from avatar to 2 meters in front of avatar -- this is NOT working + glColor3f(0,1,1); + glVertex3f(cameraPosition.x,cameraPosition.y,cameraPosition.z); + glVertex3f(lookingAt.x,lookingAt.y,lookingAt.z); + + /* + // Not yet ready for this... + glm::vec3 up = glm::vec3(0.0,1.0,0.0); + glm::vec3 right = glm::vec3(1.0,0.0,0.0); + float nearDist = 0.1; + float farDist = 500.0; + float fov = (0.7854f*2.0); // 45 deg * 2 = 90 deg + + float screenWidth = 800.0; // hack! We need to make this eventually be the correct height/width + float screenHeight = 600.0; + float ratio = screenWidth/screenHeight; + float nearHeight = 2 * tan(fov / 2) * nearDist; + float nearWidth = nearHeight * ratio; + float farHeight = 2 * tan(fov / 2) * farDist; + float farWidth = farHeight * ratio; + + glm::vec3 farCenter = cameraPosition+cameraDirection*farDist; + glm::vec3 farTopLeft = farCenter + (up*farHeight*0.5) - (right*farWidth*0.5); + glm::vec3 farTopRight = farCenter + (up*farHeight*0.5) + (right*farWidth*0.5); + glm::vec3 farBottomLeft = farCenter - (up*farHeight*0.5) - (right*farWidth*0.5); + glm::vec3 farBottomRight = farCenter - (up*farHeight*0.5) + (right*farWidth*0.5); + + glm::vec3 nearCenter = cameraPosition+cameraDirection*nearDist; + glm::vec3 nearTopLeft = nearCenter + (up*nearHeight*0.5) - (right*nearWidth*0.5); + glm::vec3 nearTopRight = nearCenter + (up*nearHeight*0.5) + (right*nearWidth*0.5); + glm::vec3 nearBottomLeft = nearCenter - (up*nearHeight*0.5) - (right*nearWidth*0.5); + glm::vec3 nearBottomRight = nearCenter - (up*nearHeight*0.5) + (right*nearWidth*0.5); + */ + + +/* + glColor3f(1,1,1); + + // near plane - bottom edge + glVertex3f(low.x,low.y,low.z); + glVertex3f(high.x,low.y,low.z); + + // near plane - top edge + glVertex3f(low.x,high.y,low.z); + glVertex3f(high.x,high.y,low.z); + + // near plane - right edge + glVertex3f(low.x,high.y,low.z); + glVertex3f(low.x,low.y,low.z); + + // near plane - left edge + glVertex3f(high.x,high.y,low.z); + glVertex3f(high.x,low.y,low.z); + + // far plane - bottom edge + glVertex3f(low.x,low.y,high.z); + glVertex3f(high.x,low.y,high.z); + + // far plane - top edge + glVertex3f(low.x,high.y,high.z); + glVertex3f(high.x,high.y,high.z); + + // far plane - right edge + glVertex3f(low.x,high.y,high.z); + glVertex3f(low.x,low.y,high.z); + + // far plane - left edge + glVertex3f(high.x,high.y,high.z); + glVertex3f(high.x,low.y,high.z); + + // right plane - bottom edge - near to distant + glVertex3f(low.x,low.y,low.z); + glVertex3f(low.x,low.y,high.z); + + // right plane - top edge - near to distant + glVertex3f(low.x,high.y,low.z); + glVertex3f(low.x,high.y,high.z); + + // left plane - bottom edge - near to distant + glVertex3f(high.x,low.y,low.z); + glVertex3f(high.x,low.y,high.z); + + // left plane - top edge - near to distant + glVertex3f(high.x,high.y,low.z); + glVertex3f(high.x,high.y,high.z); +*/ + glEnd(); +} + + void display(void) { //printf( "avatar head lookat = %f, %f, %f\n", myHead.getAvatarHeadLookatDirection().x, myHead.getAvatarHeadLookatDirection().y, myHead.getAvatarHeadLookatDirection().z ); @@ -637,6 +782,9 @@ void display(void) // Render the world box if (!displayHead && statsOn) render_world_box(); + + // brad's frustum for debugging + render_view_frustum(); //--------------------------------- From 9ce03eb27a2f52649e6a0d2a8f1e6fd61877cee3 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 10 Apr 2013 09:27:14 -0700 Subject: [PATCH 09/10] explicit initialization of audioSocket to NULL in AudioData constructor --- interface/src/AudioData.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/src/AudioData.cpp b/interface/src/AudioData.cpp index a48bfff299..600cfa8d4d 100644 --- a/interface/src/AudioData.cpp +++ b/interface/src/AudioData.cpp @@ -20,6 +20,7 @@ AudioData::AudioData() { jitterBuffer = 0; mixerLoopbackFlag = false; + audioSocket = NULL; } From 597f35db3d7fe84fb5cfdf22f1990a84b175ebea Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 10 Apr 2013 09:39:43 -0700 Subject: [PATCH 10/10] moved vector math helpers to Utils.cpp/h --- interface/src/Util.cpp | 23 +++++++++++++++++++++++ interface/src/Util.h | 4 ++++ interface/src/main.cpp | 20 -------------------- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/interface/src/Util.cpp b/interface/src/Util.cpp index 03a11e3308..a670f48f9e 100644 --- a/interface/src/Util.cpp +++ b/interface/src/Util.cpp @@ -140,3 +140,26 @@ void drawvec3(int x, int y, float scale, float rotate, float thick, int mono, gl glPopMatrix(); } + +// XXXBHG - These handy operators should probably go somewhere else, I'm surprised they don't +// already exist somewhere in OpenGL. Maybe someone can point me to them if they do exist! +glm::vec3 operator* (float lhs, const glm::vec3& rhs) +{ + glm::vec3 result = rhs; + result.x *= lhs; + result.y *= lhs; + result.z *= lhs; + return result; +} + +// XXXBHG - These handy operators should probably go somewhere else, I'm surprised they don't +// already exist somewhere in OpenGL. Maybe someone can point me to them if they do exist! +glm::vec3 operator* (const glm::vec3& lhs, float rhs) +{ + glm::vec3 result = lhs; + result.x *= rhs; + result.y *= rhs; + result.z *= rhs; + return result; +} + diff --git a/interface/src/Util.h b/interface/src/Util.h index c5a02df5aa..8efe6f549e 100644 --- a/interface/src/Util.h +++ b/interface/src/Util.h @@ -48,4 +48,8 @@ void drawvec3(int x, int y, float scale, float rotate, float thick, int mono, gl double diffclock(timeval *clock1,timeval *clock2); +glm::vec3 operator* (float lhs, const glm::vec3& rhs); +glm::vec3 operator* (const glm::vec3& lhs, float rhs); + + #endif diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 531b0b50f8..00cd8d7bfc 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -511,26 +511,6 @@ void simulateHead(float frametime) } } -// These handy operators should probably go somewhere else, I'm surprised they don't -// already exist somewhere in OpenGL. Maybe someone can point me to them if they do exist! -glm::vec3 operator* (float lhs, const glm::vec3& rhs) -{ - glm::vec3 result = rhs; - result.x *= lhs; - result.y *= lhs; - result.z *= lhs; - return result; -} - -glm::vec3 operator* (const glm::vec3& lhs, float rhs) -{ - glm::vec3 result = lhs; - result.x *= rhs; - result.y *= rhs; - result.z *= rhs; - return result; -} - // XXXBHG - this code is not yet working. This is here to help Jeffery debug getAvatarHeadLookatDirection() // The code will draw a yellow line from the avatar's position to the origin, // It also attempts to draw a cyan line from the avatar to 2 meters in front of the avatar in the direction