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 9cf966bff8..d1f81ce64c 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 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;