├── .gitignore ├── example ├── bin │ ├── data │ │ └── .gitkeep │ └── example.app │ │ └── Contents │ │ ├── PkgInfo │ │ ├── MacOS │ │ ├── example │ │ └── libfmodex.dylib │ │ ├── Resources │ │ └── icon.icns │ │ └── Info.plist ├── addons.make ├── example.xcodeproj │ ├── xcuserdata │ │ └── tim.xcuserdatad │ │ │ ├── xcdebugger │ │ │ └── Breakpoints_v2.xcbkptlist │ │ │ └── xcschemes │ │ │ └── xcschememanagement.plist │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ ├── xcuserdata │ │ │ └── tim.xcuserdatad │ │ │ │ ├── UserInterfaceState.xcuserstate │ │ │ │ └── WorkspaceSettings.xcsettings │ │ └── xcshareddata │ │ │ └── ikExample.xccheckout │ ├── xcshareddata │ │ └── xcschemes │ │ │ ├── example Debug.xcscheme │ │ │ └── ikExample Release.xcscheme │ └── project.pbxproj ├── Makefile ├── src │ ├── main.cpp │ ├── ofApp.h │ └── ofApp.cpp ├── Project.xcconfig ├── openFrameworks-Info.plist └── config.make ├── ikExample ├── bin │ └── data │ │ └── .gitkeep ├── addons.make └── src │ ├── main.cpp │ ├── ofApp.h │ └── ofApp.cpp ├── ofxaddons_thumbnail.png ├── README.md └── src ├── ofxSkeleton.h └── ofxSkeleton.cpp /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store -------------------------------------------------------------------------------- /example/bin/data/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ikExample/bin/data/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /example/addons.make: -------------------------------------------------------------------------------- 1 | ofxSkeleton -------------------------------------------------------------------------------- /ikExample/addons.make: -------------------------------------------------------------------------------- 1 | ofxSkeleton -------------------------------------------------------------------------------- /example/bin/example.app/Contents/PkgInfo: -------------------------------------------------------------------------------- 1 | APPL???? -------------------------------------------------------------------------------- /ofxaddons_thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tgfrerer/ofxSkeleton/HEAD/ofxaddons_thumbnail.png -------------------------------------------------------------------------------- /example/bin/example.app/Contents/MacOS/example: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tgfrerer/ofxSkeleton/HEAD/example/bin/example.app/Contents/MacOS/example -------------------------------------------------------------------------------- /example/bin/example.app/Contents/Resources/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tgfrerer/ofxSkeleton/HEAD/example/bin/example.app/Contents/Resources/icon.icns -------------------------------------------------------------------------------- /example/bin/example.app/Contents/MacOS/libfmodex.dylib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tgfrerer/ofxSkeleton/HEAD/example/bin/example.app/Contents/MacOS/libfmodex.dylib -------------------------------------------------------------------------------- /example/example.xcodeproj/xcuserdata/tim.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /example/example.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /example/example.xcodeproj/project.xcworkspace/xcuserdata/tim.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tgfrerer/ofxSkeleton/HEAD/example/example.xcodeproj/project.xcworkspace/xcuserdata/tim.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /example/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 | -------------------------------------------------------------------------------- /example/example.xcodeproj/project.xcworkspace/xcuserdata/tim.xcuserdatad/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges 6 | 7 | SnapshotAutomaticallyBeforeSignificantChanges 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /example/example.xcodeproj/xcuserdata/tim.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SuppressBuildableAutocreation 6 | 7 | E4B69B5A0A3A1756003C02F2 8 | 9 | primary 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /example/src/main.cpp: -------------------------------------------------------------------------------- 1 | #include "ofMain.h" 2 | #include "ofApp.h" 3 | 4 | //======================================================================== 5 | int main( ){ 6 | 7 | // ofSetCurrentRenderer(ofGLProgrammableRenderer::TYPE); 8 | 9 | ofSetupOpenGL(1024,768, OF_WINDOW); // <-------- setup the GL context 10 | 11 | // this kicks off the running of my app 12 | // can be OF_WINDOW or OF_FULLSCREEN 13 | // pass in width and height too: 14 | ofRunApp( new ofApp()); 15 | 16 | } 17 | -------------------------------------------------------------------------------- /ikExample/src/main.cpp: -------------------------------------------------------------------------------- 1 | #include "ofMain.h" 2 | #include "ofApp.h" 3 | 4 | //======================================================================== 5 | int main( ){ 6 | 7 | ofSetCurrentRenderer(ofGLProgrammableRenderer::TYPE); 8 | 9 | ofSetupOpenGL(1024,768, OF_WINDOW); // <-------- setup the GL context 10 | 11 | // this kicks off the running of my app 12 | // can be OF_WINDOW or OF_FULLSCREEN 13 | // pass in width and height too: 14 | ofRunApp( new ofApp()); 15 | 16 | } 17 | -------------------------------------------------------------------------------- /example/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 | -------------------------------------------------------------------------------- /ikExample/src/ofApp.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "ofMain.h" 4 | #include "ofxSkeleton.h" 5 | 6 | using namespace pal::ofxSkeleton; 7 | 8 | class ofApp : public ofBaseApp{ 9 | 10 | vector > bones; 11 | ofxIKchain mIKchain; 12 | 13 | 14 | public: 15 | void setup(); 16 | void update(); 17 | void draw(); 18 | 19 | void keyPressed (int key); 20 | void keyReleased(int key); 21 | void mouseMoved(int x, int y ); 22 | void mouseDragged(int x, int y, int button); 23 | void mousePressed(int x, int y, int button); 24 | void mouseReleased(int x, int y, int button); 25 | void windowResized(int w, int h); 26 | void dragEvent(ofDragInfo dragInfo); 27 | void gotMessage(ofMessage msg); 28 | 29 | }; 30 | -------------------------------------------------------------------------------- /example/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 | -------------------------------------------------------------------------------- /example/src/ofApp.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "ofMain.h" 4 | #include "ofxSkeleton.h" 5 | 6 | class ofApp : public ofBaseApp{ 7 | 8 | typedef shared_ptr JointP_t; 9 | 10 | ofEasyCam mCam1; 11 | map mSkeleton; 12 | 13 | vector mTail; 14 | pal::ofxSkeleton::ofxIKchain mIKchainTail; 15 | 16 | public: 17 | void setup(); 18 | void update(); 19 | void draw(); 20 | 21 | void keyPressed(int key); 22 | void keyReleased(int key); 23 | void mouseMoved(int x, int y ); 24 | void mouseDragged(int x, int y, int button); 25 | void mousePressed(int x, int y, int button); 26 | void mouseReleased(int x, int y, int button); 27 | void windowResized(int w, int h); 28 | void dragEvent(ofDragInfo dragInfo); 29 | void gotMessage(ofMessage msg); 30 | 31 | }; 32 | -------------------------------------------------------------------------------- /example/bin/example.app/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 13A603 7 | CFBundleDevelopmentRegion 8 | English 9 | CFBundleExecutable 10 | example 11 | CFBundleIconFile 12 | icon.icns 13 | CFBundleIdentifier 14 | com.yourcompany.openFrameworks 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundlePackageType 18 | APPL 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | DTCompiler 24 | com.apple.compilers.llvm.clang.1_0 25 | DTPlatformBuild 26 | 5A2053 27 | DTPlatformVersion 28 | GM 29 | DTSDKBuild 30 | 12F37 31 | DTSDKName 32 | macosx10.8 33 | DTXcode 34 | 0501 35 | DTXcodeBuild 36 | 5A2053 37 | 38 | 39 | -------------------------------------------------------------------------------- /example/example.xcodeproj/project.xcworkspace/xcshareddata/ikExample.xccheckout: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDESourceControlProjectFavoriteDictionaryKey 6 | 7 | IDESourceControlProjectIdentifier 8 | 389C1AF9-B4E3-4E76-9413-4CF149034EF5 9 | IDESourceControlProjectName 10 | ikExample 11 | IDESourceControlProjectOriginsDictionary 12 | 13 | 2DC21A15-6AD6-4D4D-A9AE-9440C16690E3 14 | ssh://poniesandlight.co.uk/var/git/pal.addons.ofxSkeleton.git 15 | D40A9F68-4AFD-4A64-80A2-B8B81A89B82C 16 | git://github.com/openframeworks/openFrameworks.git 17 | 18 | IDESourceControlProjectPath 19 | addons/ofxSkeleton/example/ikExample.xcodeproj/project.xcworkspace 20 | IDESourceControlProjectRelativeInstallPathDictionary 21 | 22 | 2DC21A15-6AD6-4D4D-A9AE-9440C16690E3 23 | ../../.. 24 | D40A9F68-4AFD-4A64-80A2-B8B81A89B82C 25 | ../../../../.. 26 | 27 | IDESourceControlProjectURL 28 | ssh://poniesandlight.co.uk/var/git/pal.addons.ofxSkeleton.git 29 | IDESourceControlProjectVersion 30 | 110 31 | IDESourceControlProjectWCCIdentifier 32 | D40A9F68-4AFD-4A64-80A2-B8B81A89B82C 33 | IDESourceControlProjectWCConfigurations 34 | 35 | 36 | IDESourceControlRepositoryExtensionIdentifierKey 37 | public.vcs.git 38 | IDESourceControlWCCIdentifierKey 39 | D40A9F68-4AFD-4A64-80A2-B8B81A89B82C 40 | IDESourceControlWCCName 41 | oF 42 | 43 | 44 | IDESourceControlRepositoryExtensionIdentifierKey 45 | public.vcs.git 46 | IDESourceControlWCCIdentifierKey 47 | 2DC21A15-6AD6-4D4D-A9AE-9440C16690E3 48 | IDESourceControlWCCName 49 | ofxSkeleton 50 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /ikExample/src/ofApp.cpp: -------------------------------------------------------------------------------- 1 | #include "ofApp.h" 2 | 3 | //-------------------------------------------------------------- 4 | void ofApp::setup(){ 5 | 6 | for (int i=0; i<14; i++) { 7 | ofxJoint * j = new ofxJoint(); 8 | if (i>0) j->bone(bones.back()); 9 | j->setPosition(ofVec3f(50, 0, 50)); 10 | j->setName("Joint_" + ofToString(i)); 11 | bones.push_back(shared_ptr(j)); 12 | } 13 | 14 | mIKchain.bones = bones; 15 | mIKchain.endEffector = bones.back(); 16 | mIKchain.targetPositionInGlobalSpace = ofVec3f(0,-300); 17 | } 18 | 19 | //-------------------------------------------------------------- 20 | void ofApp::update(){ 21 | mIKchain.solve(); 22 | } 23 | 24 | //-------------------------------------------------------------- 25 | void ofApp::draw(){ 26 | 27 | ofBackgroundGradient(ofColor(18,33,54), ofColor(18,22,28)); 28 | 29 | ofSetColor(255); 30 | 31 | // we want to draw in the centre of the screen. 32 | ofTranslate(ofGetWidth()/2.0, ofGetHeight()/2.0); 33 | 34 | for (int i = 0; idraw(15.0f); 36 | bones[i]->drawName(); 37 | } 38 | 39 | } 40 | 41 | //-------------------------------------------------------------- 42 | void ofApp::keyPressed(int key){ 43 | 44 | } 45 | 46 | //-------------------------------------------------------------- 47 | void ofApp::keyReleased(int key){ 48 | 49 | } 50 | 51 | //-------------------------------------------------------------- 52 | void ofApp::mouseMoved(int x, int y ){ 53 | mIKchain.targetPositionInGlobalSpace = ofVec3f(x-ofGetWidth()/2.0,y-ofGetHeight()/2.0,0); 54 | } 55 | 56 | //-------------------------------------------------------------- 57 | void ofApp::mouseDragged(int x, int y, int button){ 58 | 59 | } 60 | 61 | //-------------------------------------------------------------- 62 | void ofApp::mousePressed(int x, int y, int button){ 63 | 64 | } 65 | 66 | //-------------------------------------------------------------- 67 | void ofApp::mouseReleased(int x, int y, int button){ 68 | } 69 | 70 | //-------------------------------------------------------------- 71 | void ofApp::windowResized(int w, int h){ 72 | 73 | } 74 | 75 | //-------------------------------------------------------------- 76 | void ofApp::gotMessage(ofMessage msg){ 77 | 78 | } 79 | 80 | //-------------------------------------------------------------- 81 | void ofApp::dragEvent(ofDragInfo dragInfo){ 82 | 83 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | _____ ___ 3 | / / / / ofxSkeleton 4 | / __/ * / /__ (c) ponies & light, 2012, 2013. All rights reserved. 5 | /__/ /_____/ poniesandlight.co.uk 6 | 7 | Created by tim on 12/11/2012. 8 | 9 | Permission is hereby granted, free of charge, to any person obtaining a copy 10 | of this software and associated documentation files (the "Software"), to deal 11 | in the Software without restriction, including without limitation the rights 12 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | copies of the Software, and to permit persons to whom the Software is 14 | furnished to do so, subject to the following conditions: 15 | 16 | The above copyright notice and this permission notice shall be included in 17 | all copies or substantial portions of the Software. 18 | 19 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 | THE SOFTWARE. 26 | 27 | # ofxSkeleton 28 | 29 | ## Description 30 | 31 | This addon allows you to build (and debug-draw) skeleton structures, useful for skeletal animation and skinning. 32 | 33 | ## Use case: 34 | 35 | typedef shared_ptr JointP_t; 36 | 37 | for (int i = 0; i < 4; i++){ 38 | mSkeleton.push_back(JointP_t(new ofxJoint)); 39 | } 40 | 41 | mFoot = mSkeleton[0]; 42 | mKnee = mSkeleton[1]; 43 | mHip = mSkeleton[2]; 44 | mRoot = mSkeleton[3]; 45 | 46 | mFoot->setName("Foot"); 47 | mKnee->setName("Knee"); 48 | mHip->setName("Hip"); 49 | mRoot->setName("Root"); 50 | 51 | // build skeleton based on joints. 52 | // this applies a hierarchy, and allows you to set children 53 | // bones' offsets relative to their parent's. 54 | 55 | mFoot->bone(mKnee)->bone(mHip)->bone(mRoot); 56 | 57 | mRoot->setGlobalPosition(ofVec3f(0)); 58 | 59 | mHip->setGlobalPosition(ofVec3f(0,100,0)); 60 | mKnee->setGlobalPosition(ofVec3f(0,50,0)); 61 | mFoot->setGlobalPosition(ofVec3f(0,-50,0)); 62 | 63 | ## Example Projects 64 | 65 | 2 included. 66 | 67 | ![image](http://poniesandlight.co.uk/img/ref-render-ofxSkeleton.png "ofxSkeleton Reference Render") 68 | 69 | ## Dependencies 70 | 71 | * ♥ openframeworks >= 0.8.0 72 | 73 | 74 | -------------------------------------------------------------------------------- /example/example.xcodeproj/xcshareddata/xcschemes/example 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 | -------------------------------------------------------------------------------- /example/example.xcodeproj/xcshareddata/xcschemes/ikExample 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 | -------------------------------------------------------------------------------- /example/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/ofxSkeleton.h: -------------------------------------------------------------------------------- 1 | // 2 | // _____ ___ 3 | // / / / / ofxSkeleton 4 | // / __/ * / /__ (c) ponies & light, 2012, 2013. All rights reserved. 5 | // /__/ /_____/ poniesandlight.co.uk 6 | // 7 | // ofxSkeleton.h 8 | // Created by tim on 12/11/2012. 9 | // 10 | // Permission is hereby granted, free of charge, to any person obtaining a copy 11 | // of this software and associated documentation files (the "Software"), to deal 12 | // in the Software without restriction, including without limitation the rights 13 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | // copies of the Software, and to permit persons to whom the Software is 15 | // furnished to do so, subject to the following conditions: 16 | // 17 | // The above copyright notice and this permission notice shall be included in 18 | // all copies or substantial portions of the Software. 19 | // 20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 26 | // THE SOFTWARE. 27 | 28 | #pragma once 29 | 30 | #include "ofMain.h" 31 | 32 | namespace pal { 33 | namespace ofxSkeleton { 34 | 35 | /** 36 | * @brief A connector of bones in 3d space. 37 | * 38 | * @detail A bone is what links two joints. 39 | * A joint is linked to its parent joint through a bone. 40 | * A joint can have many children, but only one parent. 41 | * A joint with no parent is a root joint. 42 | * 43 | * @note By default, any position / orientation methods on joints 44 | * operate relative to its parent joint. These are local 45 | * operations. If you want to set the global orientaion / 46 | * position of a joint, use the equivalent setGlobal* 47 | * methods. 48 | * 49 | * @author tig 50 | * 51 | * @date 2013-10-31 52 | */ 53 | class ofxJoint { 54 | 55 | private: 56 | 57 | weak_ptr parent; 58 | ofMatrix4x4 localTransformMatrix; 59 | ofMatrix4x4 localParentTransformMatrix; 60 | string mName; 61 | 62 | virtual void customDraw(float r) const; 63 | 64 | public: 65 | 66 | 67 | void setTransformMatrix(ofMatrix4x4 m_); 68 | void setOrientation(ofQuaternion orientation_); 69 | void setParentOrientation(ofQuaternion orientation_); 70 | 71 | void setPosition(ofVec3f position_); 72 | void setGlobalOrientation(ofQuaternion orientation_); 73 | void setParentGlobalOrientation(ofQuaternion orientation_); 74 | 75 | void setGlobalPosition(ofVec3f position_); 76 | shared_ptr setParent(shared_ptr parent_); 77 | shared_ptr bone(shared_ptr parent_); 78 | 79 | void setName(string name_); 80 | 81 | void draw(float r_ = 4.0) const; 82 | void drawAxes(float scale_ = 10.0) const; 83 | void drawName(const ofColor& colour_ = ofColor::yellow) const; 84 | 85 | const string& getName() const; 86 | shared_ptr getParent(); 87 | 88 | const ofQuaternion getOrientation() const; 89 | const ofQuaternion getParentOrientation() const; 90 | const ofMatrix4x4 getLocalTransformMatrix() const; 91 | const ofMatrix4x4 getParentTransformMatrix() const; 92 | const ofVec3f getParentPosition() const; 93 | 94 | const ofMatrix4x4 getGlobalTransformMatrix() const; 95 | const ofMatrix4x4 getParentGlobalTransformMatrix() const; 96 | 97 | const ofQuaternion getParentGlobalOrientation() const; 98 | const ofQuaternion getGlobalOrientation() const; 99 | const ofVec3f getGlobalPosition() const; 100 | const ofVec3f getParentGlobalPosition() const; 101 | 102 | ofxJoint() 103 | :parent() // will automatically initialize as a NULL shared ptr. 104 | {}; 105 | 106 | }; 107 | 108 | // ---------------------------------------------------------------------- 109 | // Human skeleton helper methods. 110 | 111 | /** 112 | * @brief Calculates hip and knee orientation 113 | * 114 | * @param vHip_ global position of hip joint 115 | * @param vKnee_ global position of knee joint 116 | * @param vFoot_ global position of foot joint 117 | * 118 | * @return qHip_ global orientation at hip joint 119 | * @return qKnee_ global orientation at knee joint 120 | * 121 | * @detail Orientations are calculated based on the global position of 122 | * hip, knee, foot, and the assumption that the knee joint 123 | * has only one degree of freedom (around its local x-axis). 124 | * 125 | * @note After applying these orientations, you need to make sure to 126 | * reset the joint positions, since they might have changed. 127 | * 128 | * @author tig 129 | */ 130 | static void calculateHipKneeOrientation(const ofVec3f& vHip_, const ofVec3f& vKnee_, const ofVec3f& vFoot_, ofQuaternion& qKnee_, ofQuaternion& qHip_) { 131 | ofVec3f uHK = (vKnee_ - vHip_).getNormalized(); // e 132 | ofVec3f uKF = (vFoot_ - vKnee_).getNormalized(); // f 133 | 134 | // If Hip, knee, Foot are in one straight line, we cannot calculate axes from cross products. 135 | // but it is safe to assume zero rotation, so we initialize them with zero rotation and then 136 | // check if they are *not* in a straight line. 137 | 138 | qKnee_ = ofQuaternion(); 139 | qHip_ = ofQuaternion(); 140 | 141 | if (fabs(uHK.dot(uKF)) < 0.9999){ 142 | 143 | // ----------| invariant: hip, knee, foot *not* in a straight line 144 | 145 | // this means, Hip-Knee-Foot span a plane. We know that our knee's local x axis must be perpendicular to 146 | // this plane, since the knee can only rotate around it's local x axis. 147 | // because their twists are linked, the hip shares the knee's local x-axis. 148 | // the local y-axis at a joint always points in the opposite direction of the bone. 149 | // with this, we can calculate the local z-coordinate as a cross product of local x and local y. 150 | 151 | ofMatrix4x4 rotM; 152 | 153 | ofVec3f ax = uHK.getCrossed(uKF); // local x-axis 154 | ofVec3f ayK = -uKF; // local y-axis (points in the opposite direction of the bone) 155 | ofVec3f azK = ax.getCrossed(ayK); // local z-axis 156 | 157 | rotM.set( ax.x, ax.y, ax.z, 0, 158 | ayK.x, ayK.y, ayK.z, 0, 159 | azK.x, azK.y, azK.z, 0, 160 | 0, 0, 0, 1); // generates a rotation matrix. 161 | qKnee_ = rotM.getRotate(); 162 | 163 | // for ax, we re-use local x-axis 164 | ofVec3f ayH = -uHK; // local y-axis 165 | ofVec3f azH = ax.getCrossed(ayH); // local z-axis 166 | 167 | rotM.set( ax.x, ax.y, ax.z, 0, 168 | ayH.x, ayH.y, ayH.z, 0, 169 | azH.x, azH.y, azH.z, 0, 170 | 0, 0, 0, 1); // generates a rotation matrix. 171 | 172 | qHip_ = rotM.getRotate(); 173 | } 174 | } 175 | 176 | // -------------------------------------------------------- 177 | // this currently in prototype stage only: 178 | 179 | class ofxIKchain { 180 | public: 181 | vector > bones; 182 | shared_ptr endEffector; 183 | ofVec3f targetPositionInGlobalSpace; 184 | 185 | void solve(); 186 | }; 187 | 188 | } // namespace ofxSkeleton 189 | } // namespace pal 190 | -------------------------------------------------------------------------------- /example/src/ofApp.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // _____ ___ 3 | // / / / / ofxSkeleton Example 4 | // / __/ * / /__ (c) ponies & light, 2012, 2013. All rights reserved. 5 | // /__/ /_____/ poniesandlight.co.uk 6 | // 7 | // ofxSkeleton.h 8 | // Created by tim on 31/10/2013. 9 | // 10 | // Permission is hereby granted, free of charge, to any person obtaining a copy 11 | // of this software and associated documentation files (the "Software"), to deal 12 | // in the Software without restriction, including without limitation the rights 13 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | // copies of the Software, and to permit persons to whom the Software is 15 | // furnished to do so, subject to the following conditions: 16 | // 17 | // The above copyright notice and this permission notice shall be included in 18 | // all copies or substantial portions of the Software. 19 | // 20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 26 | // THE SOFTWARE. 27 | #include "ofApp.h" 28 | 29 | using namespace pal::ofxSkeleton; 30 | 31 | u_long animCurrentFrame; 32 | bool animIsPaused = false; 33 | bool shouldDrawLabels = false; 34 | bool shouldDrawInfo = true; 35 | 36 | //-------------------------------------------------------------- 37 | void ofApp::setup(){ 38 | 39 | 40 | animIsPaused = false; 41 | animCurrentFrame = 0; 42 | 43 | ofDisableSmoothing(); 44 | ofDisableAlphaBlending(); 45 | 46 | mCam1.setupPerspective(false, 60, 0.1, 3000); 47 | // mCam1.setPosition(500, 800, 800); 48 | mCam1.lookAt(ofVec3f(0)); 49 | 50 | 51 | mSkeleton["Root"] = JointP_t(new ofxJoint()); 52 | mSkeleton["Root"]->setGlobalPosition(ofVec3f(0)); 53 | 54 | string names[4] = {"Hip_", "Knee_", "Foot_", "Toe_"}; 55 | 56 | for (int j = 0; j < 4; ++j){ 57 | 58 | string sIndex = ofToString(j); 59 | 60 | for (int i = 0; i < 4; i++){ 61 | mSkeleton["L_" +names[i] + sIndex] = JointP_t(new ofxJoint()); 62 | mSkeleton["R_" + names[i] + sIndex] = JointP_t(new ofxJoint()); 63 | } 64 | // apply a limb's hierarchy 65 | mSkeleton["L_Toe_" + sIndex]->bone(mSkeleton["L_Foot_" + sIndex])->bone(mSkeleton["L_Knee_" + sIndex])->bone(mSkeleton["L_Hip_" + sIndex])->bone(mSkeleton["Root"]); 66 | mSkeleton["R_Toe_" + sIndex]->bone(mSkeleton["R_Foot_" + sIndex])->bone(mSkeleton["R_Knee_" + sIndex])->bone(mSkeleton["R_Hip_" + sIndex])->bone(mSkeleton["Root"]); 67 | 68 | // set the limb's joints positions 69 | 70 | mSkeleton["L_Hip_" + sIndex]->setGlobalPosition(ofVec3f(-100, 100 , -120 + j * 60 )); 71 | mSkeleton["L_Hip_" + sIndex]->setOrientation(ofQuaternion(j * 20 - 40, ofVec3f(0,1,0))); 72 | mSkeleton["L_Knee_" + sIndex]->setPosition(ofVec3f(-150, 30, 0)); 73 | mSkeleton["L_Foot_" + sIndex]->setPosition(ofVec3f(-80, -80, 0)); 74 | mSkeleton["L_Toe_" + sIndex]->setPosition(ofVec3f(-120, -60, 0)); 75 | 76 | mSkeleton["R_Hip_" + sIndex]->setGlobalPosition(ofVec3f(100, 100 , -120 + j * 60 )); 77 | mSkeleton["R_Hip_" + sIndex]->setOrientation(ofQuaternion(j * 20 - 40, ofVec3f(0,-1,0))); 78 | mSkeleton["R_Knee_" + sIndex]->setPosition(ofVec3f(150, 30, 0)); 79 | mSkeleton["R_Foot_" + sIndex]->setPosition(ofVec3f(80, -80, 0)); 80 | mSkeleton["R_Toe_" + sIndex]->setPosition(ofVec3f(120, -60, 0)); 81 | } 82 | 83 | // add a tail 84 | 85 | for (int i=0; i<10; i++){ 86 | JointP_t tailSegment = JointP_t(new ofxJoint()); 87 | if (i>0) { 88 | tailSegment->setParent(mTail.back()); 89 | } 90 | tailSegment->setPosition(ofVec3f(0,0,-100)); 91 | mTail.push_back(tailSegment); 92 | mSkeleton["TailSegment_" + ofToString(i)] = tailSegment; 93 | } 94 | 95 | mTail[0]->setParent(mSkeleton["Root"]); 96 | 97 | mIKchainTail.bones.assign(mTail.begin()+2, mTail.end()); 98 | mIKchainTail.endEffector = mTail.back(); 99 | mIKchainTail.targetPositionInGlobalSpace = ofVec3f(0,-300); 100 | 101 | // add a head. 102 | mSkeleton["Head"] = JointP_t(new ofxJoint()); 103 | mSkeleton["Head"]->setParent(mSkeleton["Root"]); 104 | mSkeleton["Head"]->setPosition(ofVec3f(0, 70 , 70 )); 105 | 106 | // add some fangs 107 | 108 | mSkeleton["L_Fang_Hinge"] = JointP_t(new ofxJoint()); 109 | mSkeleton["L_Fang_Hinge"]->bone(mSkeleton["Root"]); 110 | mSkeleton["L_Fang_Hinge"]->setPosition(ofVec3f(-50, 0, 70 )); 111 | 112 | mSkeleton["L_Fang_A"] = JointP_t(new ofxJoint()); 113 | mSkeleton["L_Fang_A"]->bone(mSkeleton["L_Fang_Hinge"]); 114 | mSkeleton["L_Fang_A"]->setPosition(ofVec3f(-50, 0, 90 )); 115 | 116 | mSkeleton["L_Fang_AA"] = JointP_t(new ofxJoint()); 117 | mSkeleton["L_Fang_AA"]->bone(mSkeleton["L_Fang_A"]); 118 | mSkeleton["L_Fang_AA"]->setPosition(ofVec3f(40, 0, 120 )); 119 | 120 | mSkeleton["L_Fang_B"] = JointP_t(new ofxJoint()); 121 | mSkeleton["L_Fang_B"]->bone(mSkeleton["L_Fang_Hinge"]); 122 | mSkeleton["L_Fang_B"]->setPosition(ofVec3f(20, 0, 90 )); 123 | 124 | mSkeleton["L_Fang_BB"] = JointP_t(new ofxJoint()); 125 | mSkeleton["L_Fang_BB"]->bone(mSkeleton["L_Fang_B"]); 126 | mSkeleton["L_Fang_BB"]->setPosition(ofVec3f(-20, 0, 120 )); 127 | 128 | mSkeleton["R_Fang_Hinge"] = JointP_t(new ofxJoint()); 129 | mSkeleton["R_Fang_Hinge"]->bone(mSkeleton["Root"]); 130 | mSkeleton["R_Fang_Hinge"]->setPosition(ofVec3f( 50, 0, 70 )); 131 | 132 | mSkeleton["R_Fang_A"] = JointP_t(new ofxJoint()); 133 | mSkeleton["R_Fang_A"]->bone(mSkeleton["R_Fang_Hinge"]); 134 | mSkeleton["R_Fang_A"]->setPosition(ofVec3f( 50, 0, 90 )); 135 | 136 | mSkeleton["R_Fang_AA"] = JointP_t(new ofxJoint()); 137 | mSkeleton["R_Fang_AA"]->bone(mSkeleton["R_Fang_A"]); 138 | mSkeleton["R_Fang_AA"]->setPosition(ofVec3f(-40, 0, 120 )); 139 | 140 | mSkeleton["R_Fang_B"] = JointP_t(new ofxJoint()); 141 | mSkeleton["R_Fang_B"]->bone(mSkeleton["R_Fang_Hinge"]); 142 | mSkeleton["R_Fang_B"]->setPosition(ofVec3f(-20, 0, 90 )); 143 | 144 | mSkeleton["R_Fang_BB"] = JointP_t(new ofxJoint()); 145 | mSkeleton["R_Fang_BB"]->bone(mSkeleton["R_Fang_B"]); 146 | mSkeleton["R_Fang_BB"]->setPosition(ofVec3f( 20, 0, 120 )); 147 | 148 | 149 | // set joint names according to their map indices. 150 | 151 | for (map::iterator it = mSkeleton.begin(); it != mSkeleton.end(); ++it){ 152 | it->second->setName(it->first); 153 | } 154 | 155 | 156 | } 157 | 158 | 159 | //-------------------------------------------------------------- 160 | void ofApp::update(){ 161 | 162 | if (!animIsPaused) { 163 | ++animCurrentFrame; 164 | 165 | 166 | mIKchainTail.solve(); 167 | } 168 | 169 | ofQuaternion q = mSkeleton["L_Hip_0"]->getOrientation(); 170 | 171 | ofQuaternion p( sin((animCurrentFrame % 200/200.f) * TWO_PI), ofVec3f(1,0,0)); 172 | 173 | q *= p; 174 | 175 | if (!animIsPaused) { 176 | 177 | for (int i = 0; i<4; i++){ 178 | ofQuaternion q(i * 20 - 40, ofVec3f(0,1,0)); 179 | ofQuaternion q2(ofSignedNoise( 180 | (cos(TWO_PI * (i) / 4.0f) + 1.0 ) / 2.0, 181 | (sin(TWO_PI * (animCurrentFrame % 200) / 200.f)) + 1.0 ) / 2.0 182 | * 50.f, ofVec3f(1,0,0)); 183 | 184 | mSkeleton["L_Hip_" + ofToString(i)]->setOrientation(q*q2); 185 | } 186 | 187 | for (int i = 0; i<4; i++){ 188 | ofQuaternion q(i * 20 - 40, ofVec3f(0,-1,0)); 189 | ofQuaternion q2(ofSignedNoise( 190 | (sin(TWO_PI * (i) / 4.0f) + 1.0 ) / 2.0, 191 | (cos(TWO_PI * (animCurrentFrame % 200) / 200.f)) + 1.0 ) / 2.0 192 | * 50.f, ofVec3f(1,0,0)); 193 | 194 | mSkeleton["R_Hip_" + ofToString(i)]->setOrientation(q*q2); 195 | } 196 | 197 | 198 | } 199 | 200 | } 201 | 202 | //-------------------------------------------------------------- 203 | void ofApp::draw(){ 204 | 205 | ofEnableDepthTest(); 206 | 207 | ofBackgroundGradient(ofColor::fromHex(0x323232), ofColor::black); 208 | 209 | mCam1.begin(); 210 | 211 | { 212 | ofVec3f mouseInWindowSpace(ofGetMouseX(),ofGetMouseY(), mCam1.worldToScreen(ofVec3f(0)).z); 213 | mIKchainTail.targetPositionInGlobalSpace = mCam1.screenToWorld(mouseInWindowSpace); 214 | 215 | } 216 | 217 | ofPushMatrix(); 218 | 219 | for (map::iterator it = mSkeleton.begin(); it != mSkeleton.end(); ++it){ 220 | it->second->draw(10); 221 | } 222 | 223 | ofPopMatrix(); 224 | 225 | mCam1.end(); 226 | 227 | ofSetColor(ofColor::yellow); 228 | 229 | if (shouldDrawLabels) { 230 | for (map::iterator it = mSkeleton.begin(); it != mSkeleton.end(); ++it){ 231 | ofDrawBitmapString(it->second->getName(), mCam1.worldToScreen(it->second->getGlobalPosition()) * ofVec3f(1,1,0) + ofVec3f(10,10)); 232 | } 233 | } 234 | 235 | ofSetColor(ofColor::white); 236 | 237 | if (shouldDrawInfo){ 238 | ofDrawBitmapString(" _____ ___\n" 239 | " / / / / ofx(Exo)Skeleton Example\n" 240 | " / __/ * / /__ (c) ponies & light, 2013. All rights reserved.\n" 241 | " /__/ /_____/ poniesandlight.co.uk\n\n" 242 | " toggle animation | toggle info text | foggle fullscreen | toggle labels", 10, ofGetHeight() - 12 * 7); 243 | } 244 | 245 | } 246 | 247 | //-------------------------------------------------------------- 248 | void ofApp::keyPressed(int key){ 249 | 250 | } 251 | 252 | //-------------------------------------------------------------- 253 | void ofApp::keyReleased(int key){ 254 | 255 | 256 | switch (key) { 257 | case ' ': 258 | animIsPaused ^= true; 259 | break; 260 | case 'i': 261 | shouldDrawInfo ^= true; 262 | break; 263 | case 'l': 264 | shouldDrawLabels ^= true; 265 | break; 266 | case 'f': 267 | ofToggleFullscreen(); 268 | break; 269 | default: 270 | break; 271 | } 272 | 273 | } 274 | 275 | //-------------------------------------------------------------- 276 | void ofApp::mouseMoved(int x, int y ){ 277 | 278 | 279 | } 280 | 281 | //-------------------------------------------------------------- 282 | void ofApp::mouseDragged(int x, int y, int button){ 283 | 284 | } 285 | 286 | //-------------------------------------------------------------- 287 | void ofApp::mousePressed(int x, int y, int button){ 288 | 289 | } 290 | 291 | //-------------------------------------------------------------- 292 | void ofApp::mouseReleased(int x, int y, int button){ 293 | 294 | } 295 | 296 | //-------------------------------------------------------------- 297 | void ofApp::windowResized(int w, int h){ 298 | 299 | } 300 | 301 | //-------------------------------------------------------------- 302 | void ofApp::gotMessage(ofMessage msg){ 303 | 304 | } 305 | 306 | //-------------------------------------------------------------- 307 | void ofApp::dragEvent(ofDragInfo dragInfo){ 308 | 309 | } 310 | -------------------------------------------------------------------------------- /src/ofxSkeleton.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // _____ ___ 3 | // / / / / ofxSkeleton 4 | // / __/ * / /__ (c) ponies & light, 2012, 2013. All rights reserved. 5 | // /__/ /_____/ poniesandlight.co.uk 6 | // 7 | // ofxSkeleton.cpp 8 | // Created by tim on 12/11/2012. 9 | // 10 | // Permission is hereby granted, free of charge, to any person obtaining a copy 11 | // of this software and associated documentation files (the "Software"), to deal 12 | // in the Software without restriction, including without limitation the rights 13 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | // copies of the Software, and to permit persons to whom the Software is 15 | // furnished to do so, subject to the following conditions: 16 | // 17 | // The above copyright notice and this permission notice shall be included in 18 | // all copies or substantial portions of the Software. 19 | // 20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 26 | // THE SOFTWARE. 27 | 28 | #include "ofxSkeleton.h" 29 | 30 | using namespace pal::ofxSkeleton; 31 | 32 | ofIndexType PRIMITIVE_RESTART_INDEX = 65535; 33 | 34 | // ---------------------------------------------------------------------- 35 | 36 | ofMesh getAxisMesh(){ 37 | ofMesh mesh; 38 | 39 | mesh.setMode(OF_PRIMITIVE_LINES); 40 | 41 | ofVec3f vertices[6] = { 42 | ofVec3f(0,0,0), 43 | ofVec3f(1,0,0), 44 | ofVec3f(0,0,0), 45 | ofVec3f(0,1,0), 46 | ofVec3f(0,0,0), 47 | ofVec3f(0,0,1), 48 | }; 49 | ofFloatColor colors[6] = { 50 | ofColor::red, 51 | ofColor::red, 52 | ofColor::green, 53 | ofColor::green, 54 | ofColor::blue, 55 | ofColor::blue, 56 | }; 57 | 58 | mesh.addVertices(vertices, 6); 59 | mesh.addColors(colors, 6); 60 | return mesh; 61 | } 62 | 63 | // ---------------------------------------------------------------------- 64 | 65 | ofMesh getJointMesh(){ 66 | ofMesh mesh; 67 | 68 | // this will hold the points of a circle in the YZ-plane 69 | vector verts; 70 | vector colours; 71 | vector indices; 72 | 73 | for (int i=0; i<30; i++){ // YZ 74 | verts.push_back(ofVec3f(0, sin(TWO_PI * i/30.0f), cos(TWO_PI * i/30.0f))); 75 | colours.push_back(ofColor::red); 76 | indices.push_back(i); 77 | } 78 | indices.push_back(0); 79 | indices.push_back(PRIMITIVE_RESTART_INDEX); 80 | 81 | for (int i=0; i<30; i++){ // XZ 82 | verts.push_back(ofVec3f(sin(TWO_PI * i/30.0f), 0 , cos(TWO_PI * i/30.0f))); 83 | colours.push_back(ofColor::green); 84 | indices.push_back(i+30); 85 | } 86 | indices.push_back(30); 87 | indices.push_back(PRIMITIVE_RESTART_INDEX); 88 | 89 | for (int i=0; i< 30; i++){ // XY 90 | verts.push_back(ofVec3f(sin(TWO_PI * i/30.0f), cos(TWO_PI * i/30.0f), 0)); 91 | colours.push_back(ofColor::blue); 92 | indices.push_back(i+60); 93 | } 94 | indices.push_back(60); 95 | 96 | 97 | mesh.setMode(OF_PRIMITIVE_LINE_STRIP); 98 | mesh.addVertices(verts); 99 | mesh.addColors(colours); 100 | mesh.addIndices(indices); 101 | 102 | return mesh; 103 | } 104 | 105 | // ---------------------------------------------------------------------- 106 | 107 | ofVboMesh & sBoneMesh() { 108 | static ofVboMesh mesh(ofConePrimitive( 1.f, 1.f, 4, 2, 2 ).getConeMesh()); 109 | return mesh; 110 | } 111 | 112 | // ---------------------------------------------------------------------- 113 | 114 | ofVboMesh & sJointMesh(){ 115 | static ofVboMesh mesh(getJointMesh()); 116 | return mesh; 117 | } 118 | 119 | 120 | // ---------------------------------------------------------------------- 121 | /// returns a Mesh representing an XYZ coordinate system. 122 | ofVboMesh & sAxisMesh(){ 123 | // mesh only available as wireframe // 124 | static ofVboMesh mesh(getAxisMesh()); 125 | return mesh; 126 | } 127 | 128 | // ---------------------------------------------------------------------- 129 | 130 | void ofxJoint::customDraw(float r_) const { 131 | 132 | ofVec3f p1(0); 133 | ofVec3f p2(0); 134 | 135 | if (shared_ptr p = parent.lock()){ 136 | // joint has a parent. draw bone connection from parent joint to this joint. 137 | p1 = p1 * p->getGlobalTransformMatrix() * ofMatrix4x4::getInverseOf(getGlobalTransformMatrix()); 138 | 139 | ofMatrix4x4 mat; 140 | mat.makeRotationMatrix(p1-p2, ofVec3f(0,1,0)); 141 | 142 | ofPushMatrix(); 143 | ofMultMatrix(mat.getInverse()); 144 | ofTranslate(0,(p2-p1).length() * 0.5, 0); 145 | ofScale(r_,(p2-p1).length(),r_); 146 | sBoneMesh().drawWireframe(); 147 | ofPopMatrix(); 148 | } 149 | 150 | ofPushMatrix(); 151 | ofScale(r_,r_,r_); 152 | glEnable(GL_PRIMITIVE_RESTART); 153 | glPrimitiveRestartIndex(PRIMITIVE_RESTART_INDEX); 154 | sJointMesh().drawWireframe(); 155 | glDisable(GL_PRIMITIVE_RESTART); 156 | ofPopMatrix(); 157 | } 158 | 159 | 160 | // ---------------------------------------------------------------------- 161 | 162 | void ofxJoint::draw(float r_) const { 163 | ofPushStyle(); 164 | ofPushMatrix(); 165 | ofMultMatrix(getGlobalTransformMatrix()); 166 | customDraw(r_); 167 | ofPopMatrix(); 168 | ofPopStyle(); 169 | }; 170 | 171 | // ---------------------------------------------------------------------- 172 | 173 | void ofxJoint::drawAxes(float scale_) const { 174 | ofPushStyle(); 175 | ofPushMatrix(); 176 | ofMultMatrix(getGlobalTransformMatrix()); 177 | ofScale(scale_, scale_, scale_); 178 | sAxisMesh().draw(); 179 | ofPopMatrix(); 180 | ofPopStyle(); 181 | } 182 | 183 | void ofxJoint::drawName(const ofColor& colour_) const { 184 | ofPushStyle(); 185 | ofSetColor(colour_); 186 | ofSetDrawBitmapMode(OF_BITMAPMODE_MODEL_BILLBOARD); 187 | ofPushMatrix(); 188 | ofMultMatrix(getGlobalTransformMatrix()); 189 | ofDrawBitmapString(mName, 0, 0); 190 | ofPopMatrix(); 191 | ofPopStyle(); 192 | } 193 | 194 | // ---------------------------------------------------------------------- 195 | 196 | shared_ptr ofxJoint::setParent(shared_ptr parent_){ 197 | parent = weak_ptr(parent_); 198 | localTransformMatrix = localTransformMatrix * ofMatrix4x4::getInverseOf( parent_->getGlobalTransformMatrix()); 199 | return parent_; 200 | }; 201 | 202 | // ---------------------------------------------------------------------- 203 | /// Alias for setParent() 204 | ///@detail Allows you to do the following: mFoot->bone(mKnee)->bone(mHip); 205 | shared_ptr ofxJoint::bone(shared_ptr parent_){ 206 | return setParent(parent_); 207 | } 208 | 209 | // ---------------------------------------------------------------------- 210 | 211 | const string& ofxJoint::getName() const { 212 | return mName; 213 | } 214 | 215 | // ---------------------------------------------------------------------- 216 | 217 | void ofxJoint::setName(string name_) { 218 | mName = name_; 219 | } 220 | 221 | // ---------------------------------------------------------------------- 222 | 223 | shared_ptr ofxJoint::getParent(){ 224 | shared_ptr p = parent.lock(); 225 | return (p); 226 | }; 227 | 228 | // ---------------------------------------------------------------------- 229 | 230 | void ofxJoint::setTransformMatrix(ofMatrix4x4 m_){ 231 | localTransformMatrix = m_; 232 | }; 233 | 234 | // ---------------------------------------------------------------------- 235 | 236 | void ofxJoint::setOrientation(ofQuaternion orientation_){ 237 | localTransformMatrix.setRotate(orientation_); 238 | }; 239 | 240 | // ---------------------------------------------------------------------- 241 | 242 | void ofxJoint::setParentGlobalOrientation(ofQuaternion orientation_){ 243 | if (shared_ptr p = parent.lock()) { 244 | p->setGlobalOrientation(orientation_); 245 | localParentTransformMatrix.makeRotationMatrix(p->getOrientation()); 246 | } else { 247 | setParentOrientation(orientation_); 248 | localParentTransformMatrix.makeRotationMatrix(orientation_); 249 | } 250 | }; 251 | 252 | 253 | // ---------------------------------------------------------------------- 254 | 255 | const ofQuaternion ofxJoint::getParentOrientation() const{ 256 | return localParentTransformMatrix.getRotate(); 257 | }; 258 | 259 | // ---------------------------------------------------------------------- 260 | 261 | void ofxJoint::setParentOrientation(ofQuaternion orientation_){ 262 | if (shared_ptr p = parent.lock()) { 263 | p->setOrientation(orientation_); 264 | localParentTransformMatrix.makeRotationMatrix(p->getOrientation()); 265 | } else { 266 | localParentTransformMatrix.makeRotationMatrix(orientation_); 267 | } 268 | }; 269 | 270 | // ---------------------------------------------------------------------- 271 | 272 | void ofxJoint::setPosition(ofVec3f position_){ 273 | if (shared_ptr p = parent.lock()) { 274 | localTransformMatrix.setTranslation(position_); 275 | } else { 276 | localTransformMatrix.setTranslation(position_); 277 | } 278 | }; 279 | 280 | // ---------------------------------------------------------------------- 281 | 282 | void ofxJoint::setGlobalOrientation(ofQuaternion orientation_){ 283 | ofQuaternion orientationInParentSpace; 284 | if (shared_ptr p = parent.lock()) { 285 | orientationInParentSpace = orientation_ * p->getGlobalOrientation().inverse(); 286 | } else { 287 | orientationInParentSpace = orientation_ ; 288 | } 289 | localTransformMatrix.setRotate(orientationInParentSpace); 290 | }; 291 | 292 | // ---------------------------------------------------------------------- 293 | 294 | void ofxJoint::setGlobalPosition(ofVec3f position_){ 295 | ofVec3f positionInParentSpace; 296 | if (shared_ptr p = parent.lock()){ 297 | positionInParentSpace = position_ * ofMatrix4x4::getInverseOf(p->getGlobalTransformMatrix()); 298 | } else { 299 | positionInParentSpace = position_ ; 300 | } 301 | setPosition(positionInParentSpace); 302 | }; 303 | 304 | // ---------------------------------------------------------------------- 305 | 306 | const ofMatrix4x4 ofxJoint::getGlobalTransformMatrix() const { 307 | if (shared_ptr p = parent.lock()) { 308 | return getLocalTransformMatrix() * p->getGlobalTransformMatrix(); 309 | } else { 310 | return getLocalTransformMatrix() * localParentTransformMatrix; 311 | } 312 | } 313 | 314 | // ---------------------------------------------------------------------- 315 | 316 | const ofMatrix4x4 ofxJoint::getLocalTransformMatrix() const { 317 | return localTransformMatrix; 318 | } 319 | 320 | // ---------------------------------------------------------------------- 321 | 322 | const ofQuaternion ofxJoint::getGlobalOrientation() const { 323 | return getGlobalTransformMatrix().getRotate(); 324 | } 325 | 326 | // ---------------------------------------------------------------------- 327 | 328 | const ofQuaternion ofxJoint::getOrientation() const { 329 | return getLocalTransformMatrix().getRotate(); 330 | } 331 | 332 | // ---------------------------------------------------------------------- 333 | 334 | const ofVec3f ofxJoint::getGlobalPosition() const { 335 | return getGlobalTransformMatrix().getTranslation(); 336 | } 337 | 338 | // ---------------------------------------------------------------------- 339 | 340 | const ofVec3f ofxJoint::getParentGlobalPosition() const { 341 | if (shared_ptr p = parent.lock()){ 342 | return (getParentTransformMatrix() * getGlobalTransformMatrix()).getTranslation(); 343 | } else { 344 | return ofVec3f(0); 345 | } 346 | } 347 | 348 | // ---------------------------------------------------------------------- 349 | 350 | const ofVec3f ofxJoint::getParentPosition() const { 351 | return getParentTransformMatrix().getTranslation(); 352 | } 353 | 354 | // ---------------------------------------------------------------------- 355 | 356 | const ofMatrix4x4 ofxJoint::getParentTransformMatrix() const { 357 | ofMatrix4x4 m; 358 | 359 | if (shared_ptr p = parent.lock()){ 360 | m = ofMatrix4x4::getInverseOf(getLocalTransformMatrix()); 361 | } else { 362 | m = localParentTransformMatrix; 363 | } 364 | 365 | return m; 366 | } 367 | 368 | // ---------------------------------------------------------------------- 369 | const ofMatrix4x4 ofxJoint::getParentGlobalTransformMatrix() const { 370 | ofMatrix4x4 m; 371 | if (shared_ptr p = parent.lock()){ 372 | m = getParentTransformMatrix() * getGlobalTransformMatrix(); 373 | } else { 374 | m.setTranslation(0, 0, 0); 375 | m = m * localParentTransformMatrix; 376 | } 377 | return m; 378 | } 379 | 380 | // ---------------------------------------------------------------------- 381 | 382 | const ofQuaternion ofxJoint::getParentGlobalOrientation() const { 383 | return getParentGlobalTransformMatrix().getRotate(); 384 | } 385 | 386 | // ---------------------------------------------------------------------- 387 | // INVERSE KINEMATICS 388 | // ---------------------------------------------------------------------- 389 | 390 | void ofxIKchain::solve(){ 391 | ofVec3f targetPosition = targetPositionInGlobalSpace; 392 | 393 | for (int i=0; i<1; i++){ // increase loop count to solve with greater precision. 394 | for (int j=bones.size()-1; j>=0; --j){ 395 | std::shared_ptr bone = bones[j]; 396 | // shoot ray from current parent joint to target 397 | // find relative angle between end effector and target 398 | 399 | const ofVec3f effectorPosition = endEffector->getGlobalPosition(); 400 | const ofMatrix4x4 worldToBone = (ofMatrix4x4::getInverseOf(bone->getParentGlobalTransformMatrix())); 401 | 402 | ofVec3f localTarget = targetPosition * worldToBone; 403 | ofVec3f localEffector = effectorPosition * worldToBone; 404 | 405 | if (localEffector.distanceSquared(localTarget) < 0.02) continue; 406 | 407 | float angle = localTarget.angle(localEffector); 408 | if (angle != angle ){ 409 | // this is where we test whether the angle is NaN 410 | // ofLogWarning() << "angle is NAN" ; 411 | continue; 412 | } 413 | if (fabs(angle) < 0.001) continue; 414 | ofVec3f axis = -(localTarget.getCrossed(localEffector)).getNormalized(); 415 | 416 | ofQuaternion q, p; 417 | p = bone->getParentOrientation(); 418 | 419 | ofVec3f parentOldAxis; 420 | float parentOldAngle; 421 | 422 | // we generate a quaternion with the new orientation 423 | q.makeRotate(angle, axis); 424 | q = p * q; // this rotates by (adds the new angle to) the current orientation 425 | 426 | // calculate the total angle 427 | q.getRotate(parentOldAngle, parentOldAxis); 428 | // clamp to the max angle. 429 | q.makeRotate(ofClamp(parentOldAngle, -45, 45), parentOldAxis); 430 | bone->setParentOrientation(q); 431 | } 432 | } 433 | } 434 | 435 | // ---------------------------------------------------------------------- 436 | 437 | 438 | 439 | 440 | -------------------------------------------------------------------------------- /example/example.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 22F2BD221821370F009EBF41 /* ofxSkeleton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 22F2BD201821370F009EBF41 /* ofxSkeleton.cpp */; }; 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 /* ofApp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4B69E1E0A3A1BDC003C02F2 /* ofApp.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 | E7E077E515D3B63C0020DFD4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E7E077E415D3B63C0020DFD4 /* CoreVideo.framework */; }; 27 | E7E077E815D3B6510020DFD4 /* QTKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E7E077E715D3B6510020DFD4 /* QTKit.framework */; }; 28 | E7F985F815E0DEA3003869B5 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E7F985F515E0DE99003869B5 /* Accelerate.framework */; }; 29 | /* End PBXBuildFile section */ 30 | 31 | /* Begin PBXContainerItemProxy section */ 32 | E4328147138ABC890047C5CB /* PBXContainerItemProxy */ = { 33 | isa = PBXContainerItemProxy; 34 | containerPortal = E4328143138ABC890047C5CB /* openFrameworksLib.xcodeproj */; 35 | proxyType = 2; 36 | remoteGlobalIDString = E4B27C1510CBEB8E00536013; 37 | remoteInfo = openFrameworks; 38 | }; 39 | E4EEB9AB138B136A00A80321 /* PBXContainerItemProxy */ = { 40 | isa = PBXContainerItemProxy; 41 | containerPortal = E4328143138ABC890047C5CB /* openFrameworksLib.xcodeproj */; 42 | proxyType = 1; 43 | remoteGlobalIDString = E4B27C1410CBEB8E00536013; 44 | remoteInfo = openFrameworks; 45 | }; 46 | /* End PBXContainerItemProxy section */ 47 | 48 | /* Begin PBXCopyFilesBuildPhase section */ 49 | E4C2427710CC5ABF004149E2 /* CopyFiles */ = { 50 | isa = PBXCopyFilesBuildPhase; 51 | buildActionMask = 2147483647; 52 | dstPath = ""; 53 | dstSubfolderSpec = 10; 54 | files = ( 55 | ); 56 | runOnlyForDeploymentPostprocessing = 0; 57 | }; 58 | /* End PBXCopyFilesBuildPhase section */ 59 | 60 | /* Begin PBXFileReference section */ 61 | 22F2BD201821370F009EBF41 /* ofxSkeleton.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ofxSkeleton.cpp; sourceTree = ""; }; 62 | 22F2BD211821370F009EBF41 /* ofxSkeleton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ofxSkeleton.h; sourceTree = ""; }; 63 | BBAB23BE13894E4700AA2426 /* GLUT.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLUT.framework; path = ../../../libs/glut/lib/osx/GLUT.framework; sourceTree = ""; }; 64 | E4328143138ABC890047C5CB /* openFrameworksLib.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = openFrameworksLib.xcodeproj; path = ../../../libs/openFrameworksCompiled/project/osx/openFrameworksLib.xcodeproj; sourceTree = SOURCE_ROOT; }; 65 | E45BE9710E8CC7DD009D7055 /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = ""; }; 66 | E45BE9720E8CC7DD009D7055 /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = /System/Library/Frameworks/ApplicationServices.framework; sourceTree = ""; }; 67 | E45BE9730E8CC7DD009D7055 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = /System/Library/Frameworks/AudioToolbox.framework; sourceTree = ""; }; 68 | E45BE9740E8CC7DD009D7055 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; 69 | E45BE9750E8CC7DD009D7055 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = /System/Library/Frameworks/CoreAudio.framework; sourceTree = ""; }; 70 | E45BE9760E8CC7DD009D7055 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = ""; }; 71 | E45BE9770E8CC7DD009D7055 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = /System/Library/Frameworks/CoreServices.framework; sourceTree = ""; }; 72 | E45BE9790E8CC7DD009D7055 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = ""; }; 73 | E45BE97A0E8CC7DD009D7055 /* QuickTime.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = /System/Library/Frameworks/QuickTime.framework; sourceTree = ""; }; 74 | E4B69B5B0A3A1756003C02F2 /* exampleDebug.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = exampleDebug.app; sourceTree = BUILT_PRODUCTS_DIR; }; 75 | E4B69E1D0A3A1BDC003C02F2 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = main.cpp; path = src/main.cpp; sourceTree = SOURCE_ROOT; }; 76 | E4B69E1E0A3A1BDC003C02F2 /* ofApp.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 30; name = ofApp.cpp; path = src/ofApp.cpp; sourceTree = SOURCE_ROOT; }; 77 | E4B69E1F0A3A1BDC003C02F2 /* ofApp.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = ofApp.h; path = src/ofApp.h; sourceTree = SOURCE_ROOT; }; 78 | E4B6FCAD0C3E899E008CF71C /* openFrameworks-Info.plist */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.plist.xml; path = "openFrameworks-Info.plist"; sourceTree = ""; }; 79 | E4C2424410CC5A17004149E2 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 80 | E4C2424510CC5A17004149E2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 81 | E4C2424610CC5A17004149E2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = ""; }; 82 | E4EB691F138AFCF100A09F29 /* CoreOF.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = CoreOF.xcconfig; path = ../../../libs/openFrameworksCompiled/project/osx/CoreOF.xcconfig; sourceTree = SOURCE_ROOT; }; 83 | E4EB6923138AFD0F00A09F29 /* Project.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Project.xcconfig; sourceTree = ""; }; 84 | E7E077E415D3B63C0020DFD4 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = /System/Library/Frameworks/CoreVideo.framework; sourceTree = ""; }; 85 | E7E077E715D3B6510020DFD4 /* QTKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = /System/Library/Frameworks/QTKit.framework; sourceTree = ""; }; 86 | E7F985F515E0DE99003869B5 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = /System/Library/Frameworks/Accelerate.framework; sourceTree = ""; }; 87 | /* End PBXFileReference section */ 88 | 89 | /* Begin PBXFrameworksBuildPhase section */ 90 | E4B69B590A3A1756003C02F2 /* Frameworks */ = { 91 | isa = PBXFrameworksBuildPhase; 92 | buildActionMask = 2147483647; 93 | files = ( 94 | E7F985F815E0DEA3003869B5 /* Accelerate.framework in Frameworks */, 95 | E7E077E815D3B6510020DFD4 /* QTKit.framework in Frameworks */, 96 | E4328149138ABC9F0047C5CB /* openFrameworksDebug.a in Frameworks */, 97 | E45BE97B0E8CC7DD009D7055 /* AGL.framework in Frameworks */, 98 | E45BE97C0E8CC7DD009D7055 /* ApplicationServices.framework in Frameworks */, 99 | E45BE97D0E8CC7DD009D7055 /* AudioToolbox.framework in Frameworks */, 100 | E45BE97E0E8CC7DD009D7055 /* Carbon.framework in Frameworks */, 101 | E45BE97F0E8CC7DD009D7055 /* CoreAudio.framework in Frameworks */, 102 | E45BE9800E8CC7DD009D7055 /* CoreFoundation.framework in Frameworks */, 103 | E45BE9810E8CC7DD009D7055 /* CoreServices.framework in Frameworks */, 104 | E45BE9830E8CC7DD009D7055 /* OpenGL.framework in Frameworks */, 105 | E45BE9840E8CC7DD009D7055 /* QuickTime.framework in Frameworks */, 106 | E4C2424710CC5A17004149E2 /* AppKit.framework in Frameworks */, 107 | E4C2424810CC5A17004149E2 /* Cocoa.framework in Frameworks */, 108 | E4C2424910CC5A17004149E2 /* IOKit.framework in Frameworks */, 109 | E7E077E515D3B63C0020DFD4 /* CoreVideo.framework in Frameworks */, 110 | ); 111 | runOnlyForDeploymentPostprocessing = 0; 112 | }; 113 | /* End PBXFrameworksBuildPhase section */ 114 | 115 | /* Begin PBXGroup section */ 116 | 22F2BD1F1821370F009EBF41 /* src */ = { 117 | isa = PBXGroup; 118 | children = ( 119 | 22F2BD201821370F009EBF41 /* ofxSkeleton.cpp */, 120 | 22F2BD211821370F009EBF41 /* ofxSkeleton.h */, 121 | ); 122 | name = src; 123 | path = ../src; 124 | sourceTree = ""; 125 | }; 126 | BB4B014C10F69532006C3DED /* addons */ = { 127 | isa = PBXGroup; 128 | children = ( 129 | 22F2BD1F1821370F009EBF41 /* src */, 130 | ); 131 | name = addons; 132 | sourceTree = ""; 133 | }; 134 | BBAB23C913894ECA00AA2426 /* system frameworks */ = { 135 | isa = PBXGroup; 136 | children = ( 137 | E7F985F515E0DE99003869B5 /* Accelerate.framework */, 138 | E4C2424410CC5A17004149E2 /* AppKit.framework */, 139 | E4C2424510CC5A17004149E2 /* Cocoa.framework */, 140 | E4C2424610CC5A17004149E2 /* IOKit.framework */, 141 | E45BE9710E8CC7DD009D7055 /* AGL.framework */, 142 | E45BE9720E8CC7DD009D7055 /* ApplicationServices.framework */, 143 | E45BE9730E8CC7DD009D7055 /* AudioToolbox.framework */, 144 | E45BE9740E8CC7DD009D7055 /* Carbon.framework */, 145 | E45BE9750E8CC7DD009D7055 /* CoreAudio.framework */, 146 | E45BE9760E8CC7DD009D7055 /* CoreFoundation.framework */, 147 | E45BE9770E8CC7DD009D7055 /* CoreServices.framework */, 148 | E45BE9790E8CC7DD009D7055 /* OpenGL.framework */, 149 | E45BE97A0E8CC7DD009D7055 /* QuickTime.framework */, 150 | E7E077E415D3B63C0020DFD4 /* CoreVideo.framework */, 151 | E7E077E715D3B6510020DFD4 /* QTKit.framework */, 152 | ); 153 | name = "system frameworks"; 154 | sourceTree = ""; 155 | }; 156 | BBAB23CA13894EDB00AA2426 /* 3rd party frameworks */ = { 157 | isa = PBXGroup; 158 | children = ( 159 | BBAB23BE13894E4700AA2426 /* GLUT.framework */, 160 | ); 161 | name = "3rd party frameworks"; 162 | sourceTree = ""; 163 | }; 164 | E4328144138ABC890047C5CB /* Products */ = { 165 | isa = PBXGroup; 166 | children = ( 167 | E4328148138ABC890047C5CB /* openFrameworksDebug.a */, 168 | ); 169 | name = Products; 170 | sourceTree = ""; 171 | }; 172 | E45BE5980E8CC70C009D7055 /* frameworks */ = { 173 | isa = PBXGroup; 174 | children = ( 175 | BBAB23CA13894EDB00AA2426 /* 3rd party frameworks */, 176 | BBAB23C913894ECA00AA2426 /* system frameworks */, 177 | ); 178 | name = frameworks; 179 | sourceTree = ""; 180 | }; 181 | E4B69B4A0A3A1720003C02F2 = { 182 | isa = PBXGroup; 183 | children = ( 184 | E4B6FCAD0C3E899E008CF71C /* openFrameworks-Info.plist */, 185 | E4EB6923138AFD0F00A09F29 /* Project.xcconfig */, 186 | E4B69E1C0A3A1BDC003C02F2 /* src */, 187 | E4EEC9E9138DF44700A80321 /* openFrameworks */, 188 | BB4B014C10F69532006C3DED /* addons */, 189 | E45BE5980E8CC70C009D7055 /* frameworks */, 190 | E4B69B5B0A3A1756003C02F2 /* exampleDebug.app */, 191 | ); 192 | sourceTree = ""; 193 | }; 194 | E4B69E1C0A3A1BDC003C02F2 /* src */ = { 195 | isa = PBXGroup; 196 | children = ( 197 | E4B69E1D0A3A1BDC003C02F2 /* main.cpp */, 198 | E4B69E1E0A3A1BDC003C02F2 /* ofApp.cpp */, 199 | E4B69E1F0A3A1BDC003C02F2 /* ofApp.h */, 200 | ); 201 | path = src; 202 | sourceTree = SOURCE_ROOT; 203 | }; 204 | E4EEC9E9138DF44700A80321 /* openFrameworks */ = { 205 | isa = PBXGroup; 206 | children = ( 207 | E4EB691F138AFCF100A09F29 /* CoreOF.xcconfig */, 208 | E4328143138ABC890047C5CB /* openFrameworksLib.xcodeproj */, 209 | ); 210 | name = openFrameworks; 211 | sourceTree = ""; 212 | }; 213 | /* End PBXGroup section */ 214 | 215 | /* Begin PBXNativeTarget section */ 216 | E4B69B5A0A3A1756003C02F2 /* example */ = { 217 | isa = PBXNativeTarget; 218 | buildConfigurationList = E4B69B5F0A3A1757003C02F2 /* Build configuration list for PBXNativeTarget "example" */; 219 | buildPhases = ( 220 | E4B69B580A3A1756003C02F2 /* Sources */, 221 | E4B69B590A3A1756003C02F2 /* Frameworks */, 222 | E4B6FFFD0C3F9AB9008CF71C /* ShellScript */, 223 | E4C2427710CC5ABF004149E2 /* CopyFiles */, 224 | ); 225 | buildRules = ( 226 | ); 227 | dependencies = ( 228 | E4EEB9AC138B136A00A80321 /* PBXTargetDependency */, 229 | ); 230 | name = example; 231 | productName = myOFApp; 232 | productReference = E4B69B5B0A3A1756003C02F2 /* exampleDebug.app */; 233 | productType = "com.apple.product-type.application"; 234 | }; 235 | /* End PBXNativeTarget section */ 236 | 237 | /* Begin PBXProject section */ 238 | E4B69B4C0A3A1720003C02F2 /* Project object */ = { 239 | isa = PBXProject; 240 | attributes = { 241 | LastUpgradeCheck = 0460; 242 | }; 243 | buildConfigurationList = E4B69B4D0A3A1720003C02F2 /* Build configuration list for PBXProject "example" */; 244 | compatibilityVersion = "Xcode 3.2"; 245 | developmentRegion = English; 246 | hasScannedForEncodings = 0; 247 | knownRegions = ( 248 | English, 249 | Japanese, 250 | French, 251 | German, 252 | ); 253 | mainGroup = E4B69B4A0A3A1720003C02F2; 254 | productRefGroup = E4B69B4A0A3A1720003C02F2; 255 | projectDirPath = ""; 256 | projectReferences = ( 257 | { 258 | ProductGroup = E4328144138ABC890047C5CB /* Products */; 259 | ProjectRef = E4328143138ABC890047C5CB /* openFrameworksLib.xcodeproj */; 260 | }, 261 | ); 262 | projectRoot = ""; 263 | targets = ( 264 | E4B69B5A0A3A1756003C02F2 /* example */, 265 | ); 266 | }; 267 | /* End PBXProject section */ 268 | 269 | /* Begin PBXReferenceProxy section */ 270 | E4328148138ABC890047C5CB /* openFrameworksDebug.a */ = { 271 | isa = PBXReferenceProxy; 272 | fileType = archive.ar; 273 | path = openFrameworksDebug.a; 274 | remoteRef = E4328147138ABC890047C5CB /* PBXContainerItemProxy */; 275 | sourceTree = BUILT_PRODUCTS_DIR; 276 | }; 277 | /* End PBXReferenceProxy section */ 278 | 279 | /* Begin PBXShellScriptBuildPhase section */ 280 | E4B6FFFD0C3F9AB9008CF71C /* ShellScript */ = { 281 | isa = PBXShellScriptBuildPhase; 282 | buildActionMask = 2147483647; 283 | files = ( 284 | ); 285 | inputPaths = ( 286 | ); 287 | outputPaths = ( 288 | ); 289 | runOnlyForDeploymentPostprocessing = 0; 290 | shellPath = /bin/sh; 291 | 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"; 292 | }; 293 | /* End PBXShellScriptBuildPhase section */ 294 | 295 | /* Begin PBXSourcesBuildPhase section */ 296 | E4B69B580A3A1756003C02F2 /* Sources */ = { 297 | isa = PBXSourcesBuildPhase; 298 | buildActionMask = 2147483647; 299 | files = ( 300 | E4B69E200A3A1BDC003C02F2 /* main.cpp in Sources */, 301 | E4B69E210A3A1BDC003C02F2 /* ofApp.cpp in Sources */, 302 | 22F2BD221821370F009EBF41 /* ofxSkeleton.cpp in Sources */, 303 | ); 304 | runOnlyForDeploymentPostprocessing = 0; 305 | }; 306 | /* End PBXSourcesBuildPhase section */ 307 | 308 | /* Begin PBXTargetDependency section */ 309 | E4EEB9AC138B136A00A80321 /* PBXTargetDependency */ = { 310 | isa = PBXTargetDependency; 311 | name = openFrameworks; 312 | targetProxy = E4EEB9AB138B136A00A80321 /* PBXContainerItemProxy */; 313 | }; 314 | /* End PBXTargetDependency section */ 315 | 316 | /* Begin XCBuildConfiguration section */ 317 | E4B69B4E0A3A1720003C02F2 /* Debug */ = { 318 | isa = XCBuildConfiguration; 319 | baseConfigurationReference = E4EB6923138AFD0F00A09F29 /* Project.xcconfig */; 320 | buildSettings = { 321 | ARCHS = "$(NATIVE_ARCH)"; 322 | CONFIGURATION_BUILD_DIR = "$(SRCROOT)/bin/"; 323 | COPY_PHASE_STRIP = NO; 324 | DEAD_CODE_STRIPPING = YES; 325 | GCC_AUTO_VECTORIZATION = YES; 326 | GCC_ENABLE_SSE3_EXTENSIONS = YES; 327 | GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS = YES; 328 | GCC_INLINES_ARE_PRIVATE_EXTERN = NO; 329 | GCC_OPTIMIZATION_LEVEL = 0; 330 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 331 | GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES; 332 | GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = NO; 333 | GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = NO; 334 | GCC_WARN_UNINITIALIZED_AUTOS = NO; 335 | GCC_WARN_UNUSED_VALUE = NO; 336 | GCC_WARN_UNUSED_VARIABLE = NO; 337 | HEADER_SEARCH_PATHS = ( 338 | "$(OF_CORE_HEADERS)", 339 | src, 340 | ); 341 | MACOSX_DEPLOYMENT_TARGET = 10.6; 342 | OTHER_CPLUSPLUSFLAGS = ( 343 | "-D__MACOSX_CORE__", 344 | "-lpthread", 345 | "-mtune=native", 346 | ); 347 | SDKROOT = macosx; 348 | }; 349 | name = Debug; 350 | }; 351 | E4B69B4F0A3A1720003C02F2 /* Release */ = { 352 | isa = XCBuildConfiguration; 353 | baseConfigurationReference = E4EB6923138AFD0F00A09F29 /* Project.xcconfig */; 354 | buildSettings = { 355 | ARCHS = "$(NATIVE_ARCH)"; 356 | CONFIGURATION_BUILD_DIR = "$(SRCROOT)/bin/"; 357 | COPY_PHASE_STRIP = YES; 358 | DEAD_CODE_STRIPPING = YES; 359 | GCC_AUTO_VECTORIZATION = YES; 360 | GCC_ENABLE_SSE3_EXTENSIONS = YES; 361 | GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS = YES; 362 | GCC_INLINES_ARE_PRIVATE_EXTERN = NO; 363 | GCC_OPTIMIZATION_LEVEL = 3; 364 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 365 | GCC_UNROLL_LOOPS = YES; 366 | GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES; 367 | GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = NO; 368 | GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = NO; 369 | GCC_WARN_UNINITIALIZED_AUTOS = NO; 370 | GCC_WARN_UNUSED_VALUE = NO; 371 | GCC_WARN_UNUSED_VARIABLE = NO; 372 | HEADER_SEARCH_PATHS = ( 373 | "$(OF_CORE_HEADERS)", 374 | src, 375 | ); 376 | MACOSX_DEPLOYMENT_TARGET = 10.6; 377 | OTHER_CPLUSPLUSFLAGS = ( 378 | "-D__MACOSX_CORE__", 379 | "-lpthread", 380 | "-mtune=native", 381 | ); 382 | SDKROOT = macosx; 383 | }; 384 | name = Release; 385 | }; 386 | E4B69B600A3A1757003C02F2 /* Debug */ = { 387 | isa = XCBuildConfiguration; 388 | buildSettings = { 389 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++98"; 390 | CLANG_CXX_LIBRARY = "libstdc++"; 391 | COMBINE_HIDPI_IMAGES = YES; 392 | COPY_PHASE_STRIP = NO; 393 | FRAMEWORK_SEARCH_PATHS = ( 394 | "$(inherited)", 395 | "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", 396 | ); 397 | FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../../libs/glut/lib/osx\""; 398 | GCC_DYNAMIC_NO_PIC = NO; 399 | GCC_GENERATE_DEBUGGING_SYMBOLS = YES; 400 | GCC_MODEL_TUNING = NONE; 401 | ICON = "$(ICON_NAME_DEBUG)"; 402 | ICON_FILE = "$(ICON_FILE_PATH)$(ICON)"; 403 | INFOPLIST_FILE = "openFrameworks-Info.plist"; 404 | INSTALL_PATH = "$(HOME)/Applications"; 405 | LIBRARY_SEARCH_PATHS = ( 406 | "$(inherited)", 407 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", 408 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)", 409 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)", 410 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_4)", 411 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_5)", 412 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_6)", 413 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)", 414 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)", 415 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)", 416 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)", 417 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)", 418 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)", 419 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)", 420 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_14)", 421 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_15)", 422 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)", 423 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)", 424 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)", 425 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)", 426 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)", 427 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)", 428 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)", 429 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)", 430 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)", 431 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_16)", 432 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_17)", 433 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_18)", 434 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_19)", 435 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_20)", 436 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_21)", 437 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_22)", 438 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_23)", 439 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_24)", 440 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_25)", 441 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_26)", 442 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_27)", 443 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_28)", 444 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_29)", 445 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_30)", 446 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_31)", 447 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_32)", 448 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_33)", 449 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_34)", 450 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_35)", 451 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_36)", 452 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_37)", 453 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_38)", 454 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_39)", 455 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_40)", 456 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_41)", 457 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_42)", 458 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_43)", 459 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_44)", 460 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_45)", 461 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_46)", 462 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_47)", 463 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_48)", 464 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_49)", 465 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_50)", 466 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_51)", 467 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_52)", 468 | ); 469 | PRODUCT_NAME = exampleDebug; 470 | SDKROOT = macosx10.8; 471 | WRAPPER_EXTENSION = app; 472 | }; 473 | name = Debug; 474 | }; 475 | E4B69B610A3A1757003C02F2 /* Release */ = { 476 | isa = XCBuildConfiguration; 477 | buildSettings = { 478 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++98"; 479 | CLANG_CXX_LIBRARY = "libstdc++"; 480 | COMBINE_HIDPI_IMAGES = YES; 481 | COPY_PHASE_STRIP = YES; 482 | FRAMEWORK_SEARCH_PATHS = ( 483 | "$(inherited)", 484 | "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", 485 | ); 486 | FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../../libs/glut/lib/osx\""; 487 | GCC_GENERATE_DEBUGGING_SYMBOLS = YES; 488 | GCC_MODEL_TUNING = NONE; 489 | ICON = "$(ICON_NAME_RELEASE)"; 490 | ICON_FILE = "$(ICON_FILE_PATH)$(ICON)"; 491 | INFOPLIST_FILE = "openFrameworks-Info.plist"; 492 | INSTALL_PATH = "$(HOME)/Applications"; 493 | LIBRARY_SEARCH_PATHS = ( 494 | "$(inherited)", 495 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", 496 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)", 497 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)", 498 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_4)", 499 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_5)", 500 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_6)", 501 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)", 502 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)", 503 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)", 504 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)", 505 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)", 506 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)", 507 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)", 508 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_14)", 509 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_15)", 510 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)", 511 | "$(LIBRARY_SEARCH_PATHS_QUOTED_1)", 512 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)", 513 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)", 514 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)", 515 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)", 516 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)", 517 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)", 518 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)", 519 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)", 520 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_16)", 521 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_17)", 522 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_18)", 523 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_19)", 524 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_20)", 525 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_21)", 526 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_22)", 527 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_23)", 528 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_24)", 529 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_25)", 530 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_26)", 531 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_27)", 532 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_28)", 533 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_29)", 534 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_30)", 535 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_31)", 536 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_32)", 537 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_33)", 538 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_34)", 539 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_35)", 540 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_36)", 541 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_37)", 542 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_38)", 543 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_39)", 544 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_40)", 545 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_41)", 546 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_42)", 547 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_43)", 548 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_44)", 549 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_45)", 550 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_46)", 551 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_47)", 552 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_48)", 553 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_49)", 554 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_50)", 555 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_51)", 556 | ); 557 | PRODUCT_NAME = example; 558 | SDKROOT = macosx10.8; 559 | WRAPPER_EXTENSION = app; 560 | }; 561 | name = Release; 562 | }; 563 | /* End XCBuildConfiguration section */ 564 | 565 | /* Begin XCConfigurationList section */ 566 | E4B69B4D0A3A1720003C02F2 /* Build configuration list for PBXProject "example" */ = { 567 | isa = XCConfigurationList; 568 | buildConfigurations = ( 569 | E4B69B4E0A3A1720003C02F2 /* Debug */, 570 | E4B69B4F0A3A1720003C02F2 /* Release */, 571 | ); 572 | defaultConfigurationIsVisible = 0; 573 | defaultConfigurationName = Release; 574 | }; 575 | E4B69B5F0A3A1757003C02F2 /* Build configuration list for PBXNativeTarget "example" */ = { 576 | isa = XCConfigurationList; 577 | buildConfigurations = ( 578 | E4B69B600A3A1757003C02F2 /* Debug */, 579 | E4B69B610A3A1757003C02F2 /* Release */, 580 | ); 581 | defaultConfigurationIsVisible = 0; 582 | defaultConfigurationName = Release; 583 | }; 584 | /* End XCConfigurationList section */ 585 | }; 586 | rootObject = E4B69B4C0A3A1720003C02F2 /* Project object */; 587 | } 588 | --------------------------------------------------------------------------------