├── .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 | 
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 |
--------------------------------------------------------------------------------