From 125eed350a9820db8be11961ccfbf568ac6598f8 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Sun, 18 Nov 2012 10:45:41 -0800 Subject: [PATCH] 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;