diff --git a/.DS_Store b/.DS_Store index 8ac4e49dec..70c620c8f2 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/SerialInterface.cpp b/SerialInterface.cpp index 5ffdf43372..93e58e73df 100644 --- a/SerialInterface.cpp +++ b/SerialInterface.cpp @@ -72,7 +72,8 @@ int read_sensors(int first_measurement, float * avg_adc_channels, int * adc_chan // At end - Extract value from string to variables if (serial_buffer[0] != 'p') { - sscanf(serial_buffer, "%d %d %d %d", &adc_channels[0], + sscanf(serial_buffer, "%d %d %d %d", + &adc_channels[0], &adc_channels[1], &adc_channels[2], &adc_channels[3]); diff --git a/hand.cpp b/hand.cpp new file mode 100644 index 0000000000..afb1d71256 --- /dev/null +++ b/hand.cpp @@ -0,0 +1,59 @@ +// +// hand.cpp +// interface +// +// Created by Philip Rosedale on 10/13/12. +// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// + +#include "hand.h" + +Hand::Hand() +{ + reset(); + noise = 0; +} + +void Hand::render() +{ + glEnable(GL_DEPTH_TEST); + glPushMatrix(); + glLoadIdentity(); + glColor3f(0.5, 0.5, 0.5); + glBegin(GL_LINES); + glVertex3f(-0.05, -0.5, 0.0); + glVertex3f(position.x, position.y, position.z); + glVertex3f(0.05, -0.5, 0.0); + glVertex3f(position.x, position.y, position.z); + glEnd(); + glTranslatef(position.x, position.y, position.z); + glutSolidSphere(0.2, 15, 15); + glPopMatrix(); +} + +void Hand::reset() +{ + position.x = 0.0; + position.y = 0.0; + position.z = -7.0; + velocity.x = velocity.y = velocity.z = 0; +} + +void Hand::simulate(float deltaTime) +{ + position += velocity*deltaTime; + + velocity *= (1.f - 4.0*deltaTime); + + if ((noise) && (randFloat() < 0.1)) + { + velocity.x += (randFloat() - 0.5)*noise; + velocity.y += (randFloat() - 0.5)*noise; + velocity.z += (randFloat() - 0.5)*noise; + + } + //position.x += (randFloat() - 0.5)/20.0; + //position.y += (randFloat() - 0.5)/20.0; + //position.z += (randFloat() - 0.5)/20.0; + +} \ No newline at end of file diff --git a/hand.h b/hand.h new file mode 100644 index 0000000000..c90877bfeb --- /dev/null +++ b/hand.h @@ -0,0 +1,36 @@ +// +// hand.h +// interface +// +// Created by Philip Rosedale on 10/13/12. +// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// + +#ifndef interface_hand_h +#define interface_hand_h + +#include "glm/glm.hpp" +#include +#include "util.h" +#include "field.h" +#include "world.h" +#include + +const float RADIUS_RANGE = 10.0; + +class Hand { +public: + Hand(void); + void simulate (float deltaTime); + void render (); + void reset (); + void setNoise (float mag) { noise = mag; }; + void addVel (glm::vec3 add) { velocity += add; }; +private: + glm::vec3 position, velocity; + float noise; + +}; + + +#endif diff --git a/head.cpp b/head.cpp index 8ff43dc306..9d429ddd3a 100644 --- a/head.cpp +++ b/head.cpp @@ -19,8 +19,6 @@ float BrowPitchAngle[3] = {-70, -60, -50}; float eyeColor[3] = {1,1,1}; float MouthWidthChoices[3] = {0.5, 0.77, 0.3}; - -int randNoise = 0; float browWidth = 0.8; float browThickness = 0.16; @@ -45,6 +43,7 @@ Head::Head() PitchTarget = YawTarget = 0; NoiseEnvelope = 1.0; PupilConverge = 2.1; + setNoise(0); } void Head::reset() @@ -57,7 +56,7 @@ void Head::reset() void Head::simulate(float deltaTime) { - if (!randNoise) + if (!noise) { // Decay back toward center Pitch *= (1.f - DECAY*deltaTime); @@ -71,7 +70,7 @@ void Head::simulate(float deltaTime) Roll *= (1.f - DECAY*deltaTime); } - if (randNoise) + if (noise) { Pitch += (randFloat() - 0.5)*0.05*NoiseEnvelope; Yaw += (randFloat() - 0.5)*0.1*NoiseEnvelope; @@ -116,87 +115,88 @@ void Head::render() glEnable(GL_DEPTH_TEST); glPushMatrix(); - glTranslatef(0.f, 0.f, -7.f); - glRotatef(Yaw/2.0, 0, 1, 0); - glRotatef(Pitch/2.0, 1, 0, 0); - glRotatef(Roll/2.0, 0, 0, 1); - - // Overall scale of head - glScalef(2.0, 2.0, 2.0); - glColor3fv(skinColor); - - // Head - glutSolidSphere(1, 15, 15); - - // Ears - glPushMatrix(); - glTranslatef(1, 0, 0); - for(side = 0; side < 2; side++) - { + glLoadIdentity(); + glTranslatef(0.f, 0.f, -7.f); + glRotatef(Yaw/2.0, 0, 1, 0); + glRotatef(Pitch/2.0, 1, 0, 0); + glRotatef(Roll/2.0, 0, 0, 1); + + // Overall scale of head + glScalef(2.0, 2.0, 2.0); + glColor3fv(skinColor); + + // Head + glutSolidSphere(1, 15, 15); + + // Ears glPushMatrix(); - glScalef(0.5, 0.75, 1.0); - glutSolidSphere(0.5, 15, 15); + glTranslatef(1, 0, 0); + for(side = 0; side < 2; side++) + { + glPushMatrix(); + glScalef(0.5, 0.75, 1.0); + glutSolidSphere(0.5, 15, 15); + glPopMatrix(); + glTranslatef(-2, 0, 0); + } glPopMatrix(); - glTranslatef(-2, 0, 0); - } - glPopMatrix(); - + - // Eyebrows - glPushMatrix(); - glTranslatef(-interBrowDistance/2.0,0.4,0.45); - for(side = 0; side < 2; side++) - { - glColor3fv(browColor); + // Eyebrows glPushMatrix(); - glTranslatef(0, 0.4, 0); - glRotatef(EyebrowPitch[side]/2.0, 1, 0, 0); - glRotatef(EyebrowRoll[side]/2.0, 0, 0, 1); - glScalef(browWidth, browThickness, 1); - glutSolidCube(0.5); + glTranslatef(-interBrowDistance/2.0,0.4,0.45); + for(side = 0; side < 2; side++) + { + glColor3fv(browColor); + glPushMatrix(); + glTranslatef(0, 0.4, 0); + glRotatef(EyebrowPitch[side]/2.0, 1, 0, 0); + glRotatef(EyebrowRoll[side]/2.0, 0, 0, 1); + glScalef(browWidth, browThickness, 1); + glutSolidCube(0.5); + glPopMatrix(); + glTranslatef(interBrowDistance, 0, 0); + } glPopMatrix(); - glTranslatef(interBrowDistance, 0, 0); - } - glPopMatrix(); - - // Mouth - glPushMatrix(); - glTranslatef(0,-0.3,0.75); - glColor3fv(mouthColor); - glRotatef(MouthPitch, 1, 0, 0); - glRotatef(MouthYaw, 0, 0, 1); - glScalef(MouthWidth, MouthHeight, 1); - glutSolidCube(0.5); - glPopMatrix(); - - glTranslatef(0, 1.0, 0); + + // Mouth + glPushMatrix(); + glTranslatef(0,-0.3,0.75); + glColor3fv(mouthColor); + glRotatef(MouthPitch, 1, 0, 0); + glRotatef(MouthYaw, 0, 0, 1); + glScalef(MouthWidth, MouthHeight, 1); + glutSolidCube(0.5); + glPopMatrix(); + + glTranslatef(0, 1.0, 0); - // Right Eye - glTranslatef(-0.25,-0.5,0.7); - glColor3fv(eyeColor); - glutSolidSphere(0.25, 15, 15); - // Right Pupil - glPushMatrix(); - glRotatef(EyeballPitch[1], 1, 0, 0); - glRotatef(EyeballYaw[1] + PupilConverge, 0, 1, 0); - glTranslatef(0,0,.25); - glColor3f(0,0,0); - glutSolidSphere(PupilSize, 10, 10); - glPopMatrix(); - // Left Eye - glColor3fv(eyeColor); - glTranslatef(interPupilDistance, 0, 0); - glutSolidSphere(0.25f, 15, 15); - // Left Pupil - glPushMatrix(); - glRotatef(EyeballPitch[0], 1, 0, 0); - glRotatef(EyeballYaw[0] - PupilConverge, 0, 1, 0); - glTranslatef(0,0,.25); - glColor3f(0,0,0); - glutSolidSphere(PupilSize, 10, 10); - glPopMatrix(); + // Right Eye + glTranslatef(-0.25,-0.5,0.7); + glColor3fv(eyeColor); + glutSolidSphere(0.25, 15, 15); + // Right Pupil + glPushMatrix(); + glRotatef(EyeballPitch[1], 1, 0, 0); + glRotatef(EyeballYaw[1] + PupilConverge, 0, 1, 0); + glTranslatef(0,0,.25); + glColor3f(0,0,0); + glutSolidSphere(PupilSize, 10, 10); + glPopMatrix(); + // Left Eye + glColor3fv(eyeColor); + glTranslatef(interPupilDistance, 0, 0); + glutSolidSphere(0.25f, 15, 15); + // Left Pupil + glPushMatrix(); + glRotatef(EyeballPitch[0], 1, 0, 0); + glRotatef(EyeballYaw[0] - PupilConverge, 0, 1, 0); + glTranslatef(0,0,.25); + glColor3f(0,0,0); + glutSolidSphere(PupilSize, 10, 10); + glPopMatrix(); - + glPopMatrix(); } diff --git a/head.h b/head.h index 1e20c9bf95..f1318105d7 100644 --- a/head.h +++ b/head.h @@ -15,6 +15,7 @@ #include class Head { + float noise; float Pitch; float Yaw; float Roll; @@ -44,6 +45,7 @@ class Head { public: Head(void); void reset(); + void setNoise (float mag) { noise = mag; } void setPitch(float p) {Pitch = p; } void setYaw(float y) {Yaw = y; } void addPitch(float p) {Pitch -= p; } diff --git a/interface.xcodeproj/project.pbxproj b/interface.xcodeproj/project.pbxproj index 120d7e77e7..c61e0141b8 100644 --- a/interface.xcodeproj/project.pbxproj +++ b/interface.xcodeproj/project.pbxproj @@ -23,6 +23,7 @@ D4EE3BBE15E7465700EE4C89 /* field.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D4EE3BBD15E7465700EE4C89 /* field.cpp */; }; D4EE3BC215E761B000EE4C89 /* util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D4EE3BC115E761B000EE4C89 /* util.cpp */; }; D4EE3BC615EBD93600EE4C89 /* network.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D4EE3BC515EBD93400EE4C89 /* network.cpp */; }; + D4EFE3D0162A2DA000DC5C59 /* hand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D4EFE3CF162A2DA000DC5C59 /* hand.cpp */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -64,6 +65,8 @@ D4EE3BC315E7625000EE4C89 /* util.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = util.h; sourceTree = ""; }; D4EE3BC415EBD90C00EE4C89 /* network.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = network.h; sourceTree = ""; }; D4EE3BC515EBD93400EE4C89 /* network.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = network.cpp; sourceTree = ""; }; + D4EFE3CE162A2D7300DC5C59 /* hand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hand.h; sourceTree = ""; }; + D4EFE3CF162A2DA000DC5C59 /* hand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hand.cpp; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -113,6 +116,8 @@ D4EE3BBD15E7465700EE4C89 /* field.cpp */, D4B96D4715FF966200CE6E8B /* head.h */, D4B96D4815FF967C00CE6E8B /* head.cpp */, + D4EFE3CE162A2D7300DC5C59 /* hand.h */, + D4EFE3CF162A2DA000DC5C59 /* hand.cpp */, D4EE3BBF15E7467600EE4C89 /* field.h */, D4EE3BBA15E45FFE00EE4C89 /* SerialInterface.h */, D4EE3BBB15E45FFE00EE4C89 /* SerialInterface.cpp */, @@ -201,6 +206,7 @@ B6BDADD415F4085B002A07DF /* audio.cpp in Sources */, B6BDAE4415F6BE53002A07DF /* particle.cpp in Sources */, D4B96D4915FF967C00CE6E8B /* head.cpp in Sources */, + D4EFE3D0162A2DA000DC5C59 /* hand.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/interface.xcodeproj/project.xcworkspace/xcuserdata/philip.xcuserdatad/UserInterfaceState.xcuserstate b/interface.xcodeproj/project.xcworkspace/xcuserdata/philip.xcuserdatad/UserInterfaceState.xcuserstate index 0f0eea4065..0482ce5eb2 100644 Binary files a/interface.xcodeproj/project.xcworkspace/xcuserdata/philip.xcuserdatad/UserInterfaceState.xcuserstate and b/interface.xcodeproj/project.xcworkspace/xcuserdata/philip.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/interface.xcodeproj/xcuserdata/philip.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/interface.xcodeproj/xcuserdata/philip.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist index e77afab681..3bc997fffe 100644 --- a/interface.xcodeproj/xcuserdata/philip.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist +++ b/interface.xcodeproj/xcuserdata/philip.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -19,11 +19,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "main.cpp" - timestampString = "371847418.921205" + timestampString = "371943667.487943" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "312" - endingLineNumber = "312" + startingLineNumber = "325" + endingLineNumber = "325" landmarkName = "init(void)" landmarkType = "7"> diff --git a/main.cpp b/main.cpp index 768db41083..e632210489 100644 --- a/main.cpp +++ b/main.cpp @@ -42,6 +42,7 @@ #include "network.h" #include "audio.h" #include "head.h" +#include "hand.h" //TGAImg Img; @@ -52,6 +53,8 @@ int serial_on = 0; // Are we using serial port for I/O? timeval begin_ping, end_ping; timeval timer_start, timer_end; +timeval last_frame; + double elapsedTime; // Socket operation stuff @@ -77,6 +80,7 @@ double ping = 0; #define TEXT_HEIGHT 14 Head myHead; // The rendered head of oneself or others +Hand myHand; // My hand (used to manipulate things in world) // Test data for creating fields that affect particles // If the simulation 'world' is a box with 10M boundaries, the offset to a field cell is given by: @@ -88,8 +92,9 @@ Head myHead; // The rendered head of oneself or others // y = (int)(i % 100 / 10) // x = (int)(i % 10) +#define RENDER_FRAME_MSECS 10 #define SLEEP 0 -#define NUM_TRIS 100000 +#define NUM_TRIS 20000 //000 struct { float vertices[NUM_TRIS * 9]; float normals [NUM_TRIS * 3]; @@ -121,7 +126,10 @@ float fwd_vel = 0.0f; #define MAX_FILE_CHARS 100000 // Biggest file size that can be read to the system int stats_on = 1; // Whether to show onscreen text overlay with stats -int noise_on = 0; // Whether to fire randomly + +int noise_on = 0; // Whether to add random noise +float noise = 1.0; // Overall magnitude scaling for random noise levels + int step_on = 0; int display_levels = 1; int display_head = 0; @@ -139,13 +147,23 @@ int speed; float mag_imbalance = 0.f; -int adc_channels[4]; // Measured input values for gyros, accelerometers +// +// Serial I/O channel mapping: +// +// 0 Head Gyro Pitch +// 1 Head Gyro Yaw +// 2 Head Accelerometer X +// 3 Head Accelerometer Z +// + +int adc_channels[4]; float avg_adc_channels[4]; - int first_measurement = 1; - -int framecount = 0; // Measure timing for framerate int samplecount = 0; + +// Frame rate Measurement + +int framecount = 0; float FPS = 120.f; void output(int x, int y, char *string) @@ -243,6 +261,11 @@ void init(void) field_init(); printf( "Field Initilialized.\n" ); + if (noise_on) + { + myHand.setNoise(noise); + myHead.setNoise(noise); + } /* const float FIELD_SCALE = 0.00005; @@ -329,6 +352,7 @@ void init(void) } gettimeofday(&timer_start, NULL); + gettimeofday(&last_frame, NULL); } void terminate () { @@ -437,14 +461,15 @@ void reset_sensors() head_mouse_x = WIDTH/2; head_mouse_y = HEIGHT/2; myHead.reset(); + myHand.reset(); if (serial_on) read_sensors(1, &avg_adc_channels[0], &adc_channels[0]); } void update_pos(float frametime) // Using serial data, update avatar/render position and angles { - float measured_yaw_rate = adc_channels[1] - avg_adc_channels[1]; float measured_pitch_rate = adc_channels[0] - avg_adc_channels[0]; + float measured_yaw_rate = adc_channels[1] - avg_adc_channels[1]; float measured_lateral_accel = adc_channels[2] - avg_adc_channels[2]; float measured_fwd_accel = avg_adc_channels[3] - adc_channels[3]; @@ -554,7 +579,6 @@ void display(void) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - glPushMatrix(); glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); @@ -563,7 +587,6 @@ void display(void) glLightfv(GL_LIGHT0, GL_POSITION, light_position0); GLfloat ambient_color[] = { 0.125, 0.305, 0.5 }; glLightfv(GL_LIGHT0, GL_AMBIENT, ambient_color); - //GLfloat diffuse_color[] = { 1.0, 0.84, 0.66}; GLfloat diffuse_color[] = { 0.5, 0.42, 0.33 }; glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse_color); GLfloat specular_color[] = { 1.0, 1.0, 1.0, 1.0}; @@ -571,10 +594,7 @@ void display(void) glMaterialfv(GL_FRONT, GL_SPECULAR, specular_color); glMateriali(GL_FRONT, GL_SHININESS, 96); - - - glPushMatrix(); - + // Rotate, translate to camera location glRotatef(render_pitch, 1, 0, 0); glRotatef(render_yaw, 0, 1, 0); @@ -620,79 +640,77 @@ void display(void) render_world_box(); - glPopMatrix(); // Display floating head in front of viewer if (display_head) { myHead.render(); } + myHand.render(); - glEnd(); - glPopMatrix(); // Render 2D overlay: I/O level bar graphs and text glMatrixMode(GL_PROJECTION); glPushMatrix(); - glLoadIdentity(); - gluOrtho2D(0, WIDTH, HEIGHT, 0); - glDisable(GL_DEPTH_TEST); - glDisable(GL_LIGHTING); + glLoadIdentity(); + gluOrtho2D(0, WIDTH, HEIGHT, 0); + glDisable(GL_DEPTH_TEST); + glDisable(GL_LIGHTING); - if (mouse_pressed == 1) - { - glPointSize(20.f); - glColor3f(1,1,1); - glEnable(GL_POINT_SMOOTH); - glBegin(GL_POINTS); - glVertex2f(target_x, target_y); - glEnd(); - } - if (display_head_mouse) - { - glPointSize(20.f); - glColor4f(1.0, 1.0, 0.0, 0.8); - glEnable(GL_POINT_SMOOTH); - glBegin(GL_POINTS); - glVertex2f(head_mouse_x, head_mouse_y); - glEnd(); - } - /* - if (display_ping) - { - // Draw a green dot to indicate receipt of ping signal - glPointSize(10.f); - if (display_ping == 2) - glColor4f(1.f, 0.f, 0.f, 1.f); - else - glColor4f(0.f, 1.f, 0.f, 1.f); - glBegin(GL_POINTS); - glVertex2f(50, 400); - glEnd(); - display_ping = 0; - } - */ - if (display_levels) - { - glColor4f(1.f, 1.f, 1.f, 1.f); - glBegin(GL_LINES); - glVertex2f(10, HEIGHT*0.95); - glVertex2f(10, HEIGHT*(0.25 + 0.75f*adc_channels[0]/4096)); - - glVertex2f(20, HEIGHT*0.95); - glVertex2f(20, HEIGHT*(0.25 + 0.75f*adc_channels[1]/4096)); - - glVertex2f(30, HEIGHT*0.95); - glVertex2f(30, HEIGHT*(0.25 + 0.75f*adc_channels[2]/4096)); - - glVertex2f(40, HEIGHT*0.95); - glVertex2f(40, HEIGHT*(0.25 + 0.75f*adc_channels[3]/4096)); - glEnd(); - - } + if (mouse_pressed == 1) + { + glPointSize(20.f); + glColor3f(1,1,1); + glEnable(GL_POINT_SMOOTH); + glBegin(GL_POINTS); + glVertex2f(target_x, target_y); + glEnd(); + } + if (display_head_mouse) + { + glPointSize(20.f); + glColor4f(1.0, 1.0, 0.0, 0.8); + glEnable(GL_POINT_SMOOTH); + glBegin(GL_POINTS); + glVertex2f(head_mouse_x, head_mouse_y); + glEnd(); + } + /* + if (display_ping) + { + // Draw a green dot to indicate receipt of ping signal + glPointSize(10.f); + if (display_ping == 2) + glColor4f(1.f, 0.f, 0.f, 1.f); + else + glColor4f(0.f, 1.f, 0.f, 1.f); + glBegin(GL_POINTS); + glVertex2f(50, 400); + glEnd(); + display_ping = 0; + } + */ + if (display_levels) + { + glColor4f(1.f, 1.f, 1.f, 1.f); + glBegin(GL_LINES); + glVertex2f(10, HEIGHT*0.95); + glVertex2f(10, HEIGHT*(0.25 + 0.75f*adc_channels[0]/4096)); + + glVertex2f(20, HEIGHT*0.95); + glVertex2f(20, HEIGHT*(0.25 + 0.75f*adc_channels[1]/4096)); + + glVertex2f(30, HEIGHT*0.95); + glVertex2f(30, HEIGHT*(0.25 + 0.75f*adc_channels[2]/4096)); + + glVertex2f(40, HEIGHT*0.95); + glVertex2f(40, HEIGHT*(0.25 + 0.75f*adc_channels[3]/4096)); + glEnd(); + + } - if (stats_on) display_stats(); + if (stats_on) display_stats(); glPopMatrix(); glutSwapBuffers(); @@ -707,7 +725,21 @@ void key(unsigned char k, int x, int y) if (k == 'q') ::terminate(); if (k == '/') stats_on = !stats_on; // toggle stats - if (k == 'n') noise_on = !noise_on; // toggle random mutation + if (k == 'n') + { + noise_on = !noise_on; // Toggle noise + if (noise_on) + { + myHand.setNoise(noise); + myHead.setNoise(noise); + } + else + { + myHand.setNoise(0); + myHead.setNoise(0); + } + + } if (k == 'h') display_head = !display_head; if (k == 'f') display_field = !display_field; if (k == 'e') location[1] -= WORLD_SIZE/100.0; @@ -751,17 +783,31 @@ void read_network() void idle(void) { - if (!step_on) glutPostRedisplay(); + timeval check; + gettimeofday(&check, NULL); + + // Check and render display frame + if (diffclock(last_frame,check) > RENDER_FRAME_MSECS) + { + // Simulation + update_pos(1.f/FPS); + update_tris(); + myHead.simulate(1.f/FPS); + myHand.simulate(1.f/FPS); + + if (!step_on) glutPostRedisplay(); + last_frame = check; + } + + // Read network packets read_network(); + // Read serial data if (serial_on) samplecount += read_sensors(0, &avg_adc_channels[0], &adc_channels[0]); - update_pos(1.f/FPS); - update_tris(); - myHead.simulate(1.f/FPS); + if (SLEEP) { usleep(SLEEP); } - } void reshape(int width, int height)