From 13344f17747e01b0c7210a0cf2e42ce21c408616 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Fri, 16 Nov 2012 16:45:44 -0800 Subject: [PATCH 1/4] Head tweaks, audio toggle --- .DS_Store | Bin 6148 -> 6148 bytes SerialInterface.cpp | 18 +++--- SerialInterface.h | 4 +- hardware/head_hand/head_hand.pde | 42 ++++++++------ head.cpp | 20 ++++++- head.h | 5 ++ .../UserInterfaceState.xcuserstate | Bin 99083 -> 101447 bytes main.cpp | 54 ++++++++++++------ 8 files changed, 95 insertions(+), 48 deletions(-) diff --git a/.DS_Store b/.DS_Store index 361ab67534efb94b6dcd4539d6dc13010ead094e..8a70b493dd03a6d3d3fde862d0b4df0112a17ed6 100644 GIT binary patch delta 213 zcmZoMXfc=|#>B!ku~2NHo+2aH#(>?7i!U%UF>-C@VX9 0) { @@ -72,20 +76,18 @@ 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 %d %d %d %d", /* Needs to match Num Channels */ + sscanf(serial_buffer, "%d %d %d %d %d", /* Needs to match Num Channels */ &adc_channels[0], &adc_channels[1], &adc_channels[2], &adc_channels[3], - &adc_channels[4], - &adc_channels[5], - &adc_channels[6], - &adc_channels[7]); + &adc_channels[4] + ); for (int i = 0; i < NUM_CHANNELS; i++) { if (!first_measurement) - avg_adc_channels[i] = (1.f - AVG_RATE)*avg_adc_channels[i] + - AVG_RATE*(float)adc_channels[i]; + avg_adc_channels[i] = (1.f - AVG_RATE[i])*avg_adc_channels[i] + + AVG_RATE[i]*(float)adc_channels[i]; else { avg_adc_channels[i] = (float)adc_channels[i]; diff --git a/SerialInterface.h b/SerialInterface.h index e2bb82fde1..3fd7a2146e 100644 --- a/SerialInterface.h +++ b/SerialInterface.h @@ -9,7 +9,7 @@ int init_port (int baud); int read_sensors(int first_measurement, float * avg_adc_channels, int * adc_channels); -#define NUM_CHANNELS 8 -#define SERIAL_PORT_NAME "/dev/tty.usbmodem411" +#define NUM_CHANNELS 5 +#define SERIAL_PORT_NAME "/dev/tty.usbmodem641" #endif diff --git a/hardware/head_hand/head_hand.pde b/hardware/head_hand/head_hand.pde index 7e4bb60955..2dbdecdb86 100644 --- a/hardware/head_hand/head_hand.pde +++ b/hardware/head_hand/head_hand.pde @@ -4,16 +4,16 @@ Read a set of analog input lines and echo their readings over the serial port wi // ADC PIN MAPPINGS // -// 0, 1 = Head Pitch, Yaw gyro -// 2,3,4 = Head Accelerometer -// 10,11,12 = Hand Accelerometer +// 15,16 = Head Pitch, Yaw gyro +// 17,18,19 = Head Accelerometer -#define NUM_CHANNELS 8 -#define AVERAGE_COUNT 100 -#define TOGGLE_LED_SAMPLES 1000 -int inputPins[NUM_CHANNELS] = {0,1,2,3,4,10,11,12}; +#define NUM_CHANNELS 5 +#define MSECS_PER_SAMPLE 10 +int inputPins[NUM_CHANNELS] = {19,20,15,16,17}; + +unsigned int time; int measured[NUM_CHANNELS]; float accumulate[NUM_CHANNELS]; @@ -29,24 +29,30 @@ void setup() accumulate[i] = measured[i]; } pinMode(BOARD_LED_PIN, OUTPUT); + time = millis(); } void loop() { int i; - sampleCount++; + sampleCount++; for (i = 0; i < NUM_CHANNELS; i++) { - if (sampleCount % AVERAGE_COUNT == 0) { - measured[i] = accumulate[i] / AVERAGE_COUNT; - SerialUSB.print(measured[i]); - SerialUSB.print(" "); - accumulate[i] = 0; - } else { - accumulate[i] += analogRead(inputPins[i]); - } + accumulate[i] += analogRead(inputPins[i]); } - if (sampleCount % AVERAGE_COUNT == 0) SerialUSB.println(""); - if (sampleCount % TOGGLE_LED_SAMPLES == 0) toggleLED(); + if ((millis() - time) >= MSECS_PER_SAMPLE) { + time = millis(); + for (i = 0; i < NUM_CHANNELS; i++) { + measured[i] = accumulate[i] / sampleCount; + SerialUSB.print(measured[i]); + SerialUSB.print(" "); + accumulate[i] = 0; + } + //SerialUSB.print("("); + //SerialUSB.print(sampleCount); + //SerialUSB.print(")"); + SerialUSB.println(""); + sampleCount = 0; + } } diff --git a/head.cpp b/head.cpp index bf1478db02..bb0e71d010 100644 --- a/head.cpp +++ b/head.cpp @@ -43,6 +43,8 @@ Head::Head() PitchTarget = YawTarget = 0; NoiseEnvelope = 1.0; PupilConverge = 2.1; + leanForward = 0.0; + leanSideways = 0.0; setNoise(0); } @@ -51,10 +53,22 @@ void Head::reset() position = glm::vec3(0,0,0); Pitch = 0; Yaw = 0; + leanForward = leanSideways = 0; +} + +// Read the sensors +void readSensors() +{ + +} + +void Head::addLean(float x, float z) { + // Add Body lean as impulse + leanSideways += x; + leanForward += z; } // Simulate the head over time - void Head::simulate(float deltaTime) { if (!noise) @@ -71,6 +85,9 @@ void Head::simulate(float deltaTime) Roll *= (1.f - DECAY*deltaTime); } + leanForward *= (1.f - DECAY*30.f*deltaTime); + leanSideways *= (1.f - DECAY*30.f*deltaTime); + if (noise) { Pitch += (randFloat() - 0.5)*0.05*NoiseEnvelope; @@ -118,6 +135,7 @@ void Head::render() glPushMatrix(); glLoadIdentity(); glTranslatef(0.f, 0.f, -7.f); + glTranslatef(leanSideways, 0.f, leanForward); glRotatef(Yaw/2.0, 0, 1, 0); glRotatef(Pitch/2.0, 1, 0, 0); glRotatef(Roll/2.0, 0, 0, 1); diff --git a/head.h b/head.h index eef04f2eb3..be228137ec 100644 --- a/head.h +++ b/head.h @@ -34,6 +34,8 @@ class Head { float MouthYaw; float MouthWidth; float MouthHeight; + float leanForward; + float leanSideways; float PitchTarget; float YawTarget; @@ -44,6 +46,8 @@ class Head { glm::vec3 position; + void readSensors(); + public: Head(void); void reset(); @@ -52,6 +56,7 @@ public: void setYaw(float y) {Yaw = y; } void addPitch(float p) {Pitch -= p; } void addYaw(float y){Yaw -= y; } + void addLean(float x, float z); void getPitch(float); void render(); void simulate(float); diff --git a/interface.xcodeproj/project.xcworkspace/xcuserdata/philip.xcuserdatad/UserInterfaceState.xcuserstate b/interface.xcodeproj/project.xcworkspace/xcuserdata/philip.xcuserdatad/UserInterfaceState.xcuserstate index 7f7bb244fffdb9c9c784aa06962122e08f953684..6c983b0f1039261b38ae49102b70dda728b186b1 100644 GIT binary patch delta 40200 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 delta 37910 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 diff --git a/main.cpp b/main.cpp index 455ae556fe..21fa1edf39 100644 --- a/main.cpp +++ b/main.cpp @@ -55,6 +55,7 @@ using namespace std; // Junk for talking to the Serial Port int serial_on = 0; // Is serial connection on/off? System will try +int audio_on = 0; // Whether to turn on the audio support // Network Socket Stuff // For testing, add milliseconds of delay for received UDP packets @@ -89,7 +90,7 @@ Hand myHand(HAND_RADIUS, glm::vec3(0,1,1)); // My hand (used to manipulate things in world) glm::vec3 box(WORLD_SIZE,WORLD_SIZE,WORLD_SIZE); -ParticleSystem balls(1000, +ParticleSystem balls(0, box, false, // Wrap? 0.02, // Noise @@ -112,7 +113,7 @@ ParticleSystem balls(1000, #define RENDER_FRAME_MSECS 10 #define SLEEP 0 -#define NUM_TRIS 10 +#define NUM_TRIS 100000 struct { float vertices[NUM_TRIS * 3]; // float normals [NUM_TRIS * 3]; @@ -154,7 +155,8 @@ int display_hand = 0; int display_field = 0; int display_head_mouse = 1; // Display sample mouse pointer controlled by head movement -int head_mouse_x, head_mouse_y; +int head_mouse_x, head_mouse_y; +int head_lean_x, head_lean_y; int mouse_x, mouse_y; // Where is the mouse int mouse_pressed = 0; // true if mouse has been pressed (clear when finished) @@ -194,7 +196,7 @@ double elapsedTime; // 1. Add to the XCode project in the Resources/images group // (ensure "Copy file" is checked // 2. Add to the "Copy files" build phase in the project -char texture_filename[] = "int-texture256-v4.png"; +char texture_filename[] = "./int-texture256-v4.png"; unsigned int texture_width = 256; unsigned int texture_height = 256; @@ -261,8 +263,10 @@ void init(void) { int i, j; - Audio::init(); - printf( "Audio started.\n" ); + if (audio_on) { + Audio::init(); + printf( "Audio started.\n" ); + } // Clear serial channels for (i = i; i < NUM_CHANNELS; i++) @@ -273,6 +277,8 @@ void init(void) head_mouse_x = WIDTH/2; head_mouse_y = HEIGHT/2; + head_lean_x = WIDTH/2; + head_lean_y = HEIGHT/2; // Initialize Field values field_init(); @@ -346,7 +352,9 @@ void terminate () { // Close serial port //close(serial_fd); - Audio::terminate(); + if (audio_on) { + Audio::terminate(); + } exit(EXIT_SUCCESS); } @@ -421,6 +429,9 @@ void reset_sensors() fwd_vel = 0.0; head_mouse_x = WIDTH/2; head_mouse_y = HEIGHT/2; + head_lean_x = WIDTH/2; + head_lean_y = HEIGHT/2; + myHead.reset(); myHand.reset(); if (serial_on) read_sensors(1, &avg_adc_channels[0], &adc_channels[0]); @@ -431,12 +442,14 @@ void update_pos(float frametime) { 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]; + float measured_lateral_accel = adc_channels[3] - avg_adc_channels[3]; + float measured_fwd_accel = avg_adc_channels[2] - adc_channels[2]; // Update avatar head position based on measured gyro rates - myHead.addYaw(measured_yaw_rate * 1.20 * frametime); - myHead.addPitch(measured_pitch_rate * -1.0 * frametime); + myHead.addYaw(measured_yaw_rate * 0.25 * frametime); + myHead.addPitch(measured_pitch_rate * -0.25 * frametime); + myHead.addLean(measured_lateral_accel * frametime * 0.05, measured_fwd_accel*frametime * 0.05); + // Decay avatar head back toward zero //pitch *= (1.f - 5.0*frametime); //yaw *= (1.f - 7.0*frametime); @@ -456,6 +469,7 @@ void update_pos(float frametime) head_mouse_y = min(head_mouse_y, HEIGHT); // Update hand/manipulator location for measured forces from serial channel + /* const float MIN_HAND_ACCEL = 30.0; const float HAND_FORCE_SCALE = 0.5; glm::vec3 hand_accel(-(avg_adc_channels[6] - adc_channels[6]), @@ -466,6 +480,7 @@ void update_pos(float frametime) { myHand.addVel(frametime*hand_accel*HAND_FORCE_SCALE); } + */ // Update render direction (pitch/yaw) based on measured gyro rates const int MIN_YAW_RATE = 300; @@ -596,6 +611,7 @@ void display(void) glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE ); glEnable( GL_POINT_SPRITE_ARB ); + if (!display_head) { glBegin( GL_POINTS ); { for (i = 0; i < NUM_TRIS; i++) @@ -606,9 +622,9 @@ void display(void) } } glEnd(); - - glDisable( GL_TEXTURE_2D ); + } glDisable( GL_POINT_SPRITE_ARB ); + glDisable( GL_TEXTURE_2D ); // Show field vectors if (display_field) field_render(); @@ -618,10 +634,10 @@ void display(void) if (display_hand) myHand.render(); - balls.render(); + if (!display_head) balls.render(); // Render the world box - render_world_box(); + if (!display_head) render_world_box(); glPopMatrix(); @@ -634,10 +650,10 @@ void display(void) glDisable(GL_LIGHTING); //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) { - glPointParameterfvARB( GL_POINT_DISTANCE_ATTENUATION_ARB, pointer_attenuation_quadratic ); glPointSize( 10.0f ); glColor3f(1,1,1); //glEnable(GL_POINT_SMOOTH); @@ -648,7 +664,7 @@ void display(void) 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) + if (display_head_mouse && !display_head) { glPointSize(10.0f); glColor4f(1.0, 1.0, 0.0, 0.8); @@ -737,7 +753,7 @@ void key(unsigned char k, int x, int y) float add[] = {0.001, 0.001, 0.001}; field_add(add, pos); } - if (k == 't') { + if ((k == 't') && (audio_on)) { Audio::writeTone(0, 400, 1.0f, 0.5f); } if (k == '1') From eb648d3d1f85aed5c18366df8280cb3c4814cfb7 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Sat, 17 Nov 2012 17:00:56 -0800 Subject: [PATCH 2/4] Partial commit to switch sprite rendering to new Cloud class --- cloud.cpp | 132 ++++++++++++++++++ cloud.h | 32 +++++ field.h | 11 -- head.cpp | 1 + interface.xcodeproj/project.pbxproj | 6 + .../UserInterfaceState.xcuserstate | Bin 101447 -> 101370 bytes main.cpp | 52 ++++--- 7 files changed, 204 insertions(+), 30 deletions(-) create mode 100644 cloud.cpp create mode 100644 cloud.h diff --git a/cloud.cpp b/cloud.cpp new file mode 100644 index 0000000000..a0bdcceec3 --- /dev/null +++ b/cloud.cpp @@ -0,0 +1,132 @@ +// +// cloud.cpp +// interface +// +// Created by Philip Rosedale on 11/17/12. +// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// + +#include +#include "cloud.h" +#include "util.h" + +Cloud::Cloud(int num, + glm::vec3 box, + int wrap) { + // Create and initialize particles + int i; + bounds = box; + count = num; + wrapBounds = wrap; + particles = new Particle[count]; + + for (i = 0; i < count; i++) { + particles[i].position.x = randFloat()*box.x; + particles[i].position.y = randFloat()*box.y; + particles[i].position.z = randFloat()*box.z; + + particles[i].velocity.x = 0; //randFloat() - 0.5; + particles[i].velocity.y = 0; //randFloat() - 0.5; + particles[i].velocity.z = 0; //randFloat() - 0.5; + + } +} + + +void Cloud::render() { + + float particle_attenuation_quadratic[] = { 0.0f, 0.0f, 2.0f }; + + glEnable( GL_TEXTURE_2D ); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + glPointParameterfvARB( GL_POINT_DISTANCE_ATTENUATION_ARB, particle_attenuation_quadratic ); + + float maxSize = 0.0f; + glGetFloatv( GL_POINT_SIZE_MAX_ARB, &maxSize ); + glPointSize( maxSize ); + glPointParameterfARB( GL_POINT_SIZE_MAX_ARB, maxSize ); + glPointParameterfARB( GL_POINT_SIZE_MIN_ARB, 0.001f ); + + glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE ); + glEnable( GL_POINT_SPRITE_ARB ); + glBegin( GL_POINTS ); + for (int i = 0; i < count; i++) + { + glVertex3f(particles[i].position.x, + particles[i].position.y, + particles[i].position.z); + } + glEnd(); + glDisable( GL_POINT_SPRITE_ARB ); + glDisable( GL_TEXTURE_2D ); +} + +void Cloud::simulate (float deltaTime) { + int i; + float verts[3], fadd[3], fval[3]; + for (i = 0; i < count; ++i) { + + // Update position + //particles[i].position += particles[i].velocity*deltaTime; + particles[i].position += particles[i].velocity; + + + // Drag: decay velocity + const float CONSTANT_DAMPING = 1.0; + particles[i].velocity *= (1.f - CONSTANT_DAMPING*deltaTime); + + // Read from field + verts[0] = particles[i].position.x; + verts[1] = particles[i].position.y; + verts[2] = particles[i].position.z; + field_value(fval, &verts[0]); + particles[i].velocity.x += fval[0]; + particles[i].velocity.y += fval[1]; + particles[i].velocity.z += fval[2]; + + // Add back to field + const float FIELD_COUPLE = 0.0000001; + fadd[0] = particles[i].velocity.x*FIELD_COUPLE; + fadd[1] = particles[i].velocity.y*FIELD_COUPLE; + fadd[2] = particles[i].velocity.z*FIELD_COUPLE; + field_add(fadd, &verts[0]); + + if (wrapBounds) { + // wrap around bounds + if (particles[i].position.x > bounds.x) + particles[i].position.x -= bounds.x; + else if (particles[i].position.x < 0.0f) + particles[i].position.x += bounds.x; + + if (particles[i].position.y > bounds.y) + particles[i].position.y -= bounds.y; + else if (particles[i].position.y < 0.0f) + particles[i].position.y += bounds.y; + + if (particles[i].position.z > bounds.z) + particles[i].position.z -= bounds.z; + else if (particles[i].position.z < 0.0f) + particles[i].position.z += bounds.z; + } else { + // Bounce at bounds + if (particles[i].position.x > bounds.x + || particles[i].position.x < 0.f) { + if (particles[i].position.x > bounds.x) particles[i].position.x = bounds.x; + else particles[i].position.x = 0.f; + particles[i].velocity.x *= -1; + } + if (particles[i].position.y > bounds.y + || particles[i].position.y < 0.f) { + if (particles[i].position.y > bounds.y) particles[i].position.y = bounds.y; + else particles[i].position.y = 0.f; + particles[i].velocity.y *= -1; + } + if (particles[i].position.z > bounds.z + || particles[i].position.z < 0.f) { + if (particles[i].position.z > bounds.z) particles[i].position.z = bounds.z; + else particles[i].position.z = 0.f; + particles[i].velocity.z *= -1; + } + } + } + } diff --git a/cloud.h b/cloud.h new file mode 100644 index 0000000000..575501be25 --- /dev/null +++ b/cloud.h @@ -0,0 +1,32 @@ +// +// cloud.h +// interface +// +// Created by Philip Rosedale on 11/17/12. +// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// + +#ifndef interface_cloud_h +#define interface_cloud_h + +#include "field.h" + +class Cloud { +public: + Cloud(int num, + glm::vec3 box, + int wrap); + + void simulate(float deltaTime); + void render(); + +private: + struct Particle { + glm::vec3 position, velocity; + } *particles; + unsigned int count; + glm::vec3 bounds; + bool wrapBounds; +}; + +#endif diff --git a/field.h b/field.h index ca62f91cec..2d0dbac757 100644 --- a/field.h +++ b/field.h @@ -29,15 +29,4 @@ void field_render(); void field_add(float* add, float *loc); void field_simulate(float dt); -class Field { -public: - static void init (); - static int addTo (const glm::vec3 &pos, glm::vec3 &v); - -private: - const static unsigned int fieldSize = 1000; - const static float fieldScale; // defined in cpp – inline const float definitions not allowed in standard C++?! (allowed in C++0x) - static glm::vec3 field[fieldSize]; -}; - #endif diff --git a/head.cpp b/head.cpp index bb0e71d010..f2132e788d 100644 --- a/head.cpp +++ b/head.cpp @@ -178,6 +178,7 @@ void Head::render() } glPopMatrix(); + // Mouth glPushMatrix(); glTranslatef(0,-0.3,0.75); diff --git a/interface.xcodeproj/project.pbxproj b/interface.xcodeproj/project.pbxproj index 7b58f146e6..910b2dbd70 100644 --- a/interface.xcodeproj/project.pbxproj +++ b/interface.xcodeproj/project.pbxproj @@ -15,6 +15,7 @@ B6BDADE315F44AB0002A07DF /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B6BDADDA15F444C9002A07DF /* AudioToolbox.framework */; }; B6BDADE415F44AC7002A07DF /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B6BDADDC15F444D3002A07DF /* AudioUnit.framework */; }; B6BDAE4415F6BE53002A07DF /* particle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B6BDAE4315F6BE53002A07DF /* particle.cpp */; }; + D409B98A165849180099B0B3 /* cloud.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D409B989165849180099B0B3 /* cloud.cpp */; }; D40BDFD513404BA300B0BE1F /* GLUT.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D40BDFD413404BA300B0BE1F /* GLUT.framework */; }; D40BDFD713404BB300B0BE1F /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D40BDFD613404BB300B0BE1F /* OpenGL.framework */; }; D40FD5FB164AF1C200878184 /* int-texture256-v2.png in CopyFiles */ = {isa = PBXBuildFile; fileRef = D40FD5FA164AF1A700878184 /* int-texture256-v2.png */; }; @@ -66,6 +67,8 @@ B6BDAE4115F6BE4D002A07DF /* particle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = particle.h; sourceTree = ""; }; B6BDAE4315F6BE53002A07DF /* particle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = particle.cpp; sourceTree = ""; }; C6859E8B029090EE04C91782 /* test_c_plus.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = test_c_plus.1; sourceTree = ""; }; + D409B988165849030099B0B3 /* cloud.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = cloud.h; sourceTree = ""; }; + D409B989165849180099B0B3 /* cloud.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cloud.cpp; sourceTree = ""; }; D40BDFD413404BA300B0BE1F /* GLUT.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLUT.framework; path = /System/Library/Frameworks/GLUT.framework; sourceTree = ""; }; D40BDFD613404BB300B0BE1F /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = ""; }; D40FD5FA164AF1A700878184 /* int-texture256-v2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "int-texture256-v2.png"; sourceTree = SOURCE_ROOT; }; @@ -134,6 +137,8 @@ isa = PBXGroup; children = ( 08FB7796FE84155DC02AAC07 /* main.cpp */, + D409B988165849030099B0B3 /* cloud.h */, + D409B989165849180099B0B3 /* cloud.cpp */, D4EE3BC015E746E900EE4C89 /* world.h */, B6BDAE4315F6BE53002A07DF /* particle.cpp */, B6BDAE4115F6BE4D002A07DF /* particle.h */, @@ -261,6 +266,7 @@ D4EFE3D0162A2DA000DC5C59 /* hand.cpp in Sources */, F68135561648617D003040E3 /* texture.cpp in Sources */, F681358B1648896D003040E3 /* lodepng.cpp in Sources */, + D409B98A165849180099B0B3 /* cloud.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 6c983b0f1039261b38ae49102b70dda728b186b1..9cf966bff86303aa87ea0c9963c3cc86906f6585 100644 GIT binary patch delta 27342 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 delta 27352 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 diff --git a/main.cpp b/main.cpp index 21fa1edf39..cf2ecbac8a 100644 --- a/main.cpp +++ b/main.cpp @@ -49,6 +49,8 @@ #include "texture.h" +#include "cloud.h" + //TGAImg Img; using namespace std; @@ -74,6 +76,8 @@ int bytescount = 0; int target_x, target_y; int target_display = 0; +int head_mirror = 0; // Whether to mirror the head when viewing it + unsigned char last_key = 0; double ping = 0; @@ -98,7 +102,10 @@ ParticleSystem balls(0, 0.0 // Gravity ); - +Cloud cloud(0, // Particles + box, // Bounding Box + false // Wrap + ); // FIELD INFORMATION // If the simulation 'world' is a box with 10M boundaries, the offset to a field cell is given by: @@ -113,11 +120,9 @@ ParticleSystem balls(0, #define RENDER_FRAME_MSECS 10 #define SLEEP 0 -#define NUM_TRIS 100000 +#define NUM_TRIS 250000 struct { float vertices[NUM_TRIS * 3]; -// float normals [NUM_TRIS * 3]; -// float colors [NUM_TRIS * 3]; float vel [NUM_TRIS * 3]; glm::vec3 vel1[NUM_TRIS]; glm::vec3 vel2[NUM_TRIS]; @@ -154,7 +159,7 @@ int display_head = 0; int display_hand = 0; int display_field = 0; -int display_head_mouse = 1; // Display sample mouse pointer controlled by head movement +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; @@ -446,10 +451,17 @@ void update_pos(float frametime) float measured_fwd_accel = avg_adc_channels[2] - adc_channels[2]; // Update avatar head position based on measured gyro rates - myHead.addYaw(measured_yaw_rate * 0.25 * frametime); - myHead.addPitch(measured_pitch_rate * -0.25 * frametime); - myHead.addLean(measured_lateral_accel * frametime * 0.05, measured_fwd_accel*frametime * 0.05); - + const float HEAD_ROTATION_SCALE = 0.10; + const float HEAD_LEAN_SCALE = 0.02; + if (head_mirror) { + myHead.addYaw(measured_yaw_rate * HEAD_ROTATION_SCALE * frametime); + myHead.addPitch(measured_pitch_rate * -HEAD_ROTATION_SCALE * frametime); + myHead.addLean(measured_lateral_accel * frametime * HEAD_LEAN_SCALE, measured_fwd_accel*frametime * HEAD_LEAN_SCALE); + } else { + myHead.addYaw(measured_yaw_rate * -HEAD_ROTATION_SCALE * frametime); + myHead.addPitch(measured_pitch_rate * -HEAD_ROTATION_SCALE * frametime); + myHead.addLean(measured_lateral_accel * frametime * -HEAD_LEAN_SCALE, measured_fwd_accel*frametime * HEAD_LEAN_SCALE); + } // Decay avatar head back toward zero //pitch *= (1.f - 5.0*frametime); //yaw *= (1.f - 7.0*frametime); @@ -608,24 +620,25 @@ void display(void) glPointSize( maxSize ); glPointParameterfARB( GL_POINT_SIZE_MAX_ARB, maxSize ); glPointParameterfARB( GL_POINT_SIZE_MIN_ARB, 0.001f ); + glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE ); - glEnable( GL_POINT_SPRITE_ARB ); - if (!display_head) { - glBegin( GL_POINTS ); - { - for (i = 0; i < NUM_TRIS; i++) + if (!display_head) { + glBegin( GL_POINTS ); { - glVertex3f(tris.vertices[i*3], - tris.vertices[i*3+1], - tris.vertices[i*3+2]); + for (i = 0; i < NUM_TRIS; i++) + { + glVertex3f(tris.vertices[i*3], + tris.vertices[i*3+1], + tris.vertices[i*3+2]); + } } - } - glEnd(); + glEnd(); } glDisable( GL_POINT_SPRITE_ARB ); glDisable( GL_TEXTURE_2D ); + if (!display_head) cloud.render(); // Show field vectors if (display_field) field_render(); @@ -800,6 +813,7 @@ void idle(void) myHead.simulate(1.f/FPS); myHand.simulate(1.f/FPS); balls.simulate(1.f/FPS); + cloud.simulate(1.f/FPS); if (!step_on) glutPostRedisplay(); last_frame = check; From 125eed350a9820db8be11961ccfbf568ac6598f8 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Sun, 18 Nov 2012 10:45:41 -0800 Subject: [PATCH 3/4] Further work on Cloud class --- cloud.cpp | 23 +++----------- field.cpp | 15 +++++++++ field.h | 1 + .../UserInterfaceState.xcuserstate | Bin 101370 -> 101260 bytes .../xcdebugger/Breakpoints.xcbkptlist | 6 ++-- main.cpp | 30 +++++++++++------- 6 files changed, 42 insertions(+), 33 deletions(-) diff --git a/cloud.cpp b/cloud.cpp index a0bdcceec3..18a05ced44 100644 --- a/cloud.cpp +++ b/cloud.cpp @@ -63,34 +63,21 @@ void Cloud::render() { void Cloud::simulate (float deltaTime) { int i; - float verts[3], fadd[3], fval[3]; for (i = 0; i < count; ++i) { // Update position //particles[i].position += particles[i].velocity*deltaTime; particles[i].position += particles[i].velocity; - - // Drag: decay velocity + // Decay Velocity (Drag) const float CONSTANT_DAMPING = 1.0; particles[i].velocity *= (1.f - CONSTANT_DAMPING*deltaTime); - // Read from field - verts[0] = particles[i].position.x; - verts[1] = particles[i].position.y; - verts[2] = particles[i].position.z; - field_value(fval, &verts[0]); - particles[i].velocity.x += fval[0]; - particles[i].velocity.y += fval[1]; - particles[i].velocity.z += fval[2]; - - // Add back to field + // Interact with Field const float FIELD_COUPLE = 0.0000001; - fadd[0] = particles[i].velocity.x*FIELD_COUPLE; - fadd[1] = particles[i].velocity.y*FIELD_COUPLE; - fadd[2] = particles[i].velocity.z*FIELD_COUPLE; - field_add(fadd, &verts[0]); - + field_interact(&particles[i].position, &particles[i].velocity, FIELD_COUPLE); + + // Bounce or Wrap if (wrapBounds) { // wrap around bounds if (particles[i].position.x > bounds.x) diff --git a/field.cpp b/field.cpp index b4a9351a46..d08c93822c 100644 --- a/field.cpp +++ b/field.cpp @@ -60,6 +60,21 @@ void field_add(float* add, float *pos) } } +void field_interact(glm::vec3 * pos, glm::vec3 * vel, float coupling) { + + int index = (int)(pos->x/WORLD_SIZE*10.0) + + (int)(pos->y/WORLD_SIZE*10.0)*10 + + (int)(pos->z/WORLD_SIZE*10.0)*100; + if ((index >= 0) && (index < FIELD_ELEMENTS)) { + // Add velocity to particle from field + *vel += field[index].val; + // Add back to field from particle velocity + glm::vec3 temp = *vel; + temp *= coupling; + field[index].val += temp; + } +} + void field_avg_neighbors(int index, glm::vec3 * result) { // Given index to field element i, return neighbor field values glm::vec3 neighbors(0,0,0); diff --git a/field.h b/field.h index 2d0dbac757..e1d26206f2 100644 --- a/field.h +++ b/field.h @@ -27,6 +27,7 @@ void field_init(); int field_value(float *ret, float *pos); void field_render(); void field_add(float* add, float *loc); +void field_interact(glm::vec3 * pos, glm::vec3 * vel, float coupling); void field_simulate(float dt); #endif diff --git a/interface.xcodeproj/project.xcworkspace/xcuserdata/philip.xcuserdatad/UserInterfaceState.xcuserstate b/interface.xcodeproj/project.xcworkspace/xcuserdata/philip.xcuserdatad/UserInterfaceState.xcuserstate index 9cf966bff86303aa87ea0c9963c3cc86906f6585..d1f81ce64c67c4f45d200e9d7b00025121c7c034 100644 GIT binary patch delta 25123 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 Dyxl=H delta 25187 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�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 VPlD~Y&;Me@&;A$xf91dh{}+ieUXB0& diff --git a/interface.xcodeproj/xcuserdata/philip.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/interface.xcodeproj/xcuserdata/philip.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist index d8e15f635a..556fc539eb 100644 --- a/interface.xcodeproj/xcuserdata/philip.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist +++ b/interface.xcodeproj/xcuserdata/philip.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -8,11 +8,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "field.cpp" - timestampString = "372274896.176083" + timestampString = "374955033.430214" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "83" - endingLineNumber = "83" + startingLineNumber = "98" + endingLineNumber = "98" landmarkName = "field_avg_neighbors(int index, glm::vec3 * result)" landmarkType = "7"> diff --git a/main.cpp b/main.cpp index cf2ecbac8a..84d7587730 100644 --- a/main.cpp +++ b/main.cpp @@ -58,6 +58,7 @@ using namespace std; // Junk for talking to the Serial Port int serial_on = 0; // Is serial connection on/off? System will try int audio_on = 0; // Whether to turn on the audio support +int simulate_on = 1; // Network Socket Stuff // For testing, add milliseconds of delay for received UDP packets @@ -96,13 +97,13 @@ Hand myHand(HAND_RADIUS, glm::vec3 box(WORLD_SIZE,WORLD_SIZE,WORLD_SIZE); ParticleSystem balls(0, box, - false, // Wrap? - 0.02, // Noise + false, // Wrap? + 0.02, // Noise 0.3, // Size scale - 0.0 // Gravity + 0.0 // Gravity ); -Cloud cloud(0, // Particles +Cloud cloud(250000, // Particles box, // Bounding Box false // Wrap ); @@ -120,7 +121,7 @@ Cloud cloud(0, // Particles #define RENDER_FRAME_MSECS 10 #define SLEEP 0 -#define NUM_TRIS 250000 +#define NUM_TRIS 0 struct { float vertices[NUM_TRIS * 3]; float vel [NUM_TRIS * 3]; @@ -394,6 +395,7 @@ void update_tris() if (tris.element[i] == 1) { + // Read and add velocity from field field_value(field_val, &tris.vertices[i*3]); tris.vel[i*3] += field_val[0]; @@ -406,6 +408,7 @@ void update_tris() field_contrib[1] = tris.vel[i*3+1]*FIELD_COUPLE; field_contrib[2] = tris.vel[i*3+2]*FIELD_COUPLE; field_add(field_contrib, &tris.vertices[i*3]); + } // bounce at edge of world @@ -734,7 +737,7 @@ void key(unsigned char k, int x, int y) if (k == '/') stats_on = !stats_on; // toggle stats if (k == 'n') { - noise_on = !noise_on; // Toggle noise + noise_on = !noise_on; // Toggle noise if (noise_on) { myHand.setNoise(noise); @@ -759,6 +762,7 @@ void key(unsigned char k, int x, int y) if (k == ' ') reset_sensors(); if (k == 'a') render_yaw_rate -= 0.25; if (k == 'd') render_yaw_rate += 0.25; + if (k == 'o') simulate_on = !simulate_on; if (k == 'p') { // Add to field vector @@ -808,12 +812,14 @@ void idle(void) { // Simulation update_pos(1.f/FPS); - update_tris(); - field_simulate(1.f/FPS); - myHead.simulate(1.f/FPS); - myHand.simulate(1.f/FPS); - balls.simulate(1.f/FPS); - cloud.simulate(1.f/FPS); + if (simulate_on) { + update_tris(); + field_simulate(1.f/FPS); + myHead.simulate(1.f/FPS); + myHand.simulate(1.f/FPS); + balls.simulate(1.f/FPS); + cloud.simulate(1.f/FPS); + } if (!step_on) glutPostRedisplay(); last_frame = check; From 95b106b86724ce76a77e5264f5c5fc5ed5c647ad Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Sun, 18 Nov 2012 11:00:21 -0800 Subject: [PATCH 4/4] Removing some of the triangle code in main.cpp --- .../UserInterfaceState.xcuserstate | Bin 101260 -> 101257 bytes main.cpp | 63 ++++++++---------- 2 files changed, 26 insertions(+), 37 deletions(-) diff --git a/interface.xcodeproj/project.xcworkspace/xcuserdata/philip.xcuserdatad/UserInterfaceState.xcuserstate b/interface.xcodeproj/project.xcworkspace/xcuserdata/philip.xcuserdatad/UserInterfaceState.xcuserstate index d1f81ce64c67c4f45d200e9d7b00025121c7c034..1cabcd6b99353d42e0982f7cc429127206fb4b0b 100644 GIT binary patch delta 7635 zcmZveX>=5Xq5Xfq%uEu;StpapI+LLaiXiTa`>qJCR0J2)YE{&#Sf*5-{&A@b zPti)HQnh-ptqZTHxVO(%pRHS4OZ92BZq+0+*=7>5z2o=)$9wK_?w5Pcy>(;p`i;d; zT+&m2!BgKn(|FeE`EwTRJ*#ET?70hmc*g2Ev**s6`}9pcsj|ogmtAt*^JlJ}yT`m) zEpz70efs4>X{2oW`n93`*M^p?EqZ6;d&NHPL)(8;;)Y=8g2(26S-P<bu=-C224@1wR z(6beKehod_q31d1c>#J}hMwO+&zsQmSLpc&dcJ|4Ug*g~&nWbaL(dfS7C~tq4xynJsElzL+@$OdnWXr3%wUW??upi3G`kDy|+N` zQ_%Y|^nL}s{m?rFebb?@7W(R;uNC?_pf3r1Y3SPx`sPF5KG3&6^c@6!3!(43Wa#@3 z=-U8&JD~6P(Dx4XeE@x5LEqQVHwb-s=o^K;ap;?ZY$;^RAX@?1D#+GAHU`;F$nFl= z{UCb)WRHOC(U3h3vL`}z5oFJT?AefA4%zcEkX;Gc%OQImWY?X)=hU^x| zJ`CAMA^Rj`w?TG0WS@iV3y^&cvhPCnL&*Lcvfn^<2(ksp?t<(DqmNB*>itxuuX>2DufGJ0EfvLhcI4t%lq>$lVFK z4UpRexy_K<0=b7F_bB9^gxogBZHL@*kb41guR-oT$mISBxlbYY4dnVD*AKZN$Q7U; z=np`DG4xM^{xI}Mp+5or-OxWD`WHa|A<%yq^dAZR$3Xw_(0?lQp8@?#p??|luYmqF z(El*>KMnmKK>ufC=y+0SsLSLqCL}8)4`!7}^9wkHOGZ7}^Fy+hOQA7Bx+e+=Z0hx|#9KLzqjA%8yPzYqEAA-@LlH$nbp z$lnI}J0QOS@|z&P8S+~o|8NHKk3#-Q$Ug`9-$DLu$iEBu4

$@*NnN4I_KP$UGQX03(OM$YC&YB#ayb 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 delta 7640 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 diff --git a/main.cpp b/main.cpp index 84d7587730..49d93cb317 100644 --- a/main.cpp +++ b/main.cpp @@ -125,9 +125,6 @@ Cloud cloud(250000, // Particles struct { float vertices[NUM_TRIS * 3]; float vel [NUM_TRIS * 3]; - glm::vec3 vel1[NUM_TRIS]; - glm::vec3 vel2[NUM_TRIS]; - int element[NUM_TRIS]; }tris; @@ -325,7 +322,6 @@ void init(void) //tris.normals[i*3+2] = pos.z; // Moving - white - tris.element[i] = 1; //tris.colors[i*3] = 1.0; tris.colors[i*3+1] = 1.0; tris.colors[i*3+2] = 1.0; tris.vel[i*3] = (randFloat() - 0.5)*VEL_SCALE; tris.vel[i*3+1] = (randFloat() - 0.5)*VEL_SCALE; @@ -376,41 +372,34 @@ void update_tris() float field_contrib[3]; for (i = 0; i < NUM_TRIS; i++) { - if (tris.element[i] == 1) // If moving object, move and drag - { - // Update position - tris.vertices[i*3+0] += tris.vel[i*3]; - tris.vertices[i*3+1] += tris.vel[i*3+1]; - tris.vertices[i*3+2] += tris.vel[i*3+2]; - - // Add a little gravity - //tris.vel[i*3+1] -= 0.0001; - - const float DRAG = 0.99; - // Drag: Decay velocity - tris.vel[i*3] *= DRAG; - tris.vel[i*3+1] *= DRAG; - tris.vel[i*3+2] *= DRAG; - } + // Update position + tris.vertices[i*3+0] += tris.vel[i*3]; + tris.vertices[i*3+1] += tris.vel[i*3+1]; + tris.vertices[i*3+2] += tris.vel[i*3+2]; + + // Add a little gravity + //tris.vel[i*3+1] -= 0.0001; + + const float DRAG = 0.99; + // Drag: Decay velocity + tris.vel[i*3] *= DRAG; + tris.vel[i*3+1] *= DRAG; + tris.vel[i*3+2] *= DRAG; - if (tris.element[i] == 1) - { + // Read and add velocity from field + field_value(field_val, &tris.vertices[i*3]); + tris.vel[i*3] += field_val[0]; + tris.vel[i*3+1] += field_val[1]; + tris.vel[i*3+2] += field_val[2]; + + // Add a tiny bit of energy back to the field + const float FIELD_COUPLE = 0.0000001; + field_contrib[0] = tris.vel[i*3]*FIELD_COUPLE; + field_contrib[1] = tris.vel[i*3+1]*FIELD_COUPLE; + field_contrib[2] = tris.vel[i*3+2]*FIELD_COUPLE; + field_add(field_contrib, &tris.vertices[i*3]); - // Read and add velocity from field - field_value(field_val, &tris.vertices[i*3]); - tris.vel[i*3] += field_val[0]; - tris.vel[i*3+1] += field_val[1]; - tris.vel[i*3+2] += field_val[2]; - - // Add a tiny bit of energy back to the field - const float FIELD_COUPLE = 0.0000001; - field_contrib[0] = tris.vel[i*3]*FIELD_COUPLE; - field_contrib[1] = tris.vel[i*3+1]*FIELD_COUPLE; - field_contrib[2] = tris.vel[i*3+2]*FIELD_COUPLE; - field_add(field_contrib, &tris.vertices[i*3]); - - } - + // bounce at edge of world for (j=0; j < 3; j++) { if ((tris.vertices[i*3+j] > WORLD_SIZE) || (tris.vertices[i*3+j] < 0.0)) {