├── addons.make ├── bin └── data │ ├── .gitkeep │ └── shaders │ ├── render.vert │ ├── posUpdate.frag │ ├── render.geom │ └── velUpdate.frag ├── .gitignore ├── GPU_Flocking.xcodeproj ├── project.xcworkspace │ └── contents.xcworkspacedata ├── xcshareddata │ └── xcschemes │ │ ├── GPU_Flocking Debug.xcscheme │ │ └── GPU_Flocking Release.xcscheme └── project.pbxproj ├── src ├── main.cpp ├── testApp.h ├── pingPongBuffer.h └── testApp.cpp ├── Makefile ├── readme.md ├── Project.xcconfig ├── openFrameworks-Info.plist └── config.make /addons.make: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /bin/data/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.app 2 | xcuserdata 3 | .DS_Store -------------------------------------------------------------------------------- /GPU_Flocking.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/main.cpp: -------------------------------------------------------------------------------- 1 | #include "ofMain.h" 2 | #include "testApp.h" 3 | 4 | //======================================================================== 5 | int main( ){ 6 | ofSetupOpenGL(1024,768,OF_WINDOW); // <-------- setup the GL context 7 | 8 | // this kicks off the running of my app 9 | // can be OF_WINDOW or OF_FULLSCREEN 10 | // pass in width and height too: 11 | ofRunApp(new testApp()); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # Attempt to load a config.make file. 2 | # If none is found, project defaults in config.project.make will be used. 3 | ifneq ($(wildcard config.make),) 4 | include config.make 5 | endif 6 | 7 | # make sure the the OF_ROOT location is defined 8 | ifndef OF_ROOT 9 | OF_ROOT=../../.. 10 | endif 11 | 12 | # call the project makefile! 13 | include $(OF_ROOT)/libs/openFrameworksCompiled/project/makefileCommon/compile.project.mk 14 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # GPU Flocking in openFrameworks 2 | * A very direct port of [Daniel Shiffman's](http://shiffman.net/) Nature of Code Flocking onto the GPU 3 | * Based in part on the excellent openFrameworks GPU particle example 4 | 5 | ## Setup 6 | * Clone or download openFrameworks 7 | * Clone this app into apps/myApps/GPU_Flocking 8 | * Run! 9 | 10 | ## Notes 11 | * You may get errors with the geometry shader if you have an older GPU. It's basically just a bonus anyways. -------------------------------------------------------------------------------- /bin/data/shaders/render.vert: -------------------------------------------------------------------------------- 1 | #version 120 2 | #extension GL_EXT_gpu_shader4 : enable 3 | #extension GL_ARB_texture_rectangle : enable 4 | 5 | uniform sampler2DRect posTex; 6 | uniform vec2 screen; 7 | uniform vec2 screenPos; 8 | 9 | void main() { 10 | // use the texture coordinates as an index into the position texture 11 | vec2 verPos = gl_MultiTexCoord0.xy; 12 | 13 | // read position data from texture 14 | vec4 pixPos = texture2DRect( posTex, verPos ); 15 | 16 | 17 | pixPos.x += -0.5; 18 | pixPos.y += -0.5; 19 | 20 | pixPos.x *= screen.x; 21 | pixPos.y *= screen.y; 22 | 23 | gl_Position = pixPos; 24 | gl_FrontColor = gl_Color; 25 | } -------------------------------------------------------------------------------- /Project.xcconfig: -------------------------------------------------------------------------------- 1 | //THE PATH TO THE ROOT OF OUR OF PATH RELATIVE TO THIS PROJECT. 2 | //THIS NEEDS TO BE DEFINED BEFORE CoreOF.xcconfig IS INCLUDED 3 | OF_PATH = ../../.. 4 | 5 | //THIS HAS ALL THE HEADER AND LIBS FOR OF CORE 6 | #include "../../../libs/openFrameworksCompiled/project/osx/CoreOF.xcconfig" 7 | 8 | //ICONS - NEW IN 0072 9 | ICON_NAME_DEBUG = icon-debug.icns 10 | ICON_NAME_RELEASE = icon.icns 11 | ICON_FILE_PATH = $(OF_PATH)/libs/openFrameworksCompiled/project/osx/ 12 | 13 | //IF YOU WANT AN APP TO HAVE A CUSTOM ICON - PUT THEM IN YOUR DATA FOLDER AND CHANGE ICON_FILE_PATH to: 14 | //ICON_FILE_PATH = bin/data/ 15 | 16 | OTHER_LDFLAGS = $(OF_CORE_LIBS) 17 | HEADER_SEARCH_PATHS = $(OF_CORE_HEADERS) 18 | -------------------------------------------------------------------------------- /openFrameworks-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | com.yourcompany.openFrameworks 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundlePackageType 14 | APPL 15 | CFBundleSignature 16 | ???? 17 | CFBundleVersion 18 | 1.0 19 | CFBundleIconFile 20 | ${ICON} 21 | 22 | 23 | -------------------------------------------------------------------------------- /bin/data/shaders/posUpdate.frag: -------------------------------------------------------------------------------- 1 | #version 120 2 | #extension GL_ARB_texture_rectangle : enable 3 | 4 | uniform sampler2DRect prevPosData; // recive the previus position texture 5 | uniform sampler2DRect velData; // recive the velocity texture 6 | 7 | void main(void){ 8 | vec2 st = gl_TexCoord[0].st; // gets the position of the pixel that it´s dealing with... 9 | 10 | vec2 pos = texture2DRect( prevPosData, st ).xy; // ... in order to look at a particulary place on it 11 | vec2 vel = texture2DRect( velData, st ).xy; // Fetch both the pos and vel. 12 | 13 | pos += vel; 14 | 15 | // wrap 16 | if ( pos.x < 0.0) 17 | pos.x = 1.0; 18 | 19 | if ( pos.x > 1.0) 20 | pos.x = 0.0; 21 | 22 | if (pos.y < 0.0) 23 | pos.y = 1.0; 24 | 25 | if ( pos.y > 1.0) 26 | pos.y = 0.0; 27 | 28 | gl_FragColor.rgba = vec4(pos.x,pos.y,1.0,1.0); // And finaly it store it on the position FBO 29 | } -------------------------------------------------------------------------------- /bin/data/shaders/render.geom: -------------------------------------------------------------------------------- 1 | #version 120 2 | #extension GL_EXT_geometry_shader4 : enable 3 | #extension GL_EXT_gpu_shader4 : enable 4 | 5 | uniform float pointSize; 6 | uniform float screenSize; 7 | 8 | const float PI = 3.1415926; 9 | 10 | void main(void){ 11 | 12 | float circleRes = 12.0; 13 | float size = pointSize / screenSize; 14 | 15 | for ( float a = 0; a < circleRes; a++ ){ 16 | // Angle between each side in radians 17 | float ang = (PI * 2.0 / circleRes) * a; 18 | 19 | vec4 offset = vec4(cos(ang) * size, -sin(ang) * size, 0.0, 0.0); 20 | gl_Position = gl_PositionIn[0] + offset; 21 | gl_FrontColor = gl_FrontColorIn[0]; 22 | EmitVertex(); 23 | 24 | ang = (PI * 2.0 / circleRes) * (a + 1); 25 | offset = vec4(cos(ang) * size, -sin(ang) * size, 0.0, 0.0); 26 | gl_Position = gl_PositionIn[0] + offset; 27 | gl_FrontColor = gl_FrontColorIn[0]; 28 | EmitVertex(); 29 | 30 | gl_Position = gl_PositionIn[0]; 31 | gl_FrontColor = gl_FrontColorIn[0]; 32 | EmitVertex(); 33 | } 34 | 35 | EndPrimitive(); 36 | 37 | } -------------------------------------------------------------------------------- /src/testApp.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "ofMain.h" 4 | #include "pingPongBuffer.h" 5 | 6 | class testApp : public ofBaseApp{ 7 | 8 | public: 9 | void setup(); 10 | void update(); 11 | void draw(); 12 | 13 | void keyPressed(int key); 14 | void keyReleased(int key); 15 | void mouseMoved(int x, int y ); 16 | void mouseDragged(int x, int y, int button); 17 | void mousePressed(int x, int y, int button); 18 | void mouseReleased(int x, int y, int button); 19 | void windowResized(int w, int h); 20 | void dragEvent(ofDragInfo dragInfo); 21 | void gotMessage(ofMessage msg); 22 | 23 | // shaders 24 | ofShader velocity; 25 | ofShader position; 26 | ofShader render; 27 | 28 | // fbo you're rendering to 29 | ofFbo renderFBO; 30 | 31 | // ping-pong buffers for position and velocity 32 | pingPongBuffer posPingPong; 33 | pingPongBuffer velPingPong; 34 | 35 | // parameters for flocking 36 | float maxVelocity; 37 | float maxForce; 38 | float desiredSeparation; 39 | float neighborDistance; 40 | 41 | // size of circles 42 | float particleSize; 43 | 44 | // mesh for position + color store 45 | ofMesh mesh; 46 | }; 47 | -------------------------------------------------------------------------------- /src/pingPongBuffer.h: -------------------------------------------------------------------------------- 1 | // Ping-pong buffer from openFrameworks shader particle example 2 | 3 | #pragma once 4 | 5 | struct pingPongBuffer { 6 | public: 7 | void allocate( int _width, int _height, int _internalformat = GL_RGBA, float _dissipation = 1.0f){ 8 | // Allocate 9 | for(int i = 0; i < 2; i++){ 10 | FBOs[i].allocate(_width,_height, _internalformat ); 11 | FBOs[i].getTextureReference().setTextureMinMagFilter(GL_NEAREST, GL_NEAREST); 12 | } 13 | 14 | // Clean 15 | clear(); 16 | 17 | // Set everything to 0 18 | flag = 0; 19 | swap(); 20 | flag = 0; 21 | } 22 | 23 | void swap(){ 24 | src = &(FBOs[(flag)%2]); 25 | dst = &(FBOs[++(flag)%2]); 26 | } 27 | 28 | void clear(){ 29 | for(int i = 0; i < 2; i++){ 30 | FBOs[i].begin(); 31 | ofClear(0,255); 32 | FBOs[i].end(); 33 | } 34 | } 35 | 36 | ofFbo& operator[]( int n ){ return FBOs[n];} 37 | 38 | ofFbo *src; // Source -> Ping 39 | ofFbo *dst; // Destination -> Pong 40 | private: 41 | ofFbo FBOs[2]; // Real addresses of ping/pong FBO´s 42 | int flag; // Integer for making a quick swap 43 | }; 44 | -------------------------------------------------------------------------------- /GPU_Flocking.xcodeproj/xcshareddata/xcschemes/GPU_Flocking Debug.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 51 | 52 | 58 | 59 | 60 | 61 | 62 | 63 | 69 | 70 | 76 | 77 | 78 | 79 | 81 | 82 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /GPU_Flocking.xcodeproj/xcshareddata/xcschemes/GPU_Flocking Release.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 51 | 52 | 58 | 59 | 60 | 61 | 62 | 63 | 69 | 70 | 76 | 77 | 78 | 79 | 81 | 82 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /bin/data/shaders/velUpdate.frag: -------------------------------------------------------------------------------- 1 | #version 120 2 | #extension GL_ARB_texture_rectangle : enable 3 | #define KERNEL_SIZE 9 4 | 5 | uniform sampler2DRect backbuffer; // recive the previus velocity texture 6 | uniform sampler2DRect posData; // recive the position texture 7 | 8 | uniform int posWidth; 9 | uniform int posHeight; 10 | 11 | // flocking parameters 12 | uniform float maxspeed; 13 | uniform float maxforce; 14 | uniform float desiredSeparation; 15 | uniform float neighborDistance; 16 | 17 | // vector utils 18 | vec2 limit(vec2 v,float m){ 19 | float lengthSquared = v.x*v.x + v.y*v.y; 20 | if( lengthSquared > m*m && lengthSquared > 0.0 ) { 21 | float ls = sqrt(lengthSquared); 22 | float ratio = m/ls; 23 | v *= ratio; 24 | } 25 | return v; 26 | } 27 | 28 | // Separation 29 | // Method checks for nearby boids and steers away 30 | vec2 separate(vec2 p,vec2 vel){ 31 | vec2 steer = vec2(0.0,0.0); 32 | float count = 0.0; 33 | 34 | // For every boid in the system, check if it's too close 35 | 36 | for ( int x =0; x < posWidth; x ++){ 37 | for (int y=0; y < posHeight; y++) { 38 | vec2 pos = texture2DRect( posData, vec2(x,y)).xy; 39 | 40 | float d = distance( p, pos ); 41 | 42 | // If the distance is greater than 0 and less than an arbitrary amount (0 when you are yourself) 43 | if ((d > 0.0) && (d < desiredSeparation)) { 44 | // Calculate vector pointing away from neighbor 45 | vec2 diff = p; 46 | diff -= pos; 47 | diff = normalize(diff); 48 | diff /= d; // Weight by distance 49 | steer += diff; 50 | count += 1.0; // Keep track of how many 51 | } 52 | } 53 | } 54 | // Average -- divide by how many 55 | if (count > 0.0) { 56 | steer /= count; 57 | } 58 | 59 | // As long as the vector is greater than 0 60 | if (length(steer) > 0.0) { 61 | // Implement Reynolds: Steering = Desired - Velocity 62 | steer = normalize(steer); 63 | steer *= (maxspeed); 64 | steer /= vel; 65 | steer = limit(steer, maxforce); 66 | } 67 | return steer; 68 | } 69 | 70 | // Alignment 71 | // For every nearby boid in the system, calculate the average velocity 72 | vec2 align(vec2 p,vec2 vel){ 73 | 74 | vec2 sum = vec2(0.0,0.0); 75 | float count = 0.0; 76 | for ( int x =0; x < posWidth; x ++){ 77 | for (int y=0; y < posHeight; y++) { 78 | vec2 pos = texture2DRect( posData, vec2(x,y)).xy; 79 | vec2 otherVel = texture2DRect( backbuffer, vec2(x,y) ).xy; 80 | 81 | float d = distance( p, pos ); 82 | 83 | if ((d > 0) && (d < neighborDistance)) { 84 | sum.x += otherVel.x; 85 | sum.y += otherVel.y; 86 | count = count + 1.0; 87 | } 88 | } 89 | } 90 | if (count > 0.0) { 91 | sum /= (count); 92 | sum = normalize(sum); 93 | sum *= (maxspeed); 94 | 95 | vec2 steer = sum - vel; 96 | steer = limit(steer, maxforce); 97 | return steer; 98 | } else { 99 | return vec2(0.0,0.0); 100 | } 101 | } 102 | 103 | vec2 seek(vec2 p,vec2 vel,vec2 target) { 104 | vec2 desired = target; // A vector pointing from the location to the target 105 | desired -= p; 106 | 107 | // Normalize desired and scale to maximum speed 108 | desired = normalize(desired); 109 | desired *= (maxspeed); 110 | 111 | // Steering = Desired minus Velocity 112 | vec2 steer = desired; 113 | steer -= vel; 114 | steer = limit(steer, maxforce); // Limit to maximum steering force 115 | return steer; 116 | } 117 | 118 | vec2 seekForce(vec2 p,vec2 vel,vec2 target) { 119 | vec2 desired = target; // A vector pointing from the location to the target 120 | desired -= p; 121 | 122 | // Normalize desired and scale to maximum speed 123 | desired = normalize(desired); 124 | 125 | // Steering = Desired minus Velocity 126 | vec2 steer = desired; 127 | steer -= vel; 128 | return steer; 129 | } 130 | 131 | // Cohesion 132 | // For the average location (i.e. center) of all nearby boids, calculate steering vector towards that location 133 | vec2 cohesion(vec2 p,vec2 vel) { 134 | 135 | vec2 sum = vec2(0.0,0.0); 136 | float count = 0.0; 137 | for ( int x =0; x < posWidth; x ++){ 138 | for (int y=0; y < posHeight; y++) { 139 | vec2 pos = texture2DRect( posData, vec2(x,y)).xy; 140 | vec2 otherVel = texture2DRect( backbuffer, vec2(x,y) ).xy; 141 | 142 | float d = distance( p, pos ); 143 | 144 | if ((d > 0.0) && (d < neighborDistance)) { 145 | sum += pos; 146 | count = count + 1.0; 147 | } 148 | } 149 | } 150 | if (count > 0.0) { 151 | sum /= count; 152 | return seek(p, vel, sum); // Steer towards the location 153 | } else { 154 | return vec2(0.0,0.0); 155 | } 156 | } 157 | 158 | vec2 applyForce(vec2 vel,vec2 force) { 159 | // We could add mass here if we want A = F / M 160 | return vel + force; 161 | } 162 | 163 | 164 | vec2 flock(vec2 p, vec2 v) { 165 | vec2 sep = separate(p,v); // Separation 166 | vec2 ali = align(p,v); // Alignment 167 | vec2 coh = cohesion(p,v); // Cohesion 168 | // Arbitrarily weight these forces 169 | sep *= 1.5; 170 | ali *= 1.0; 171 | coh *= 1.0; 172 | 173 | // Add the force vectors to acceleration 174 | v = applyForce(v,sep); 175 | v = applyForce(v,ali); 176 | v = applyForce(v,coh); 177 | return v; 178 | } 179 | 180 | void main(void){ 181 | vec2 st = gl_TexCoord[0].st; // gets the position of the pixel that it´s dealing with... 182 | 183 | vec2 pos = texture2DRect( posData, st).xy; // ... for gettinh the position data 184 | vec2 vel = texture2DRect( backbuffer, st ).xy; // and the velocity 185 | 186 | // Calculates what´s going to be the next position without updating it. 187 | // Just to see if it collide with the borders of the FBO texture 188 | // 189 | vel = flock(pos, vel); 190 | 191 | gl_FragColor = vec4(vel.x,vel.y,0.0,1.0); // Then save the vel data into the velocity FBO 192 | } 193 | -------------------------------------------------------------------------------- /config.make: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # CONFIGURE PROJECT MAKEFILE (optional) 3 | # This file is where we make project specific configurations. 4 | ################################################################################ 5 | 6 | ################################################################################ 7 | # OF ROOT 8 | # The location of your root openFrameworks installation 9 | # (default) OF_ROOT = ../../.. 10 | ################################################################################ 11 | # OF_ROOT = ../../.. 12 | 13 | ################################################################################ 14 | # PROJECT ROOT 15 | # The location of the project - a starting place for searching for files 16 | # (default) PROJECT_ROOT = . (this directory) 17 | # 18 | ################################################################################ 19 | # PROJECT_ROOT = . 20 | 21 | ################################################################################ 22 | # PROJECT SPECIFIC CHECKS 23 | # This is a project defined section to create internal makefile flags to 24 | # conditionally enable or disable the addition of various features within 25 | # this makefile. For instance, if you want to make changes based on whether 26 | # GTK is installed, one might test that here and create a variable to check. 27 | ################################################################################ 28 | # None 29 | 30 | ################################################################################ 31 | # PROJECT EXTERNAL SOURCE PATHS 32 | # These are fully qualified paths that are not within the PROJECT_ROOT folder. 33 | # Like source folders in the PROJECT_ROOT, these paths are subject to 34 | # exlclusion via the PROJECT_EXLCUSIONS list. 35 | # 36 | # (default) PROJECT_EXTERNAL_SOURCE_PATHS = (blank) 37 | # 38 | # Note: Leave a leading space when adding list items with the += operator 39 | ################################################################################ 40 | # PROJECT_EXTERNAL_SOURCE_PATHS = 41 | 42 | ################################################################################ 43 | # PROJECT EXCLUSIONS 44 | # These makefiles assume that all folders in your current project directory 45 | # and any listed in the PROJECT_EXTERNAL_SOURCH_PATHS are are valid locations 46 | # to look for source code. The any folders or files that match any of the 47 | # items in the PROJECT_EXCLUSIONS list below will be ignored. 48 | # 49 | # Each item in the PROJECT_EXCLUSIONS list will be treated as a complete 50 | # string unless teh user adds a wildcard (%) operator to match subdirectories. 51 | # GNU make only allows one wildcard for matching. The second wildcard (%) is 52 | # treated literally. 53 | # 54 | # (default) PROJECT_EXCLUSIONS = (blank) 55 | # 56 | # Will automatically exclude the following: 57 | # 58 | # $(PROJECT_ROOT)/bin% 59 | # $(PROJECT_ROOT)/obj% 60 | # $(PROJECT_ROOT)/%.xcodeproj 61 | # 62 | # Note: Leave a leading space when adding list items with the += operator 63 | ################################################################################ 64 | # PROJECT_EXCLUSIONS = 65 | 66 | ################################################################################ 67 | # PROJECT LINKER FLAGS 68 | # These flags will be sent to the linker when compiling the executable. 69 | # 70 | # (default) PROJECT_LDFLAGS = -Wl,-rpath=./libs 71 | # 72 | # Note: Leave a leading space when adding list items with the += operator 73 | ################################################################################ 74 | 75 | # Currently, shared libraries that are needed are copied to the 76 | # $(PROJECT_ROOT)/bin/libs directory. The following LDFLAGS tell the linker to 77 | # add a runtime path to search for those shared libraries, since they aren't 78 | # incorporated directly into the final executable application binary. 79 | # TODO: should this be a default setting? 80 | # PROJECT_LDFLAGS=-Wl,-rpath=./libs 81 | 82 | ################################################################################ 83 | # PROJECT DEFINES 84 | # Create a space-delimited list of DEFINES. The list will be converted into 85 | # CFLAGS with the "-D" flag later in the makefile. 86 | # 87 | # (default) PROJECT_DEFINES = (blank) 88 | # 89 | # Note: Leave a leading space when adding list items with the += operator 90 | ################################################################################ 91 | # PROJECT_DEFINES = 92 | 93 | ################################################################################ 94 | # PROJECT CFLAGS 95 | # This is a list of fully qualified CFLAGS required when compiling for this 96 | # project. These CFLAGS will be used IN ADDITION TO the PLATFORM_CFLAGS 97 | # defined in your platform specific core configuration files. These flags are 98 | # presented to the compiler BEFORE the PROJECT_OPTIMIZATION_CFLAGS below. 99 | # 100 | # (default) PROJECT_CFLAGS = (blank) 101 | # 102 | # Note: Before adding PROJECT_CFLAGS, note that the PLATFORM_CFLAGS defined in 103 | # your platform specific configuration file will be applied by default and 104 | # further flags here may not be needed. 105 | # 106 | # Note: Leave a leading space when adding list items with the += operator 107 | ################################################################################ 108 | # PROJECT_CFLAGS = 109 | 110 | ################################################################################ 111 | # PROJECT OPTIMIZATION CFLAGS 112 | # These are lists of CFLAGS that are target-specific. While any flags could 113 | # be conditionally added, they are usually limited to optimization flags. 114 | # These flags are added BEFORE the PROJECT_CFLAGS. 115 | # 116 | # PROJECT_OPTIMIZATION_CFLAGS_RELEASE flags are only applied to RELEASE targets. 117 | # 118 | # (default) PROJECT_OPTIMIZATION_CFLAGS_RELEASE = (blank) 119 | # 120 | # PROJECT_OPTIMIZATION_CFLAGS_DEBUG flags are only applied to DEBUG targets. 121 | # 122 | # (default) PROJECT_OPTIMIZATION_CFLAGS_DEBUG = (blank) 123 | # 124 | # Note: Before adding PROJECT_OPTIMIZATION_CFLAGS, please note that the 125 | # PLATFORM_OPTIMIZATION_CFLAGS defined in your platform specific configuration 126 | # file will be applied by default and further optimization flags here may not 127 | # be needed. 128 | # 129 | # Note: Leave a leading space when adding list items with the += operator 130 | ################################################################################ 131 | # PROJECT_OPTIMIZATION_CFLAGS_RELEASE = 132 | # PROJECT_OPTIMIZATION_CFLAGS_DEBUG = 133 | 134 | ################################################################################ 135 | # PROJECT COMPILERS 136 | # Custom compilers can be set for CC and CXX 137 | # (default) PROJECT_CXX = (blank) 138 | # (default) PROJECT_CC = (blank) 139 | # Note: Leave a leading space when adding list items with the += operator 140 | ################################################################################ 141 | # PROJECT_CXX = 142 | # PROJECT_CC = 143 | -------------------------------------------------------------------------------- /src/testApp.cpp: -------------------------------------------------------------------------------- 1 | #include "testApp.h" 2 | 3 | int numParticles = 5000; 4 | int textureRes = 0; 5 | bool bTrails = true; 6 | 7 | //-------------------------------------------------------------- 8 | void testApp::setup(){ 9 | ofBackground(0); 10 | 11 | // set defaults 12 | 13 | maxVelocity = .1; 14 | maxForce = .1; 15 | particleSize = 1.0; 16 | desiredSeparation = 50.0 / ofGetWidth(); 17 | neighborDistance = 10.0 / ofGetHeight(); 18 | 19 | 20 | // load shaders 21 | // BASED ON THE EXCELLENT OF GPU PARTICLE EXAMPLE 22 | // shader for updating the texture that store the particles position on RG channels 23 | position.load("","shaders/posUpdate.frag"); 24 | 25 | // shader for updating the texture that store the particles velocity on RG channels 26 | velocity.load("","shaders/velUpdate.frag"); 27 | 28 | // takes input from ping pong buffers and outputs as adjustable circles 29 | render.setGeometryInputType(GL_POINTS); 30 | render.setGeometryOutputType(GL_TRIANGLES); 31 | render.setGeometryOutputCount(36); 32 | render.load("shaders/render.vert","","shaders/render.geom"); 33 | 34 | // load ping-pong buffers 35 | // Seting the textures where the information ( position and velocity ) will be 36 | textureRes = (int)sqrt((float)numParticles); 37 | numParticles = textureRes * textureRes; 38 | 39 | // Make arrays of float pixels with position information 40 | 41 | float * pos = new float[numParticles*3]; 42 | for (int x = 0; x < textureRes; x++){ 43 | for (int y = 0; y < textureRes; y++){ 44 | int i = textureRes * y + x; 45 | 46 | pos[i*3 + 0] = ofRandom(0.0, ofGetWidth())/ (float) ofGetWidth(); 47 | pos[i*3 + 1] = ofRandom(0.0, ofGetHeight()) / (float) ofGetHeight(); 48 | pos[i*3 + 2] = 0.0; 49 | } 50 | } 51 | 52 | posPingPong.allocate(textureRes, textureRes,GL_RGB32F); 53 | posPingPong.src->getTextureReference().loadData(pos, textureRes, textureRes, GL_RGB); 54 | posPingPong.dst->getTextureReference().loadData(pos, textureRes, textureRes, GL_RGB); 55 | 56 | delete [] pos; // Delete the array 57 | 58 | 59 | // 2. Making arrays of float pixels with velocity information and the load it to a texture 60 | float * vel = new float[numParticles*3]; 61 | for (int i = 0; i < numParticles; i++){ 62 | vel[i*3 + 0] = ofRandom(-.01,.01); 63 | vel[i*3 + 1] = ofRandom(-.01,.01); 64 | vel[i*3 + 2] = 1.0; 65 | } 66 | // Load this information in to the FBO�s texture 67 | velPingPong.allocate(textureRes, textureRes,GL_RGB32F); 68 | velPingPong.src->getTextureReference().loadData(vel, textureRes, textureRes, GL_RGB); 69 | velPingPong.dst->getTextureReference().loadData(vel, textureRes, textureRes, GL_RGB); 70 | delete [] vel; // Delete the array 71 | 72 | // Allocate the final 73 | renderFBO.allocate(ofGetWidth(),ofGetHeight(), GL_RGBA);//32F); 74 | renderFBO.begin(); 75 | ofClear(0, 0, 0, 0); 76 | renderFBO.end(); 77 | 78 | mesh.setMode(OF_PRIMITIVE_POINTS); 79 | ofFloatColor color = ofColor(); 80 | color.setSaturation(1.0); 81 | color.setBrightness(1.0); 82 | color.setHue(ofRandom(0.0, 1.0)); 83 | 84 | for(int x = 0; x < textureRes; x++){ 85 | for(int y = 0; y < textureRes; y++){ 86 | mesh.addVertex(ofVec3f(x,y)); 87 | mesh.addTexCoord(ofVec2f(x, y)); 88 | 89 | mesh.addColor(color); 90 | } 91 | } 92 | } 93 | 94 | //-------------------------------------------------------------- 95 | void testApp::update(){ 96 | ofSetWindowTitle(ofToString(ofGetFrameRate())); 97 | velPingPong.dst->begin(); 98 | ofClear(0); 99 | velocity.begin(); 100 | velocity.setUniform1i("posWidth", velPingPong.src->getWidth()); 101 | velocity.setUniform1i("posHeight", velPingPong.src->getWidth()); 102 | velocity.setUniformTexture("backbuffer", velPingPong.src->getTextureReference(), 0); // passing the previus velocity information 103 | velocity.setUniformTexture("posData", posPingPong.src->getTextureReference(), 1); // passing the position information 104 | 105 | velocity.setUniform1f("maxspeed", maxVelocity / 100.0f); 106 | velocity.setUniform1f("maxforce", maxForce / 100.0f); 107 | 108 | // play with these to change your patterns 109 | velocity.setUniform1f("desiredSeparation", desiredSeparation); 110 | velocity.setUniform1f("neighborDistance", neighborDistance); 111 | 112 | // draw the source velocity texture to be updated 113 | velPingPong.src->draw(0, 0); 114 | 115 | velocity.end(); 116 | velPingPong.dst->end(); 117 | 118 | velPingPong.swap(); 119 | 120 | 121 | // Position PingPong 122 | // 123 | // With the velocity calculated updates the position 124 | // 125 | posPingPong.dst->begin(); 126 | ofClear(0); 127 | position.begin(); 128 | position.setUniform1i("posWidth", velPingPong.src->getWidth()); 129 | position.setUniform1i("posHeight", velPingPong.src->getWidth()); 130 | position.setUniformTexture("prevPosData", posPingPong.src->getTextureReference(), 0); // Previus position 131 | position.setUniformTexture("velData", velPingPong.src->getTextureReference(), 1); // Velocity 132 | 133 | // draw the source position texture to be updated 134 | posPingPong.src->draw(0, 0); 135 | 136 | position.end(); 137 | posPingPong.dst->end(); 138 | 139 | posPingPong.swap(); 140 | 141 | // Rendering 142 | 143 | renderFBO.begin(); 144 | 145 | ofPushMatrix(); 146 | 147 | if ( !bTrails ){ 148 | ofClear(0, 0, 0, 0); 149 | } else { 150 | ofSetColor(0,0,0,5); 151 | ofRect(0,0,renderFBO.getWidth(), renderFBO.getHeight()); 152 | ofSetColor(255); 153 | } 154 | render.begin(); 155 | render.setUniformTexture("posTex", posPingPong.dst->getTextureReference(), 0); 156 | render.setUniform2f("screen", (float)2.0, (float)2.0); 157 | render.setUniform1f("pointSize", (float)particleSize); 158 | render.setUniform1f("screenSize", (float)ofGetWidth()); 159 | 160 | ofPushStyle(); 161 | ofSetColor(255); 162 | 163 | mesh.draw(); 164 | 165 | ofPopStyle(); 166 | 167 | render.end(); 168 | ofPopMatrix(); 169 | renderFBO.end(); 170 | } 171 | 172 | //-------------------------------------------------------------- 173 | void testApp::draw(){ 174 | renderFBO.draw(0,0); 175 | 176 | string toPrint = "Flockin' on the GPU\nMove mouse to set max force and velocity"; 177 | toPrint += "\nMax Force = "+ofToString(maxForce); 178 | toPrint += "\nMax Velocity: "+ofToString(maxVelocity); 179 | toPrint += "\n\nPress +/- to change particle size"; 180 | toPrint += "\nParticle Size: "+ofToString(particleSize); 181 | toPrint += "\nPress ' ' to draw trails: "+ofToString(bTrails); 182 | 183 | ofDrawBitmapString(toPrint, 20, 20); 184 | } 185 | 186 | //-------------------------------------------------------------- 187 | void testApp::keyPressed(int key){ 188 | if ( key == '='){ 189 | particleSize += .1; 190 | } else if ( key == '-'){ 191 | particleSize -= .1; 192 | particleSize = fmax(0.0, particleSize); 193 | } else if ( key == ' '){ 194 | bTrails = !bTrails; 195 | } 196 | } 197 | 198 | //-------------------------------------------------------------- 199 | void testApp::keyReleased(int key){} 200 | 201 | //-------------------------------------------------------------- 202 | void testApp::mouseMoved(int x, int y ){ 203 | maxVelocity = (float) x/ofGetWidth(); 204 | maxForce = (float) y / ofGetHeight(); 205 | } 206 | 207 | //-------------------------------------------------------------- 208 | void testApp::mouseDragged(int x, int y, int button){} 209 | 210 | //-------------------------------------------------------------- 211 | void testApp::mousePressed(int x, int y, int button){} 212 | 213 | //-------------------------------------------------------------- 214 | void testApp::mouseReleased(int x, int y, int button){} 215 | 216 | //-------------------------------------------------------------- 217 | void testApp::windowResized(int w, int h){} 218 | 219 | //-------------------------------------------------------------- 220 | void testApp::gotMessage(ofMessage msg){} 221 | 222 | //-------------------------------------------------------------- 223 | void testApp::dragEvent(ofDragInfo dragInfo){} 224 | -------------------------------------------------------------------------------- /GPU_Flocking.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | BBAB23CB13894F3D00AA2426 /* GLUT.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = BBAB23BE13894E4700AA2426 /* GLUT.framework */; }; 11 | E4328149138ABC9F0047C5CB /* openFrameworksDebug.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E4328148138ABC890047C5CB /* openFrameworksDebug.a */; }; 12 | E45BE97B0E8CC7DD009D7055 /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9710E8CC7DD009D7055 /* AGL.framework */; }; 13 | E45BE97C0E8CC7DD009D7055 /* ApplicationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9720E8CC7DD009D7055 /* ApplicationServices.framework */; }; 14 | E45BE97D0E8CC7DD009D7055 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9730E8CC7DD009D7055 /* AudioToolbox.framework */; }; 15 | E45BE97E0E8CC7DD009D7055 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9740E8CC7DD009D7055 /* Carbon.framework */; }; 16 | E45BE97F0E8CC7DD009D7055 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9750E8CC7DD009D7055 /* CoreAudio.framework */; }; 17 | E45BE9800E8CC7DD009D7055 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9760E8CC7DD009D7055 /* CoreFoundation.framework */; }; 18 | E45BE9810E8CC7DD009D7055 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9770E8CC7DD009D7055 /* CoreServices.framework */; }; 19 | E45BE9830E8CC7DD009D7055 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9790E8CC7DD009D7055 /* OpenGL.framework */; }; 20 | E45BE9840E8CC7DD009D7055 /* QuickTime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE97A0E8CC7DD009D7055 /* QuickTime.framework */; }; 21 | E4B69E200A3A1BDC003C02F2 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4B69E1D0A3A1BDC003C02F2 /* main.cpp */; }; 22 | E4B69E210A3A1BDC003C02F2 /* testApp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4B69E1E0A3A1BDC003C02F2 /* testApp.cpp */; }; 23 | E4C2424710CC5A17004149E2 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2424410CC5A17004149E2 /* AppKit.framework */; }; 24 | E4C2424810CC5A17004149E2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2424510CC5A17004149E2 /* Cocoa.framework */; }; 25 | E4C2424910CC5A17004149E2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2424610CC5A17004149E2 /* IOKit.framework */; }; 26 | E4EB6799138ADC1D00A09F29 /* GLUT.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BBAB23BE13894E4700AA2426 /* GLUT.framework */; }; 27 | E7E077E515D3B63C0020DFD4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E7E077E415D3B63C0020DFD4 /* CoreVideo.framework */; }; 28 | E7E077E815D3B6510020DFD4 /* QTKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E7E077E715D3B6510020DFD4 /* QTKit.framework */; }; 29 | E7F985F815E0DEA3003869B5 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E7F985F515E0DE99003869B5 /* Accelerate.framework */; }; 30 | /* End PBXBuildFile section */ 31 | 32 | /* Begin PBXContainerItemProxy section */ 33 | E4328147138ABC890047C5CB /* PBXContainerItemProxy */ = { 34 | isa = PBXContainerItemProxy; 35 | containerPortal = E4328143138ABC890047C5CB /* openFrameworksLib.xcodeproj */; 36 | proxyType = 2; 37 | remoteGlobalIDString = E4B27C1510CBEB8E00536013; 38 | remoteInfo = openFrameworks; 39 | }; 40 | E4EEB9AB138B136A00A80321 /* PBXContainerItemProxy */ = { 41 | isa = PBXContainerItemProxy; 42 | containerPortal = E4328143138ABC890047C5CB /* openFrameworksLib.xcodeproj */; 43 | proxyType = 1; 44 | remoteGlobalIDString = E4B27C1410CBEB8E00536013; 45 | remoteInfo = openFrameworks; 46 | }; 47 | /* End PBXContainerItemProxy section */ 48 | 49 | /* Begin PBXCopyFilesBuildPhase section */ 50 | E4C2427710CC5ABF004149E2 /* CopyFiles */ = { 51 | isa = PBXCopyFilesBuildPhase; 52 | buildActionMask = 2147483647; 53 | dstPath = ""; 54 | dstSubfolderSpec = 10; 55 | files = ( 56 | BBAB23CB13894F3D00AA2426 /* GLUT.framework in CopyFiles */, 57 | ); 58 | runOnlyForDeploymentPostprocessing = 0; 59 | }; 60 | /* End PBXCopyFilesBuildPhase section */ 61 | 62 | /* Begin PBXFileReference section */ 63 | 013C027F18C6797A00129384 /* posUpdate.frag */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.glsl; name = posUpdate.frag; path = bin/data/shaders/posUpdate.frag; sourceTree = ""; }; 64 | 013C028118C6797A00129384 /* render.geom */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.glsl; name = render.geom; path = bin/data/shaders/render.geom; sourceTree = ""; }; 65 | 013C028218C6797A00129384 /* render.vert */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.glsl; name = render.vert; path = bin/data/shaders/render.vert; sourceTree = ""; }; 66 | 013C028318C6797A00129384 /* velUpdate.frag */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.glsl; name = velUpdate.frag; path = bin/data/shaders/velUpdate.frag; sourceTree = ""; }; 67 | 013C028418C67A8B00129384 /* pingPongBuffer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = pingPongBuffer.h; sourceTree = ""; }; 68 | BBAB23BE13894E4700AA2426 /* GLUT.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLUT.framework; path = ../../../libs/glut/lib/osx/GLUT.framework; sourceTree = ""; }; 69 | E4328143138ABC890047C5CB /* openFrameworksLib.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = openFrameworksLib.xcodeproj; path = ../../../libs/openFrameworksCompiled/project/osx/openFrameworksLib.xcodeproj; sourceTree = SOURCE_ROOT; }; 70 | E45BE9710E8CC7DD009D7055 /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = ""; }; 71 | E45BE9720E8CC7DD009D7055 /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = /System/Library/Frameworks/ApplicationServices.framework; sourceTree = ""; }; 72 | E45BE9730E8CC7DD009D7055 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = /System/Library/Frameworks/AudioToolbox.framework; sourceTree = ""; }; 73 | E45BE9740E8CC7DD009D7055 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; 74 | E45BE9750E8CC7DD009D7055 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = /System/Library/Frameworks/CoreAudio.framework; sourceTree = ""; }; 75 | E45BE9760E8CC7DD009D7055 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = ""; }; 76 | E45BE9770E8CC7DD009D7055 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = /System/Library/Frameworks/CoreServices.framework; sourceTree = ""; }; 77 | E45BE9790E8CC7DD009D7055 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = ""; }; 78 | E45BE97A0E8CC7DD009D7055 /* QuickTime.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = /System/Library/Frameworks/QuickTime.framework; sourceTree = ""; }; 79 | E4B69B5B0A3A1756003C02F2 /* GPU_FlockingDebug.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GPU_FlockingDebug.app; sourceTree = BUILT_PRODUCTS_DIR; }; 80 | E4B69E1D0A3A1BDC003C02F2 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = main.cpp; path = src/main.cpp; sourceTree = SOURCE_ROOT; }; 81 | E4B69E1E0A3A1BDC003C02F2 /* testApp.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 30; name = testApp.cpp; path = src/testApp.cpp; sourceTree = SOURCE_ROOT; }; 82 | E4B69E1F0A3A1BDC003C02F2 /* testApp.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = testApp.h; path = src/testApp.h; sourceTree = SOURCE_ROOT; }; 83 | E4B6FCAD0C3E899E008CF71C /* openFrameworks-Info.plist */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.plist.xml; path = "openFrameworks-Info.plist"; sourceTree = ""; }; 84 | E4C2424410CC5A17004149E2 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 85 | E4C2424510CC5A17004149E2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 86 | E4C2424610CC5A17004149E2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = ""; }; 87 | E4EB691F138AFCF100A09F29 /* CoreOF.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = CoreOF.xcconfig; path = ../../../libs/openFrameworksCompiled/project/osx/CoreOF.xcconfig; sourceTree = SOURCE_ROOT; }; 88 | E4EB6923138AFD0F00A09F29 /* Project.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Project.xcconfig; sourceTree = ""; }; 89 | E7E077E415D3B63C0020DFD4 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = /System/Library/Frameworks/CoreVideo.framework; sourceTree = ""; }; 90 | E7E077E715D3B6510020DFD4 /* QTKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = /System/Library/Frameworks/QTKit.framework; sourceTree = ""; }; 91 | E7F985F515E0DE99003869B5 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = /System/Library/Frameworks/Accelerate.framework; sourceTree = ""; }; 92 | /* End PBXFileReference section */ 93 | 94 | /* Begin PBXFrameworksBuildPhase section */ 95 | E4B69B590A3A1756003C02F2 /* Frameworks */ = { 96 | isa = PBXFrameworksBuildPhase; 97 | buildActionMask = 2147483647; 98 | files = ( 99 | E7F985F815E0DEA3003869B5 /* Accelerate.framework in Frameworks */, 100 | E7E077E815D3B6510020DFD4 /* QTKit.framework in Frameworks */, 101 | E4EB6799138ADC1D00A09F29 /* GLUT.framework in Frameworks */, 102 | E4328149138ABC9F0047C5CB /* openFrameworksDebug.a in Frameworks */, 103 | E45BE97B0E8CC7DD009D7055 /* AGL.framework in Frameworks */, 104 | E45BE97C0E8CC7DD009D7055 /* ApplicationServices.framework in Frameworks */, 105 | E45BE97D0E8CC7DD009D7055 /* AudioToolbox.framework in Frameworks */, 106 | E45BE97E0E8CC7DD009D7055 /* Carbon.framework in Frameworks */, 107 | E45BE97F0E8CC7DD009D7055 /* CoreAudio.framework in Frameworks */, 108 | E45BE9800E8CC7DD009D7055 /* CoreFoundation.framework in Frameworks */, 109 | E45BE9810E8CC7DD009D7055 /* CoreServices.framework in Frameworks */, 110 | E45BE9830E8CC7DD009D7055 /* OpenGL.framework in Frameworks */, 111 | E45BE9840E8CC7DD009D7055 /* QuickTime.framework in Frameworks */, 112 | E4C2424710CC5A17004149E2 /* AppKit.framework in Frameworks */, 113 | E4C2424810CC5A17004149E2 /* Cocoa.framework in Frameworks */, 114 | E4C2424910CC5A17004149E2 /* IOKit.framework in Frameworks */, 115 | E7E077E515D3B63C0020DFD4 /* CoreVideo.framework in Frameworks */, 116 | ); 117 | runOnlyForDeploymentPostprocessing = 0; 118 | }; 119 | /* End PBXFrameworksBuildPhase section */ 120 | 121 | /* Begin PBXGroup section */ 122 | 013C027E18C6796E00129384 /* shaders */ = { 123 | isa = PBXGroup; 124 | children = ( 125 | 013C027F18C6797A00129384 /* posUpdate.frag */, 126 | 013C028118C6797A00129384 /* render.geom */, 127 | 013C028218C6797A00129384 /* render.vert */, 128 | 013C028318C6797A00129384 /* velUpdate.frag */, 129 | ); 130 | name = shaders; 131 | sourceTree = ""; 132 | }; 133 | BB4B014C10F69532006C3DED /* addons */ = { 134 | isa = PBXGroup; 135 | children = ( 136 | ); 137 | name = addons; 138 | sourceTree = ""; 139 | }; 140 | BBAB23C913894ECA00AA2426 /* system frameworks */ = { 141 | isa = PBXGroup; 142 | children = ( 143 | E7F985F515E0DE99003869B5 /* Accelerate.framework */, 144 | E4C2424410CC5A17004149E2 /* AppKit.framework */, 145 | E4C2424510CC5A17004149E2 /* Cocoa.framework */, 146 | E4C2424610CC5A17004149E2 /* IOKit.framework */, 147 | E45BE9710E8CC7DD009D7055 /* AGL.framework */, 148 | E45BE9720E8CC7DD009D7055 /* ApplicationServices.framework */, 149 | E45BE9730E8CC7DD009D7055 /* AudioToolbox.framework */, 150 | E45BE9740E8CC7DD009D7055 /* Carbon.framework */, 151 | E45BE9750E8CC7DD009D7055 /* CoreAudio.framework */, 152 | E45BE9760E8CC7DD009D7055 /* CoreFoundation.framework */, 153 | E45BE9770E8CC7DD009D7055 /* CoreServices.framework */, 154 | E45BE9790E8CC7DD009D7055 /* OpenGL.framework */, 155 | E45BE97A0E8CC7DD009D7055 /* QuickTime.framework */, 156 | E7E077E415D3B63C0020DFD4 /* CoreVideo.framework */, 157 | E7E077E715D3B6510020DFD4 /* QTKit.framework */, 158 | ); 159 | name = "system frameworks"; 160 | sourceTree = ""; 161 | }; 162 | BBAB23CA13894EDB00AA2426 /* 3rd party frameworks */ = { 163 | isa = PBXGroup; 164 | children = ( 165 | BBAB23BE13894E4700AA2426 /* GLUT.framework */, 166 | ); 167 | name = "3rd party frameworks"; 168 | sourceTree = ""; 169 | }; 170 | E4328144138ABC890047C5CB /* Products */ = { 171 | isa = PBXGroup; 172 | children = ( 173 | E4328148138ABC890047C5CB /* openFrameworksDebug.a */, 174 | ); 175 | name = Products; 176 | sourceTree = ""; 177 | }; 178 | E45BE5980E8CC70C009D7055 /* frameworks */ = { 179 | isa = PBXGroup; 180 | children = ( 181 | BBAB23CA13894EDB00AA2426 /* 3rd party frameworks */, 182 | BBAB23C913894ECA00AA2426 /* system frameworks */, 183 | ); 184 | name = frameworks; 185 | sourceTree = ""; 186 | }; 187 | E4B69B4A0A3A1720003C02F2 = { 188 | isa = PBXGroup; 189 | children = ( 190 | 013C027E18C6796E00129384 /* shaders */, 191 | E4B6FCAD0C3E899E008CF71C /* openFrameworks-Info.plist */, 192 | E4EB6923138AFD0F00A09F29 /* Project.xcconfig */, 193 | E4B69E1C0A3A1BDC003C02F2 /* src */, 194 | E4EEC9E9138DF44700A80321 /* openFrameworks */, 195 | BB4B014C10F69532006C3DED /* addons */, 196 | E45BE5980E8CC70C009D7055 /* frameworks */, 197 | E4B69B5B0A3A1756003C02F2 /* GPU_FlockingDebug.app */, 198 | ); 199 | sourceTree = ""; 200 | }; 201 | E4B69E1C0A3A1BDC003C02F2 /* src */ = { 202 | isa = PBXGroup; 203 | children = ( 204 | E4B69E1D0A3A1BDC003C02F2 /* main.cpp */, 205 | E4B69E1E0A3A1BDC003C02F2 /* testApp.cpp */, 206 | E4B69E1F0A3A1BDC003C02F2 /* testApp.h */, 207 | 013C028418C67A8B00129384 /* pingPongBuffer.h */, 208 | ); 209 | path = src; 210 | sourceTree = SOURCE_ROOT; 211 | }; 212 | E4EEC9E9138DF44700A80321 /* openFrameworks */ = { 213 | isa = PBXGroup; 214 | children = ( 215 | E4EB691F138AFCF100A09F29 /* CoreOF.xcconfig */, 216 | E4328143138ABC890047C5CB /* openFrameworksLib.xcodeproj */, 217 | ); 218 | name = openFrameworks; 219 | sourceTree = ""; 220 | }; 221 | /* End PBXGroup section */ 222 | 223 | /* Begin PBXNativeTarget section */ 224 | E4B69B5A0A3A1756003C02F2 /* GPU_Flocking */ = { 225 | isa = PBXNativeTarget; 226 | buildConfigurationList = E4B69B5F0A3A1757003C02F2 /* Build configuration list for PBXNativeTarget "GPU_Flocking" */; 227 | buildPhases = ( 228 | E4B69B580A3A1756003C02F2 /* Sources */, 229 | E4B69B590A3A1756003C02F2 /* Frameworks */, 230 | E4B6FFFD0C3F9AB9008CF71C /* ShellScript */, 231 | E4C2427710CC5ABF004149E2 /* CopyFiles */, 232 | ); 233 | buildRules = ( 234 | ); 235 | dependencies = ( 236 | E4EEB9AC138B136A00A80321 /* PBXTargetDependency */, 237 | ); 238 | name = GPU_Flocking; 239 | productName = myOFApp; 240 | productReference = E4B69B5B0A3A1756003C02F2 /* GPU_FlockingDebug.app */; 241 | productType = "com.apple.product-type.application"; 242 | }; 243 | /* End PBXNativeTarget section */ 244 | 245 | /* Begin PBXProject section */ 246 | E4B69B4C0A3A1720003C02F2 /* Project object */ = { 247 | isa = PBXProject; 248 | attributes = { 249 | LastUpgradeCheck = 0460; 250 | }; 251 | buildConfigurationList = E4B69B4D0A3A1720003C02F2 /* Build configuration list for PBXProject "GPU_Flocking" */; 252 | compatibilityVersion = "Xcode 3.2"; 253 | developmentRegion = English; 254 | hasScannedForEncodings = 0; 255 | knownRegions = ( 256 | English, 257 | Japanese, 258 | French, 259 | German, 260 | ); 261 | mainGroup = E4B69B4A0A3A1720003C02F2; 262 | productRefGroup = E4B69B4A0A3A1720003C02F2; 263 | projectDirPath = ""; 264 | projectReferences = ( 265 | { 266 | ProductGroup = E4328144138ABC890047C5CB /* Products */; 267 | ProjectRef = E4328143138ABC890047C5CB /* openFrameworksLib.xcodeproj */; 268 | }, 269 | ); 270 | projectRoot = ""; 271 | targets = ( 272 | E4B69B5A0A3A1756003C02F2 /* GPU_Flocking */, 273 | ); 274 | }; 275 | /* End PBXProject section */ 276 | 277 | /* Begin PBXReferenceProxy section */ 278 | E4328148138ABC890047C5CB /* openFrameworksDebug.a */ = { 279 | isa = PBXReferenceProxy; 280 | fileType = archive.ar; 281 | path = openFrameworksDebug.a; 282 | remoteRef = E4328147138ABC890047C5CB /* PBXContainerItemProxy */; 283 | sourceTree = BUILT_PRODUCTS_DIR; 284 | }; 285 | /* End PBXReferenceProxy section */ 286 | 287 | /* Begin PBXShellScriptBuildPhase section */ 288 | E4B6FFFD0C3F9AB9008CF71C /* ShellScript */ = { 289 | isa = PBXShellScriptBuildPhase; 290 | buildActionMask = 2147483647; 291 | files = ( 292 | ); 293 | inputPaths = ( 294 | ); 295 | outputPaths = ( 296 | ); 297 | runOnlyForDeploymentPostprocessing = 0; 298 | shellPath = /bin/sh; 299 | shellScript = "cp -f ../../../libs/fmodex/lib/osx/libfmodex.dylib \"$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/MacOS/libfmodex.dylib\"; install_name_tool -change ./libfmodex.dylib @executable_path/libfmodex.dylib \"$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/MacOS/$PRODUCT_NAME\";\nmkdir -p \"$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/Resources/\"\ncp -f \"$ICON_FILE\" \"$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/Resources/\"\n"; 300 | }; 301 | /* End PBXShellScriptBuildPhase section */ 302 | 303 | /* Begin PBXSourcesBuildPhase section */ 304 | E4B69B580A3A1756003C02F2 /* Sources */ = { 305 | isa = PBXSourcesBuildPhase; 306 | buildActionMask = 2147483647; 307 | files = ( 308 | E4B69E200A3A1BDC003C02F2 /* main.cpp in Sources */, 309 | E4B69E210A3A1BDC003C02F2 /* testApp.cpp in Sources */, 310 | ); 311 | runOnlyForDeploymentPostprocessing = 0; 312 | }; 313 | /* End PBXSourcesBuildPhase section */ 314 | 315 | /* Begin PBXTargetDependency section */ 316 | E4EEB9AC138B136A00A80321 /* PBXTargetDependency */ = { 317 | isa = PBXTargetDependency; 318 | name = openFrameworks; 319 | targetProxy = E4EEB9AB138B136A00A80321 /* PBXContainerItemProxy */; 320 | }; 321 | /* End PBXTargetDependency section */ 322 | 323 | /* Begin XCBuildConfiguration section */ 324 | E4B69B4E0A3A1720003C02F2 /* Debug */ = { 325 | isa = XCBuildConfiguration; 326 | baseConfigurationReference = E4EB6923138AFD0F00A09F29 /* Project.xcconfig */; 327 | buildSettings = { 328 | ARCHS = "$(NATIVE_ARCH)"; 329 | CONFIGURATION_BUILD_DIR = "$(SRCROOT)/bin/"; 330 | COPY_PHASE_STRIP = NO; 331 | DEAD_CODE_STRIPPING = YES; 332 | GCC_AUTO_VECTORIZATION = YES; 333 | GCC_ENABLE_SSE3_EXTENSIONS = YES; 334 | GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS = YES; 335 | GCC_INLINES_ARE_PRIVATE_EXTERN = NO; 336 | GCC_OPTIMIZATION_LEVEL = 0; 337 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 338 | GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES; 339 | GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = NO; 340 | GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = NO; 341 | GCC_WARN_UNINITIALIZED_AUTOS = NO; 342 | GCC_WARN_UNUSED_VALUE = NO; 343 | GCC_WARN_UNUSED_VARIABLE = NO; 344 | MACOSX_DEPLOYMENT_TARGET = 10.6; 345 | OTHER_CPLUSPLUSFLAGS = ( 346 | "-D__MACOSX_CORE__", 347 | "-lpthread", 348 | "-mtune=native", 349 | ); 350 | SDKROOT = macosx; 351 | }; 352 | name = Debug; 353 | }; 354 | E4B69B4F0A3A1720003C02F2 /* Release */ = { 355 | isa = XCBuildConfiguration; 356 | baseConfigurationReference = E4EB6923138AFD0F00A09F29 /* Project.xcconfig */; 357 | buildSettings = { 358 | ARCHS = "$(NATIVE_ARCH)"; 359 | CONFIGURATION_BUILD_DIR = "$(SRCROOT)/bin/"; 360 | COPY_PHASE_STRIP = YES; 361 | DEAD_CODE_STRIPPING = YES; 362 | GCC_AUTO_VECTORIZATION = YES; 363 | GCC_ENABLE_SSE3_EXTENSIONS = YES; 364 | GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS = YES; 365 | GCC_INLINES_ARE_PRIVATE_EXTERN = NO; 366 | GCC_OPTIMIZATION_LEVEL = 3; 367 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 368 | GCC_UNROLL_LOOPS = YES; 369 | GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES; 370 | GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = NO; 371 | GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = NO; 372 | GCC_WARN_UNINITIALIZED_AUTOS = NO; 373 | GCC_WARN_UNUSED_VALUE = NO; 374 | GCC_WARN_UNUSED_VARIABLE = NO; 375 | MACOSX_DEPLOYMENT_TARGET = 10.6; 376 | OTHER_CPLUSPLUSFLAGS = ( 377 | "-D__MACOSX_CORE__", 378 | "-lpthread", 379 | "-mtune=native", 380 | ); 381 | SDKROOT = macosx; 382 | }; 383 | name = Release; 384 | }; 385 | E4B69B600A3A1757003C02F2 /* Debug */ = { 386 | isa = XCBuildConfiguration; 387 | buildSettings = { 388 | COMBINE_HIDPI_IMAGES = YES; 389 | COPY_PHASE_STRIP = NO; 390 | FRAMEWORK_SEARCH_PATHS = ( 391 | "$(inherited)", 392 | "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", 393 | ); 394 | FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../../libs/glut/lib/osx\""; 395 | GCC_DYNAMIC_NO_PIC = NO; 396 | GCC_GENERATE_DEBUGGING_SYMBOLS = YES; 397 | GCC_MODEL_TUNING = NONE; 398 | ICON = "$(ICON_NAME_DEBUG)"; 399 | ICON_FILE = "$(ICON_FILE_PATH)$(ICON)"; 400 | INFOPLIST_FILE = "openFrameworks-Info.plist"; 401 | INSTALL_PATH = "$(HOME)/Applications"; 402 | LIBRARY_SEARCH_PATHS = ( 403 | "$(inherited)", 404 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", 405 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)", 406 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)", 407 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_4)", 408 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_5)", 409 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_6)", 410 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)", 411 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)", 412 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)", 413 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)", 414 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)", 415 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)", 416 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)", 417 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_14)", 418 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_15)", 419 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)", 420 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)", 421 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)", 422 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)", 423 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)", 424 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)", 425 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)", 426 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)", 427 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)", 428 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_16)", 429 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_17)", 430 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_18)", 431 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_19)", 432 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_20)", 433 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_21)", 434 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_22)", 435 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_23)", 436 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_24)", 437 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_25)", 438 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_26)", 439 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_27)", 440 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_28)", 441 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_29)", 442 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_30)", 443 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_31)", 444 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_32)", 445 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_33)", 446 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_34)", 447 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_35)", 448 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_36)", 449 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_37)", 450 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_38)", 451 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_39)", 452 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_40)", 453 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_41)", 454 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_42)", 455 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_43)", 456 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_44)", 457 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_45)", 458 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_46)", 459 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_47)", 460 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_48)", 461 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_49)", 462 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_50)", 463 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_51)", 464 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_52)", 465 | ); 466 | PRODUCT_NAME = "$(TARGET_NAME)Debug"; 467 | WRAPPER_EXTENSION = app; 468 | }; 469 | name = Debug; 470 | }; 471 | E4B69B610A3A1757003C02F2 /* Release */ = { 472 | isa = XCBuildConfiguration; 473 | buildSettings = { 474 | COMBINE_HIDPI_IMAGES = YES; 475 | COPY_PHASE_STRIP = YES; 476 | FRAMEWORK_SEARCH_PATHS = ( 477 | "$(inherited)", 478 | "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", 479 | ); 480 | FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../../libs/glut/lib/osx\""; 481 | GCC_GENERATE_DEBUGGING_SYMBOLS = YES; 482 | GCC_MODEL_TUNING = NONE; 483 | ICON = "$(ICON_NAME_RELEASE)"; 484 | ICON_FILE = "$(ICON_FILE_PATH)$(ICON)"; 485 | INFOPLIST_FILE = "openFrameworks-Info.plist"; 486 | INSTALL_PATH = "$(HOME)/Applications"; 487 | LIBRARY_SEARCH_PATHS = ( 488 | "$(inherited)", 489 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", 490 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)", 491 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)", 492 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_4)", 493 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_5)", 494 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_6)", 495 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)", 496 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)", 497 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)", 498 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)", 499 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)", 500 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)", 501 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)", 502 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_14)", 503 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_15)", 504 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)", 505 | "$(LIBRARY_SEARCH_PATHS_QUOTED_1)", 506 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)", 507 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)", 508 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)", 509 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)", 510 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)", 511 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)", 512 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)", 513 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)", 514 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_16)", 515 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_17)", 516 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_18)", 517 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_19)", 518 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_20)", 519 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_21)", 520 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_22)", 521 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_23)", 522 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_24)", 523 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_25)", 524 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_26)", 525 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_27)", 526 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_28)", 527 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_29)", 528 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_30)", 529 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_31)", 530 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_32)", 531 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_33)", 532 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_34)", 533 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_35)", 534 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_36)", 535 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_37)", 536 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_38)", 537 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_39)", 538 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_40)", 539 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_41)", 540 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_42)", 541 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_43)", 542 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_44)", 543 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_45)", 544 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_46)", 545 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_47)", 546 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_48)", 547 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_49)", 548 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_50)", 549 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_51)", 550 | ); 551 | PRODUCT_NAME = "$(TARGET_NAME)"; 552 | WRAPPER_EXTENSION = app; 553 | }; 554 | name = Release; 555 | }; 556 | /* End XCBuildConfiguration section */ 557 | 558 | /* Begin XCConfigurationList section */ 559 | E4B69B4D0A3A1720003C02F2 /* Build configuration list for PBXProject "GPU_Flocking" */ = { 560 | isa = XCConfigurationList; 561 | buildConfigurations = ( 562 | E4B69B4E0A3A1720003C02F2 /* Debug */, 563 | E4B69B4F0A3A1720003C02F2 /* Release */, 564 | ); 565 | defaultConfigurationIsVisible = 0; 566 | defaultConfigurationName = Release; 567 | }; 568 | E4B69B5F0A3A1757003C02F2 /* Build configuration list for PBXNativeTarget "GPU_Flocking" */ = { 569 | isa = XCConfigurationList; 570 | buildConfigurations = ( 571 | E4B69B600A3A1757003C02F2 /* Debug */, 572 | E4B69B610A3A1757003C02F2 /* Release */, 573 | ); 574 | defaultConfigurationIsVisible = 0; 575 | defaultConfigurationName = Release; 576 | }; 577 | /* End XCConfigurationList section */ 578 | }; 579 | rootObject = E4B69B4C0A3A1720003C02F2 /* Project object */; 580 | } 581 | --------------------------------------------------------------------------------