From bb7443fa6e9a68e7df9c28ab6835db4a82446d42 Mon Sep 17 00:00:00 2001 From: Ian Smith-Heisters Date: Mon, 3 Dec 2012 20:36:13 -0800 Subject: [PATCH 01/10] Define alternate deprecation macro for OS X Fixes compilation warning that "warning" does not exist --- include/Include/MacOSX/XnPlatformMacOSX.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/Include/MacOSX/XnPlatformMacOSX.h b/include/Include/MacOSX/XnPlatformMacOSX.h index cb46dd7..ba83342 100644 --- a/include/Include/MacOSX/XnPlatformMacOSX.h +++ b/include/Include/MacOSX/XnPlatformMacOSX.h @@ -39,5 +39,8 @@ #undef XN_THREAD_STATIC #define XN_THREAD_STATIC + +#undef XN_API_DEPRECATED +#define XN_API_DEPRECATED(msg) __attribute__((deprecated("This function is deprecated: " msg))) #endif //_XN_PLATFORM_MACOSX_H_ From 07f864d7307ec1594c2cf9ae616f8ca5bc86c1b7 Mon Sep 17 00:00:00 2001 From: Ian Smith-Heisters Date: Mon, 3 Dec 2012 20:42:12 -0800 Subject: [PATCH 02/10] Fix compilation of BlockOpenNISkeleton sample --- samples/BlockOpenNISkeleton/src/BlockOpenNISkeletonApp.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/samples/BlockOpenNISkeleton/src/BlockOpenNISkeletonApp.cpp b/samples/BlockOpenNISkeleton/src/BlockOpenNISkeletonApp.cpp index 1c01f8b..596c934 100644 --- a/samples/BlockOpenNISkeleton/src/BlockOpenNISkeletonApp.cpp +++ b/samples/BlockOpenNISkeleton/src/BlockOpenNISkeletonApp.cpp @@ -210,8 +210,8 @@ void BlockOpenNISampleAppApp::update() } // Update textures - mColorTex.update( getColorImage() ); - mDepthTex.update( getDepthImage() ); + mColorTex.update( Surface(getColorImage()) ); + mDepthTex.update( Surface(getDepthImage()) ); // Uses manager to handle users. @@ -219,7 +219,7 @@ void BlockOpenNISampleAppApp::update() it != mUsersTexMap.end(); ++it ) { - it->second.update( getUserImage( it->first ) ); + it->second.update( Surface(getUserImage( it->first )) ); } } From ea57a4bc271b6b22a9aefbb2cf9c4ece76b50467 Mon Sep 17 00:00:00 2001 From: Ian Smith-Heisters Date: Mon, 3 Dec 2012 20:46:24 -0800 Subject: [PATCH 03/10] Add instructions for installing dependencies using Homebrew --- README | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/README b/README index 63d26e6..7164422 100644 --- a/README +++ b/README @@ -54,13 +54,20 @@ Run NiViewer.exe. You should now be looking at a window with the RGB and Depth f MacOSX 32bit: ------------- -1) Download/Install MacPorts +1.A) Download/Install MacPorts (Snow Leopard 10.6) https://distfiles.macports.org/MacPorts/MacPorts-2.0.0-10.5-Leopard.dmg (Lion 10.7) https://distfiles.macports.org/MacPorts/MacPorts-2.0.0-10.7-Lion.dmg +1.B) OR download/install Homebrew + Type and run: ruby -e "$(curl -fsSkL raw.github.com/mxcl/homebrew/go)" + 2) Open the terminal, install libtool/libusb. - 2.1) Type and run: sudo port install libtool - 2.2) Type and run: sudo port install libusb-devel +universal + A) For MacPorts + 2.1) Type and run: sudo port install libtool + 2.2) Type and run: sudo port install libusb-devel +universal + B) For Homebrew + 2.1) Type and run: brew install libtool + 2.2) Type and run: brew install libusb --universal 3) Download/Untar OpenNI @@ -84,4 +91,4 @@ Run ./NiViewer. You should now be looking at a window with the RGB and Depth fee Linux: - Check Avin2's SensorKinect repo (@github) for more information. \ No newline at end of file + Check Avin2's SensorKinect repo (@github) for more information. From 27971d92e6a47a710730ddc9a2baba5974056ccd Mon Sep 17 00:00:00 2001 From: Ian Smith-Heisters Date: Sun, 6 Jan 2013 17:28:25 -0800 Subject: [PATCH 04/10] Added Kinect abstraction class --- src/VKinect.cpp | 168 ++++++++++++++++++++++++++++++++++++++++++++++++ src/VKinect.h | 139 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 307 insertions(+) create mode 100644 src/VKinect.cpp create mode 100644 src/VKinect.h diff --git a/src/VKinect.cpp b/src/VKinect.cpp new file mode 100644 index 0000000..f011acd --- /dev/null +++ b/src/VKinect.cpp @@ -0,0 +1,168 @@ +#include "VKinect.h" +#include "cinder/app/AppBasic.h" +#include + +using namespace ci; +using namespace std; + +namespace V{ + +Kinect::Kinect() : +pixels(NULL) +{ +} + +Kinect::~Kinect() +{ + delete [] pixels; + pixels = NULL; +} + +void Kinect::setup() +{ + setup(Vec2i(640, 480)); +} + +void Kinect::setup(const Vec2i & size) +{ + setup(size, size); +} + +void Kinect::setup(const Vec2i & _depthSize, const Vec2i & _colorSize) +{ + depthSize = _depthSize; + colorSize = _colorSize; + + OpenNIDeviceManager::USE_THREAD = false; + + manager = OpenNIDeviceManager::InstancePtr(); + manager->createDevices(1, NODE_TYPE_IMAGE | NODE_TYPE_DEPTH | NODE_TYPE_SCENE | NODE_TYPE_USER); + + device = manager->getDevice(0); + if ( !device ) { + app::console() << "Can't find a kinect device" << endl; + throw 1; + } + device->setDepthShiftMul(3); + + device->addListener(this); + + pixels = new uint16_t[depthSize.x * depthSize.y]; + tex_Color = gl::Texture(colorSize.x, colorSize.y); + tex_Depth = gl::Texture(depthSize.x, depthSize.y); + + manager->start(); +} + +void Kinect::update() +{ + if ( !OpenNIDeviceManager::USE_THREAD ) { + manager->update(); + } + + tex_Color.update(Surface(getColorImage())); + tex_Depth.update(Surface(getDepthImage())); + + BOOST_FOREACH(users_map::value_type &user, users) + { + user.second.texture.update(Surface(getUserImage(user.first))); + } +} + +void Kinect::drawColor( const Rectf & rect ) +{ + gl::draw(tex_Color, rect); +} + +void Kinect::drawDepth( const Rectf & rect ) +{ + gl::draw(tex_Depth, rect); +} + +void Kinect::drawUser( const int id, const Rectf & rect ) +{ + users_map::iterator it = users.find(id); + if ( it != users.end() ) { + gl::draw(it->second.texture, rect); + } else { + app::console() << "Could not draw user with id: " << id << endl; + } +} + +void Kinect::drawSkeletons( const Rectf & rect, float depth, float pointRadius, bool renderDepth ) +{ + if( !manager->hasUsers() ) return; + + gl::disable( GL_TEXTURE_2D ); + + gl::pushMatrices(); + gl::translate(Vec2f(rect.x1, rect.y1)); + manager->renderJoints(rect.getWidth(), + rect.getHeight(), + depth, + pointRadius, + renderDepth); + gl::popMatrices(); +} + +void Kinect::onNewUser( UserEvent ev ) +{ + users.insert(make_pair(ev.mId, User(*this, ev.mId))); +} + + +void Kinect::onLostUser( UserEvent ev ) +{ + users.erase(ev.mId); +} + +void Kinect::onUserExit( V::UserEvent ev ) +{ +} + +void Kinect::onUserReEnter( V::UserEvent ev ) +{ +} + + +ImageSourceRef Kinect::getColorImage() +{ + // register a reference to the active buffer + uint8_t *activeColor = device->getColorMap(); + return ImageSourceRef(new ImageSourceColor(activeColor, colorSize.x, colorSize.y)); +} + +ImageSourceRef Kinect::getUserImage( const int id ) +{ + device->getLabelMap(id, pixels); + return ImageSourceRef(new ImageSourceDepth(pixels, depthSize.x, depthSize.y)); +} + +ImageSourceRef Kinect::getDepthImage() +{ + // register a reference to the active buffer + uint16_t *activeDepth = device->getDepthMap(); + return ImageSourceRef(new ImageSourceDepth(activeDepth, depthSize.x, depthSize.y)); +} + +/******************************************************************************* + * Kinect::User + */ + +ImageSourceRef Kinect::User::getImage() const +{ + return kinect.getUserImage(id); +} + +OpenNIUserRef Kinect::User::getOpenNIUser() const +{ + return kinect.manager->getUser(id); +} + +Vec3f Kinect::User::getCenterOfMass( bool doProjectiveCoords ) const +{ + float * center = getOpenNIUser()->getCenterOfMass(doProjectiveCoords); + return ci::Vec3f(center[0], center[1], center[2]); +}; + +} // end namespace V \ No newline at end of file diff --git a/src/VKinect.h b/src/VKinect.h new file mode 100644 index 0000000..940630b --- /dev/null +++ b/src/VKinect.h @@ -0,0 +1,139 @@ +#pragma once + +#include "cinder/gl/gl.h" +#include "cinder/gl/Texture.h" +#include "cinder/Vector.h" +#include "cinder/Surface.h" +#include "cinder/ImageIo.h" + +#include "VOpenNIHeaders.h" + +namespace V { + +class Kinect : public UserListener { +public: + Kinect(); + ~Kinect(); + + void setup(); + void setup(const ci::Vec2i & size); + void setup(const ci::Vec2i & _depthSize, const ci::Vec2i & _colorSize); + void update(); + + void drawColor(const ci::Rectf &rect); + void drawDepth(const ci::Rectf &rect); + void drawUser(const int id, const ci::Rectf &rect); + void drawSkeletons(const ci::Rectf &rect, float depth=0.f, float pointRadius=3.f, bool renderDepth=false); + + void onNewUser( UserEvent ev ); + void onLostUser( UserEvent ev ); + void onUserExit( UserEvent ev ); + void onUserReEnter( UserEvent ev ); + + + ci::ImageSourceRef getColorImage(); + ci::ImageSourceRef getUserImage(const int id); + ci::ImageSourceRef getDepthImage(); + + ci::Vec2i getDepthSize() { return depthSize; }; + ci::Vec2i getColorSize() { return colorSize; }; + + class User { + public: + User(Kinect & kinect, const int id) : + kinect(kinect), + id(id), + texture(ci::gl::Texture(kinect.depthSize.x, kinect.depthSize.y)) + {}; + + ci::ImageSourceRef getImage() const; + OpenNIUserRef getOpenNIUser() const; + ci::Vec3f getCenterOfMass( bool doProjectiveCoords=false ) const; + + int id; + Kinect & kinect; + ci::gl::Texture texture; + }; + friend class User; + + typedef std::map< int, User > users_map; + users_map users; + +private: + OpenNIDeviceManager * manager; + OpenNIDevice::Ref device; + ci::gl::Texture tex_Color, tex_Depth; + uint16_t * pixels; + ci::Vec2i depthSize, colorSize; + +public: + class ImageSourceColor : public ci::ImageSource + { + public: + ImageSourceColor( uint8_t *buffer, int width, int height ) + : ci::ImageSource(), mData( buffer ), _width(width), _height(height) + { + setSize( _width, _height ); + setColorModel( ImageIo::CM_RGB ); + setChannelOrder( ImageIo::RGB ); + setDataType( ImageIo::UINT8 ); + } + + ~ImageSourceColor() + { + // mData is actually a ref. It's released from the device. + /*if( mData ) { + delete[] mData; + mData = NULL; + }*/ + } + + virtual void load( ci::ImageTargetRef target ) + { + ImageSource::RowFunc func = setupRowFunc( target ); + + for( uint32_t row = 0; row < _height; ++row ) + ((*this).*func)( target, row, mData + row * _width * 3 ); + } + + protected: + uint32_t _width, _height; + uint8_t *mData; + }; + + + class ImageSourceDepth : public ci::ImageSource + { + public: + ImageSourceDepth( uint16_t *buffer, int width, int height ) + : ci::ImageSource(), mData( buffer ), _width(width), _height(height) + { + setSize( _width, _height ); + setColorModel( ci::ImageIo::CM_GRAY ); + setChannelOrder( ci::ImageIo::Y ); + setDataType( ci::ImageIo::UINT16 ); + } + + ~ImageSourceDepth() + { + // mData is actually a ref. It's released from the device. + /*if( mData ) { + delete[] mData; + mData = NULL; + }*/ + } + + virtual void load( ci::ImageTargetRef target ) + { + ci::ImageSource::RowFunc func = setupRowFunc( target ); + + for( uint32_t row = 0; row < _height; ++row ) + ((*this).*func)( target, row, mData + row * _width ); + } + + protected: + uint32_t _width, _height; + uint16_t *mData; + }; +}; +} // end namespace V \ No newline at end of file From 65fd88207a93f111a3d94890703a6214cd6c7260 Mon Sep 17 00:00:00 2001 From: Ian Smith-Heisters Date: Sun, 6 Jan 2013 17:53:55 -0800 Subject: [PATCH 05/10] Reformat the README --- README | 94 ----------------------------------------------- README.md | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+), 94 deletions(-) delete mode 100644 README create mode 100644 README.md diff --git a/README b/README deleted file mode 100644 index 7164422..0000000 --- a/README +++ /dev/null @@ -1,94 +0,0 @@ -Block OpenNI ------------- -A C++ wrapper for OpenNI - -2011-06-20: -This block is going through heavy remake and so old code/methods are mixed with new methods for the moment. -I will be changing the way things are handled at the moment when i'm finished. All for better support on multiple devices. - - - - - -Basic description ------------------ - -Support for several generators as Image, IR, Depth and User. -Skeleton tracking is also supported. - - - - -How to use ----------- - -You need to install the sensor drivers, OpenNI and NITE. -Note! PrimeSense drivers do not work with the Kinect. - - -So here's a step-by-step installationg guide: -(The links you'll find here are the latest unstable at the time of writing) -OpenNI 1.3.2.3 -Nite 1.4.1.2 -SensorKinect 5.0.3.4 - - -Windows 32bit: --------------- - -Download/Install OpenNI: -http://openni.org/downloadfiles/opennimodules/openni-binaries/latest-unstable/163-openni-unstable-build-for-windows-x86-32-bit-v1-3-2/download - -Download/Install Avin2's SensorKinect: -https://github.com/avin2/SensorKinect/blob/unstable/Bin/SensorKinect-Win-OpenSource32-5.0.3.4.msi - -Download/Install NITE: -http://openni.org/downloadfiles/opennimodules/openni-compliant-middleware-binaries/latest-unstable/177-primesense-nite-unstable-build-for-windows-x86-32-bit-v1-4-1/download - -At this moment you should now be able to run the samples in OpenNI. -Go to OpenNI's folder and browse to /Samples/Bin/Release. -Run NiViewer.exe. You should now be looking at a window with the RGB and Depth feed coming from the kinect - - - -MacOSX 32bit: -------------- - -1.A) Download/Install MacPorts - (Snow Leopard 10.6) https://distfiles.macports.org/MacPorts/MacPorts-2.0.0-10.5-Leopard.dmg - (Lion 10.7) https://distfiles.macports.org/MacPorts/MacPorts-2.0.0-10.7-Lion.dmg - -1.B) OR download/install Homebrew - Type and run: ruby -e "$(curl -fsSkL raw.github.com/mxcl/homebrew/go)" - -2) Open the terminal, install libtool/libusb. - A) For MacPorts - 2.1) Type and run: sudo port install libtool - 2.2) Type and run: sudo port install libusb-devel +universal - B) For Homebrew - 2.1) Type and run: brew install libtool - 2.2) Type and run: brew install libusb --universal - - -3) Download/Untar OpenNI - http://openni.org/downloadfiles/opennimodules/openni-binaries/latest-unstable/162-openni-unstable-build-for-macosx-10-6-universal-x86x64-3264-bit-v1-3-2/download - 3.1) Open the terminal, goto openni's folder you just untar'ed. - 3.2) Type and run: sudo ./install.sh - -4) Download Avin2's SensorKinect - https://github.com/avin2/SensorKinect/blob/unstable/Bin/SensorKinect-Bin-MacOSX-v5.0.3.4.tar.bz2 - 4.1) Open the terminal, goto SensorKinect's folder you just untar'ed. - 4.2) Type and run: sudo ./install.sh - -5) Download NITE - http://openni.org/downloadfiles/opennimodules/openni-compliant-middleware-binaries/latest-unstable/176-primesense-nite-unstable-build-for-macosx-10-6-universal-x86x64-3264-bit-v1-4-1/download - 4.1) Open the terminal, goto NITE's folder you just untar'ed. - 4.2) Type and run: sudo ./install.sh - -At this moment you should now be able to run the samples in OpenNI. -Go to OpenNI's folder and browse to /Samples/Bin/Release (use terminal). -Run ./NiViewer. You should now be looking at a window with the RGB and Depth feed coming from the kinect - - -Linux: - Check Avin2's SensorKinect repo (@github) for more information. diff --git a/README.md b/README.md new file mode 100644 index 0000000..166aac8 --- /dev/null +++ b/README.md @@ -0,0 +1,108 @@ +Block OpenNI +============ +A C++ wrapper for OpenNI + +2011-06-20: +This block is going through heavy remake and so old code/methods are mixed with +new methods for the moment. I will be changing the way things are handled at +the moment when i'm finished. All for better support on multiple devices. + +Basic description +================= + +Support for several generators as Image, IR, Depth and User. +Skeleton tracking is also supported. + +Installation +============ + +You need to install the sensor drivers, OpenNI and NITE. +Note! PrimeSense drivers do not work with the Kinect. + + +So here's a step-by-step installationg guide: +(The links you'll find here are the latest unstable at the time of writing) + +- OpenNI 1.3.2.3 +- Nite 1.4.1.2 +- SensorKinect 5.0.3.4 + +Windows 32bit: +-------------- + +Download/Install OpenNI: +http://openni.org/downloadfiles/opennimodules/openni-binaries/latest-unstable/163-openni-unstable-build-for-windows-x86-32-bit-v1-3-2/download + +Download/Install Avin2's SensorKinect: +https://github.com/avin2/SensorKinect/blob/unstable/Bin/SensorKinect-Win-OpenSource32-5.0.3.4.msi + +Download/Install NITE: +http://openni.org/downloadfiles/opennimodules/openni-compliant-middleware-binaries/latest-unstable/177-primesense-nite-unstable-build-for-windows-x86-32-bit-v1-4-1/download + +At this moment you should now be able to run the samples in OpenNI. Go to +OpenNI's folder and browse to /Samples/Bin/Release. Run NiViewer.exe. You +should now be looking at a window with the RGB and Depth feed coming from the +kinect. + +MacOSX 32bit: +------------- + +### 1. Install libtool/libusb ### + +#### With MacPorts: #### + +Download/Install MacPorts +- (Snow Leopard 10.6) https://distfiles.macports.org/MacPorts/MacPorts-2.0.0-10.5-Leopard.dmg +- (Lion 10.7) https://distfiles.macports.org/MacPorts/MacPorts-2.0.0-10.7-Lion.dmg + +In the terminal: + + sudo port install libtool + sudo port install libusb-devel +universal + +#### With Hombrew: #### + +Install Homebrew: in the terminal: + + ruby -e "$(curl -fsSkL raw.github.com/mxcl/homebrew/go)" + +Install the libs from the terminal: + + brew install libtool + brew install libusb --universal + + +### 2. Download/Untar OpenNI ### + +http://openni.org/downloadfiles/opennimodules/openni-binaries/latest-unstable/162-openni-unstable-build-for-macosx-10-6-universal-x86x64-3264-bit-v1-3-2/download + +Open the terminal, goto openni's folder you just untar'ed. + + sudo ./install.sh + +### 3. Download Avin2's SensorKinect ### + +https://github.com/avin2/SensorKinect/blob/unstable/Bin/SensorKinect-Bin-MacOSX-v5.0.3.4.tar.bz2 + +Open the terminal, goto SensorKinect's folder you just untar'ed. + + sudo ./install.sh + +### 4. Download NITE ### + +http://openni.org/downloadfiles/opennimodules/openni-compliant-middleware-binaries/latest-unstable/176-primesense-nite-unstable-build-for-macosx-10-6-universal-x86x64-3264-bit-v1-4-1/download + +Open the terminal, goto NITE's folder you just untar'ed. + + sudo ./install.sh + +At this moment you should now be able to run the samples in OpenNI. Go to +OpenNI's folder and browse to /Samples/Bin/Release (use terminal). Run +./NiViewer. You should now be looking at a window with the RGB and Depth feed +coming from the kinect + + +Linux +----- + +Check Avin2's SensorKinect repo (@github) for more information. From 1954eeb6e02421fe899e1fa4693a516d6c65baa5 Mon Sep 17 00:00:00 2001 From: Ian Smith-Heisters Date: Sun, 6 Jan 2013 17:54:15 -0800 Subject: [PATCH 06/10] New sample project using VKinect --- samples/BasicKinect/include/Resources.h | 4 + samples/BasicKinect/resources/CinderApp.icns | Bin 0 -> 114357 bytes .../BasicKinect/resources/cinder_app_icon.ico | Bin 0 -> 44737 bytes samples/BasicKinect/src/BasicKinectApp.cpp | 57 +++ samples/BasicKinect/vc10/BasicKinect.sln | 19 + samples/BasicKinect/vc10/BasicKinect.vcxproj | 118 ++++++ .../vc10/BasicKinect.vcxproj.filters | 32 ++ samples/BasicKinect/vc10/Resources.rc | 5 + samples/BasicKinect/vc9/BasicKinect.sln | 19 + samples/BasicKinect/vc9/BasicKinect.vcproj | 210 +++++++++ samples/BasicKinect/vc9/Resources.rc | 5 + .../BasicKinect.xcodeproj/project.pbxproj | 400 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 11620 bytes .../xcschemes/BasicKinect.xcscheme | 86 ++++ .../xcschemes/xcschememanagement.plist | 22 + .../BasicKinect/xcode/BasicKinect_Prefix.pch | 7 + samples/BasicKinect/xcode/Info.plist | 28 ++ 18 files changed, 1019 insertions(+) create mode 100644 samples/BasicKinect/include/Resources.h create mode 100644 samples/BasicKinect/resources/CinderApp.icns create mode 100644 samples/BasicKinect/resources/cinder_app_icon.ico create mode 100644 samples/BasicKinect/src/BasicKinectApp.cpp create mode 100644 samples/BasicKinect/vc10/BasicKinect.sln create mode 100644 samples/BasicKinect/vc10/BasicKinect.vcxproj create mode 100644 samples/BasicKinect/vc10/BasicKinect.vcxproj.filters create mode 100644 samples/BasicKinect/vc10/Resources.rc create mode 100644 samples/BasicKinect/vc9/BasicKinect.sln create mode 100644 samples/BasicKinect/vc9/BasicKinect.vcproj create mode 100644 samples/BasicKinect/vc9/Resources.rc create mode 100644 samples/BasicKinect/xcode/BasicKinect.xcodeproj/project.pbxproj create mode 100644 samples/BasicKinect/xcode/BasicKinect.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 samples/BasicKinect/xcode/BasicKinect.xcodeproj/project.xcworkspace/xcuserdata/ian.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 samples/BasicKinect/xcode/BasicKinect.xcodeproj/xcuserdata/ian.xcuserdatad/xcschemes/BasicKinect.xcscheme create mode 100644 samples/BasicKinect/xcode/BasicKinect.xcodeproj/xcuserdata/ian.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 samples/BasicKinect/xcode/BasicKinect_Prefix.pch create mode 100644 samples/BasicKinect/xcode/Info.plist diff --git a/samples/BasicKinect/include/Resources.h b/samples/BasicKinect/include/Resources.h new file mode 100644 index 0000000..3bdaead --- /dev/null +++ b/samples/BasicKinect/include/Resources.h @@ -0,0 +1,4 @@ +#pragma once +#include "cinder/CinderResources.h" + +//#define RES_MY_RES CINDER_RESOURCE( ../resources/, image_name.png, 128, IMAGE ) diff --git a/samples/BasicKinect/resources/CinderApp.icns b/samples/BasicKinect/resources/CinderApp.icns new file mode 100644 index 0000000000000000000000000000000000000000..c231c2c7fe624e51bb35898468f11847cc1bfce6 GIT binary patch literal 114357 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 nko + + + + Debug + Win32 + + + Release + Win32 + + + + {74202EDD-91D2-4D2A-B0B6-355CEB16E6BE} + BasicKinectApp + Win32Proj + + + + Application + Unicode + true + + + Application + Unicode + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + true + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + false + + + + Disabled + ..\include;..\..\..\..\..\include;..\..\..\..\..\boost + WIN32;_DEBUG;_WINDOWS;NOMINMAX;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebug + + + Level3 + EditAndContinue + + + ..\..\..\..\..\include;..\include;%(AdditionalIncludeDirectories) + + + cinder_d.lib;%(AdditionalDependencies) + ..\..\..\..\..\lib;..\..\..\..\..\lib\msw;%(AdditionalLibraryDirectories) + true + Windows + false + + + MachineX86 + LIBCMT + + + + + ..\include;..\..\..\..\..\include;..\..\..\..\..\boost + WIN32;NDEBUG;_WINDOWS;NOMINMAX;%(PreprocessorDefinitions) + MultiThreaded + + + Level3 + ProgramDatabase + + + true + + + ..\..\..\..\..\include;..\include;%(AdditionalIncludeDirectories) + + + cinder.lib;%(AdditionalDependencies) + ..\..\..\..\..\lib;..\..\..\..\..\lib\msw;%(AdditionalLibraryDirectories) + false + true + Windows + true + + + false + + + MachineX86 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/BasicKinect/vc10/BasicKinect.vcxproj.filters b/samples/BasicKinect/vc10/BasicKinect.vcxproj.filters new file mode 100644 index 0000000..e3a7859 --- /dev/null +++ b/samples/BasicKinect/vc10/BasicKinect.vcxproj.filters @@ -0,0 +1,32 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + + + Header Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/samples/BasicKinect/vc10/Resources.rc b/samples/BasicKinect/vc10/Resources.rc new file mode 100644 index 0000000..c3a27c0 --- /dev/null +++ b/samples/BasicKinect/vc10/Resources.rc @@ -0,0 +1,5 @@ +#include "Resources.h" + +ID ICON "..\\resources\\cinder_app_icon.ico" + +//RES_MY_RESOURCE diff --git a/samples/BasicKinect/vc9/BasicKinect.sln b/samples/BasicKinect/vc9/BasicKinect.sln new file mode 100644 index 0000000..7c9e0b5 --- /dev/null +++ b/samples/BasicKinect/vc9/BasicKinect.sln @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual C++ Express 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BasicKinect", "BasicKinect.vcproj", "{9DA00FEA-5218-413E-B762-35D91045B3B4}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9DA00FEA-5218-413E-B762-35D91045B3B4}.Debug|Win32.ActiveCfg = Debug|Win32 + {9DA00FEA-5218-413E-B762-35D91045B3B4}.Debug|Win32.Build.0 = Debug|Win32 + {9DA00FEA-5218-413E-B762-35D91045B3B4}.Release|Win32.ActiveCfg = Release|Win32 + {9DA00FEA-5218-413E-B762-35D91045B3B4}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/samples/BasicKinect/vc9/BasicKinect.vcproj b/samples/BasicKinect/vc9/BasicKinect.vcproj new file mode 100644 index 0000000..0c3ee54 --- /dev/null +++ b/samples/BasicKinect/vc9/BasicKinect.vcproj @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/BasicKinect/vc9/Resources.rc b/samples/BasicKinect/vc9/Resources.rc new file mode 100644 index 0000000..14f123f --- /dev/null +++ b/samples/BasicKinect/vc9/Resources.rc @@ -0,0 +1,5 @@ +#include "Resources.h" + +ID ICON "..\\resources\\cinder_app_icon.ico" + +//RES_MY_RESOURCE diff --git a/samples/BasicKinect/xcode/BasicKinect.xcodeproj/project.pbxproj b/samples/BasicKinect/xcode/BasicKinect.xcodeproj/project.pbxproj new file mode 100644 index 0000000..b44f6f4 --- /dev/null +++ b/samples/BasicKinect/xcode/BasicKinect.xcodeproj/project.pbxproj @@ -0,0 +1,400 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 0091D8F90E81B9330029341E /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0091D8F80E81B9330029341E /* OpenGL.framework */; }; + 0097E3E50F3E9819005A4392 /* QuickTime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0097E3E40F3E9819005A4392 /* QuickTime.framework */; }; + 00B784B30FF439BC000DE1D7 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00B784AF0FF439BC000DE1D7 /* Accelerate.framework */; }; + 00B784B40FF439BC000DE1D7 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00B784B00FF439BC000DE1D7 /* AudioToolbox.framework */; }; + 00B784B50FF439BC000DE1D7 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00B784B10FF439BC000DE1D7 /* AudioUnit.framework */; }; + 00B784B60FF439BC000DE1D7 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00B784B20FF439BC000DE1D7 /* CoreAudio.framework */; }; + 00BAE65A0E7ED9C10018A608 /* BasicKinectApp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 00BAE6590E7ED9C10018A608 /* BasicKinectApp.cpp */; }; + 00CCAF15116A9FEE008396D5 /* CinderApp.icns in Resources */ = {isa = PBXBuildFile; fileRef = 00CCAF14116A9FEE008396D5 /* CinderApp.icns */; }; + 3C92D351169A602100748453 /* VKinect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C92D341169A602100748453 /* VKinect.cpp */; }; + 3C92D352169A602100748453 /* VOpenNIDevice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C92D345169A602100748453 /* VOpenNIDevice.cpp */; }; + 3C92D353169A602100748453 /* VOpenNIDeviceManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C92D347169A602100748453 /* VOpenNIDeviceManager.cpp */; }; + 3C92D354169A602100748453 /* VOpenNINetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C92D34A169A602100748453 /* VOpenNINetwork.cpp */; }; + 3C92D355169A602100748453 /* VOpenNIRecorder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C92D34C169A602100748453 /* VOpenNIRecorder.cpp */; }; + 3C92D356169A602100748453 /* VOpenNIUser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C92D34F169A602100748453 /* VOpenNIUser.cpp */; }; + 5323E6B20EAFCA74003A9687 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5323E6B10EAFCA74003A9687 /* CoreVideo.framework */; }; + 5323E6B60EAFCA7E003A9687 /* QTKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5323E6B50EAFCA7E003A9687 /* QTKit.framework */; }; + 53E3CDFC0E86099300238D2B /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53E3CDFB0E86099300238D2B /* Carbon.framework */; }; + 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 0091D8F80E81B9330029341E /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = ""; }; + 0097E3E40F3E9819005A4392 /* QuickTime.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = /System/Library/Frameworks/QuickTime.framework; sourceTree = ""; }; + 00B784AF0FF439BC000DE1D7 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; + 00B784B00FF439BC000DE1D7 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; + 00B784B10FF439BC000DE1D7 /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; }; + 00B784B20FF439BC000DE1D7 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; + 00BAE6590E7ED9C10018A608 /* BasicKinectApp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = BasicKinectApp.cpp; path = ../src/BasicKinectApp.cpp; sourceTree = SOURCE_ROOT; }; + 00CCAF14116A9FEE008396D5 /* CinderApp.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = CinderApp.icns; path = ../resources/CinderApp.icns; sourceTree = SOURCE_ROOT; }; + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; + 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; + 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; + 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; + 32CA4F630368D1EE00C91783 /* BasicKinect_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BasicKinect_Prefix.pch; sourceTree = ""; }; + 3C92D340169A602100748453 /* SkeletonPoseDetector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SkeletonPoseDetector.h; sourceTree = ""; }; + 3C92D341169A602100748453 /* VKinect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VKinect.cpp; sourceTree = ""; }; + 3C92D342169A602100748453 /* VKinect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VKinect.h; sourceTree = ""; }; + 3C92D343169A602100748453 /* VOpenNIBone.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VOpenNIBone.h; sourceTree = ""; }; + 3C92D344169A602100748453 /* VOpenNICommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VOpenNICommon.h; sourceTree = ""; }; + 3C92D345169A602100748453 /* VOpenNIDevice.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VOpenNIDevice.cpp; sourceTree = ""; }; + 3C92D346169A602100748453 /* VOpenNIDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VOpenNIDevice.h; sourceTree = ""; }; + 3C92D347169A602100748453 /* VOpenNIDeviceManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VOpenNIDeviceManager.cpp; sourceTree = ""; }; + 3C92D348169A602100748453 /* VOpenNIDeviceManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VOpenNIDeviceManager.h; sourceTree = ""; }; + 3C92D349169A602100748453 /* VOpenNIHeaders.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VOpenNIHeaders.h; sourceTree = ""; }; + 3C92D34A169A602100748453 /* VOpenNINetwork.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VOpenNINetwork.cpp; sourceTree = ""; }; + 3C92D34B169A602100748453 /* VOpenNINetwork.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VOpenNINetwork.h; sourceTree = ""; }; + 3C92D34C169A602100748453 /* VOpenNIRecorder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VOpenNIRecorder.cpp; sourceTree = ""; }; + 3C92D34D169A602100748453 /* VOpenNIRecorder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VOpenNIRecorder.h; sourceTree = ""; }; + 3C92D34E169A602100748453 /* VOpenNISurface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VOpenNISurface.h; sourceTree = ""; }; + 3C92D34F169A602100748453 /* VOpenNIUser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VOpenNIUser.cpp; sourceTree = ""; }; + 3C92D350169A602100748453 /* VOpenNIUser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VOpenNIUser.h; sourceTree = ""; }; + 5323E6B10EAFCA74003A9687 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = /System/Library/Frameworks/CoreVideo.framework; sourceTree = ""; }; + 5323E6B50EAFCA7E003A9687 /* QTKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = /System/Library/Frameworks/QTKit.framework; sourceTree = ""; }; + 53E3CDFB0E86099300238D2B /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; + 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 8D1107320486CEB800E47090 /* BasicKinect.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BasicKinect.app; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8D11072E0486CEB800E47090 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, + 0091D8F90E81B9330029341E /* OpenGL.framework in Frameworks */, + 53E3CDFC0E86099300238D2B /* Carbon.framework in Frameworks */, + 5323E6B20EAFCA74003A9687 /* CoreVideo.framework in Frameworks */, + 5323E6B60EAFCA7E003A9687 /* QTKit.framework in Frameworks */, + 0097E3E50F3E9819005A4392 /* QuickTime.framework in Frameworks */, + 00B784B30FF439BC000DE1D7 /* Accelerate.framework in Frameworks */, + 00B784B40FF439BC000DE1D7 /* AudioToolbox.framework in Frameworks */, + 00B784B50FF439BC000DE1D7 /* AudioUnit.framework in Frameworks */, + 00B784B60FF439BC000DE1D7 /* CoreAudio.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 080E96DDFE201D6D7F000001 /* Source */ = { + isa = PBXGroup; + children = ( + 00BAE6590E7ED9C10018A608 /* BasicKinectApp.cpp */, + ); + name = Source; + sourceTree = ""; + }; + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { + isa = PBXGroup; + children = ( + 00B784AF0FF439BC000DE1D7 /* Accelerate.framework */, + 00B784B00FF439BC000DE1D7 /* AudioToolbox.framework */, + 00B784B10FF439BC000DE1D7 /* AudioUnit.framework */, + 00B784B20FF439BC000DE1D7 /* CoreAudio.framework */, + 0097E3E40F3E9819005A4392 /* QuickTime.framework */, + 5323E6B50EAFCA7E003A9687 /* QTKit.framework */, + 5323E6B10EAFCA74003A9687 /* CoreVideo.framework */, + 53E3CDFB0E86099300238D2B /* Carbon.framework */, + 0091D8F80E81B9330029341E /* OpenGL.framework */, + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, + ); + name = "Linked Frameworks"; + sourceTree = ""; + }; + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + 29B97324FDCFA39411CA2CEA /* AppKit.framework */, + 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */, + 29B97325FDCFA39411CA2CEA /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + 19C28FACFE9D520D11CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8D1107320486CEB800E47090 /* BasicKinect.app */, + ); + name = Products; + sourceTree = ""; + }; + 29B97314FDCFA39411CA2CEA /* BasicKinect */ = { + isa = PBXGroup; + children = ( + 3C92D33C169A600300748453 /* Vendor */, + 29B97315FDCFA39411CA2CEA /* Headers */, + 080E96DDFE201D6D7F000001 /* Source */, + 29B97317FDCFA39411CA2CEA /* Resources */, + 29B97323FDCFA39411CA2CEA /* Frameworks */, + 19C28FACFE9D520D11CA2CBB /* Products */, + ); + name = BasicKinect; + sourceTree = ""; + }; + 29B97315FDCFA39411CA2CEA /* Headers */ = { + isa = PBXGroup; + children = ( + 32CA4F630368D1EE00C91783 /* BasicKinect_Prefix.pch */, + ); + name = Headers; + sourceTree = ""; + }; + 29B97317FDCFA39411CA2CEA /* Resources */ = { + isa = PBXGroup; + children = ( + 8D1107310486CEB800E47090 /* Info.plist */, + 00CCAF14116A9FEE008396D5 /* CinderApp.icns */, + ); + name = Resources; + sourceTree = ""; + }; + 29B97323FDCFA39411CA2CEA /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; + 3C92D33C169A600300748453 /* Vendor */ = { + isa = PBXGroup; + children = ( + 3C92D33E169A600D00748453 /* openni */, + ); + name = Vendor; + sourceTree = ""; + }; + 3C92D33E169A600D00748453 /* openni */ = { + isa = PBXGroup; + children = ( + 3C92D33F169A602100748453 /* src */, + ); + name = openni; + sourceTree = ""; + }; + 3C92D33F169A602100748453 /* src */ = { + isa = PBXGroup; + children = ( + 3C92D340169A602100748453 /* SkeletonPoseDetector.h */, + 3C92D341169A602100748453 /* VKinect.cpp */, + 3C92D342169A602100748453 /* VKinect.h */, + 3C92D343169A602100748453 /* VOpenNIBone.h */, + 3C92D344169A602100748453 /* VOpenNICommon.h */, + 3C92D345169A602100748453 /* VOpenNIDevice.cpp */, + 3C92D346169A602100748453 /* VOpenNIDevice.h */, + 3C92D347169A602100748453 /* VOpenNIDeviceManager.cpp */, + 3C92D348169A602100748453 /* VOpenNIDeviceManager.h */, + 3C92D349169A602100748453 /* VOpenNIHeaders.h */, + 3C92D34A169A602100748453 /* VOpenNINetwork.cpp */, + 3C92D34B169A602100748453 /* VOpenNINetwork.h */, + 3C92D34C169A602100748453 /* VOpenNIRecorder.cpp */, + 3C92D34D169A602100748453 /* VOpenNIRecorder.h */, + 3C92D34E169A602100748453 /* VOpenNISurface.h */, + 3C92D34F169A602100748453 /* VOpenNIUser.cpp */, + 3C92D350169A602100748453 /* VOpenNIUser.h */, + ); + name = src; + path = ../../../src; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8D1107260486CEB800E47090 /* BasicKinect */ = { + isa = PBXNativeTarget; + buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "BasicKinect" */; + buildPhases = ( + 8D1107290486CEB800E47090 /* Resources */, + 8D11072C0486CEB800E47090 /* Sources */, + 8D11072E0486CEB800E47090 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = BasicKinect; + productInstallPath = "$(HOME)/Applications"; + productName = BasicKinect; + productReference = 8D1107320486CEB800E47090 /* BasicKinect.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 29B97313FDCFA39411CA2CEA /* Project object */ = { + isa = PBXProject; + buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "BasicKinect" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + en, + ); + mainGroup = 29B97314FDCFA39411CA2CEA /* BasicKinect */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8D1107260486CEB800E47090 /* BasicKinect */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8D1107290486CEB800E47090 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 00CCAF15116A9FEE008396D5 /* CinderApp.icns in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8D11072C0486CEB800E47090 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 00BAE65A0E7ED9C10018A608 /* BasicKinectApp.cpp in Sources */, + 3C92D351169A602100748453 /* VKinect.cpp in Sources */, + 3C92D352169A602100748453 /* VOpenNIDevice.cpp in Sources */, + 3C92D353169A602100748453 /* VOpenNIDeviceManager.cpp in Sources */, + 3C92D354169A602100748453 /* VOpenNINetwork.cpp in Sources */, + 3C92D355169A602100748453 /* VOpenNIRecorder.cpp in Sources */, + 3C92D356169A602100748453 /* VOpenNIUser.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + C01FCF4B08A954540054247B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_INLINES_ARE_PRIVATE_EXTERN = NO; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = BasicKinect_Prefix.pch; + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + HEADER_SEARCH_PATHS = ( + "\"$(CINDER_PATH)/boost\"", + "\"$(OPENNI_PATH)/include/Include\"", + ); + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(HOME)/Applications"; + OTHER_LDFLAGS = ( + "\"$(CINDER_PATH)/lib/libcinder_d.a\"", + "-lcurl", + "\"$(OPENNI_PATH)/lib/macosx/libOpenNI.dylib\"", + ); + PRODUCT_NAME = BasicKinect; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + C01FCF4C08A954540054247B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_FAST_MATH = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_INLINES_ARE_PRIVATE_EXTERN = NO; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 3; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = BasicKinect_Prefix.pch; + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + HEADER_SEARCH_PATHS = ( + "\"$(CINDER_PATH)/boost\"", + "\"$(OPENNI_PATH)/include/Include\"", + ); + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(HOME)/Applications"; + OTHER_LDFLAGS = ( + "\"$(CINDER_PATH)/lib/libcinder.a\"", + "-lcurl", + "\"$(OPENNI_PATH)/lib/macosx/libOpenNI.dylib\"", + ); + PRODUCT_NAME = BasicKinect; + STRIP_INSTALLED_PRODUCT = YES; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; + C01FCF4F08A954540054247B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = i386; + CINDER_PATH = ../../../../..; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "\"$(CINDER_PATH)/boost\""; + LIBRARY_SEARCH_PATHS = "$(OPENNI_PATH)/lib/macosx"; + MACOSX_DEPLOYMENT_TARGET = 10.6; + OPENNI_PATH = "$(CINDER_PATH)/blocks/BlockOpenNI"; + OTHER_LDFLAGS = "$(OPENNI_PATH)/lib/macosx/libOpenNI.dylib"; + SDKROOT = macosx; + USER_HEADER_SEARCH_PATHS = "\"$(CINDER_PATH)/include\" ../include"; + }; + name = Debug; + }; + C01FCF5008A954540054247B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = i386; + CINDER_PATH = ../../../../..; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "\"$(CINDER_PATH)/boost\""; + LIBRARY_SEARCH_PATHS = "$(OPENNI_PATH)/lib/macosx"; + MACOSX_DEPLOYMENT_TARGET = 10.6; + OPENNI_PATH = "$(CINDER_PATH)/blocks/BlockOpenNI"; + OTHER_LDFLAGS = "$(OPENNI_PATH)/lib/macosx/libOpenNI.dylib"; + SDKROOT = macosx; + USER_HEADER_SEARCH_PATHS = "\"$(CINDER_PATH)/include\" ../include"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "BasicKinect" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C01FCF4B08A954540054247B /* Debug */, + C01FCF4C08A954540054247B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C01FCF4E08A954540054247B /* Build configuration list for PBXProject "BasicKinect" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C01FCF4F08A954540054247B /* Debug */, + C01FCF5008A954540054247B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; +} diff --git a/samples/BasicKinect/xcode/BasicKinect.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/samples/BasicKinect/xcode/BasicKinect.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..6ca1057 --- /dev/null +++ b/samples/BasicKinect/xcode/BasicKinect.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/samples/BasicKinect/xcode/BasicKinect.xcodeproj/project.xcworkspace/xcuserdata/ian.xcuserdatad/UserInterfaceState.xcuserstate b/samples/BasicKinect/xcode/BasicKinect.xcodeproj/project.xcworkspace/xcuserdata/ian.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..0f87773abfa60d6df2dd0c1ae68a0ef63272add3 GIT binary patch literal 11620 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 literal 0 HcmV?d00001 diff --git a/samples/BasicKinect/xcode/BasicKinect.xcodeproj/xcuserdata/ian.xcuserdatad/xcschemes/BasicKinect.xcscheme b/samples/BasicKinect/xcode/BasicKinect.xcodeproj/xcuserdata/ian.xcuserdatad/xcschemes/BasicKinect.xcscheme new file mode 100644 index 0000000..5b8130d --- /dev/null +++ b/samples/BasicKinect/xcode/BasicKinect.xcodeproj/xcuserdata/ian.xcuserdatad/xcschemes/BasicKinect.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/BasicKinect/xcode/BasicKinect.xcodeproj/xcuserdata/ian.xcuserdatad/xcschemes/xcschememanagement.plist b/samples/BasicKinect/xcode/BasicKinect.xcodeproj/xcuserdata/ian.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..cc9c2a9 --- /dev/null +++ b/samples/BasicKinect/xcode/BasicKinect.xcodeproj/xcuserdata/ian.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + BasicKinect.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + 8D1107260486CEB800E47090 + + primary + + + + + diff --git a/samples/BasicKinect/xcode/BasicKinect_Prefix.pch b/samples/BasicKinect/xcode/BasicKinect_Prefix.pch new file mode 100644 index 0000000..ca51059 --- /dev/null +++ b/samples/BasicKinect/xcode/BasicKinect_Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'basicApp' target in the 'basicApp' project +// + +#ifdef __OBJC__ + #import +#endif diff --git a/samples/BasicKinect/xcode/Info.plist b/samples/BasicKinect/xcode/Info.plist new file mode 100644 index 0000000..54467d3 --- /dev/null +++ b/samples/BasicKinect/xcode/Info.plist @@ -0,0 +1,28 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + CinderApp.icns + CFBundleIdentifier + org.libcinder.BasicKinect + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + From 7b0b5c83e1471272127e30ae42f9fb108777005a Mon Sep 17 00:00:00 2001 From: Ian Smith-Heisters Date: Sun, 13 Jan 2013 18:08:27 -0800 Subject: [PATCH 07/10] Allow configuration of Kinect device nodes provide lots of getters for device and generator state don't update texture if data isn't new --- src/VKinect.cpp | 39 +++++++++++++++++++++++++++++++-------- src/VKinect.h | 10 +++++++++- src/VOpenNIDevice.cpp | 6 +++--- src/VOpenNIDevice.h | 8 +++++++- 4 files changed, 50 insertions(+), 13 deletions(-) diff --git a/src/VKinect.cpp b/src/VKinect.cpp index f011acd..97c0322 100644 --- a/src/VKinect.cpp +++ b/src/VKinect.cpp @@ -25,10 +25,16 @@ void Kinect::setup() void Kinect::setup(const Vec2i & size) { - setup(size, size); + setup(size, size, NODE_TYPE_IMAGE | NODE_TYPE_DEPTH | NODE_TYPE_SCENE | NODE_TYPE_USER); } -void Kinect::setup(const Vec2i & _depthSize, const Vec2i & _colorSize) +void Kinect::setup(const Vec2i & size, int nodeTypeFlags) +{ + setup(size, size, nodeTypeFlags); +} + + +void Kinect::setup(const Vec2i & _depthSize, const Vec2i & _colorSize, int nodeTypeFlags) { depthSize = _depthSize; colorSize = _colorSize; @@ -36,7 +42,7 @@ void Kinect::setup(const Vec2i & _depthSize, const Vec2i & _colorSize) OpenNIDeviceManager::USE_THREAD = false; manager = OpenNIDeviceManager::InstancePtr(); - manager->createDevices(1, NODE_TYPE_IMAGE | NODE_TYPE_DEPTH | NODE_TYPE_SCENE | NODE_TYPE_USER); + manager->createDevices(1, nodeTypeFlags); device = manager->getDevice(0); if ( !device ) { @@ -60,12 +66,16 @@ void Kinect::update() manager->update(); } - tex_Color.update(Surface(getColorImage())); - tex_Depth.update(Surface(getDepthImage())); + if ( device->_isImageOn && device->getImageGenerator()->IsValid() && device->isImageDataNew() ) + tex_Color.update(Surface(getColorImage())); + if ( device->_isDepthOn && device->getDepthGenerator()->IsValid() && device->isDepthDataNew() ) + tex_Depth.update(Surface(getDepthImage())); - BOOST_FOREACH(users_map::value_type &user, users) - { - user.second.texture.update(Surface(getUserImage(user.first))); + if ( device->_isUserOn && device->getUserGenerator()->IsValid() && device->isUserDataNew() ) { + BOOST_FOREACH(users_map::value_type &user, users) + { + user.second.texture.update(Surface(getUserImage(user.first))); + } } } @@ -144,6 +154,19 @@ ImageSourceRef Kinect::getDepthImage() uint16_t *activeDepth = device->getDepthMap(); return ImageSourceRef(new ImageSourceDepth(activeDepth, depthSize.x, depthSize.y)); } + +XnPoint3D * Kinect::getDepthMapRealWorld() +{ + device->calcDepthImageRealWorld(); + return device->getDepthMapRealWorld(); +} + +ColorA8u Kinect::getColorPixel(Vec2i pixel) +{ + uint8_t *r = device->getColorMap() + (pixel.x + pixel.y * colorSize.y); + return ColorA8u(*r, *(r + 1), *(r + 2)); +} + /******************************************************************************* * Kinect::User diff --git a/src/VKinect.h b/src/VKinect.h index 940630b..9577604 100644 --- a/src/VKinect.h +++ b/src/VKinect.h @@ -17,7 +17,8 @@ class Kinect : public UserListener { void setup(); void setup(const ci::Vec2i & size); - void setup(const ci::Vec2i & _depthSize, const ci::Vec2i & _colorSize); + void setup(const ci::Vec2i & size, int nodeTypeFlags); + void setup(const ci::Vec2i & _depthSize, const ci::Vec2i & _colorSize, int nodeTypeFlags); void update(); void drawColor(const ci::Rectf &rect); @@ -32,12 +33,19 @@ class Kinect : public UserListener { ci::ImageSourceRef getColorImage(); + ci::ColorA8u getColorPixel(ci::Vec2i pixel); ci::ImageSourceRef getUserImage(const int id); ci::ImageSourceRef getDepthImage(); + XnPoint3D * getDepthMapRealWorld(); + + ci::gl::Texture * getColorTexture() { return &tex_Color; }; + ci::gl::Texture * getDepthTexture() { return &tex_Depth; }; ci::Vec2i getDepthSize() { return depthSize; }; ci::Vec2i getColorSize() { return colorSize; }; + OpenNIDevice::Ref getDevice() { return device; }; + class User { public: User(Kinect & kinect, const int id) : diff --git a/src/VOpenNIDevice.cpp b/src/VOpenNIDevice.cpp index 16da02d..8b85f19 100644 --- a/src/VOpenNIDevice.cpp +++ b/src/VOpenNIDevice.cpp @@ -1167,7 +1167,7 @@ namespace V // // Handle depth map // - if( _isDepthOn && _depthGen->IsValid() ) + if( _isDepthOn && _depthGen->IsValid() && _depthGen->IsDataNew() ) { _depthGen->GetMetaData( _depthMetaData ); //pDepth = _depthGen->GetDepthMap(); //_depthMetaData.Data(); @@ -1232,7 +1232,7 @@ namespace V } - if( _isImageOn && _imageGen->IsValid() ) + if( _isImageOn && _imageGen->IsValid() && _imageGen->IsDataNew() ) { _imageGen->GetMetaData( _imageMetaData ); pImage = _imageMetaData.Data(); //_imageGen->GetImageMap(); @@ -1246,7 +1246,7 @@ namespace V } - if( _isIROn && _irGen->IsValid() ) + if( _isIROn && _irGen->IsValid() && _irGen->IsDataNew() ) { _irGen->GetMetaData( _irMetaData ); pIR = _irMetaData.Data(); //_irGen->GetIRMap(); diff --git a/src/VOpenNIDevice.h b/src/VOpenNIDevice.h index efee32e..1650958 100644 --- a/src/VOpenNIDevice.h +++ b/src/VOpenNIDevice.h @@ -98,7 +98,7 @@ namespace V //void setFPS( ProductionNodeType nodeType, int fps ); //void setMapOutputMode( ProductionNodeType nodeType, int width, int height, int fps ); void readFrame(); - + void calcDepthImageRealWorld(); void calcDepthImageRealWorld( uint16_t* pixelData, XnPoint3D* worldData ); void calcDepthImageRealWorld( XnPoint3D* buffer ); @@ -184,6 +184,12 @@ namespace V xn::UserGenerator* getUserGenerator() { return _userGen; } xn::HandsGenerator* getHandsGenerator() { return _handsGen; } xn::Context* getContext() { return _context; } + + bool isImageDataNew() { return _imageGen->IsDataNew(); }; + bool isIRDataNew() { return _irGen->IsDataNew(); }; + bool isDepthDataNew() { return _depthGen->IsDataNew(); }; + bool isUserDataNew() { return _userGen->IsDataNew(); }; + bool isHandsDataNew() { return _handsGen->IsDataNew(); }; bool isOneTimeCalibration() { return _isOneTimeCalibration; } void enableOneTimeCalibration( bool value ) { _isOneTimeCalibration = value; } From 3a37675eb98a7c17f2199b5694fc82f9713aab96 Mon Sep 17 00:00:00 2001 From: Ian Smith-Heisters Date: Wed, 30 Jan 2013 13:34:54 -0800 Subject: [PATCH 08/10] Add FakeKinect class for developing without a real kinect --- src/VFakeKinect.cpp | 45 +++++++++++++++++++++++++++++++++++++++++++++ src/VFakeKinect.h | 34 ++++++++++++++++++++++++++++++++++ src/VKinect.h | 10 +++++----- 3 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 src/VFakeKinect.cpp create mode 100644 src/VFakeKinect.h diff --git a/src/VFakeKinect.cpp b/src/VFakeKinect.cpp new file mode 100644 index 0000000..2874804 --- /dev/null +++ b/src/VFakeKinect.cpp @@ -0,0 +1,45 @@ +#include "VFakeKinect.h" + +using namespace ci; +using namespace std; + +namespace V { + + void FakeKinect::setup(const ci::Vec2i & _depthSize, const ci::Vec2i & _colorSize, int nodeTypeFlags) + { + depthSize = _depthSize; + colorSize = _colorSize; + depthMapRealWorld = new XnPoint3D[depthSize.x * depthSize.y]; + + Surface8u colorSurface = Surface8u(colorSize.x, colorSize.y, false); + Surface::Iter it = colorSurface.getIter(); + while ( it.line() ) { + while ( it.pixel() ) { + Vec2i xy = it.getPos(); + Colorf color = hsvToRGB(Vec3f((float)xy.x / (float)colorSize.x, 1.f, 1.f)); + it.r() = color.r * 255.f; + it.g() = color.g * 255.f; + it.b() = color.b * 255.f; + } + } + + Surface8u depthSurface = Surface8u(depthSize.x, depthSize.y, false); + it = depthSurface.getIter(); + while ( it.line() ) { + while ( it.pixel() ) { + float depth = ((Vec2f)it.getPos()).distance((Vec2f)depthSize / 2.f) / ((Vec2f)depthSize).distance(Vec2f(0, 0)) * 255.f; + it.r() = depth; + it.g() = depth; + it.b() = depth; + + XnPoint3D *point = depthMapRealWorld + (it.x() + it.y() * depthSize.x); + point->X = it.x() + depthSize.x * -0.5; + point->Y = it.y() + depthSize.y * -0.5; + point->Z = (depth / 255.f) * 1000.f; // real kinect data seems to range from about 0 - 6000 + } + } + + tex_Color = gl::Texture(colorSurface); + tex_Depth = gl::Texture(depthSurface); + } +} diff --git a/src/VFakeKinect.h b/src/VFakeKinect.h new file mode 100644 index 0000000..ba57cdc --- /dev/null +++ b/src/VFakeKinect.h @@ -0,0 +1,34 @@ +#pragma once + +#include "VKinect.h" + +namespace V { + class FakeKinect : public Kinect + { + public: + FakeKinect(){}; + ~FakeKinect(){}; + + using Kinect::setup; + void setup(const ci::Vec2i & _depthSize, const ci::Vec2i & _colorSize, int nodeTypeFlags); + void update(){}; + + ci::ImageSourceRef getColorImage(){ return ci::ImageSourceRef(tex_Color); } + ci::ImageSourceRef getDepthImage(){ return ci::ImageSourceRef(tex_Depth); } + + class FakeDevice + { + public: + void setAlignWithDepthGenerator(){}; + bool isDepthDataNew(){ return true; }; + bool isColorDataNew(){ return true; }; + }; + + XnPoint3D * getDepthMapRealWorld() { return depthMapRealWorld; }; + FakeDevice * getDevice() { return &device; }; + + private: + FakeDevice device; + XnPoint3D *depthMapRealWorld; + }; +} \ No newline at end of file diff --git a/src/VKinect.h b/src/VKinect.h index 9577604..e2d89fb 100644 --- a/src/VKinect.h +++ b/src/VKinect.h @@ -15,10 +15,10 @@ class Kinect : public UserListener { Kinect(); ~Kinect(); - void setup(); - void setup(const ci::Vec2i & size); - void setup(const ci::Vec2i & size, int nodeTypeFlags); - void setup(const ci::Vec2i & _depthSize, const ci::Vec2i & _colorSize, int nodeTypeFlags); + virtual void setup(); + virtual void setup(const ci::Vec2i & size); + virtual void setup(const ci::Vec2i & size, int nodeTypeFlags); + virtual void setup(const ci::Vec2i & _depthSize, const ci::Vec2i & _colorSize, int nodeTypeFlags); void update(); void drawColor(const ci::Rectf &rect); @@ -67,7 +67,7 @@ class Kinect : public UserListener { typedef std::map< int, User > users_map; users_map users; -private: +protected: OpenNIDeviceManager * manager; OpenNIDevice::Ref device; ci::gl::Texture tex_Color, tex_Depth; From c618e7631ec522b9d5d863b04a7734e4cd999be4 Mon Sep 17 00:00:00 2001 From: Ian Smith-Heisters Date: Tue, 12 Feb 2013 19:35:24 -0800 Subject: [PATCH 09/10] Make it efficient to call getDepthMapRealWorld multiple times per run loop --- src/VKinect.cpp | 10 ++++++++-- src/VKinect.h | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/VKinect.cpp b/src/VKinect.cpp index 97c0322..636b1d0 100644 --- a/src/VKinect.cpp +++ b/src/VKinect.cpp @@ -69,6 +69,7 @@ void Kinect::update() if ( device->_isImageOn && device->getImageGenerator()->IsValid() && device->isImageDataNew() ) tex_Color.update(Surface(getColorImage())); if ( device->_isDepthOn && device->getDepthGenerator()->IsValid() && device->isDepthDataNew() ) + isDepthMapRealWorldUpdated = false; tex_Depth.update(Surface(getDepthImage())); if ( device->_isUserOn && device->getUserGenerator()->IsValid() && device->isUserDataNew() ) { @@ -157,8 +158,13 @@ ImageSourceRef Kinect::getDepthImage() XnPoint3D * Kinect::getDepthMapRealWorld() { - device->calcDepthImageRealWorld(); - return device->getDepthMapRealWorld(); + if ( isDepthMapRealWorldUpdated ) { + return device->getDepthMapRealWorld(); + } else { + device->calcDepthImageRealWorld(); + isDepthMapRealWorldUpdated = true; + return device->getDepthMapRealWorld(); + } } ColorA8u Kinect::getColorPixel(Vec2i pixel) diff --git a/src/VKinect.h b/src/VKinect.h index e2d89fb..1ae1279 100644 --- a/src/VKinect.h +++ b/src/VKinect.h @@ -73,6 +73,7 @@ class Kinect : public UserListener { ci::gl::Texture tex_Color, tex_Depth; uint16_t * pixels; ci::Vec2i depthSize, colorSize; + bool isDepthMapRealWorldUpdated; public: class ImageSourceColor : public ci::ImageSource From da576e3bcc8165ae62deff6d5eda800d02208cc5 Mon Sep 17 00:00:00 2001 From: Ian Smith-Heisters Date: Thu, 14 Feb 2013 10:30:10 -0800 Subject: [PATCH 10/10] Get it compiling against C++11 --- src/VOpenNICommon.h | 1 + src/VOpenNIDeviceManager.cpp | 3 ++- src/VOpenNIDeviceManager.h | 3 ++- src/VOpenNIHeaders.h | 1 - src/VOpenNINetwork.h | 2 +- 5 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/VOpenNICommon.h b/src/VOpenNICommon.h index 32128aa..263461a 100644 --- a/src/VOpenNICommon.h +++ b/src/VOpenNICommon.h @@ -16,6 +16,7 @@ #define DEBUG_MESSAGE( x ) printf( "%s", x ) #endif #elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) +#define BOOST_NO_CXX11_NUMERIC_LIMITS 1 #include #include #ifndef DEBUG_MESSAGE diff --git a/src/VOpenNIDeviceManager.cpp b/src/VOpenNIDeviceManager.cpp index 91299be..2648b3d 100644 --- a/src/VOpenNIDeviceManager.cpp +++ b/src/VOpenNIDeviceManager.cpp @@ -8,6 +8,7 @@ #include "VOpenNIDevice.h" #include "VOpenNIDeviceManager.h" #include +#include namespace V { @@ -745,7 +746,7 @@ namespace V #ifdef WIN32 _thread = std::shared_ptr( new boost::thread(&OpenNIDeviceManager::run, this) ); #else - _thread = boost::shared_ptr( new boost::thread(&OpenNIDeviceManager::run, this) ); + _thread = boost::shared_ptr( new std::thread(&OpenNIDeviceManager::run, this) ); #endif _isRunning = true; } diff --git a/src/VOpenNIDeviceManager.h b/src/VOpenNIDeviceManager.h index eb5b201..38a8386 100644 --- a/src/VOpenNIDeviceManager.h +++ b/src/VOpenNIDeviceManager.h @@ -2,6 +2,7 @@ #include "VOpenNIDevice.h" +#include namespace V @@ -86,7 +87,7 @@ namespace V #ifdef WIN32 std::shared_ptr _thread; #else - boost::shared_ptr _thread; + boost::shared_ptr _thread; #endif boost::mutex _mutex; diff --git a/src/VOpenNIHeaders.h b/src/VOpenNIHeaders.h index e6f3687..8d09dc3 100644 --- a/src/VOpenNIHeaders.h +++ b/src/VOpenNIHeaders.h @@ -1,6 +1,5 @@ #pragma once - #include "VOpenNICommon.h" // #ifdef _WIN32 // #include "VOpenNINetwork.h" diff --git a/src/VOpenNINetwork.h b/src/VOpenNINetwork.h index f2bcc94..75cdcda 100644 --- a/src/VOpenNINetwork.h +++ b/src/VOpenNINetwork.h @@ -48,7 +48,7 @@ namespace V bool mIsServer; volatile bool mIsRunning; - boost::shared_ptr _thread; + boost::shared_ptr _thread; std::string mHostName; uint16_t mHostPort;