|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261 |
- #include "ofApp.h"
-
- //--------------------------------------------------------------
- void ofApp::setup() {
- ofSetVerticalSync(true);
-
- //Initialize 8 empty attractrs
- for (int i = 0; i < 8; i++)
- {
- attractors.push_back(new Attractor);
- }
-
- //OSC reciever port setup
- receiver.setup(PORT);
-
- varSystem = true;
- trails = true;
- history = 0.95;
- num = 1000;
- sys.assign(num, Particle());
-
- currentMode = PARTICLE_MODE_DEFAULT;
- currentModeDisp = "PARTICLE_MODE_DEFAULT";
-
- //Black background
- ofSetBackgroundColor(0, 0, 0);
- ofSetFrameRate(60);
- birthCount = 0;
- int w = ofGetWidth();
- int h = ofGetHeight();
- fbo.allocate(w, h, GL_RGB);
- //attractors.at(0)->setup(600, 600);
-
- attractors.at(1)->setup(200, 200);
- attractors.at(2)->setup(400, 400);
- attractors.at(3)->setup(500, 500);
- }
-
- //--------------------------------------------------------------
- void ofApp::update() {
- // *** OSC RECEIVER ***
- while (receiver.hasWaitingMessages()) {
-
- ofxOscMessage contourCentroids;
- receiver.getNextMessage(&contourCentroids);
- oscMsg = ofToString(contourCentroids);
-
- //Get active ammount of attractors (nBlobs) and their x & y coordinates
- //Exp. OSC Message: " /centroidsOfBlob ammount xValue, yValue"
- if (contourCentroids.getAddress() == "/centroidsOfBlob") {
- nBlobs = contourCentroids.getArgAsInt(0);
- for (int i = 1; i <= nBlobs; i++) {
- xOfCentroid = contourCentroids.getArgAsFloat(i * 2 - 1) * ofGetWindowWidth();
- yOfCentroid = contourCentroids.getArgAsFloat(i * 2) * ofGetWindowHeight();
-
- attractors.at(i - 1)->setup(xOfCentroid, yOfCentroid);
- }
- }
- //Delete all Attractors on command
- if (contourCentroids.getAddress() == "/checkin") {
- for (int i = 0; i < 8; i++) {
- attractors.at(i)->setup(0, 0);
- }
- }
- }
-
- // *** PARTICLE EMITTER ***
-
- //Capture time based on FrameTime
- double deltaT = ofGetLastFrameTime();
- birthCount += deltaT;
-
- if (varSystem == true) {
- //Birth control for new particles
- if (birthCount > 0.001) {
- for (int i = 0;i < 4;i++) {
- system.push_back(new Particle);
- system.back()->setup(currentMode);
- }
- birthCount = 0;
- }
-
-
- for (int p = 0; p < system.size();)
- {
- //Upate particle system /w all active attractors
- system.at(p)->update(deltaT, &attractors, system);
-
- //Delete particles, that reached max Age
- if (system.at(p)->getAgeNorm() > 4) {
- delete system.at(p);
- system.erase(system.begin() + p);
- }
- else {
- p++;
- }
- }
- }
- else {
- ofSeedRandom(39);
- }
- }
-
- //--------------------------------------------------------------
- void ofApp::reset() {
-
- for (int p = 0; p < system.size();)
- {
- system.erase(system.begin() + p);
- }
- }
-
-
- //--------------------------------------------------------------
- void ofApp::draw() {
- if (varSystem == false) {
- vector<ofVec2f> system;
- for (int i = 0; i < 1000; i++) {
- ofVec2f particle(ofMap(ofNoise(ofRandom(100), ofGetFrameNum() * 0.0005), 0, 1, 0, ofGetWidth()), ofMap(ofNoise(ofRandom(100), ofGetFrameNum() * 0.0005), 0, 1, 0, ofGetHeight()));
- system.push_back(particle);
- }
-
- for (int out = 0; out < system.size(); out++) {
- for (int in = out + 1; in < system.size(); in++) {
- if (system[out].distance(system[in]) < 60) {
- ofDrawLine(system[out], system[in]);
- }
- }
- }
-
- for (int i = 0; i < system.size(); i++) {
-
- ofDrawCircle(system[i], ofRandom(0.5, 3));
- }
- }
-
- if (trails == true) {
- fbo.begin();
- ofEnableAlphaBlending(); //Enable transparency
-
- float alpha = (1 - history) * 255;
- ofSetColor(0, 0, 0, alpha);
- ofFill();
- ofRect(0, 0, ofGetWidth(), ofGetHeight());
-
- ofDisableAlphaBlending(); //Disable transparency
- //Draw particle system
- for (int p = 0; p < system.size(); p++) {
- system.at(p)->draw();
- }
- fbo.end();
- }
- else {
- //Draw particle system
- for (int p = 0; p < system.size(); p++) {
- system.at(p)->draw();
- }
- }
- //Capture time based on FrameTime
- double deltaT = ofGetLastFrameTime();
- time += deltaT;
-
- // Delete inactive attractors after 4 seconds based on Frametime
- if (time > 2) {
- for (int i = 0; i < 8; i++) {
- //attractors.at(i)->setup(0, 0);
- time = 0;
- }
- }
- fbo.draw(0, 0);
- // *** DEBUG INFO ***
- ofSetColor(230);
- //All 8 Attractors with x | y coordinates
- for (int i = 0; i < 8; i++) {
-
- string x = ofToString(attractors.at(i)->getX());
- string y = ofToString(attractors.at(i)->getY());
-
- ofDrawBitmapString("x: " + x + " y: " + y, 100, 100 + i * 20);
- }
- //Recieved OSC messages
- ofDrawBitmapString("OSC: " + ofToString(oscMsg),100, 275);
- //Elapsed time since last clear of attractors
- ofDrawBitmapString("Time: " + ofToString(time),100, 300);
- //Current FPS
- ofDrawBitmapString("FPS: " + ofToString(ofGetFrameRate()), 100, 325);
- //Current Mode
- ofDrawBitmapString("Current Effect: " + currentModeDisp, 100, 350);
- }
-
- //--------------------------------------------------------------
- void ofApp::keyPressed(int key) {
- //Key press 1 to trigger default particle Mode
- if (key == '1') {
- currentMode = PARTICLE_MODE_DEFAULT;
- currentModeDisp = "PARTICLE_MODE_DEFAULT";
- varSystem = true;
- reset();
- }
- //Key press 2 to trigger attractor particle Mode
- if (key == '2') {
- currentMode = PARTICLE_MODE_RADIAL;
- currentModeDisp = "PARTICLE_MODE_RADIAL";
- varSystem = true;
- reset();
- }
- //Key press 2 to trigger rain particle Mode
- if (key == '3') {
- currentMode = PARTICLE_MODE_RAIN;
- currentModeDisp = "PARTICLE_MODE_RAIN";
- varSystem = false;
- reset();
- }
- //Key press 2 to trigger attractor particle Mode
- if (key == '4') {
- currentMode = PARTICLE_MODE_ATTRACTOR;
- currentModeDisp = "PARTICLE_MODE_ATTRACTOR";
- varSystem = true;
- reset();
- }
- //Key press 2 to trigger attractor particle Mode
- if (key == '5') {
- currentMode = PARTICLE_MODE_DETRACTOR;
- currentModeDisp = "PARTICLE_MODE_DETRACTOR";
- varSystem = true;
- reset();
- }
- //Key press 2 to trigger attractor particle Mode
- if (key == '6') {
- currentMode = PARTICLE_MODE_POLY;
- currentModeDisp = "PARTICLE_MODE_POLY";
- varSystem = false;
- reset();
- }
- if (key == '7') {
- trails = true;
- reset();
- }
- }
-
- //--------------------------------------------------------------
- void ofApp::keyReleased(int key) {
-
- }
-
- //--------------------------------------------------------------
- void ofApp::mouseMoved(int x, int y) {
- attractors.at(0)->setup(ofGetMouseX(), ofGetMouseY());
-
- }
-
- //--------------------------------------------------------------
- void ofApp::mousePressed(int x, int y, int button) {
-
- }
-
- //--------------------------------------------------------------
- void ofApp::mouseReleased(int x, int y, int button) {
-
- }
-
|