void Demo::update() { Vec2f gravity = Vec2f(0, 0.01); particleSystem->applyForce(gravity); float dx = lmap((float)getMousePos().x, 0.0f, (float)getWindowWidth(), -0.2f, 0.2f); Vec2f wind = Vec2f(dx, 0); particleSystem->applyForce(wind); particleSystem->addParticle(); particleSystem->update(); }
void NOC_4_08_ParticleSystemSmokeApp::draw() { gl::clear( Color::black() ); // Calculate a "wind" force based on mouse horizontal position float dx = lmap( mousePos.x, 0.0f, float( getWindowWidth() ), -0.2f, 0.2f ); Vec2f wind = Vec2f( dx, 0 ); ps.applyForce(wind); for( int i = 0; i < 2; i++ ){ ps.addParticle(); } ps.run(); // Draw an arrow representing the wind force drawVector( wind, Vec2f( getWindowWidth() / 2, 50 ), 500 ); }
void update(int t) { if (currentCamera == 0) { cameraAngle += (diffMouseDownX / 100.0); cameraDistance = (cameraDistance += (diffMouseDownY / 20.0)) < 10 ? 10 : cameraDistance; camera.set( cameraDistance * cos(cameraAngle * (M_PI / 180)), cameraElevation, cameraDistance * sin(cameraAngle * (M_PI / 180)) ); cameraLookAt = Vector3(); cameraUp = Vector3(0, 1, 0); } else if (currentCamera == 1) { aboveCamera.y = (std::max(50.0, aboveCamera.y + (diffMouseDownY / 100.0))); aboveCameraLookAt = Vector3(0, aboveCamera.y - 100, aboveCamera.z); cameraLookAt = aboveCameraLookAt; camera.set(aboveCamera.x, aboveCamera.y, aboveCamera.z); cameraUp = aboveCameraUp; } else if (currentCamera == 2) { frontCamera.y = (frontCamera.y + (diffMouseDownY / 100.0)); frontCamera.x = (frontCamera.x - (diffMouseDownX / 100.0)); frontCamera.z = (cameraDistance); frontCameraLookAt = frontCamera.add(Vector3(0.0, 0.0, -1.0)); cameraLookAt = frontCameraLookAt; camera.set(frontCamera.x, frontCamera.y, frontCamera.z); cameraUp = frontCameraUp; } else if (currentCamera == 3) { getFreeCameraLookAt(); cameraLookAt = freeCameraLookAt; camera.set(freeCamera.x, freeCamera.y, freeCamera.z); freeCameraUp.x = sin(upAngle * (M_PI / 180)); freeCameraUp.y = cos(upAngle * (M_PI / 180)); cameraUp = freeCameraUp; } else if (currentCamera >= 4) { updateFlyBy(); cameraLookAt = flyBySettings.lookAt; camera.set( flyBySettings.position.x, flyBySettings.position.y, flyBySettings.position.z ); cameraUp = flyBySettings.up; } gravity.y = gravityIntensity; particleSystem.applyForce(gravity); for (int i = 0; i < 9; i++) { if (gravitationalForce[i].type != GRAVITATIONALFORCETYPE_NONE) { particleSystem.applyGravitationalForce(gravitationalForce[i]); } } if (cycleColours) { colourSwitch--; if (colourSwitch == 0) { colourSwitch = 10; Particle::startColour = emitColours[initialColour]; currentColour = Particle::startColour; initialColour = (++initialColour) == colourCount ? 0 : initialColour; } else { Particle::startColour.r = linearEase(10 - colourSwitch, currentColour.r, emitColours[initialColour].r - currentColour.r, 10); Particle::startColour.g = linearEase(10 - colourSwitch, currentColour.g, emitColours[initialColour].g - currentColour.g, 10); Particle::startColour.b = linearEase(10 - colourSwitch, currentColour.b, emitColours[initialColour].b - currentColour.b, 10); } } particleSystem.update(); // FPS monitoring frame++; elapsedTime = glutGet(GLUT_ELAPSED_TIME); if (elapsedTime - timebase > 1000) { fps = frame * 1000.0 / (elapsedTime - timebase); timebase = elapsedTime; frame = 0; } glutPostRedisplay(); glutTimerFunc(30, update, 0); }