From 32a5a42233f0489e17afc0d61ae7f3f862964390 Mon Sep 17 00:00:00 2001 From: Sebastian Holzki Date: Wed, 12 Jun 2019 17:18:39 +0200 Subject: [PATCH] initial commit --- .gitattributes | 63 ++++++++++++ .gitignore | 93 +++++++++++++++++ emptyExample.png | Bin 0 -> 114064 bytes src/avatar.cpp | 99 ++++++++++++++++++ src/avatar.hpp | 51 +++++++++ src/greatWhole.cpp | 80 ++++++++++++++ src/greatWhole.hpp | 41 ++++++++ src/main.cpp | 15 +++ src/objectPhysics.cpp | 56 ++++++++++ src/objectPhysics.hpp | 96 +++++++++++++++++ src/ofApp.cpp | 229 +++++++++++++++++++++++++++++++++++++++++ src/ofApp.h | 83 +++++++++++++++ src/particle.cpp | 122 ++++++++++++++++++++++ src/particle.hpp | 54 ++++++++++ src/particleSystem.cpp | 75 ++++++++++++++ src/particleSystem.hpp | 74 +++++++++++++ src/visitor.cpp | 165 +++++++++++++++++++++++++++++ src/visitor.hpp | 47 +++++++++ 18 files changed, 1443 insertions(+) create mode 100755 .gitattributes create mode 100755 .gitignore create mode 100644 emptyExample.png create mode 100644 src/avatar.cpp create mode 100644 src/avatar.hpp create mode 100644 src/greatWhole.cpp create mode 100644 src/greatWhole.hpp create mode 100644 src/main.cpp create mode 100644 src/objectPhysics.cpp create mode 100644 src/objectPhysics.hpp create mode 100644 src/ofApp.cpp create mode 100644 src/ofApp.h create mode 100644 src/particle.cpp create mode 100644 src/particle.hpp create mode 100644 src/particleSystem.cpp create mode 100644 src/particleSystem.hpp create mode 100644 src/visitor.cpp create mode 100644 src/visitor.hpp diff --git a/.gitattributes b/.gitattributes new file mode 100755 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..3b2a2e2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,93 @@ +########################### +# ignore generated binaries +# but not the data folder +########################### + +/bin/* +!/bin/data/ + +######### +# general +######### + +[Bb]uild/ +[Oo]bj/ +*.o +[Dd]ebug*/ +[Rr]elease*/ +*.mode* +*.app/ +*.pyc +.svn/ +*.log + +######################## +# IDE files which should +# be ignored +######################## + +# XCode +*.pbxuser +*.plist +*.DS_Store +*.Makefile +Project.xcconfig +*.make +/makefile +*.xcodeproj +*.perspective +*.perspectivev3 +*.mode1v3 +*.mode2v3 +# XCode 4 +xcuserdata +*.xcworkspace + +# Code::Blocks +*.depend +*.layout + +# Visual Studio +*.sdf +*.opensdf +*.suo +*.pdb +*.ilk +*.aps +*.make +*.sln +*.vcxproj +*.filters +*.rc +ipch/ + +# Eclipse +.metadata +local.properties +.externalToolBuilders + +################## +# operating system +################## + +# Linux +*~ +# KDE +.directory +.AppleDouble + +# OSX +.DS_Store +*.swp +*~.nib +# Thumbnails +._* + +# Windows +# Image file caches +Thumbs.db +# Folder config file +Desktop.ini + +# Android +.csettings \ No newline at end of file diff --git a/emptyExample.png b/emptyExample.png new file mode 100644 index 0000000000000000000000000000000000000000..8de27cc4d64339a1d1e62d128e9c16d20a30dabc GIT binary patch literal 114064 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 icon = .... + +} + +// ----------------------------------------- + + +void Avatar::update(){ + + + +} + +// ----------------------------------------- + +void Avatar::draw(){ + + icon.draw(position); + +} + +// ----------------------------------------- + +ofVec2f Avatar::getPosition(){ + + return position; + +} + +// ----------------------------------------- + +void Avatar::setPosition(int _x, int _y){ + + position.x = _x; + position.y = _y; + +} + +void Avatar::setPosition(ofVec2f _position){ + + position = _position; + +} + + +// ----------------------------------------- + +void Avatar::clipToAvatar(Avatar _avatar){ + + //Read coordinates to clip to: + ofVec2f tempCoords = _avatar.getPosition(); + + if( tempCoords.y == 0 ){ + + position.x = tempCoords.x + 20 ; + position.y = tempCoords.y + 20 ; + + }else{ + + position.x = tempCoords.x + 20 ; + position.y = tempCoords.y - 20 ; + + } + +} diff --git a/src/avatar.hpp b/src/avatar.hpp new file mode 100644 index 0000000..ad125b0 --- /dev/null +++ b/src/avatar.hpp @@ -0,0 +1,51 @@ +// +// avatar.hpp +// emptyExample +// +// Created by Sebastian Holzki on 17.04.19. +// + +#pragma once +#include +#include "ofMain.h" + + + + +class Avatar { + + +public: + + Avatar(int playerType); + ~Avatar(); + + void setup(int playerType); + void update(); + void draw(); + + void setPlayerType(); + int getPlayerType(); + + ofVec2f getPosition(); + void setPosition(int x, int y); + void setPosition(ofVec2f position); + + + void clipToAvatar(Avatar avatar); //A particular avatar can clip its position, depending on the position of another avatar, compared to a beehive-structure) + + + +private: + + ofImage icon; + int playerType; + ofVec2f position; + + + + + + +}; + diff --git a/src/greatWhole.cpp b/src/greatWhole.cpp new file mode 100644 index 0000000..e426215 --- /dev/null +++ b/src/greatWhole.cpp @@ -0,0 +1,80 @@ +// +// greatWhole.cpp +// emptyExample +// +// Created by Sebastian Holzki on 17.04.19. +// + +#include "greatWhole.hpp" +#include "avatar.hpp" + + + + +GreatWhole::GreatWhole() +{ + + +} + +// ----------------------------------- + +GreatWhole::~GreatWhole() +{ + + +} + +// ----------------------------------- + + + +void GreatWhole::setup(){ + + + +} + +// ----------------------------------------------- + + +void GreatWhole::update(vector avatars){ + + + + +} + +// ----------------------------------------------- + + +void GreatWhole::draw(){ + + /* + + draw the whole avatar vector + + */ + + +} + + +// ----------------------------------------------- + + +void GreatWhole::addAvatar(Avatar avatar){ + + + // avatars.push_back(avatar); + + /* + + Set coordinates in abhängigkeit vom letzten also bei avatars at (max-1) + clip avatar dann an den letzten, y und x angepasst an x und y von avatars.at(max-1) + + */ + +} + + diff --git a/src/greatWhole.hpp b/src/greatWhole.hpp new file mode 100644 index 0000000..fdcb95a --- /dev/null +++ b/src/greatWhole.hpp @@ -0,0 +1,41 @@ +// +// greatWhole.hpp +// emptyExample +// +// Created by Sebastian Holzki on 17.04.19. +// + +#include +#include "ofMain.h" +#include "avatar.hpp" + +#pragma once + + +/* Das Große Ganze beinhaltet eine unbestimmte Anzahl an bereits eingecheckten Personen, deren Infos in Avatare gespeichert werden. + Es bedarf eine setup(), update() und draw()-Methode. Dabei soll Platz für den vector geschaffen werden. In update wird eine + gewisse Bewegung der Avatar-"Bubbles" definiert. Draw zeichnet die Avatare auf die Stelen, also die entsprechenden Koordinaten. */ + + +class GreatWhole { + + +public: + + GreatWhole(); + ~GreatWhole(); + + void setup(); + void update(vector avatars); + void draw(); + + void addAvatar(Avatar avatar); + Avatar getAvatarAt(int i); + + + +private: + + vector avatars; + +}; diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..f73817a --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,15 @@ + +#include "ofMain.h" +#include "ofApp.h" + +//======================================================================== +int main( ){ + + ofSetupOpenGL(1000,1000, OF_WINDOW); // <-------- setup the GL context + + // this kicks off the running of my app + // can be OF_WINDOW or OF_FULLSCREEN + // pass in width and height too: + ofRunApp( new ofApp()); + +} diff --git a/src/objectPhysics.cpp b/src/objectPhysics.cpp new file mode 100644 index 0000000..089b6d3 --- /dev/null +++ b/src/objectPhysics.cpp @@ -0,0 +1,56 @@ +// +// objectPhysics.cpp +// particle_combined +// +// Created by Sebastian Holzki on 11.06.19. +// + +#include "objectPhysics.hpp" + + + +ObjectPhysics::ObjectPhysics(){ + + cout<< "ObjectPhysics Konstruktor"< +#include "ofMain.h" +#endif /* objectPhysics_hpp */ + + +class ObjectPhysics { + +public: + + ObjectPhysics(); + ~ObjectPhysics(); + + +protected: + + ofVec2f position; + bool emitting; + bool attracting; + + float force; + float vel; + +}; + +// ******* ATTRAKTOR ******* ATTRAKTOR ******* ATTRAKTOR ******* ATTRAKTOR ******* ATTRAKTOR ******* + +class Attraktor: public ObjectPhysics { + + +public: + + Attraktor(); + Attraktor(float x, float y); + ~Attraktor(); + + +// Attraktor(){ +// +// emitting = false; +// attracting = true; +// +// cout << "Attraktor Konstruktor" << endl; +// +// }; +// +// Attraktor(float x, float y){ +// +// emitting = false; +// attracting = true; +// +// position.set(x,y); +// +// cout << "Attraktor Konstruktor überladen" << endl; +// }; +// +// +// +// ~Attraktor(){ +// cout << "Attraktor Destruktor" << endl; +// }; + +private: + + +}; + +// ******* EMITTER ******* EMITTER ******* EMITTER ******* EMITTER ******* EMITTER ******* EMITTER ******* + +class Emitter: public ObjectPhysics { + + +public: + +// Emitter(){ +// +// emitting = true; +// attracting = false; +// +// }; + Emitter(); + ~Emitter(); + +private: + +}; + diff --git a/src/ofApp.cpp b/src/ofApp.cpp new file mode 100644 index 0000000..dd63115 --- /dev/null +++ b/src/ofApp.cpp @@ -0,0 +1,229 @@ + +#include "ofApp.h" + + +// *** GLOBALS DEFINITION *** GLOBALS DEFINITION *** GLOBALS DEFINITION *** GLOBALS DEFINITION **** + + +//-------------------------------------------------------------- +void ofApp::setup(){ + + VISITOR_COUNT = 0; + VISITOR_COUNT_LASTFRAME = 0; + PARTICLE_COUNT = 0; + + + for (int i = 0; i < particleSystems.size(); i++){ + + + + } + + + // *** OSC Setup *** OSC Setup *** OSC Setup *** + + receiver.setup(PORT); + +} + +//-------------------------------------------------------------- +void ofApp::update(){ + + + // *** OSC RECEIVER *** OSC RECEIVER *** OSC RECEIVER *** + + + /* + + Here the program will read and convert the information from the tracking, count them & put coordinates of people entering the ground. + We have to define, how this information will affect the particleSystems! + + -Create message, put the stuff from the received OSC in it + -duplicate the msg as string to enable onscreen supervision + -There will be a global visitor count called VISITOR_COUNT + -Use VISITOR_COUNT to correctly update the size of the visitors vector + -Iterate trough Message-values and put information in the visitors vector + + */ + + + + while(receiver.hasWaitingMessages()){ + + ofxOscMessage visitorInformations; + receiver.getNextMessage(&visitorInformations); + + oscMsg = ofToString(visitorInformations); + + if(visitorInformations.getAddress() == "/centroidsOfBlob") { + + VISITOR_COUNT_LASTFRAME = VISITOR_COUNT; + VISITOR_COUNT = visitorInformations.getArgAsInt(0); //update the number of Visitors from OSCs first Argument, which is the number of blobs (detected Contours) + + + +// *** CHECK FOR CHANGES IN THE NUMBER OF VISITORS *** CHECK FOR CHANGES IN THE NUMBER OF VISITORS *** CHECK FOR CHANGES IN THE NUMBER OF VISITORS *** + + +// If there are MORE visitors now, add the difference to the visitors vector + + + if(VISITOR_COUNT > VISITOR_COUNT_LASTFRAME){ + + for(int i = 0; i < (VISITOR_COUNT - VISITOR_COUNT_LASTFRAME); i++){ + + visitors.push_back(new Visitor); + + } + } + + +// If there are LESS visitors now, delete the difference from the visitors vector + + + if(VISITOR_COUNT < VISITOR_COUNT_LASTFRAME){ + + for(int i = 0; i < (VISITOR_COUNT_LASTFRAME - VISITOR_COUNT); i++){ + + delete visitors.at(visitors.size()); //maybe nicht zulässig, weil fehleranfällig??? + //erase ergänzen! + } + + } + + +// *** TRANSFER TRACKING-INFORMATION INTO VISITOR-CLASS *** TRANSFER TRACKING-INFORMATION INTO VISITOR-CLASS *** + + + for(int i = 1; i <= VISITOR_COUNT; i++){ + + //put Information into visitors + + float xOfVisitor = visitorInformations.getArgAsFloat(i * 2 - 1) * ofGetWindowWidth(); + float yOfVisitor = visitorInformations.getArgAsFloat(i * 2) * ofGetWindowHeight(); + + visitors.at( i - 1 )->setPosition(xOfVisitor, yOfVisitor); + + } + + } //end of .getAddress() == "/centroidsOfBlob") + + } //end of receiver.hasWaitingMessages + + + + + + + // *** RFID Input *** RFID Input *** RFID Input *** RFID Input *** RFID Input *** + + /* + + + + Here we have to define, how the particleSystems react to RFID input. + Read ID of a visitor and let the particlesystems react to it. + + !!! Here in ofApp.cpp there will only be the transfer of incoming information about IDs, playertypes, etc. into the update-methods of the particleSystems. !!! + + For example: + + - Tell all particleSystems about a new checkedIn-Visitor + - Set the playerType of one particular particleSystem to the checked in. + + */ + + + + // *** MAIN UPDATE PARTICLE SYSTEMS *** MAIN UPDATE PARTICLE SYSTEMS *** MAIN UPDATE PARTICLE SYSTEMS *** + + + for (int p = 0; p < particleSystems.size();) + { + // Update particle systems + +// particleSystems.at(p)->update("xxx , xxx , xxx , .... "); + + + } + + + +} //end of update() + + + + +//-------------------------------------------------------------- +void ofApp::draw(){ + + + //draw all ParticleSystems that are in the particleSystems vector + + for(int p = 0; p < particleSystems.size(); p++) + { + particleSystems.at(p)->draw(); + } + + +} + +//-------------------------------------------------------------- +void ofApp::keyPressed(int key){ + +} + +//-------------------------------------------------------------- +void ofApp::keyReleased(int key){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseMoved(int x, int y){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseDragged(int x, int y, int button){ + +} + +//-------------------------------------------------------------- +void ofApp::mousePressed(int x, int y, int button){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseReleased(int x, int y, int button){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseEntered(int x, int y){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseExited(int x, int y){ + +} + +//-------------------------------------------------------------- +void ofApp::windowResized(int w, int h){ + +} + +//-------------------------------------------------------------- +void ofApp::gotMessage(ofMessage msg){ + +} + +//-------------------------------------------------------------- +void ofApp::dragEvent(ofDragInfo dragInfo){ + +} + +//-------------------------------------------------------------- + + + diff --git a/src/ofApp.h b/src/ofApp.h new file mode 100644 index 0000000..1259f1c --- /dev/null +++ b/src/ofApp.h @@ -0,0 +1,83 @@ +#pragma once + +#include "ofMain.h" +#include "particleSystem.hpp" +#include "greatWhole.hpp" +#include "avatar.hpp" +#include "ofxOsc.h" +#include "visitor.hpp" +#include "objectPhysics.hpp" +#include "particle.hpp" + + + int WINDOWSIZE_WIDTH = 1000; + int WINDOWSIZE_HEIGHT = 1000; + + + + +// *** SETUP OSC INFORMATION *** SETUP OSC INFORMATION *** + +#define PORT 12345 +#define HOST "xxx.xxx.xxx.xxx" + + + + +class ofApp : public ofBaseApp{ + + public: + + void setup(); + void update(); + void draw(); + + void keyPressed(int key); + void keyReleased(int key); + void mouseMoved(int x, int y); + void mouseDragged(int x, int y, int button); + void mousePressed(int x, int y, int button); + void mouseReleased(int x, int y, int button); + void mouseEntered(int x, int y); + void mouseExited(int x, int y); + void windowResized(int w, int h); + void dragEvent(ofDragInfo dragInfo); + void gotMessage(ofMessage msg); + + + int PARTICLE_COUNT; + //+1 for every new Particle, -1 for every Particle that gets older than the defined maxLife + int VISITOR_COUNT; + //the visitor count will be fed with the nBlobs-value from incoming OSC messages + int VISITOR_COUNT_LASTFRAME; + + + +private: + + // *** OSC *** OSC *** OSC *** + + string oscMsg; + ofxOscReceiver receiver; + float timeSent, timeReceived; + + + //Information about what is going on in the scene + + int nBlobs; //count of the tracked visitors + + + + + + vector visitors; + + vector particleSystems; + + GreatWhole dasGrosseGanze; + + +}; + + + diff --git a/src/particle.cpp b/src/particle.cpp new file mode 100644 index 0000000..1c51d0c --- /dev/null +++ b/src/particle.cpp @@ -0,0 +1,122 @@ +// +// particle.cpp +// emptyExample +// +// Created by Sebastian Holzki on 16.04.19. +// + +#include "particle.hpp" + + + +Particle::Particle() +{ + + +} + +// ----------------------------------- + +Particle::~Particle() +{ + + +} + +// ----------------------------------- + + + +void Particle::setup(ofVec2f _position){ + + this->position = _position; + + velocity.set(0,0); + age = 0.0; + maxLife = 12.0; + + color.set(250,250,250); + size = 2.0; + mass = 100; + +} + +// ----------------------------------- + +void Particle::update(float deltaT){ + + + + + +} + + +// ----------------------------------- + +void Particle::draw(){ + + ofDrawCircle(position,size); + +} + + +//----------------------------------- + +float Particle::getMaxLife(){ + + return maxLife; + +} + +//----------------------------------- + +float Particle::getAge(){ + + return age; + +} + +//----------------------------------- + + +void Particle::mapParticle(){ + + /* + Put an if Statement before it: + + if(borderCollission == true){mapParticle()} + + + The particle will be mapped to a new position, using information about: + + - old position + - velocity (direction) + - defined borders in the projection --> globals like window size, angle between "stelen", width of stelen, etc. + + if the particle hits a border + + + */ + + +} + + + + + + + + + + + + + + + + + + + diff --git a/src/particle.hpp b/src/particle.hpp new file mode 100644 index 0000000..9f9ecf2 --- /dev/null +++ b/src/particle.hpp @@ -0,0 +1,54 @@ +// +// particle.hpp +// +// Created by Sebastian Holzki on 16.04.19. +// + +#pragma once +#include +#include "ofMain.h" + + + + + +class Particle { + +public: + + Particle(); + ~Particle(); + + void setup(ofVec2f position); + void update(float deltaT); + void draw(); + + float getMaxLife(); + float getAge(); + float getAgeNorm(); + + + void mapParticle(); + bool borderCollission(); + + + + +private: + + ofVec2f velocity; + ofVec2f position; + + float maxLife; + float age; + float size; + float mass; + + ofColor color; + + + int stele; + //on which "stele" is the particle? --> will affect the movement (mapping), when it reaches borders of its "stele" ! + //if border 1/2/3/4 (<,>,v,^), then map particle + +}; diff --git a/src/particleSystem.cpp b/src/particleSystem.cpp new file mode 100644 index 0000000..33110dc --- /dev/null +++ b/src/particleSystem.cpp @@ -0,0 +1,75 @@ +// +// particleSystem.cpp +// emptyExample +// +// Created by Sebastian Holzki on 16.04.19. +// + +#include "particleSystem.hpp" + + + +ParticleSystem::ParticleSystem(){ + + + +} + +// ----------------------------------- + +ParticleSystem::~ParticleSystem(){ + + +} + +// ----------------------------------- + + + +void ParticleSystem::setup(){ + + + +} + +// ----------------------------------------------- + + +void ParticleSystem::update(float deltaT, int visitorID, bool attracted){ + +/* + + + + - wenn attracted, dann springe in Berechnung der Attraktion durch die vorhandenen Attraktoren + +*/ + +/* + VisitorID stellt bekannten Besucher dar, also fertiges, auswertbares Profil. + visitorID steuert die Optik des Partikelsystems, aktiviert also eine Art Preset + z.B. Switch-Anweisung (visitorID 1-8): + + case 0: default mode, attraction + case 1: load xml blabla1 + case 2: load xml blabla2 + ... + +*/ + + +} + +// ----------------------------------------------- + + +void ParticleSystem::draw(){ + + /* + + draw all the particles from the vector in the ParticleSystem + + */ + + +} diff --git a/src/particleSystem.hpp b/src/particleSystem.hpp new file mode 100644 index 0000000..326fb5b --- /dev/null +++ b/src/particleSystem.hpp @@ -0,0 +1,74 @@ +// +// particleSystem.hpp +// emptyExample +// +// Created by Sebastian Holzki on 16.04.19. +// +#pragma once + + +#include + + +#include "particle.hpp" + + + +class ParticleSystem { + + ParticleSystem(); + ~ParticleSystem(); + +public: + + + void setup(); + void update(float deltaT, int playerType, bool attracted); + void draw(); + + + + /* + + Where do we make the quick setting-changes? + Like for exampe change direction of an emitter + its position? + --> XML? + + + */ + +private: + + vector particles; + + //adresses of the active emitters and attractors +// vector attractors; +// vector emitters; + + //Maybe the emitter does not have to be an own class, but is more like a Vector of Positions, so in the system.back it will setup particles for every position that is saved in this Vector + //like following: + + //vector positionsToEmitFrom; + + + float birthcount; + bool attracted; + int playerType; + + + +}; + + + +/* + +class AttractedSystem : public ParticleSystem { + + + bool attracted = true; + +}; + + */ + diff --git a/src/visitor.cpp b/src/visitor.cpp new file mode 100644 index 0000000..ef72087 --- /dev/null +++ b/src/visitor.cpp @@ -0,0 +1,165 @@ +// +// visitor.cpp +// particle_combined +// +// Created by Sebastian Holzki on 11.06.19. +// + +#include "visitor.hpp" + + + +Visitor::Visitor() +{ + + +} + +// ----------------------------------- + +Visitor::~Visitor() +{ + + +} + +// ----------------------------------- + + + +void Visitor::setup(){ + + + +} + +// ----------------------------------------------- + + +void Visitor::setup(float _x, float _y){ + + position.x = _x; + position.y = _y; + +} + +// ----------------------------------------------- + + +void Visitor::update(){ + + + + +} + +// ----------------------------------------------- + + +void Visitor::draw(){ + + + + +} + + // ----------------------------------------------- + + + + ofVec2f Visitor::getPosition(){ + + return position; + + } + +// ----------------------------------------------- + + + float Visitor::getX(){ + + return position.x; + + } + + + // ----------------------------------------------- + + float Visitor::getY(){ + + return position.y; + + } + + // ----------------------------------------------- + + +void Visitor::setPosition(float _x, float _y){ + + position.x = _x; + position.y = _y; + + +} + + +// ----------------------------------------------- + + +void Visitor::setPosition(ofVec2f _position){ + + position = _position; + +} + +// ----------------------------------------------- + + +void Visitor::setX(float _x){ + + position.x = _x; + +} + + + +// ----------------------------------------------- + + +void Visitor::setY(float _y){ + + position.y = _y; + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/visitor.hpp b/src/visitor.hpp new file mode 100644 index 0000000..af8c3fe --- /dev/null +++ b/src/visitor.hpp @@ -0,0 +1,47 @@ +// +// visitor.hpp +// particle_combined +// +// Created by Sebastian Holzki on 11.06.19. +// + + +#pragma once +#include +#include "ofMain.h" + + + + +class Visitor { + + +public: + + Visitor(); + ~Visitor(); + + void setup(); + void setup(float _x, float _y); + void update(); + void draw(); + + + //GETTERS + ofVec2f getPosition(); + float getX(); + float getY(); + + //SETTERS + void setPosition(float x, float y); + void setPosition(ofVec2f position); + void setX(float _x); + void setY(float _y); + + +private: + + ofVec2f position; + + +};