From d32bbd2512656b608b734591b10bfd8aabacfc77 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Wed, 19 Jun 2013 13:13:25 +0300 Subject: [PATCH 001/188] Fix C compilation --- Include/OniCTypes.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Include/OniCTypes.h b/Include/OniCTypes.h index 12246949..076915b0 100644 --- a/Include/OniCTypes.h +++ b/Include/OniCTypes.h @@ -83,13 +83,13 @@ typedef struct } OniDeviceInfo; struct _OniDevice; -typedef _OniDevice* OniDeviceHandle; +typedef struct _OniDevice* OniDeviceHandle; struct _OniStream; -typedef _OniStream* OniStreamHandle; +typedef struct _OniStream* OniStreamHandle; struct _OniRecorder; -typedef _OniRecorder* OniRecorderHandle; +typedef struct _OniRecorder* OniRecorderHandle; /** All information of the current frame */ typedef struct From 4d2333854067e181267000cd1de23c959183e2ed Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Sun, 23 Jun 2013 12:48:10 +0300 Subject: [PATCH 002/188] OPENNITWO-493: Single pixel translation is wrong when image res is 1280x1024 --- Source/DepthUtils/DepthUtilsImpl.cpp | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/Source/DepthUtils/DepthUtilsImpl.cpp b/Source/DepthUtils/DepthUtilsImpl.cpp index 8da3e139..b278c5c0 100644 --- a/Source/DepthUtils/DepthUtilsImpl.cpp +++ b/Source/DepthUtils/DepthUtilsImpl.cpp @@ -262,33 +262,47 @@ XnStatus DepthUtilsImpl::TranslateSinglePixel(XnUInt32 x, XnUInt32 y, unsigned s ///////////////////////////////////// - XnDouble fullXRes = m_colorResolution.x; + XnDouble fullXRes; XnDouble fullYRes; XnBool bCrop = FALSE; - if ((9 * m_colorResolution.x / m_colorResolution.y) == 16) + // if color aspect ratio is different from depth one, assume it's cropped + if (m_colorResolution.x * m_depthResolution.y < m_colorResolution.y * m_depthResolution.x) { - fullYRes = m_colorResolution.x * 4 / 5; + fullXRes = m_colorResolution.x; + fullYRes = fullXRes * m_depthResolution.y / m_depthResolution.x; + bCrop = TRUE; + } + else if (m_colorResolution.x * m_depthResolution.y > m_colorResolution.y * m_depthResolution.x) + { + fullYRes = m_colorResolution.y; + fullXRes = fullYRes * m_depthResolution.x / m_depthResolution.y; bCrop = TRUE; } else { + fullXRes = m_colorResolution.x; fullYRes = m_colorResolution.y; bCrop = FALSE; } - // inflate to full res + // inflate translated pixel from current resolution into full one imageX = (XnUInt32)(fullXRes / m_depthResolution.x * imageX); imageY = (XnUInt32)(fullYRes / m_depthResolution.y * imageY); if (bCrop) { // crop from center - imageY -= (XnUInt32)(fullYRes - m_colorResolution.y)/2; + imageY += (XnUInt32)(m_colorResolution.y - fullYRes)/2; if (imageY > (XnUInt32)m_colorResolution.y) { return XN_STATUS_BAD_PARAM; } + imageX += (XnUInt32)(m_colorResolution.x - fullXRes)/2; + if (imageX > (XnUInt32)m_colorResolution.x) + { + return XN_STATUS_BAD_PARAM; + } } return XN_STATUS_OK; From 36af9cb21ecce3533a4799d238d02e3ea06126cf Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Tue, 25 Jun 2013 17:15:45 +0300 Subject: [PATCH 003/188] Link console: allow running a single command and exit --- .../PSLink/PSLinkConsole/PSLinkConsole.cpp | 60 +++++++++++-------- 1 file changed, 34 insertions(+), 26 deletions(-) diff --git a/Source/Drivers/PSLink/PSLinkConsole/PSLinkConsole.cpp b/Source/Drivers/PSLink/PSLinkConsole/PSLinkConsole.cpp index 922cfe6f..4e76193e 100644 --- a/Source/Drivers/PSLink/PSLinkConsole/PSLinkConsole.cpp +++ b/Source/Drivers/PSLink/PSLinkConsole/PSLinkConsole.cpp @@ -268,20 +268,8 @@ const char* fwVideoModeToString(XnFwStreamVideoMode videoMode) //--------------------------------------------------------------------------- // Framework //--------------------------------------------------------------------------- -void RunCommand(XnChar* strCmdLine) +void RunCommand(int argc, const char* argv[]) { - enum {CMD_MAX_ARGS = 256}; - const char* argv[CMD_MAX_ARGS] = {NULL}; - int argc = CMD_MAX_ARGS; - - SplitStr(strCmdLine, argv, &argc); - - if (argc == 0) - { - //Ignore empty lines - return; - } - char commandName[XN_FILE_MAX_PATH]; xnOSStrCopy(commandName, argv[0], sizeof(commandName)); @@ -303,6 +291,23 @@ void RunCommand(XnChar* strCmdLine) command.handler(argc, argv); } +void RunCommand(XnChar* strCmdLine) +{ + enum {CMD_MAX_ARGS = 256}; + const char* argv[CMD_MAX_ARGS] = {NULL}; + int argc = CMD_MAX_ARGS; + + SplitStr(strCmdLine, argv, &argc); + + if (argc == 0) + { + //Ignore empty lines + return; + } + + RunCommand(argc, argv); +} + void ExecuteCommandsFromStream(FILE* pStream, XnBool bPrompt) { XnChar strCmdLine[1024]; @@ -1544,7 +1549,8 @@ int main(int argc, char* argv[]) Status nRetVal = STATUS_OK; const XnChar* strScriptFile = NULL; XnUInt16 nProductID = 0; - XnBool bQuit = FALSE; + const char** commandArgv = NULL; + int commandArgc = 0; // printf("PSLinkConsole version %s\n", XN_PS_VERSION_STRING); @@ -1566,11 +1572,8 @@ int main(int argc, char* argv[]) else if (xnOSStrCaseCmp(argv[nArgIndex], "-help") == 0) { printf("USAGE\n"); - printf("\t%s [-transport ] [-product ] [-script ] [-help]\n", argv[0]); + printf("\t%s [-product ] [-script ] [-help] [command]\n", argv[0]); printf("OPTIONS\n"); - printf("\t-transport \n"); - printf("\t\tOpen a device from a specific transport, either USB or from a specific IP and port number.\n"); - printf("\t\tWhen omitted, USB will be used.\n"); printf("\t-product \n"); printf("\t\tOpen only devices with a specific product ID. By default, any device can be opened.\n"); printf("\t-script \n"); @@ -1587,8 +1590,9 @@ int main(int argc, char* argv[]) } else { - printf("Unknown option: %s\n. Run %s -help for usage.\n", argv[nArgIndex], argv[0]); - return -1; + commandArgc = argc - nArgIndex; + commandArgv = (const char**)(argv + nArgIndex); + break; } } @@ -1657,13 +1661,17 @@ int main(int argc, char* argv[]) return -5; } - if (bQuit) - { - return 0; - } + return 0; + } + else if (commandArgc != 0) + { + RunCommand(commandArgc, commandArgv); + return 0; + } + else + { + ExecuteCommandsFromStream(stdin, TRUE); } - - ExecuteCommandsFromStream(stdin, TRUE); g_device.close(); OpenNI::shutdown(); From 023206ede53c5c3ef2f005b5eb77b03e80e355ed Mon Sep 17 00:00:00 2001 From: "mark.sandler" Date: Wed, 12 Jun 2013 14:19:36 +0300 Subject: [PATCH 004/188] 1. Stop streams when closing device. 2. Fixed crush when destroying VideoStream object after sensor closed. 3. Fixed crush when rewinding on file playback. --- CHANGES.txt | 4 +- Include/OniCEnums.h | 8 +- Include/OniCTypes.h | 93 ++++++++------- Include/OniVersion.h | 2 +- Include/OpenNI.h | 61 ++-------- Packaging/Harvest.py | 112 +++--------------- Packaging/Install/Includes/Variables.wxi | 2 +- Packaging/UpdateVersion.py | 2 +- ReleaseNotes.txt | 4 +- .../Samples/SimpleViewer/SimpleViewer.java | 4 +- Source/Core/OniDevice.cpp | 7 ++ Source/Core/OniFrameManager.cpp | 25 +--- Source/Core/OniStream.cpp | 7 +- Source/DepthUtils/DepthUtilsImpl.cpp | 24 +--- Source/Drivers/OniFile/PlayerDevice.cpp | 25 +++- Source/Drivers/OniFile/PlayerDevice.h | 3 + Source/Drivers/OniFile/PlayerStream.cpp | 10 ++ Source/Drivers/OniFile/PlayerStream.h | 4 + .../PSLink/PSLinkConsole/PSLinkConsole.cpp | 60 ++++------ Source/Tools/NiViewer/Device.cpp | 2 +- .../PSCommon/BuildSystem/CommonJavaMakefile | 13 +- .../XnLib/Include/XnThreadSafeQueue.h | 79 ------------ .../XnLib/Source/Linux/XnLinuxTime.cpp | 4 - .../src/org/openni/VideoFrameRef.java | 1 - .../OpenNI.jni/org_openni_NativeMethods.cpp | 6 +- 25 files changed, 186 insertions(+), 376 deletions(-) delete mode 100644 ThirdParty/PSCommon/XnLib/Include/XnThreadSafeQueue.h diff --git a/CHANGES.txt b/CHANGES.txt index 697e6908..66efcd8f 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -11,13 +11,11 @@ OpenNI 2.2.0: - Add support for Capri devkits - Added tools: PS1080Console and PSLinkConsole (for debugging purposes) - Drivers and INI files path resolution based on the shared library location (merge pull request #7. See https://github.com/OpenNI/OpenNI2/pull/7 for details. Thanks to Tomoto) - - NiViewer: Allow choosing which streams to open (run "NiViewer --help" for details). - - NiViewer: add support for seeking to a specific frame in a recording. Use the ':' key. + - NiViewer: Allow choosing which streams to open (run "NiViewer --help" for details) - Image registration support for Kinect driver (merge pull request #4. See https://github.com/OpenNI/OpenNI2/pull/4 for details. Thanks to Tomoto) - Completely re-wrote frame buffers management. - Added API for replacing frame buffer allocator. - Linux: implement connect/disconnect events - - All samples are now self-contained and can be copied anywhere. In addition, compiling a sample does *not* overwrite the original precompiled binary. - PS1080: IR stream now also supports RGB888 - PS1080: improved hardware name detection - PS1080: Add NESA unlimited to BIST diff --git a/Include/OniCEnums.h b/Include/OniCEnums.h index d7f513b8..affce9a1 100644 --- a/Include/OniCEnums.h +++ b/Include/OniCEnums.h @@ -75,10 +75,8 @@ typedef enum ONI_IMAGE_REGISTRATION_DEPTH_TO_COLOR = 1, } OniImageRegistrationMode; -enum -{ - ONI_TIMEOUT_NONE = 0, - ONI_TIMEOUT_FOREVER = -1, -}; +static const int ONI_TIMEOUT_NONE = 0; +static const int ONI_TIMEOUT_FOREVER = -1; + #endif // _ONI_C_ENUMS_H_ diff --git a/Include/OniCTypes.h b/Include/OniCTypes.h index 076915b0..00ff71ee 100644 --- a/Include/OniCTypes.h +++ b/Include/OniCTypes.h @@ -40,18 +40,21 @@ typedef int OniBool; struct OniCallbackHandleImpl; typedef struct OniCallbackHandleImpl* OniCallbackHandle; -/** Holds an OpenNI version number, which consists of four separate numbers in the format: @c major.minor.maintenance.build. For example: 2.0.0.20. */ -typedef struct -{ - /** Major version number, incremented for major API restructuring. */ - int major; - /** Minor version number, incremented when significant new features added. */ - int minor; - /** Maintenance build number, incremented for new releases that primarily provide minor bug fixes. */ - int maintenance; - /** Build number. Incremented for each new API build. Generally not shown on the installer and download site. */ - int build; -} OniVersion; +#define _ONI_DECLARE_VERSION(name) \ +/** Holds an OpenNI version number, which consists of four separate numbers in the format: @c major.minor.maintenance.build. For example: 2.0.0.20. */ \ +typedef struct \ +{ \ + /** Major version number, incremented for major API restructuring. */ \ + int major; \ + /** Minor version number, incremented when signficant new features added. */ \ + int minor; \ + /** Mainenance build number, incremented for new releases that primarily provide minor bug fixes. */ \ + int maintenance; \ + /** Build number. Incremented for each new API build. Generally not shown on the installer and download site. */ \ + int build; \ +} name; + +_ONI_DECLARE_VERSION(OniVersion); typedef int OniHardwareVersion; @@ -83,13 +86,13 @@ typedef struct } OniDeviceInfo; struct _OniDevice; -typedef struct _OniDevice* OniDeviceHandle; +typedef _OniDevice* OniDeviceHandle; struct _OniStream; -typedef struct _OniStream* OniStreamHandle; +typedef _OniStream* OniStreamHandle; struct _OniRecorder; -typedef struct _OniRecorder* OniRecorderHandle; +typedef _OniRecorder* OniRecorderHandle; /** All information of the current frame */ typedef struct @@ -154,33 +157,39 @@ typedef uint8_t OniGrayscale8Pixel; #pragma pack (push, 1) -/** Holds the value of a single color image pixel in 24-bit RGB format. */ -typedef struct -{ - /* Red value of this pixel. */ - uint8_t r; - /* Green value of this pixel. */ - uint8_t g; - /* Blue value of this pixel. */ - uint8_t b; -} OniRGB888Pixel; - -/** - Holds the value of two pixels in YUV422 format (Luminance/Chrominance,16-bits/pixel). - The first pixel has the values y1, u, v. - The second pixel has the values y2, u, v. -*/ -typedef struct -{ - /** First chrominance value for two pixels, stored as blue luminance difference signal. */ - uint8_t u; - /** Overall luminance value of first pixel. */ - uint8_t y1; - /** Second chrominance value for two pixels, stored as red luminance difference signal. */ - uint8_t v; - /** Overall luminance value of second pixel. */ - uint8_t y2; -} OniYUV422DoublePixel; +#define _ONI_DECLARE_RGB888_PIXEL(name) \ +/** Holds the value of a single color image pixel in 24-bit RGB format. */ \ +typedef struct \ +{ \ + /* Red value of this pixel. */ \ + uint8_t r; \ + /* Green value of this pixel. */ \ + uint8_t g; \ + /* Blue value of this pixel. */ \ + uint8_t b; \ +} name; + +_ONI_DECLARE_RGB888_PIXEL(OniRGB888Pixel) + +#define _ONI_DECLARE_YUV422_PIXEL(name) \ +/** \ + Holds the value of two pixels in YUV422 format (Luminance/Chrominance,16-bits/pixel). \ + The first pixel has the values y1, u, v. \ + The second pixel has the values y2, u, v. \ +*/ \ +typedef struct \ +{ \ + /** First chrominance value for two pixels, stored as blue luminance difference signal. */ \ + uint8_t u; \ + /** Overall luminance value of first pixel. */ \ + uint8_t y1; \ + /** Second chrominance value for two pixels, stored as red luminance difference signal. */ \ + uint8_t v; \ + /** Overall luminance value of second pixel. */ \ + uint8_t y2; \ +} name; + +_ONI_DECLARE_YUV422_PIXEL(OniYUV422DoublePixel) #pragma pack (pop) diff --git a/Include/OniVersion.h b/Include/OniVersion.h index 60376a45..112eb728 100644 --- a/Include/OniVersion.h +++ b/Include/OniVersion.h @@ -23,7 +23,7 @@ #define ONI_VERSION_MAJOR 2 #define ONI_VERSION_MINOR 2 #define ONI_VERSION_MAINTENANCE 0 -#define ONI_VERSION_BUILD 30 +#define ONI_VERSION_BUILD 23 /** OpenNI version (in brief string format): "Major.Minor.Maintenance (Build)" */ #define ONI_BRIEF_VERSION_STRING \ diff --git a/Include/OpenNI.h b/Include/OpenNI.h index 52324b4e..58298427 100644 --- a/Include/OpenNI.h +++ b/Include/OpenNI.h @@ -36,51 +36,13 @@ namespace openni /** Pixel type used to store depth images. */ typedef uint16_t DepthPixel; - /** Pixel type used to store IR images. */ typedef uint16_t Grayscale16Pixel; // structs -/** Holds an OpenNI version number, which consists of four separate numbers in the format: @c major.minor.maintenance.build. For example: 2.0.0.20. */ -typedef struct -{ - /** Major version number, incremented for major API restructuring. */ - int major; - /** Minor version number, incremented when significant new features added. */ - int minor; - /** Maintenance build number, incremented for new releases that primarily provide minor bug fixes. */ - int maintenance; - /** Build number. Incremented for each new API build. Generally not shown on the installer and download site. */ - int build; -} Version; - -/** Holds the value of a single color image pixel in 24-bit RGB format. */ -typedef struct -{ - /* Red value of this pixel. */ - uint8_t r; - /* Green value of this pixel. */ - uint8_t g; - /* Blue value of this pixel. */ - uint8_t b; -} RGB888Pixel; - -/** - Holds the value of two pixels in YUV422 format (Luminance/Chrominance,16-bits/pixel). - The first pixel has the values y1, u, v. - The second pixel has the values y2, u, v. -*/ -typedef struct -{ - /** First chrominance value for two pixels, stored as blue luminance difference signal. */ - uint8_t u; - /** Overall luminance value of first pixel. */ - uint8_t y1; - /** Second chrominance value for two pixels, stored as red luminance difference signal. */ - uint8_t v; - /** Overall luminance value of second pixel. */ - uint8_t y2; -} YUV422DoublePixel; +_ONI_DECLARE_VERSION(Version); +_ONI_DECLARE_RGB888_PIXEL(RGB888Pixel); +_ONI_DECLARE_YUV422_PIXEL(YUV422DoublePixel); /** This special URI can be passed to @ref Device::open() when the application has no concern for a specific device. */ #if ONI_PLATFORM != ONI_PLATFORM_WIN32 @@ -1707,7 +1669,7 @@ class PlaybackControl return speed; } /** - * Setter function for the playback speed of the device. For a full explaination of + * Setter function for the playback speed of the device. For a full explanation of * what this value means @see PlaybackControl::getSpeed(). * * @param [in] speed Desired new value of playback speed, as ratio of original recording. @@ -2113,13 +2075,14 @@ class OpenNI */ static Version getVersion() { - OniVersion oniVersion = oniGetVersion(); - Version version; - version.major = oniVersion.major; - version.minor = oniVersion.minor; - version.maintenance = oniVersion.maintenance; - version.build = oniVersion.build; - return version; + OniVersion version = oniGetVersion(); + union + { + OniVersion* pC; + Version* pCpp; + } a; + a.pC = &version; + return *a.pCpp; } /** diff --git a/Packaging/Harvest.py b/Packaging/Harvest.py index 4ce9ed26..31c38390 100755 --- a/Packaging/Harvest.py +++ b/Packaging/Harvest.py @@ -26,7 +26,6 @@ import shutil import platform import stat -import xml.dom.minidom class Harvest: def __init__(self, rootDir, outDir, arch): @@ -124,10 +123,7 @@ def copySample(self, samplesDir, name, isLibrary = False, isGL = False, isJava = shutil.copytree(os.path.join(self.rootDir, 'ThirdParty', 'GL', 'GL'), os.path.join(sampleTargetDir, 'GL')) shutil.copytree(os.path.join(self.rootDir, 'ThirdParty', 'GL', 'glh'), os.path.join(sampleTargetDir, 'glh')) # and lib - shutil.copy(os.path.join(self.rootDir, 'ThirdParty', 'GL', 'glut32.lib'), sampleTargetDir) - shutil.copy(os.path.join(self.rootDir, 'ThirdParty', 'GL', 'glut64.lib'), sampleTargetDir) - shutil.copy(os.path.join(self.rootDir, 'ThirdParty', 'GL', 'glut32.dll'), sampleTargetDir) - shutil.copy(os.path.join(self.rootDir, 'ThirdParty', 'GL', 'glut64.dll'), sampleTargetDir) + shutil.copy(os.path.join(self.rootDir, 'ThirdParty', 'GL', 'glut' + self.glutSuffix + '.lib'), sampleTargetDir) # and project file / makefile if self.osName == 'Windows': @@ -135,75 +131,21 @@ def copySample(self, samplesDir, name, isLibrary = False, isGL = False, isJava = shutil.copy(os.path.join(sampleSourceDir, 'Build.bat'), sampleTargetDir) shutil.copy(os.path.join(self.rootDir, 'ThirdParty', 'PSCommon', 'BuildSystem', 'BuildJavaWindows.py'), sampleTargetDir) # fix call - buildFile = open(os.path.join(sampleTargetDir, 'Build.bat')) - buildScript = buildFile.read() - buildFile.close() - - buildScript = re.sub('..\\\\..\\\\ThirdParty\\\\PSCommon\\\\BuildSystem\\\\', '', buildScript) - buildScript = re.sub('..\\\\..\\\\Bin', 'Bin', buildScript) - - buildFile = open(os.path.join(sampleTargetDir, 'Build.bat'), 'w') - buildFile.write('@echo off\n') - buildFile.write('IF "%1"=="x64" (\n') - buildFile.write('\txcopy /D /S /F /Y "%OPENNI2_REDIST64%\\*" "Bin\\x64-Release\\"\n') - buildFile.write(') ELSE (\n') - buildFile.write('\txcopy /D /S /F /Y "%OPENNI2_REDIST%\\*" "Bin\\Win32-Release\\"\n') - buildFile.write(')\n') - buildFile.write(buildScript) - buildFile.close() - + self.regxReplace(r'..\\\\..\\\\ThirdParty\\\\PSCommon\\\\BuildSystem\\\\', '', os.path.join(sampleTargetDir, 'Build.bat')) else: shutil.copy(os.path.join(sampleSourceDir, name + '.vcxproj'), sampleTargetDir) - projFile = os.path.join(sampleTargetDir, name + '.vcxproj') - #ET.register_namespace('', 'http://schemas.microsoft.com/developer/msbuild/2003') - doc = xml.dom.minidom.parse(projFile) - - # remove OutDir and IntDir (make them default) - for propertyGroup in doc.getElementsByTagName("PropertyGroup"): - if len(propertyGroup.getElementsByTagName("OutDir")) > 0: - propertyGroup.parentNode.removeChild(propertyGroup) - - for group in doc.getElementsByTagName("ItemDefinitionGroup"): - condAttr = group.getAttribute('Condition') - if condAttr.find('x64') != -1: - postfix = '64' - glPostfix = '64' - else: - postfix = '' - glPostfix = '32' - - incDirs = group.getElementsByTagName('ClCompile')[0].getElementsByTagName('AdditionalIncludeDirectories')[0] - val = incDirs.firstChild.data - - # fix GL include dir - val = re.sub('..\\\\..\\\\ThirdParty\\\\GL', r'.', val) - # fix Common include dir - val = re.sub('..\\\\Common', r'.', val) - # fix OpenNI include dir - val = re.sub('..\\\\..\\\\Include', '$(OPENNI2_INCLUDE' + postfix + ')', val) - - incDirs.firstChild.data = val - - # fix additional library directories - libDirs = group.getElementsByTagName('Link')[0].getElementsByTagName('AdditionalLibraryDirectories')[0] - val = libDirs.firstChild.data - val = re.sub('\$\(OutDir\)', '$(OutDir);$(OPENNI2_LIB' + postfix + ')', val) - libDirs.firstChild.data = val - - # add post-build event to copy OpenNI redist - post = doc.createElement('PostBuildEvent') - cmd = 'xcopy /D /S /F /Y "$(OPENNI2_REDIST' + postfix + ')\*" "$(OutDir)"\n' - if isGL: - cmd += 'xcopy /D /F /Y "$(ProjectDir)\\glut' + glPostfix + '.dll" "$(OutDir)"\n' - - cmdNode = doc.createElement('Command') - cmdNode.appendChild(doc.createTextNode(cmd)) - post.appendChild(cmdNode) - group.appendChild(post) - - proj = open(projFile, 'w') - proj.write(doc.toxml()) - proj.close() + # fix output dir + self.regxReplace('\$\(SolutionDir\)Bin\\\\\$\(Platform\)-\$\(Configuration\)', '$(ProjectDir)..\\Bin', os.path.join(sampleTargetDir, name + '.vcxproj')) + # fix intermediate dir + self.regxReplace('\$\(SolutionDir\)Bin', '$(ProjectDir)..\\Bin', os.path.join(sampleTargetDir, name + '.vcxproj')) + # fix OpenNI include dir + self.regxReplace('..\\\\..\\\\Include', '$(OPENNI2_INCLUDE' + self.platformSuffix + ')', os.path.join(sampleTargetDir, name + '.vcxproj')) + # fix GL include dir + self.regxReplace('..\\\\..\\\\ThirdParty\\\\GL', '.', os.path.join(sampleTargetDir, name + '.vcxproj')) + # fix Common include dir + self.regxReplace('..\\\\Common', '.', os.path.join(sampleTargetDir, name + '.vcxproj')) + # fix library dir + self.regxReplace('\$\(OutDir\)', '$(OutDir);$(OPENNI2_LIB' + self.platformSuffix + ')', os.path.join(sampleTargetDir, name + '.vcxproj')) elif self.osName == 'Linux' or self.osName == 'Darwin': shutil.copy(os.path.join(sampleSourceDir, 'Makefile'), sampleTargetDir) @@ -216,32 +158,8 @@ def copySample(self, samplesDir, name, isLibrary = False, isGL = False, isJava = shutil.copy(os.path.join(rootDir, 'ThirdParty', 'PSCommon', 'BuildSystem', 'CommonJavaMakefile'), sampleTargetDir) else: shutil.copy(os.path.join(rootDir, 'ThirdParty', 'PSCommon', 'BuildSystem', 'CommonCppMakefile'), sampleTargetDir) - - # fix common makefiles path + # fix includes self.regxReplace('../../ThirdParty/PSCommon/BuildSystem/', '', os.path.join(sampleTargetDir, 'Makefile')) - - # fix BIN dir - self.regxReplace('BIN_DIR = ../../Bin', 'BIN_DIR = Bin', os.path.join(sampleTargetDir, 'Makefile')) - - # fix include dirs and copy openni_redist - add = r''' -ifndef OPENNI2_INCLUDE - $(error OPENNI2_INCLUDE is not defined. Please define it or 'source' the OpenNIDevEnvironment file from the installation) -else ifndef OPENNI2_REDIST - $(error OPENNI2_REDIST is not defined. Please define it or 'source' the OpenNIDevEnvironment file from the installation) -endif - -INC_DIRS += $(OPENNI2_INCLUDE) - -include \1 - -.PHONY: copy-redist -copy-redist: - cp -R $(OPENNI2_REDIST)/* $(OUT_DIR) - -$(OUTPUT_FILE): copy-redist -''' - self.regxReplace(r'include (Common.*Makefile)', add, os.path.join(sampleTargetDir, 'Makefile')) # and executable if isJava: diff --git a/Packaging/Install/Includes/Variables.wxi b/Packaging/Install/Includes/Variables.wxi index 8482c3ff..88394d52 100644 --- a/Packaging/Install/Includes/Variables.wxi +++ b/Packaging/Install/Includes/Variables.wxi @@ -8,7 +8,7 @@ - + diff --git a/Packaging/UpdateVersion.py b/Packaging/UpdateVersion.py index 15d8ffc3..76a87c0b 100755 --- a/Packaging/UpdateVersion.py +++ b/Packaging/UpdateVersion.py @@ -28,7 +28,7 @@ VERSION_MAJOR = 2 VERSION_MINOR = 2 VERSION_MAINTENANCE = 0 -VERSION_BUILD = 30 +VERSION_BUILD = 23 def getVersionString(): return str(VERSION_MAJOR) + "." + str(VERSION_MINOR) + "." + str(VERSION_MAINTENANCE) + "." + str(VERSION_BUILD) diff --git a/ReleaseNotes.txt b/ReleaseNotes.txt index 42fbb902..374ebbeb 100644 --- a/ReleaseNotes.txt +++ b/ReleaseNotes.txt @@ -1,5 +1,5 @@ -OpenNI 2.2.0 Build 30 -June 18 2013 +OpenNI 2.2.0 Build 23 +June 1 2013 Minimum Requirements: --------------------- diff --git a/Samples/SimpleViewer.java/src/org/openni/Samples/SimpleViewer/SimpleViewer.java b/Samples/SimpleViewer.java/src/org/openni/Samples/SimpleViewer/SimpleViewer.java index 3e674d1b..79936de1 100644 --- a/Samples/SimpleViewer.java/src/org/openni/Samples/SimpleViewer/SimpleViewer.java +++ b/Samples/SimpleViewer.java/src/org/openni/Samples/SimpleViewer/SimpleViewer.java @@ -38,7 +38,7 @@ public void setStream(VideoStream videoStream) { } @Override - public synchronized void paint(Graphics g) { + public void paint(Graphics g) { if (mLastFrame == null) { return; } @@ -59,7 +59,7 @@ public synchronized void paint(Graphics g) { } @Override - public synchronized void onFrameReady(VideoStream stream) { + public void onFrameReady(VideoStream stream) { if (mLastFrame != null) { mLastFrame.release(); mLastFrame = null; diff --git a/Source/Core/OniDevice.cpp b/Source/Core/OniDevice.cpp index 24511f0b..ac9f4498 100644 --- a/Source/Core/OniDevice.cpp +++ b/Source/Core/OniDevice.cpp @@ -77,6 +77,13 @@ OniStatus Device::close() if (m_openCount == 0) { + while(m_streams.Begin() != m_streams.End()) + { + VideoStream* pStream = *m_streams.Begin(); + pStream->stop(); + m_streams.Remove(pStream); + } + for (int i = 0; i < MAX_SENSORS_PER_DEVICE; ++i) { if (m_sensors[i] != NULL) diff --git a/Source/Core/OniFrameManager.cpp b/Source/Core/OniFrameManager.cpp index 0d450aa7..e47d36ce 100644 --- a/Source/Core/OniFrameManager.cpp +++ b/Source/Core/OniFrameManager.cpp @@ -14,29 +14,8 @@ FrameManager::~FrameManager() OniFrameInternal* FrameManager::acquireFrame() { OniFrameInternal* pFrame = m_frames.Acquire(); - - // reset all fields - pFrame->dataSize = 0; - pFrame->data = NULL; - pFrame->sensorType = (OniSensorType)0; - pFrame->timestamp = 0; - pFrame->frameIndex = 0; - pFrame->width = 0; - pFrame->height = 0; - pFrame->videoMode.pixelFormat = (OniPixelFormat)0; - pFrame->videoMode.resolutionX = 0; - pFrame->videoMode.resolutionY = 0; - pFrame->videoMode.fps = 0; - pFrame->croppingEnabled = FALSE; - pFrame->cropOriginX = 0; - pFrame->cropOriginY = 0; - pFrame->stride = 0; - pFrame->backToPoolFunc = NULL; - pFrame->backToPoolFuncCookie = NULL; - pFrame->refCount = 1; // this is the only reference - pFrame->freeBufferFunc = NULL; - pFrame->freeBufferFuncCookie = NULL; - + xnOSMemSet(pFrame, 0, sizeof(OniFrameInternal)); + pFrame->refCount = 1; return pFrame; } diff --git a/Source/Core/OniStream.cpp b/Source/Core/OniStream.cpp index 435dde69..ef77f77b 100644 --- a/Source/Core/OniStream.cpp +++ b/Source/Core/OniStream.cpp @@ -67,7 +67,12 @@ VideoStream::~VideoStream() if (m_hNewFrameEvent != NULL) { - m_pSensor->newFrameEvent().Unregister(m_hNewFrameEvent); + //If device has no handle then the m_pSensor object is not valid + if(m_device.getHandle() != NULL) + { + m_pSensor->newFrameEvent().Unregister(m_hNewFrameEvent); + } + m_hNewFrameEvent = NULL; } diff --git a/Source/DepthUtils/DepthUtilsImpl.cpp b/Source/DepthUtils/DepthUtilsImpl.cpp index b278c5c0..8da3e139 100644 --- a/Source/DepthUtils/DepthUtilsImpl.cpp +++ b/Source/DepthUtils/DepthUtilsImpl.cpp @@ -262,47 +262,33 @@ XnStatus DepthUtilsImpl::TranslateSinglePixel(XnUInt32 x, XnUInt32 y, unsigned s ///////////////////////////////////// - XnDouble fullXRes; + XnDouble fullXRes = m_colorResolution.x; XnDouble fullYRes; XnBool bCrop = FALSE; - // if color aspect ratio is different from depth one, assume it's cropped - if (m_colorResolution.x * m_depthResolution.y < m_colorResolution.y * m_depthResolution.x) + if ((9 * m_colorResolution.x / m_colorResolution.y) == 16) { - fullXRes = m_colorResolution.x; - fullYRes = fullXRes * m_depthResolution.y / m_depthResolution.x; - bCrop = TRUE; - } - else if (m_colorResolution.x * m_depthResolution.y > m_colorResolution.y * m_depthResolution.x) - { - fullYRes = m_colorResolution.y; - fullXRes = fullYRes * m_depthResolution.x / m_depthResolution.y; + fullYRes = m_colorResolution.x * 4 / 5; bCrop = TRUE; } else { - fullXRes = m_colorResolution.x; fullYRes = m_colorResolution.y; bCrop = FALSE; } - // inflate translated pixel from current resolution into full one + // inflate to full res imageX = (XnUInt32)(fullXRes / m_depthResolution.x * imageX); imageY = (XnUInt32)(fullYRes / m_depthResolution.y * imageY); if (bCrop) { // crop from center - imageY += (XnUInt32)(m_colorResolution.y - fullYRes)/2; + imageY -= (XnUInt32)(fullYRes - m_colorResolution.y)/2; if (imageY > (XnUInt32)m_colorResolution.y) { return XN_STATUS_BAD_PARAM; } - imageX += (XnUInt32)(m_colorResolution.x - fullXRes)/2; - if (imageX > (XnUInt32)m_colorResolution.x) - { - return XN_STATUS_BAD_PARAM; - } } return XN_STATUS_OK; diff --git a/Source/Drivers/OniFile/PlayerDevice.cpp b/Source/Drivers/OniFile/PlayerDevice.cpp index c79efd8b..597858c3 100644 --- a/Source/Drivers/OniFile/PlayerDevice.cpp +++ b/Source/Drivers/OniFile/PlayerDevice.cpp @@ -93,7 +93,7 @@ static PS1080Property PS1080PropertyList[] = PlayerDevice::PlayerDevice(const xnl::String& filePath) : m_filePath(filePath), m_fileHandle(0), m_threadHandle(NULL), m_running(FALSE), m_isSeeking(FALSE), m_dPlaybackSpeed(1.0), m_nStartTimestamp(0), m_nStartTime(0), m_bHasTimeReference(FALSE), - m_bRepeat(TRUE), m_player(filePath.Data()), m_driverEOFCallback(NULL), m_driverCookie(NULL) + m_bRepeat(TRUE), m_player(filePath.Data()), m_driverEOFCallback(NULL), m_driverCookie(NULL), m_bStreamsLocked(FALSE) { // Create the events. m_readyForDataInternalEvent.Create(FALSE); @@ -525,6 +525,20 @@ void PlayerDevice::SleepToTimestamp(XnUInt64 nTimeStamp) } } +void PlayerDevice::LockStreams(bool toLock) +{ + for (StreamList::Iterator iter = m_streams.Begin(); iter != m_streams.End(); iter++) + { + PlayerStream* pStream = *iter; + if(toLock) + pStream->Lock(); + else + pStream->Unlock(); + } + + m_bStreamsLocked = toLock; +} + void PlayerDevice::MainLoop() { m_running = true; @@ -999,6 +1013,10 @@ XnStatus XN_CALLBACK_TYPE PlayerDevice::OnNodeNewData(void* pCookie, const XnCha { if (ready) { + // If we have locked streams (due to reset), unlock them. + if(pThis->m_bStreamsLocked) + pThis->LockStreams(false); + // Check if waiting for manual trigger (playback speed is zero). if (pThis->m_dPlaybackSpeed == XN_PLAYBACK_SPEED_MANUAL) { @@ -1046,6 +1064,11 @@ void XN_CALLBACK_TYPE PlayerDevice::OnEndOfFileReached(void* pCookie) { pThis->TriggerDriverEOFCallback(); } + //Lock the streams until new data will arrive + else + { + pThis->LockStreams(true); + } } XnStatus PlayerDevice::AddPrivateProperty(PlayerSource* pSource, const XnChar* strPropName, XnUInt32 nBufferSize, const void* pBuffer) diff --git a/Source/Drivers/OniFile/PlayerDevice.h b/Source/Drivers/OniFile/PlayerDevice.h index 2bcba8ed..4c97a310 100644 --- a/Source/Drivers/OniFile/PlayerDevice.h +++ b/Source/Drivers/OniFile/PlayerDevice.h @@ -102,6 +102,8 @@ class PlayerDevice : public oni::driver::DeviceBase } Seek; void MainLoop(); + void LockStreams(bool toLock); + static XN_THREAD_PROC ThreadProc(XN_THREAD_PARAM pThreadParam); static void ONI_CALLBACK_TYPE ReadyForDataCallback(const PlayerStream::ReadyForDataEventArgs& newDataEventArgs, void* pCookie); @@ -176,6 +178,7 @@ class PlayerDevice : public oni::driver::DeviceBase // List of streams. typedef xnl::List StreamList; StreamList m_streams; + bool m_bStreamsLocked; // Internal event for stream ready for data. xnl::OSEvent m_readyForDataInternalEvent; diff --git a/Source/Drivers/OniFile/PlayerStream.cpp b/Source/Drivers/OniFile/PlayerStream.cpp index 9803f556..265cd274 100644 --- a/Source/Drivers/OniFile/PlayerStream.cpp +++ b/Source/Drivers/OniFile/PlayerStream.cpp @@ -246,4 +246,14 @@ int PlayerStream::getRequiredFrameSize() return requiredFrameSize; } +void PlayerStream::Lock() +{ + m_cs.Lock(); +} + +void PlayerStream::Unlock() +{ + m_cs.Unlock(); +} + } // namespace oni_files_player diff --git a/Source/Drivers/OniFile/PlayerStream.h b/Source/Drivers/OniFile/PlayerStream.h index e8e36c95..5d2d7164 100644 --- a/Source/Drivers/OniFile/PlayerStream.h +++ b/Source/Drivers/OniFile/PlayerStream.h @@ -99,6 +99,10 @@ class PlayerStream : public oni::driver::StreamBase // Unregister from 'destroy' event. void UnregisterDestroyEvent(OniCallbackHandle handle); + //Used to prevent any access to the stream while it is being modified externally (by a device, for example) + void Lock(); + void Unlock(); + private: void destroy(); diff --git a/Source/Drivers/PSLink/PSLinkConsole/PSLinkConsole.cpp b/Source/Drivers/PSLink/PSLinkConsole/PSLinkConsole.cpp index 4e76193e..922cfe6f 100644 --- a/Source/Drivers/PSLink/PSLinkConsole/PSLinkConsole.cpp +++ b/Source/Drivers/PSLink/PSLinkConsole/PSLinkConsole.cpp @@ -268,8 +268,20 @@ const char* fwVideoModeToString(XnFwStreamVideoMode videoMode) //--------------------------------------------------------------------------- // Framework //--------------------------------------------------------------------------- -void RunCommand(int argc, const char* argv[]) +void RunCommand(XnChar* strCmdLine) { + enum {CMD_MAX_ARGS = 256}; + const char* argv[CMD_MAX_ARGS] = {NULL}; + int argc = CMD_MAX_ARGS; + + SplitStr(strCmdLine, argv, &argc); + + if (argc == 0) + { + //Ignore empty lines + return; + } + char commandName[XN_FILE_MAX_PATH]; xnOSStrCopy(commandName, argv[0], sizeof(commandName)); @@ -291,23 +303,6 @@ void RunCommand(int argc, const char* argv[]) command.handler(argc, argv); } -void RunCommand(XnChar* strCmdLine) -{ - enum {CMD_MAX_ARGS = 256}; - const char* argv[CMD_MAX_ARGS] = {NULL}; - int argc = CMD_MAX_ARGS; - - SplitStr(strCmdLine, argv, &argc); - - if (argc == 0) - { - //Ignore empty lines - return; - } - - RunCommand(argc, argv); -} - void ExecuteCommandsFromStream(FILE* pStream, XnBool bPrompt) { XnChar strCmdLine[1024]; @@ -1549,8 +1544,7 @@ int main(int argc, char* argv[]) Status nRetVal = STATUS_OK; const XnChar* strScriptFile = NULL; XnUInt16 nProductID = 0; - const char** commandArgv = NULL; - int commandArgc = 0; + XnBool bQuit = FALSE; // printf("PSLinkConsole version %s\n", XN_PS_VERSION_STRING); @@ -1572,8 +1566,11 @@ int main(int argc, char* argv[]) else if (xnOSStrCaseCmp(argv[nArgIndex], "-help") == 0) { printf("USAGE\n"); - printf("\t%s [-product ] [-script ] [-help] [command]\n", argv[0]); + printf("\t%s [-transport ] [-product ] [-script ] [-help]\n", argv[0]); printf("OPTIONS\n"); + printf("\t-transport \n"); + printf("\t\tOpen a device from a specific transport, either USB or from a specific IP and port number.\n"); + printf("\t\tWhen omitted, USB will be used.\n"); printf("\t-product \n"); printf("\t\tOpen only devices with a specific product ID. By default, any device can be opened.\n"); printf("\t-script \n"); @@ -1590,9 +1587,8 @@ int main(int argc, char* argv[]) } else { - commandArgc = argc - nArgIndex; - commandArgv = (const char**)(argv + nArgIndex); - break; + printf("Unknown option: %s\n. Run %s -help for usage.\n", argv[nArgIndex], argv[0]); + return -1; } } @@ -1661,18 +1657,14 @@ int main(int argc, char* argv[]) return -5; } - return 0; - } - else if (commandArgc != 0) - { - RunCommand(commandArgc, commandArgv); - return 0; - } - else - { - ExecuteCommandsFromStream(stdin, TRUE); + if (bQuit) + { + return 0; + } } + ExecuteCommandsFromStream(stdin, TRUE); + g_device.close(); OpenNI::shutdown(); diff --git a/Source/Tools/NiViewer/Device.cpp b/Source/Tools/NiViewer/Device.cpp index 28cbfeec..b1abdacc 100644 --- a/Source/Tools/NiViewer/Device.cpp +++ b/Source/Tools/NiViewer/Device.cpp @@ -147,7 +147,7 @@ int openStream(openni::Device& device, const char* name, openni::SensorType sens nRetVal = stream.start(); if (nRetVal != openni::STATUS_OK) { - stream.destroy(); + g_depthStream.destroy(); if (openType == SENSOR_ON) { diff --git a/ThirdParty/PSCommon/BuildSystem/CommonJavaMakefile b/ThirdParty/PSCommon/BuildSystem/CommonJavaMakefile index 15cdfbbd..b1e6140c 100644 --- a/ThirdParty/PSCommon/BuildSystem/CommonJavaMakefile +++ b/ThirdParty/PSCommon/BuildSystem/CommonJavaMakefile @@ -15,9 +15,9 @@ ############################################################################# # take this file's dir -COMMON_JAVA_MAKE_FILE_DIR = $(dir $(lastword $(MAKEFILE_LIST))) +COMMON_CS_MAKE_FILE_DIR = $(dir $(lastword $(MAKEFILE_LIST))) -include $(COMMON_JAVA_MAKE_FILE_DIR)CommonDefs.mak +include $(COMMON_CS_MAKE_FILE_DIR)CommonDefs.mak nullstring := space := $(nullstring) # end of the line @@ -57,20 +57,23 @@ endif ############################################################################# # Targets ############################################################################# -include $(COMMON_JAVA_MAKE_FILE_DIR)CommonTargets.mak +include $(COMMON_CS_MAKE_FILE_DIR)CommonTargets.mak .PHONY: clean-manifest clean-int # Final output file -$(OUTPUT_FILE): $(SRC_FILES_LIST) | $(OUT_DIR) $(INT_DIR) +$(OUTPUT_FILE): | $(INT_DIR) javac $(USED_JARS_OPTION) -d $(INT_DIR) $(SRC_FILES) $(JAR_MANIFEST_CREATE_COMMAND) jar $(JAR_OPTIONS) $@ $(MANIFEST_FILE) -C $(INT_DIR) . $(CREATE_SHORTCUT) +clean-manifest: + rm -rf $(MANIFEST_FILE) + clean-int: rm -rf $(INT_DIR) -clean: clean-int +clean: clean-manifest clean-int diff --git a/ThirdParty/PSCommon/XnLib/Include/XnThreadSafeQueue.h b/ThirdParty/PSCommon/XnLib/Include/XnThreadSafeQueue.h deleted file mode 100644 index e1fe4223..00000000 --- a/ThirdParty/PSCommon/XnLib/Include/XnThreadSafeQueue.h +++ /dev/null @@ -1,79 +0,0 @@ -/***************************************************************************** -* * -* PrimeSense PSCommon Library * -* Copyright (C) 2012 PrimeSense Ltd. * -* * -* This file is part of PSCommon. * -* * -* Licensed under the Apache License, Version 2.0 (the "License"); * -* you may not use this file except in compliance with the License. * -* You may obtain a copy of the License at * -* * -* http://www.apache.org/licenses/LICENSE-2.0 * -* * -* Unless required by applicable law or agreed to in writing, software * -* distributed under the License is distributed on an "AS IS" BASIS, * -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * -* See the License for the specific language governing permissions and * -* limitations under the License. * -* * -*****************************************************************************/ -#ifndef _XN_THREAD_SAFE_QUEUE_H_ -#define _XN_THREAD_SAFE_QUEUE_H_ - -#include "XnQueue.h" -#include "XnOSCpp.h" - -namespace xnl -{ -template > -class ThreadSafeQueue : protected Queue -{ -public: - typedef Queue Base; - - ThreadSafeQueue() : Base() {} - ThreadSafeQueue(const Queue& other) : Base() - { - *this = other; - } - ThreadSafeQueue& operator=(const ThreadSafeQueue& other) - { - Base::operator=(other); - return *this; - } - ~ThreadSafeQueue() {} - - XnStatus Push(const T& value) - { - XnStatus rc = XN_STATUS_OK; - m_cs.Lock(); - rc = Base::Push(value); - m_cs.Unlock(); - return rc; - } - XnStatus Pop(T& value) - { - XnStatus rc = XN_STATUS_OK; - m_cs.Lock(); - rc = Base::Pop(value); - m_cs.Unlock(); - return rc; - } - XnUInt32 Size() const - { - m_cs.Lock(); - XnUInt32 size = Base::Size(); - m_cs.Unlock(); - return size; - } - - using Base::IsEmpty; -protected: - CriticalSection m_cs; -}; - -} // xnl - - -#endif // _XN_THREAD_SAFE_QUEUE_H_ diff --git a/ThirdParty/PSCommon/XnLib/Source/Linux/XnLinuxTime.cpp b/ThirdParty/PSCommon/XnLib/Source/Linux/XnLinuxTime.cpp index 75f5b8d8..678df9e7 100644 --- a/ThirdParty/PSCommon/XnLib/Source/Linux/XnLinuxTime.cpp +++ b/ThirdParty/PSCommon/XnLib/Source/Linux/XnLinuxTime.cpp @@ -143,10 +143,6 @@ XN_C_API XnStatus xnOSQueryTimer(XnOSTimer Timer, XnUInt64* pnTimeSinceStart) } *pnTimeSinceStart = ((now.tv_sec - Timer.tStartTime.tv_sec) * 1E6 + (now.tv_nsec - Timer.tStartTime.tv_nsec) / 1E3); - if (!Timer.bHighRes) - { - *pnTimeSinceStart /= 1000; - } return XN_STATUS_OK; } diff --git a/Wrappers/java/OpenNI.java/src/org/openni/VideoFrameRef.java b/Wrappers/java/OpenNI.java/src/org/openni/VideoFrameRef.java index 9cc07523..7545ced3 100644 --- a/Wrappers/java/OpenNI.java/src/org/openni/VideoFrameRef.java +++ b/Wrappers/java/OpenNI.java/src/org/openni/VideoFrameRef.java @@ -167,7 +167,6 @@ protected void finalize() throws Throwable { } private VideoFrameRef(long handle) { - NativeMethods.oniFrameAddRef(handle); mFrameHandle = handle; } diff --git a/Wrappers/java/OpenNI.jni/org_openni_NativeMethods.cpp b/Wrappers/java/OpenNI.jni/org_openni_NativeMethods.cpp index 63aa9f20..9e731c98 100644 --- a/Wrappers/java/OpenNI.jni/org_openni_NativeMethods.cpp +++ b/Wrappers/java/OpenNI.jni/org_openni_NativeMethods.cpp @@ -216,13 +216,9 @@ JNIEXPORT jint JNICALL Java_org_openni_NativeMethods_oniStreamReadFrame fieldID = env->GetFieldID(videoFrameRefCls, "mVideoMode", "Lorg/openni/VideoMode;"); env->SetObjectField(videoFrameRefObj,fieldID, videoModeObj); SetOutArgObjectValue(env, outArgObj, videoFrameRefObj); - - // release this frame. The java object is its own now. - oniFrameRelease(pOniFrame); } - - return status; + } From de66e9207d9cef1829ddc2b91066a97288d464ce Mon Sep 17 00:00:00 2001 From: "mark.sandler" Date: Wed, 12 Jun 2013 14:47:31 +0300 Subject: [PATCH 005/188] Submodule update --- .../PSCommon/BuildSystem/CommonJavaMakefile | 13 ++- .../XnLib/Include/XnThreadSafeQueue.h | 79 +++++++++++++++++++ .../XnLib/Source/Linux/XnLinuxINI.cpp | 4 +- 3 files changed, 86 insertions(+), 10 deletions(-) create mode 100644 ThirdParty/PSCommon/XnLib/Include/XnThreadSafeQueue.h diff --git a/ThirdParty/PSCommon/BuildSystem/CommonJavaMakefile b/ThirdParty/PSCommon/BuildSystem/CommonJavaMakefile index b1e6140c..15cdfbbd 100644 --- a/ThirdParty/PSCommon/BuildSystem/CommonJavaMakefile +++ b/ThirdParty/PSCommon/BuildSystem/CommonJavaMakefile @@ -15,9 +15,9 @@ ############################################################################# # take this file's dir -COMMON_CS_MAKE_FILE_DIR = $(dir $(lastword $(MAKEFILE_LIST))) +COMMON_JAVA_MAKE_FILE_DIR = $(dir $(lastword $(MAKEFILE_LIST))) -include $(COMMON_CS_MAKE_FILE_DIR)CommonDefs.mak +include $(COMMON_JAVA_MAKE_FILE_DIR)CommonDefs.mak nullstring := space := $(nullstring) # end of the line @@ -57,23 +57,20 @@ endif ############################################################################# # Targets ############################################################################# -include $(COMMON_CS_MAKE_FILE_DIR)CommonTargets.mak +include $(COMMON_JAVA_MAKE_FILE_DIR)CommonTargets.mak .PHONY: clean-manifest clean-int # Final output file -$(OUTPUT_FILE): | $(INT_DIR) +$(OUTPUT_FILE): $(SRC_FILES_LIST) | $(OUT_DIR) $(INT_DIR) javac $(USED_JARS_OPTION) -d $(INT_DIR) $(SRC_FILES) $(JAR_MANIFEST_CREATE_COMMAND) jar $(JAR_OPTIONS) $@ $(MANIFEST_FILE) -C $(INT_DIR) . $(CREATE_SHORTCUT) -clean-manifest: - rm -rf $(MANIFEST_FILE) - clean-int: rm -rf $(INT_DIR) -clean: clean-manifest clean-int +clean: clean-int diff --git a/ThirdParty/PSCommon/XnLib/Include/XnThreadSafeQueue.h b/ThirdParty/PSCommon/XnLib/Include/XnThreadSafeQueue.h new file mode 100644 index 00000000..e1fe4223 --- /dev/null +++ b/ThirdParty/PSCommon/XnLib/Include/XnThreadSafeQueue.h @@ -0,0 +1,79 @@ +/***************************************************************************** +* * +* PrimeSense PSCommon Library * +* Copyright (C) 2012 PrimeSense Ltd. * +* * +* This file is part of PSCommon. * +* * +* Licensed under the Apache License, Version 2.0 (the "License"); * +* you may not use this file except in compliance with the License. * +* You may obtain a copy of the License at * +* * +* http://www.apache.org/licenses/LICENSE-2.0 * +* * +* Unless required by applicable law or agreed to in writing, software * +* distributed under the License is distributed on an "AS IS" BASIS, * +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * +* See the License for the specific language governing permissions and * +* limitations under the License. * +* * +*****************************************************************************/ +#ifndef _XN_THREAD_SAFE_QUEUE_H_ +#define _XN_THREAD_SAFE_QUEUE_H_ + +#include "XnQueue.h" +#include "XnOSCpp.h" + +namespace xnl +{ +template > +class ThreadSafeQueue : protected Queue +{ +public: + typedef Queue Base; + + ThreadSafeQueue() : Base() {} + ThreadSafeQueue(const Queue& other) : Base() + { + *this = other; + } + ThreadSafeQueue& operator=(const ThreadSafeQueue& other) + { + Base::operator=(other); + return *this; + } + ~ThreadSafeQueue() {} + + XnStatus Push(const T& value) + { + XnStatus rc = XN_STATUS_OK; + m_cs.Lock(); + rc = Base::Push(value); + m_cs.Unlock(); + return rc; + } + XnStatus Pop(T& value) + { + XnStatus rc = XN_STATUS_OK; + m_cs.Lock(); + rc = Base::Pop(value); + m_cs.Unlock(); + return rc; + } + XnUInt32 Size() const + { + m_cs.Lock(); + XnUInt32 size = Base::Size(); + m_cs.Unlock(); + return size; + } + + using Base::IsEmpty; +protected: + CriticalSection m_cs; +}; + +} // xnl + + +#endif // _XN_THREAD_SAFE_QUEUE_H_ diff --git a/ThirdParty/PSCommon/XnLib/Source/Linux/XnLinuxINI.cpp b/ThirdParty/PSCommon/XnLib/Source/Linux/XnLinuxINI.cpp index b686db18..e51571b7 100644 --- a/ThirdParty/PSCommon/XnLib/Source/Linux/XnLinuxINI.cpp +++ b/ThirdParty/PSCommon/XnLib/Source/Linux/XnLinuxINI.cpp @@ -26,8 +26,8 @@ #define XN_READ_IXN_BUFFER_SIZE 10*1024 -#define XN_IS_SPACE(p) (*p == ' ' || *p == '\t') -#define XN_IS_NEWLINE(p) (*p == '\r' || *p == '\n') +#define XN_IS_SPACE(p) (*(p) == ' ' || *(p) == '\t') +#define XN_IS_NEWLINE(p) (*(p) == '\r' || *(p) == '\n') #define XN_SKIP_LINE(p) \ /* first read till end of line. */ \ From 623da2ae89cee7bce44b9e6b09bc0407eb627424 Mon Sep 17 00:00:00 2001 From: "mark.sandler" Date: Wed, 12 Jun 2013 14:48:25 +0300 Subject: [PATCH 006/188] Merge branch 'develop' of ssh://git/localhome/GIT/Software/OpenNI2 into develop --- CHANGES.txt | 4 +- Include/OniCEnums.h | 8 +- Include/OniCTypes.h | 87 +++++++-------- Include/OniVersion.h | 2 +- Include/OpenNI.h | 59 ++++++++-- Packaging/Harvest.py | 102 +++++++++++++++--- Packaging/Install/Includes/Variables.wxi | 2 +- Packaging/UpdateVersion.py | 2 +- ReleaseNotes.txt | 4 +- .../Samples/SimpleViewer/SimpleViewer.java | 4 +- Source/Tools/NiViewer/Device.cpp | 2 +- .../src/org/openni/VideoFrameRef.java | 1 + .../OpenNI.jni/org_openni_NativeMethods.cpp | 6 +- 13 files changed, 196 insertions(+), 87 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 66efcd8f..697e6908 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -11,11 +11,13 @@ OpenNI 2.2.0: - Add support for Capri devkits - Added tools: PS1080Console and PSLinkConsole (for debugging purposes) - Drivers and INI files path resolution based on the shared library location (merge pull request #7. See https://github.com/OpenNI/OpenNI2/pull/7 for details. Thanks to Tomoto) - - NiViewer: Allow choosing which streams to open (run "NiViewer --help" for details) + - NiViewer: Allow choosing which streams to open (run "NiViewer --help" for details). + - NiViewer: add support for seeking to a specific frame in a recording. Use the ':' key. - Image registration support for Kinect driver (merge pull request #4. See https://github.com/OpenNI/OpenNI2/pull/4 for details. Thanks to Tomoto) - Completely re-wrote frame buffers management. - Added API for replacing frame buffer allocator. - Linux: implement connect/disconnect events + - All samples are now self-contained and can be copied anywhere. In addition, compiling a sample does *not* overwrite the original precompiled binary. - PS1080: IR stream now also supports RGB888 - PS1080: improved hardware name detection - PS1080: Add NESA unlimited to BIST diff --git a/Include/OniCEnums.h b/Include/OniCEnums.h index affce9a1..d7f513b8 100644 --- a/Include/OniCEnums.h +++ b/Include/OniCEnums.h @@ -75,8 +75,10 @@ typedef enum ONI_IMAGE_REGISTRATION_DEPTH_TO_COLOR = 1, } OniImageRegistrationMode; -static const int ONI_TIMEOUT_NONE = 0; -static const int ONI_TIMEOUT_FOREVER = -1; - +enum +{ + ONI_TIMEOUT_NONE = 0, + ONI_TIMEOUT_FOREVER = -1, +}; #endif // _ONI_C_ENUMS_H_ diff --git a/Include/OniCTypes.h b/Include/OniCTypes.h index 00ff71ee..12246949 100644 --- a/Include/OniCTypes.h +++ b/Include/OniCTypes.h @@ -40,21 +40,18 @@ typedef int OniBool; struct OniCallbackHandleImpl; typedef struct OniCallbackHandleImpl* OniCallbackHandle; -#define _ONI_DECLARE_VERSION(name) \ -/** Holds an OpenNI version number, which consists of four separate numbers in the format: @c major.minor.maintenance.build. For example: 2.0.0.20. */ \ -typedef struct \ -{ \ - /** Major version number, incremented for major API restructuring. */ \ - int major; \ - /** Minor version number, incremented when signficant new features added. */ \ - int minor; \ - /** Mainenance build number, incremented for new releases that primarily provide minor bug fixes. */ \ - int maintenance; \ - /** Build number. Incremented for each new API build. Generally not shown on the installer and download site. */ \ - int build; \ -} name; - -_ONI_DECLARE_VERSION(OniVersion); +/** Holds an OpenNI version number, which consists of four separate numbers in the format: @c major.minor.maintenance.build. For example: 2.0.0.20. */ +typedef struct +{ + /** Major version number, incremented for major API restructuring. */ + int major; + /** Minor version number, incremented when significant new features added. */ + int minor; + /** Maintenance build number, incremented for new releases that primarily provide minor bug fixes. */ + int maintenance; + /** Build number. Incremented for each new API build. Generally not shown on the installer and download site. */ + int build; +} OniVersion; typedef int OniHardwareVersion; @@ -157,39 +154,33 @@ typedef uint8_t OniGrayscale8Pixel; #pragma pack (push, 1) -#define _ONI_DECLARE_RGB888_PIXEL(name) \ -/** Holds the value of a single color image pixel in 24-bit RGB format. */ \ -typedef struct \ -{ \ - /* Red value of this pixel. */ \ - uint8_t r; \ - /* Green value of this pixel. */ \ - uint8_t g; \ - /* Blue value of this pixel. */ \ - uint8_t b; \ -} name; - -_ONI_DECLARE_RGB888_PIXEL(OniRGB888Pixel) - -#define _ONI_DECLARE_YUV422_PIXEL(name) \ -/** \ - Holds the value of two pixels in YUV422 format (Luminance/Chrominance,16-bits/pixel). \ - The first pixel has the values y1, u, v. \ - The second pixel has the values y2, u, v. \ -*/ \ -typedef struct \ -{ \ - /** First chrominance value for two pixels, stored as blue luminance difference signal. */ \ - uint8_t u; \ - /** Overall luminance value of first pixel. */ \ - uint8_t y1; \ - /** Second chrominance value for two pixels, stored as red luminance difference signal. */ \ - uint8_t v; \ - /** Overall luminance value of second pixel. */ \ - uint8_t y2; \ -} name; - -_ONI_DECLARE_YUV422_PIXEL(OniYUV422DoublePixel) +/** Holds the value of a single color image pixel in 24-bit RGB format. */ +typedef struct +{ + /* Red value of this pixel. */ + uint8_t r; + /* Green value of this pixel. */ + uint8_t g; + /* Blue value of this pixel. */ + uint8_t b; +} OniRGB888Pixel; + +/** + Holds the value of two pixels in YUV422 format (Luminance/Chrominance,16-bits/pixel). + The first pixel has the values y1, u, v. + The second pixel has the values y2, u, v. +*/ +typedef struct +{ + /** First chrominance value for two pixels, stored as blue luminance difference signal. */ + uint8_t u; + /** Overall luminance value of first pixel. */ + uint8_t y1; + /** Second chrominance value for two pixels, stored as red luminance difference signal. */ + uint8_t v; + /** Overall luminance value of second pixel. */ + uint8_t y2; +} OniYUV422DoublePixel; #pragma pack (pop) diff --git a/Include/OniVersion.h b/Include/OniVersion.h index 112eb728..699bf505 100644 --- a/Include/OniVersion.h +++ b/Include/OniVersion.h @@ -23,7 +23,7 @@ #define ONI_VERSION_MAJOR 2 #define ONI_VERSION_MINOR 2 #define ONI_VERSION_MAINTENANCE 0 -#define ONI_VERSION_BUILD 23 +#define ONI_VERSION_BUILD 29 /** OpenNI version (in brief string format): "Major.Minor.Maintenance (Build)" */ #define ONI_BRIEF_VERSION_STRING \ diff --git a/Include/OpenNI.h b/Include/OpenNI.h index 58298427..893d0ffa 100644 --- a/Include/OpenNI.h +++ b/Include/OpenNI.h @@ -36,13 +36,51 @@ namespace openni /** Pixel type used to store depth images. */ typedef uint16_t DepthPixel; + /** Pixel type used to store IR images. */ typedef uint16_t Grayscale16Pixel; // structs -_ONI_DECLARE_VERSION(Version); -_ONI_DECLARE_RGB888_PIXEL(RGB888Pixel); -_ONI_DECLARE_YUV422_PIXEL(YUV422DoublePixel); +/** Holds an OpenNI version number, which consists of four separate numbers in the format: @c major.minor.maintenance.build. For example: 2.0.0.20. */ +typedef struct +{ + /** Major version number, incremented for major API restructuring. */ + int major; + /** Minor version number, incremented when significant new features added. */ + int minor; + /** Maintenance build number, incremented for new releases that primarily provide minor bug fixes. */ + int maintenance; + /** Build number. Incremented for each new API build. Generally not shown on the installer and download site. */ + int build; +} Version; + +/** Holds the value of a single color image pixel in 24-bit RGB format. */ +typedef struct +{ + /* Red value of this pixel. */ + uint8_t r; + /* Green value of this pixel. */ + uint8_t g; + /* Blue value of this pixel. */ + uint8_t b; +} RGB888Pixel; + +/** + Holds the value of two pixels in YUV422 format (Luminance/Chrominance,16-bits/pixel). + The first pixel has the values y1, u, v. + The second pixel has the values y2, u, v. +*/ +typedef struct +{ + /** First chrominance value for two pixels, stored as blue luminance difference signal. */ + uint8_t u; + /** Overall luminance value of first pixel. */ + uint8_t y1; + /** Second chrominance value for two pixels, stored as red luminance difference signal. */ + uint8_t v; + /** Overall luminance value of second pixel. */ + uint8_t y2; +} YUV422DoublePixel; /** This special URI can be passed to @ref Device::open() when the application has no concern for a specific device. */ #if ONI_PLATFORM != ONI_PLATFORM_WIN32 @@ -2075,14 +2113,13 @@ class OpenNI */ static Version getVersion() { - OniVersion version = oniGetVersion(); - union - { - OniVersion* pC; - Version* pCpp; - } a; - a.pC = &version; - return *a.pCpp; + OniVersion oniVersion = oniGetVersion(); + Version version; + version.major = oniVersion.major; + version.minor = oniVersion.minor; + version.maintenance = oniVersion.maintenance; + version.build = oniVersion.build; + return version; } /** diff --git a/Packaging/Harvest.py b/Packaging/Harvest.py index 31c38390..2feb02d9 100755 --- a/Packaging/Harvest.py +++ b/Packaging/Harvest.py @@ -26,6 +26,7 @@ import shutil import platform import stat +import xml.dom.minidom class Harvest: def __init__(self, rootDir, outDir, arch): @@ -123,7 +124,10 @@ def copySample(self, samplesDir, name, isLibrary = False, isGL = False, isJava = shutil.copytree(os.path.join(self.rootDir, 'ThirdParty', 'GL', 'GL'), os.path.join(sampleTargetDir, 'GL')) shutil.copytree(os.path.join(self.rootDir, 'ThirdParty', 'GL', 'glh'), os.path.join(sampleTargetDir, 'glh')) # and lib - shutil.copy(os.path.join(self.rootDir, 'ThirdParty', 'GL', 'glut' + self.glutSuffix + '.lib'), sampleTargetDir) + shutil.copy(os.path.join(self.rootDir, 'ThirdParty', 'GL', 'glut32.lib'), sampleTargetDir) + shutil.copy(os.path.join(self.rootDir, 'ThirdParty', 'GL', 'glut64.lib'), sampleTargetDir) + shutil.copy(os.path.join(self.rootDir, 'ThirdParty', 'GL', 'glut32.dll'), sampleTargetDir) + shutil.copy(os.path.join(self.rootDir, 'ThirdParty', 'GL', 'glut64.dll'), sampleTargetDir) # and project file / makefile if self.osName == 'Windows': @@ -131,21 +135,75 @@ def copySample(self, samplesDir, name, isLibrary = False, isGL = False, isJava = shutil.copy(os.path.join(sampleSourceDir, 'Build.bat'), sampleTargetDir) shutil.copy(os.path.join(self.rootDir, 'ThirdParty', 'PSCommon', 'BuildSystem', 'BuildJavaWindows.py'), sampleTargetDir) # fix call - self.regxReplace(r'..\\\\..\\\\ThirdParty\\\\PSCommon\\\\BuildSystem\\\\', '', os.path.join(sampleTargetDir, 'Build.bat')) + buildFile = open(os.path.join(sampleTargetDir, 'Build.bat')) + buildScript = buildFile.read() + buildFile.close() + + buildScript = re.sub('..\\\\..\\\\ThirdParty\\\\PSCommon\\\\BuildSystem\\\\', '', buildScript) + buildScript = re.sub('..\\\\..\\\\Bin', 'Bin', buildScript) + + buildFile = open(os.path.join(sampleTargetDir, 'Build.bat'), 'w') + buildFile.write('@echo off\n') + buildFile.write('IF "%1"=="x64" (\n') + buildFile.write('\txcopy /D /S /F /Y "%OPENNI2_REDIST64%\\*" "Bin\\x64-Release\\"\n') + buildFile.write(') ELSE (\n') + buildFile.write('\txcopy /D /S /F /Y "%OPENNI2_REDIST%\\*" "Bin\\Win32-Release\\"\n') + buildFile.write(')\n') + buildFile.write(buildScript) + buildFile.close() + else: shutil.copy(os.path.join(sampleSourceDir, name + '.vcxproj'), sampleTargetDir) - # fix output dir - self.regxReplace('\$\(SolutionDir\)Bin\\\\\$\(Platform\)-\$\(Configuration\)', '$(ProjectDir)..\\Bin', os.path.join(sampleTargetDir, name + '.vcxproj')) - # fix intermediate dir - self.regxReplace('\$\(SolutionDir\)Bin', '$(ProjectDir)..\\Bin', os.path.join(sampleTargetDir, name + '.vcxproj')) - # fix OpenNI include dir - self.regxReplace('..\\\\..\\\\Include', '$(OPENNI2_INCLUDE' + self.platformSuffix + ')', os.path.join(sampleTargetDir, name + '.vcxproj')) - # fix GL include dir - self.regxReplace('..\\\\..\\\\ThirdParty\\\\GL', '.', os.path.join(sampleTargetDir, name + '.vcxproj')) - # fix Common include dir - self.regxReplace('..\\\\Common', '.', os.path.join(sampleTargetDir, name + '.vcxproj')) - # fix library dir - self.regxReplace('\$\(OutDir\)', '$(OutDir);$(OPENNI2_LIB' + self.platformSuffix + ')', os.path.join(sampleTargetDir, name + '.vcxproj')) + projFile = os.path.join(sampleTargetDir, name + '.vcxproj') + #ET.register_namespace('', 'http://schemas.microsoft.com/developer/msbuild/2003') + doc = xml.dom.minidom.parse(projFile) + + # remove OutDir and IntDir (make them default) + for propertyGroup in doc.getElementsByTagName("PropertyGroup"): + if len(propertyGroup.getElementsByTagName("OutDir")) > 0: + propertyGroup.parentNode.removeChild(propertyGroup) + + for group in doc.getElementsByTagName("ItemDefinitionGroup"): + condAttr = group.getAttribute('Condition') + if condAttr.find('x64') != -1: + postfix = '64' + glPostfix = '64' + else: + postfix = '' + glPostfix = '32' + + incDirs = group.getElementsByTagName('ClCompile')[0].getElementsByTagName('AdditionalIncludeDirectories')[0] + val = incDirs.firstChild.data + + # fix GL include dir + val = re.sub('..\\\\..\\\\ThirdParty\\\\GL', r'.', val) + # fix Common include dir + val = re.sub('..\\\\Common', r'.', val) + # fix OpenNI include dir + val = re.sub('..\\\\..\\\\Include', '$(OPENNI2_INCLUDE' + postfix + ')', val) + + incDirs.firstChild.data = val + + # fix additional library directories + libDirs = group.getElementsByTagName('Link')[0].getElementsByTagName('AdditionalLibraryDirectories')[0] + val = libDirs.firstChild.data + val = re.sub('\$\(OutDir\)', '$(OutDir);$(OPENNI2_LIB' + postfix + ')', val) + libDirs.firstChild.data = val + + # add post-build event to copy OpenNI redist + post = doc.createElement('PostBuildEvent') + cmd = 'xcopy /D /S /F /Y "$(OPENNI2_REDIST' + postfix + ')\*" "$(OutDir)"\n' + if isGL: + cmd += 'xcopy /D /F /Y "$(ProjectDir)\\glut' + glPostfix + '.dll" "$(OutDir)"\n' + + cmdNode = doc.createElement('Command') + cmdNode.appendChild(doc.createTextNode(cmd)) + post.appendChild(cmdNode) + group.appendChild(post) + + proj = open(projFile, 'w') + proj.write(doc.toxml()) + proj.close() elif self.osName == 'Linux' or self.osName == 'Darwin': shutil.copy(os.path.join(sampleSourceDir, 'Makefile'), sampleTargetDir) @@ -158,8 +216,22 @@ def copySample(self, samplesDir, name, isLibrary = False, isGL = False, isJava = shutil.copy(os.path.join(rootDir, 'ThirdParty', 'PSCommon', 'BuildSystem', 'CommonJavaMakefile'), sampleTargetDir) else: shutil.copy(os.path.join(rootDir, 'ThirdParty', 'PSCommon', 'BuildSystem', 'CommonCppMakefile'), sampleTargetDir) - # fix includes + + # fix common makefiles path self.regxReplace('../../ThirdParty/PSCommon/BuildSystem/', '', os.path.join(sampleTargetDir, 'Makefile')) + + # fix BIN dir + self.regxReplace('BIN_DIR = ../../Bin', 'BIN_DIR = Bin', os.path.join(sampleTargetDir, 'Makefile')) + + # fix include dirs and copy openni_redist + add = r'INC_DIRS += $(OPENNI2_INCLUDE)\n\n' + add += r'include \1\n\n' + add += r'.PHONY: copy-redist\n' + add += r'copy-redist:\n' + add += r'\tcp -R $(OPENNI2_REDIST)/* $(OUT_DIR)\n' + add += r'$(OUTPUT_FILE): copy-redist' + + self.regxReplace(r'include (Common.*Makefile)', add, os.path.join(sampleTargetDir, 'Makefile')) # and executable if isJava: diff --git a/Packaging/Install/Includes/Variables.wxi b/Packaging/Install/Includes/Variables.wxi index 88394d52..67f177d5 100644 --- a/Packaging/Install/Includes/Variables.wxi +++ b/Packaging/Install/Includes/Variables.wxi @@ -8,7 +8,7 @@ - + diff --git a/Packaging/UpdateVersion.py b/Packaging/UpdateVersion.py index 76a87c0b..9efb3903 100755 --- a/Packaging/UpdateVersion.py +++ b/Packaging/UpdateVersion.py @@ -28,7 +28,7 @@ VERSION_MAJOR = 2 VERSION_MINOR = 2 VERSION_MAINTENANCE = 0 -VERSION_BUILD = 23 +VERSION_BUILD = 29 def getVersionString(): return str(VERSION_MAJOR) + "." + str(VERSION_MINOR) + "." + str(VERSION_MAINTENANCE) + "." + str(VERSION_BUILD) diff --git a/ReleaseNotes.txt b/ReleaseNotes.txt index 374ebbeb..076f37da 100644 --- a/ReleaseNotes.txt +++ b/ReleaseNotes.txt @@ -1,5 +1,5 @@ -OpenNI 2.2.0 Build 23 -June 1 2013 +OpenNI 2.2.0 Build 29 +June 9 2013 Minimum Requirements: --------------------- diff --git a/Samples/SimpleViewer.java/src/org/openni/Samples/SimpleViewer/SimpleViewer.java b/Samples/SimpleViewer.java/src/org/openni/Samples/SimpleViewer/SimpleViewer.java index 79936de1..3e674d1b 100644 --- a/Samples/SimpleViewer.java/src/org/openni/Samples/SimpleViewer/SimpleViewer.java +++ b/Samples/SimpleViewer.java/src/org/openni/Samples/SimpleViewer/SimpleViewer.java @@ -38,7 +38,7 @@ public void setStream(VideoStream videoStream) { } @Override - public void paint(Graphics g) { + public synchronized void paint(Graphics g) { if (mLastFrame == null) { return; } @@ -59,7 +59,7 @@ public void paint(Graphics g) { } @Override - public void onFrameReady(VideoStream stream) { + public synchronized void onFrameReady(VideoStream stream) { if (mLastFrame != null) { mLastFrame.release(); mLastFrame = null; diff --git a/Source/Tools/NiViewer/Device.cpp b/Source/Tools/NiViewer/Device.cpp index b1abdacc..28cbfeec 100644 --- a/Source/Tools/NiViewer/Device.cpp +++ b/Source/Tools/NiViewer/Device.cpp @@ -147,7 +147,7 @@ int openStream(openni::Device& device, const char* name, openni::SensorType sens nRetVal = stream.start(); if (nRetVal != openni::STATUS_OK) { - g_depthStream.destroy(); + stream.destroy(); if (openType == SENSOR_ON) { diff --git a/Wrappers/java/OpenNI.java/src/org/openni/VideoFrameRef.java b/Wrappers/java/OpenNI.java/src/org/openni/VideoFrameRef.java index 7545ced3..9cc07523 100644 --- a/Wrappers/java/OpenNI.java/src/org/openni/VideoFrameRef.java +++ b/Wrappers/java/OpenNI.java/src/org/openni/VideoFrameRef.java @@ -167,6 +167,7 @@ protected void finalize() throws Throwable { } private VideoFrameRef(long handle) { + NativeMethods.oniFrameAddRef(handle); mFrameHandle = handle; } diff --git a/Wrappers/java/OpenNI.jni/org_openni_NativeMethods.cpp b/Wrappers/java/OpenNI.jni/org_openni_NativeMethods.cpp index 9e731c98..63aa9f20 100644 --- a/Wrappers/java/OpenNI.jni/org_openni_NativeMethods.cpp +++ b/Wrappers/java/OpenNI.jni/org_openni_NativeMethods.cpp @@ -216,9 +216,13 @@ JNIEXPORT jint JNICALL Java_org_openni_NativeMethods_oniStreamReadFrame fieldID = env->GetFieldID(videoFrameRefCls, "mVideoMode", "Lorg/openni/VideoMode;"); env->SetObjectField(videoFrameRefObj,fieldID, videoModeObj); SetOutArgObjectValue(env, outArgObj, videoFrameRefObj); + + // release this frame. The java object is its own now. + oniFrameRelease(pOniFrame); } - return status; + + return status; } From b384024391bb065b5840eb8212df483af085a00b Mon Sep 17 00:00:00 2001 From: "mark.sandler" Date: Mon, 17 Jun 2013 15:45:24 +0300 Subject: [PATCH 007/188] Merge branch 'develop' of ssh://git/localhome/GIT/Software/OpenNI2 into develop --- Source/Core/OniFrameManager.cpp | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/Source/Core/OniFrameManager.cpp b/Source/Core/OniFrameManager.cpp index e47d36ce..0d450aa7 100644 --- a/Source/Core/OniFrameManager.cpp +++ b/Source/Core/OniFrameManager.cpp @@ -14,8 +14,29 @@ FrameManager::~FrameManager() OniFrameInternal* FrameManager::acquireFrame() { OniFrameInternal* pFrame = m_frames.Acquire(); - xnOSMemSet(pFrame, 0, sizeof(OniFrameInternal)); - pFrame->refCount = 1; + + // reset all fields + pFrame->dataSize = 0; + pFrame->data = NULL; + pFrame->sensorType = (OniSensorType)0; + pFrame->timestamp = 0; + pFrame->frameIndex = 0; + pFrame->width = 0; + pFrame->height = 0; + pFrame->videoMode.pixelFormat = (OniPixelFormat)0; + pFrame->videoMode.resolutionX = 0; + pFrame->videoMode.resolutionY = 0; + pFrame->videoMode.fps = 0; + pFrame->croppingEnabled = FALSE; + pFrame->cropOriginX = 0; + pFrame->cropOriginY = 0; + pFrame->stride = 0; + pFrame->backToPoolFunc = NULL; + pFrame->backToPoolFuncCookie = NULL; + pFrame->refCount = 1; // this is the only reference + pFrame->freeBufferFunc = NULL; + pFrame->freeBufferFuncCookie = NULL; + return pFrame; } From d8ae7671f309fbcac4ef3b4c88e18b96ef73eeba Mon Sep 17 00:00:00 2001 From: "mark.sandler" Date: Wed, 19 Jun 2013 16:49:58 +0300 Subject: [PATCH 008/188] Merge branch 'develop' of ssh://git/localhome/GIT/Software/OpenNI2 into develop --- Include/OniCTypes.h | 6 +++--- Include/OniVersion.h | 2 +- Packaging/Harvest.py | 24 +++++++++++++++++------- Packaging/Install/Includes/Variables.wxi | 2 +- Packaging/UpdateVersion.py | 2 +- ReleaseNotes.txt | 4 ++-- 6 files changed, 25 insertions(+), 15 deletions(-) diff --git a/Include/OniCTypes.h b/Include/OniCTypes.h index 12246949..076915b0 100644 --- a/Include/OniCTypes.h +++ b/Include/OniCTypes.h @@ -83,13 +83,13 @@ typedef struct } OniDeviceInfo; struct _OniDevice; -typedef _OniDevice* OniDeviceHandle; +typedef struct _OniDevice* OniDeviceHandle; struct _OniStream; -typedef _OniStream* OniStreamHandle; +typedef struct _OniStream* OniStreamHandle; struct _OniRecorder; -typedef _OniRecorder* OniRecorderHandle; +typedef struct _OniRecorder* OniRecorderHandle; /** All information of the current frame */ typedef struct diff --git a/Include/OniVersion.h b/Include/OniVersion.h index 699bf505..60376a45 100644 --- a/Include/OniVersion.h +++ b/Include/OniVersion.h @@ -23,7 +23,7 @@ #define ONI_VERSION_MAJOR 2 #define ONI_VERSION_MINOR 2 #define ONI_VERSION_MAINTENANCE 0 -#define ONI_VERSION_BUILD 29 +#define ONI_VERSION_BUILD 30 /** OpenNI version (in brief string format): "Major.Minor.Maintenance (Build)" */ #define ONI_BRIEF_VERSION_STRING \ diff --git a/Packaging/Harvest.py b/Packaging/Harvest.py index 2feb02d9..4ce9ed26 100755 --- a/Packaging/Harvest.py +++ b/Packaging/Harvest.py @@ -224,13 +224,23 @@ def copySample(self, samplesDir, name, isLibrary = False, isGL = False, isJava = self.regxReplace('BIN_DIR = ../../Bin', 'BIN_DIR = Bin', os.path.join(sampleTargetDir, 'Makefile')) # fix include dirs and copy openni_redist - add = r'INC_DIRS += $(OPENNI2_INCLUDE)\n\n' - add += r'include \1\n\n' - add += r'.PHONY: copy-redist\n' - add += r'copy-redist:\n' - add += r'\tcp -R $(OPENNI2_REDIST)/* $(OUT_DIR)\n' - add += r'$(OUTPUT_FILE): copy-redist' - + add = r''' +ifndef OPENNI2_INCLUDE + $(error OPENNI2_INCLUDE is not defined. Please define it or 'source' the OpenNIDevEnvironment file from the installation) +else ifndef OPENNI2_REDIST + $(error OPENNI2_REDIST is not defined. Please define it or 'source' the OpenNIDevEnvironment file from the installation) +endif + +INC_DIRS += $(OPENNI2_INCLUDE) + +include \1 + +.PHONY: copy-redist +copy-redist: + cp -R $(OPENNI2_REDIST)/* $(OUT_DIR) + +$(OUTPUT_FILE): copy-redist +''' self.regxReplace(r'include (Common.*Makefile)', add, os.path.join(sampleTargetDir, 'Makefile')) # and executable diff --git a/Packaging/Install/Includes/Variables.wxi b/Packaging/Install/Includes/Variables.wxi index 67f177d5..8482c3ff 100644 --- a/Packaging/Install/Includes/Variables.wxi +++ b/Packaging/Install/Includes/Variables.wxi @@ -8,7 +8,7 @@ - + diff --git a/Packaging/UpdateVersion.py b/Packaging/UpdateVersion.py index 9efb3903..15d8ffc3 100755 --- a/Packaging/UpdateVersion.py +++ b/Packaging/UpdateVersion.py @@ -28,7 +28,7 @@ VERSION_MAJOR = 2 VERSION_MINOR = 2 VERSION_MAINTENANCE = 0 -VERSION_BUILD = 29 +VERSION_BUILD = 30 def getVersionString(): return str(VERSION_MAJOR) + "." + str(VERSION_MINOR) + "." + str(VERSION_MAINTENANCE) + "." + str(VERSION_BUILD) diff --git a/ReleaseNotes.txt b/ReleaseNotes.txt index 076f37da..42fbb902 100644 --- a/ReleaseNotes.txt +++ b/ReleaseNotes.txt @@ -1,5 +1,5 @@ -OpenNI 2.2.0 Build 29 -June 9 2013 +OpenNI 2.2.0 Build 30 +June 18 2013 Minimum Requirements: --------------------- From 7c248e0de2db58a57ed8962c67d72bc66649cc3c Mon Sep 17 00:00:00 2001 From: "mark.sandler" Date: Tue, 2 Jul 2013 16:31:27 +0300 Subject: [PATCH 009/188] Merge branch 'develop' of ssh://git/localhome/GIT/Software/OpenNI2 into develop --- Source/DepthUtils/DepthUtilsImpl.cpp | 24 ++++++-- .../PSLink/PSLinkConsole/PSLinkConsole.cpp | 60 +++++++++++-------- 2 files changed, 53 insertions(+), 31 deletions(-) diff --git a/Source/DepthUtils/DepthUtilsImpl.cpp b/Source/DepthUtils/DepthUtilsImpl.cpp index 8da3e139..b278c5c0 100644 --- a/Source/DepthUtils/DepthUtilsImpl.cpp +++ b/Source/DepthUtils/DepthUtilsImpl.cpp @@ -262,33 +262,47 @@ XnStatus DepthUtilsImpl::TranslateSinglePixel(XnUInt32 x, XnUInt32 y, unsigned s ///////////////////////////////////// - XnDouble fullXRes = m_colorResolution.x; + XnDouble fullXRes; XnDouble fullYRes; XnBool bCrop = FALSE; - if ((9 * m_colorResolution.x / m_colorResolution.y) == 16) + // if color aspect ratio is different from depth one, assume it's cropped + if (m_colorResolution.x * m_depthResolution.y < m_colorResolution.y * m_depthResolution.x) { - fullYRes = m_colorResolution.x * 4 / 5; + fullXRes = m_colorResolution.x; + fullYRes = fullXRes * m_depthResolution.y / m_depthResolution.x; + bCrop = TRUE; + } + else if (m_colorResolution.x * m_depthResolution.y > m_colorResolution.y * m_depthResolution.x) + { + fullYRes = m_colorResolution.y; + fullXRes = fullYRes * m_depthResolution.x / m_depthResolution.y; bCrop = TRUE; } else { + fullXRes = m_colorResolution.x; fullYRes = m_colorResolution.y; bCrop = FALSE; } - // inflate to full res + // inflate translated pixel from current resolution into full one imageX = (XnUInt32)(fullXRes / m_depthResolution.x * imageX); imageY = (XnUInt32)(fullYRes / m_depthResolution.y * imageY); if (bCrop) { // crop from center - imageY -= (XnUInt32)(fullYRes - m_colorResolution.y)/2; + imageY += (XnUInt32)(m_colorResolution.y - fullYRes)/2; if (imageY > (XnUInt32)m_colorResolution.y) { return XN_STATUS_BAD_PARAM; } + imageX += (XnUInt32)(m_colorResolution.x - fullXRes)/2; + if (imageX > (XnUInt32)m_colorResolution.x) + { + return XN_STATUS_BAD_PARAM; + } } return XN_STATUS_OK; diff --git a/Source/Drivers/PSLink/PSLinkConsole/PSLinkConsole.cpp b/Source/Drivers/PSLink/PSLinkConsole/PSLinkConsole.cpp index 922cfe6f..4e76193e 100644 --- a/Source/Drivers/PSLink/PSLinkConsole/PSLinkConsole.cpp +++ b/Source/Drivers/PSLink/PSLinkConsole/PSLinkConsole.cpp @@ -268,20 +268,8 @@ const char* fwVideoModeToString(XnFwStreamVideoMode videoMode) //--------------------------------------------------------------------------- // Framework //--------------------------------------------------------------------------- -void RunCommand(XnChar* strCmdLine) +void RunCommand(int argc, const char* argv[]) { - enum {CMD_MAX_ARGS = 256}; - const char* argv[CMD_MAX_ARGS] = {NULL}; - int argc = CMD_MAX_ARGS; - - SplitStr(strCmdLine, argv, &argc); - - if (argc == 0) - { - //Ignore empty lines - return; - } - char commandName[XN_FILE_MAX_PATH]; xnOSStrCopy(commandName, argv[0], sizeof(commandName)); @@ -303,6 +291,23 @@ void RunCommand(XnChar* strCmdLine) command.handler(argc, argv); } +void RunCommand(XnChar* strCmdLine) +{ + enum {CMD_MAX_ARGS = 256}; + const char* argv[CMD_MAX_ARGS] = {NULL}; + int argc = CMD_MAX_ARGS; + + SplitStr(strCmdLine, argv, &argc); + + if (argc == 0) + { + //Ignore empty lines + return; + } + + RunCommand(argc, argv); +} + void ExecuteCommandsFromStream(FILE* pStream, XnBool bPrompt) { XnChar strCmdLine[1024]; @@ -1544,7 +1549,8 @@ int main(int argc, char* argv[]) Status nRetVal = STATUS_OK; const XnChar* strScriptFile = NULL; XnUInt16 nProductID = 0; - XnBool bQuit = FALSE; + const char** commandArgv = NULL; + int commandArgc = 0; // printf("PSLinkConsole version %s\n", XN_PS_VERSION_STRING); @@ -1566,11 +1572,8 @@ int main(int argc, char* argv[]) else if (xnOSStrCaseCmp(argv[nArgIndex], "-help") == 0) { printf("USAGE\n"); - printf("\t%s [-transport ] [-product ] [-script ] [-help]\n", argv[0]); + printf("\t%s [-product ] [-script ] [-help] [command]\n", argv[0]); printf("OPTIONS\n"); - printf("\t-transport \n"); - printf("\t\tOpen a device from a specific transport, either USB or from a specific IP and port number.\n"); - printf("\t\tWhen omitted, USB will be used.\n"); printf("\t-product \n"); printf("\t\tOpen only devices with a specific product ID. By default, any device can be opened.\n"); printf("\t-script \n"); @@ -1587,8 +1590,9 @@ int main(int argc, char* argv[]) } else { - printf("Unknown option: %s\n. Run %s -help for usage.\n", argv[nArgIndex], argv[0]); - return -1; + commandArgc = argc - nArgIndex; + commandArgv = (const char**)(argv + nArgIndex); + break; } } @@ -1657,13 +1661,17 @@ int main(int argc, char* argv[]) return -5; } - if (bQuit) - { - return 0; - } + return 0; + } + else if (commandArgc != 0) + { + RunCommand(commandArgc, commandArgv); + return 0; + } + else + { + ExecuteCommandsFromStream(stdin, TRUE); } - - ExecuteCommandsFromStream(stdin, TRUE); g_device.close(); OpenNI::shutdown(); From 5b4809dec3f8b8e02f0dbadd213b5fe160104530 Mon Sep 17 00:00:00 2001 From: "eddie.cohen" Date: Tue, 9 Jul 2013 17:44:49 +0300 Subject: [PATCH 010/188] Support gold linker in compilation --- Source/Tools/NiViewer/Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Source/Tools/NiViewer/Makefile b/Source/Tools/NiViewer/Makefile index 1eba049a..dfa56bd6 100644 --- a/Source/Tools/NiViewer/Makefile +++ b/Source/Tools/NiViewer/Makefile @@ -26,7 +26,11 @@ else endif LIB_DIRS += ../../../ThirdParty/PSCommon/XnLib/Bin/$(PLATFORM)-$(CFG) -USED_LIBS += OpenNI2 XnLib +USED_LIBS += OpenNI2 XnLib pthread +ifneq ("$(OSTYPE)","Darwin") + USED_LIBS += rt +endif + EXE_NAME = NiViewer From b8b6f5ec4ae9b19a9bd27aaf641245702d050b9a Mon Sep 17 00:00:00 2001 From: "eddie.cohen" Date: Tue, 9 Jul 2013 17:47:16 +0300 Subject: [PATCH 011/188] Update PSCommon (fix Linux non-highres timers) --- .../PSCommon/XnLib/Include/XnCyclicBuffer.h | 144 ++++++++++++++++++ .../XnLib/Source/Linux/XnLinuxTime.cpp | 4 + 2 files changed, 148 insertions(+) create mode 100644 ThirdParty/PSCommon/XnLib/Include/XnCyclicBuffer.h diff --git a/ThirdParty/PSCommon/XnLib/Include/XnCyclicBuffer.h b/ThirdParty/PSCommon/XnLib/Include/XnCyclicBuffer.h new file mode 100644 index 00000000..a004bcfd --- /dev/null +++ b/ThirdParty/PSCommon/XnLib/Include/XnCyclicBuffer.h @@ -0,0 +1,144 @@ +/***************************************************************************** +* * +* PrimeSense PSCommon Library * +* Copyright (C) 2012 PrimeSense Ltd. * +* * +* This file is part of PSCommon. * +* * +* Licensed under the Apache License, Version 2.0 (the "License"); * +* you may not use this file except in compliance with the License. * +* You may obtain a copy of the License at * +* * +* http://www.apache.org/licenses/LICENSE-2.0 * +* * +* Unless required by applicable law or agreed to in writing, software * +* distributed under the License is distributed on an "AS IS" BASIS, * +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * +* See the License for the specific language governing permissions and * +* limitations under the License. * +* * +*****************************************************************************/ + +#ifndef __XNCYCLICBUFFER_H__ +#define __XNCYCLICBUFFER_H__ + +#include + +namespace xn +{ + +class CyclicBuffer +{ +public: + CyclicBuffer() + { + m_pBuffer = NULL; + m_nBegin = 0; + m_nEnd = 0; + m_nBufferSize = 0; + } + + ~CyclicBuffer() + { + Shutdown(); + } + + XnStatus Init(XnUInt32 nMaxSize) + { + //Allocate +1 byte for end marker + m_nBufferSize = nMaxSize + 1; + m_pBuffer = reinterpret_cast(xnOSMallocAligned(m_nBufferSize, XN_DEFAULT_MEM_ALIGN)); + XN_VALIDATE_ALLOC_PTR(m_pBuffer); + m_nBegin = 0; + m_nEnd = 0; + return XN_STATUS_OK; + } + + void Shutdown() + { + XN_ALIGNED_FREE_AND_NULL(m_pBuffer); + } + + XnBool IsFull() const + { + return (((m_nEnd + 1) % m_nBufferSize) == m_nBegin); + } + + XnStatus Add(const XnUInt8* pSrc, XnUInt32 nSrcSize) + { + if (nSrcSize > m_nBufferSize - 1) + { + return XN_STATUS_INPUT_BUFFER_OVERFLOW; + } + + //Make more room for new data by moving the beginning of the buffer forward if needed. + XnUInt32 nMissingSpace = XN_MAX((XnInt32)(nSrcSize - m_nBufferSize + GetSize()), 0); + m_nBegin = ((m_nBegin + nMissingSpace) % m_nBufferSize); + //First copy either whole source or as much of it that fits between m_nEnd and buffer end. + //Then we copy the remaining bytes (if any) to the beginning of the buffer. + XnUInt32 nSize1 = XN_MIN(nSrcSize, m_nBufferSize - m_nEnd); + XnUInt32 nSize2 = (nSrcSize - nSize1); + xnOSMemCopy(m_pBuffer + m_nEnd, pSrc, nSize1); + xnOSMemCopy(m_pBuffer, pSrc + nSize1, nSize2); + m_nEnd = (m_nEnd + nSrcSize) % m_nBufferSize; + return XN_STATUS_OK; + } + + //nDestSize is max size on input, actual size on output. + XnStatus Flush(XnUInt8* pDest, XnUInt32& nDestSize) + { + XnInt32 nDiff = (m_nEnd - m_nBegin); + if (nDiff > 0) + { + if (XnUInt32(nDiff) > nDestSize) + { + return XN_STATUS_OUTPUT_BUFFER_OVERFLOW; + } + + xnOSMemCopy(pDest, m_pBuffer + m_nBegin, nDiff); + nDestSize = nDiff; + } + else if (nDiff < 0) + { + if ((m_nBufferSize + nDiff) > nDestSize) + { + return XN_STATUS_OUTPUT_BUFFER_OVERFLOW; + } + + xnOSMemCopy(pDest, m_pBuffer + m_nBegin, m_nBufferSize - m_nBegin); + xnOSMemCopy(pDest + m_nBufferSize - m_nBegin, m_pBuffer, m_nEnd); + nDestSize = m_nBufferSize + nDiff; + } + else + { + nDestSize = 0; + } + m_nBegin = 0; + m_nEnd = 0; + + return XN_STATUS_OK; + } + + XnUInt32 GetSize() const + { + XnInt32 nDiff = (m_nEnd - m_nBegin); + if (nDiff >= 0) + { + return nDiff; + } + else + { + return m_nBufferSize + nDiff; + } + } + +private: + XnUInt8* m_pBuffer; + XnUInt32 m_nBufferSize; + XnUInt32 m_nBegin; + XnUInt32 m_nEnd; +}; + +} + +#endif // __XNCYCLICBUFFER_H__ diff --git a/ThirdParty/PSCommon/XnLib/Source/Linux/XnLinuxTime.cpp b/ThirdParty/PSCommon/XnLib/Source/Linux/XnLinuxTime.cpp index 678df9e7..75f5b8d8 100644 --- a/ThirdParty/PSCommon/XnLib/Source/Linux/XnLinuxTime.cpp +++ b/ThirdParty/PSCommon/XnLib/Source/Linux/XnLinuxTime.cpp @@ -143,6 +143,10 @@ XN_C_API XnStatus xnOSQueryTimer(XnOSTimer Timer, XnUInt64* pnTimeSinceStart) } *pnTimeSinceStart = ((now.tv_sec - Timer.tStartTime.tv_sec) * 1E6 + (now.tv_nsec - Timer.tStartTime.tv_nsec) / 1E3); + if (!Timer.bHighRes) + { + *pnTimeSinceStart /= 1000; + } return XN_STATUS_OK; } From 7aeb31abd498a5b8d250170d0983d4e89fd7fa67 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Sun, 14 Jul 2013 16:18:33 +0300 Subject: [PATCH 012/188] Bug Fix: no even frame indexes from Capri devices. --- .../PSLink/LinkProtoLib/XnLinkFrameInputStream.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Source/Drivers/PSLink/LinkProtoLib/XnLinkFrameInputStream.cpp b/Source/Drivers/PSLink/LinkProtoLib/XnLinkFrameInputStream.cpp index c7d27787..821889e9 100644 --- a/Source/Drivers/PSLink/LinkProtoLib/XnLinkFrameInputStream.cpp +++ b/Source/Drivers/PSLink/LinkProtoLib/XnLinkFrameInputStream.cpp @@ -196,14 +196,14 @@ XnStatus LinkFrameInputStream::HandlePacket(const LinkPacketHeader& origHeader, header.SetSize(header.GetSize() - sizeof(XnUInt64)); // TEMP: inject the host's timestamp. Firmware can't produce timestamps yet - XnUInt64 nTimestamp; + XnUInt64 nTimestamp; nRetVal = xnOSGetHighResTimeStamp(&nTimestamp); if (nRetVal != XN_STATUS_OK) { xnLogWarning(XN_MASK_LINK, "Failed to get timestamp from os: %s", xnGetStatusString(nRetVal)); XN_ASSERT(FALSE); } - m_pCurrFrame->timestamp = nTimestamp; + m_pCurrFrame->timestamp = nTimestamp; // begin parsing frame nRetVal = m_pLinkMsgParser->BeginParsing(m_pCurrFrame->data, m_nBufferSize); @@ -248,9 +248,7 @@ XnStatus LinkFrameInputStream::HandlePacket(const LinkPacketHeader& origHeader, { //Save actual size of data in working buffer info m_pCurrFrame->dataSize = m_pLinkMsgParser->GetParsedSize(); - m_pCurrFrame->frameIndex = m_frameIndex++; - - m_pCurrFrame->frameIndex = m_frameIndex++; + m_pCurrFrame->frameIndex = ++m_frameIndex; m_pCurrFrame->croppingEnabled = m_cropping.enabled; if (m_cropping.enabled) { From 620a160170eb1797adad84232545f1c97098779a Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Tue, 16 Jul 2013 09:45:01 +0300 Subject: [PATCH 013/188] Merge remote-tracking branch 'origin/propertiesFix' into develop --- Source/Core/Android.mk | 4 +- Source/Core/Makefile | 1 + Source/Core/OniRecorder.cpp | 24 ++++++++ Source/Core/OpenNI.vcxproj | 8 +-- Source/Drivers/OniFile/FileProperties.h | 28 ++++++++++ Source/Drivers/OniFile/OniFile.vcxproj | 1 + .../Drivers/OniFile/OniFile.vcxproj.filters | 3 + Source/Drivers/OniFile/PlayerDevice.cpp | 56 ++++++++++++++++++- Source/Drivers/OniFile/PlayerDevice.h | 5 ++ Source/Drivers/OniFile/PlayerProperties.h | 4 +- Source/Drivers/OniFile/PlayerSource.h | 2 + Source/Drivers/OniFile/PlayerStream.cpp | 23 +++++++- Source/Drivers/OniFile/PlayerStream.h | 6 +- Source/Drivers/OniFile/XnPropNames.h | 2 + 14 files changed, 155 insertions(+), 12 deletions(-) create mode 100644 Source/Drivers/OniFile/FileProperties.h diff --git a/Source/Core/Android.mk b/Source/Core/Android.mk index e212b010..f1b8a957 100644 --- a/Source/Core/Android.mk +++ b/Source/Core/Android.mk @@ -37,7 +37,9 @@ LOCAL_CFLAGS += $(OPENNI2_CFLAGS) -DOPENNI2_EXPORT LOCAL_C_INCLUDES := \ $(LOCAL_PATH)/../../Include \ $(LOCAL_PATH)/../../ThirdParty/PSCommon/XnLib/Include \ - $(LOCAL_PATH)/../Drivers/OniFile/Formats + $(LOCAL_PATH)/../Drivers/OniFile/Formats \ + $(LOCAL_PATH)/../Drivers/OniFile + ifdef OPENNI2_ANDROID_NDK_BUILD LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../ThirdParty/LibJPEG diff --git a/Source/Core/Makefile b/Source/Core/Makefile index a3bb73f9..77ab09bd 100644 --- a/Source/Core/Makefile +++ b/Source/Core/Makefile @@ -6,6 +6,7 @@ INC_DIRS = \ ../../Include \ ../../ThirdParty/PSCommon/XnLib/Include \ ../Drivers/OniFile/Formats \ + ../Drivers/OniFile \ ../../ThirdParty/LibJPEG SRC_FILES = \ diff --git a/Source/Core/OniRecorder.cpp b/Source/Core/OniRecorder.cpp index 1a70a7fa..e5655057 100644 --- a/Source/Core/OniRecorder.cpp +++ b/Source/Core/OniRecorder.cpp @@ -30,6 +30,8 @@ #include "OniContext.h" #include "OniProperties.h" #include "PS1080.h" +#include "PSLink.h" +#include "FileProperties.h" ONI_NAMESPACE_IMPLEMENTATION_BEGIN @@ -51,6 +53,7 @@ const struct PropertyTable { const char* propertyName; PropertyType propertyType; } propertyTable[] = { + // PS1080 Properties { XN_STREAM_PROPERTY_INPUT_FORMAT, "InputFormat" , PROPERTY_TYPE_INTEGER }, { XN_STREAM_PROPERTY_CROPPING_MODE, "CroppingMode" , PROPERTY_TYPE_INTEGER }, { XN_STREAM_PROPERTY_WHITE_BALANCE_ENABLED, "WhiteBalancedEnabled", PROPERTY_TYPE_INTEGER }, @@ -71,6 +74,18 @@ const struct PropertyTable { { XN_STREAM_PROPERTY_DCMOS_RCMOS_DISTANCE, "DCRCDIS" , PROPERTY_TYPE_REAL }, { XN_STREAM_PROPERTY_CLOSE_RANGE, "CloseRange" , PROPERTY_TYPE_INTEGER }, { XN_STREAM_PROPERTY_PIXEL_REGISTRATION, "PixelRegistration" , PROPERTY_TYPE_GENERAL }, + // PSLink Properties + { LINK_PROP_MAX_SHIFT, "MaxShift", PROPERTY_TYPE_INTEGER}, + { LINK_PROP_ZERO_PLANE_DISTANCE, "ZPD", PROPERTY_TYPE_INTEGER}, + { LINK_PROP_CONST_SHIFT, "ConstShift", PROPERTY_TYPE_INTEGER}, + { LINK_PROP_PARAM_COEFF, "ParamCoeff", PROPERTY_TYPE_INTEGER}, + { LINK_PROP_SHIFT_SCALE, "ShiftScale", PROPERTY_TYPE_INTEGER}, + { LINK_PROP_ZERO_PLANE_PIXEL_SIZE, "ZPPS", PROPERTY_TYPE_REAL}, + { LINK_PROP_EMITTER_DEPTH_CMOS_DISTANCE, "LDDIS", PROPERTY_TYPE_REAL}, + { LINK_PROP_SHIFT_TO_DEPTH_TABLE, "S2D", PROPERTY_TYPE_GENERAL}, + { LINK_PROP_DEPTH_TO_SHIFT_TABLE, "D2S", PROPERTY_TYPE_GENERAL}, + // File Properties + { ONI_FILE_PROPERTY_ORIGINAL_DEVICE, "oniOriginalDevice", PROPERTY_TYPE_GENERAL} }; const XnSizeT propertyTableItemsCount = sizeof(propertyTable) / sizeof(propertyTable[0]); @@ -716,6 +731,15 @@ void Recorder::onAttach(XnUInt32 nodeId, VideoStream* pStream) )) undoPoint.Reuse(); + EMIT(RECORD_GENERAL_PROPERTY( + nodeId, + getLastPropertyRecordPos(nodeId, "oniOriginalDevice", undoPoint.GetPosition()), + "oniOriginalDevice", + pStream->getDevice().getInfo()->name, + sizeof(pStream->getDevice().getInfo()->name) + )); + undoPoint.Reuse(); + // required data size (for cases where data is larger than video mode) EMIT(RECORD_INT_PROPERTY( nodeId, diff --git a/Source/Core/OpenNI.vcxproj b/Source/Core/OpenNI.vcxproj index 12189dec..cde1020f 100644 --- a/Source/Core/OpenNI.vcxproj +++ b/Source/Core/OpenNI.vcxproj @@ -84,7 +84,7 @@ Disabled - ..\..\Include;..\Drivers\OniFile\Formats;..\..\ThirdParty\PSCommon\XnLib\Include;..\..\ThirdParty\LibJPEG;%(AdditionalIncludeDirectories) + ..\..\Include;..\Drivers\OniFile;..\Drivers\OniFile\Formats;..\..\ThirdParty\PSCommon\XnLib\Include;..\..\ThirdParty\LibJPEG;%(AdditionalIncludeDirectories) _WINDLL;%(PreprocessorDefinitions);OPENNI2_EXPORT ProgramDatabase Level4 @@ -106,7 +106,7 @@ Disabled - ..\..\Include;..\Drivers\OniFile\Formats;..\..\ThirdParty\PSCommon\XnLib\Include;..\..\ThirdParty\LibJPEG;%(AdditionalIncludeDirectories) + ..\..\Include;..\Drivers\OniFile;..\Drivers\OniFile\Formats;..\..\ThirdParty\PSCommon\XnLib\Include;..\..\ThirdParty\LibJPEG;%(AdditionalIncludeDirectories) _WINDLL;%(PreprocessorDefinitions);OPENNI2_EXPORT ProgramDatabase Level4 @@ -131,7 +131,7 @@ MaxSpeed true _MBCS;%(PreprocessorDefinitions);OPENNI2_EXPORT - ..\..\Include;..\Drivers\OniFile\Formats;..\..\ThirdParty\PSCommon\XnLib\Include;..\..\ThirdParty\LibJPEG;%(AdditionalIncludeDirectories) + ..\..\Include;..\Drivers\OniFile;..\Drivers\OniFile\Formats;..\..\ThirdParty\PSCommon\XnLib\Include;..\..\ThirdParty\LibJPEG;%(AdditionalIncludeDirectories) true true AnySuitable @@ -160,7 +160,7 @@ MaxSpeed true _MBCS;%(PreprocessorDefinitions);OPENNI2_EXPORT - ..\..\Include;..\Drivers\OniFile\Formats;..\..\ThirdParty\PSCommon\XnLib\Include;..\..\ThirdParty\LibJPEG;%(AdditionalIncludeDirectories) + ..\..\Include;..\Drivers\OniFile;..\Drivers\OniFile\Formats;..\..\ThirdParty\PSCommon\XnLib\Include;..\..\ThirdParty\LibJPEG;%(AdditionalIncludeDirectories) true true AnySuitable diff --git a/Source/Drivers/OniFile/FileProperties.h b/Source/Drivers/OniFile/FileProperties.h new file mode 100644 index 00000000..e209e078 --- /dev/null +++ b/Source/Drivers/OniFile/FileProperties.h @@ -0,0 +1,28 @@ +/***************************************************************************** +* * +* OpenNI 2.x Alpha * +* Copyright (C) 2012 PrimeSense Ltd. * +* * +* This file is part of OpenNI. * +* * +* Licensed under the Apache License, Version 2.0 (the "License"); * +* you may not use this file except in compliance with the License. * +* You may obtain a copy of the License at * +* * +* http://www.apache.org/licenses/LICENSE-2.0 * +* * +* Unless required by applicable law or agreed to in writing, software * +* distributed under the License is distributed on an "AS IS" BASIS, * +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * +* See the License for the specific language governing permissions and * +* limitations under the License. * +* * +*****************************************************************************/ +#ifndef __FILE_PROPERTIES_H__ +#define __FILE_PROPERTIES_H__ + +enum { + ONI_FILE_PROPERTY_ORIGINAL_DEVICE = 0x00010001 +}; + +#endif // __FILE_PROPERTIES_H__ \ No newline at end of file diff --git a/Source/Drivers/OniFile/OniFile.vcxproj b/Source/Drivers/OniFile/OniFile.vcxproj index 9b173f7d..6f96ce24 100644 --- a/Source/Drivers/OniFile/OniFile.vcxproj +++ b/Source/Drivers/OniFile/OniFile.vcxproj @@ -248,6 +248,7 @@ + diff --git a/Source/Drivers/OniFile/OniFile.vcxproj.filters b/Source/Drivers/OniFile/OniFile.vcxproj.filters index 6b6a4234..e2f2c9d6 100644 --- a/Source/Drivers/OniFile/OniFile.vcxproj.filters +++ b/Source/Drivers/OniFile/OniFile.vcxproj.filters @@ -81,6 +81,9 @@ Header Files + + Header Files + diff --git a/Source/Drivers/OniFile/PlayerDevice.cpp b/Source/Drivers/OniFile/PlayerDevice.cpp index 597858c3..4fd5d41c 100644 --- a/Source/Drivers/OniFile/PlayerDevice.cpp +++ b/Source/Drivers/OniFile/PlayerDevice.cpp @@ -31,6 +31,7 @@ #include "Formats/XnCodec.h" #include "PlayerCodecFactory.h" #include "PS1080.h" +#include "PSLink.h" namespace oni_file { @@ -55,9 +56,9 @@ typedef struct // Name of the property. XnChar propertyName[40]; -} PS1080Property; +} PropertyEntry; -static PS1080Property PS1080PropertyList[] = +static PropertyEntry PS1080PropertyList[] = { { XN_STREAM_PROPERTY_INPUT_FORMAT, "InputFormat" }, { XN_STREAM_PROPERTY_CROPPING_MODE, "CroppingMode" }, @@ -90,11 +91,26 @@ static PS1080Property PS1080PropertyList[] = */ }; +static PropertyEntry PSLinkPropertyList[] = +{ + { LINK_PROP_MAX_SHIFT, "MaxShift" }, + { LINK_PROP_ZERO_PLANE_DISTANCE, "ZPD" }, + { LINK_PROP_CONST_SHIFT, "ConstShift" }, + { LINK_PROP_PARAM_COEFF, "ParamCoeff" }, + { LINK_PROP_SHIFT_SCALE, "ShiftScale" }, + { LINK_PROP_ZERO_PLANE_PIXEL_SIZE, "ZPPS" }, + { LINK_PROP_ZERO_PLANE_OUTPUT_PIXEL_SIZE, "ZPOPS" }, + { LINK_PROP_EMITTER_DEPTH_CMOS_DISTANCE, "LDDIS" }, + { LINK_PROP_SHIFT_TO_DEPTH_TABLE, "S2D" }, + { LINK_PROP_DEPTH_TO_SHIFT_TABLE, "D2S" }, +}; + PlayerDevice::PlayerDevice(const xnl::String& filePath) : m_filePath(filePath), m_fileHandle(0), m_threadHandle(NULL), m_running(FALSE), m_isSeeking(FALSE), m_dPlaybackSpeed(1.0), m_nStartTimestamp(0), m_nStartTime(0), m_bHasTimeReference(FALSE), m_bRepeat(TRUE), m_player(filePath.Data()), m_driverEOFCallback(NULL), m_driverCookie(NULL), m_bStreamsLocked(FALSE) { + xnOSMemSet(m_originalDevice, 0, sizeof(m_originalDevice)); // Create the events. m_readyForDataInternalEvent.Create(FALSE); m_manualTriggerInternalEvent.Create(FALSE); @@ -258,7 +274,7 @@ driver::StreamBase* PlayerDevice::createStream(OniSensorType sensorType) } // Create a new stream using the source. - PlayerStream* pStream = XN_NEW(PlayerStream, pSource); + PlayerStream* pStream = XN_NEW(PlayerStream, this, pSource); if (pStream == NULL) { return NULL; @@ -957,6 +973,10 @@ XnStatus XN_CALLBACK_TYPE PlayerDevice::OnNodeGeneralPropChanged(void* pCookie, } } } + else if (strcmp(strPropName, XN_PROP_ORIGINAL_DEVICE) == 0) + { + xnOSStrCopy(pThis->m_originalDevice, (char*)pBuffer, sizeof(pThis->m_originalDevice)); + } else { nRetVal = pThis->AddPrivateProperty(pSource, strPropName, nBufferSize, pBuffer); @@ -1072,6 +1092,36 @@ void XN_CALLBACK_TYPE PlayerDevice::OnEndOfFileReached(void* pCookie) } XnStatus PlayerDevice::AddPrivateProperty(PlayerSource* pSource, const XnChar* strPropName, XnUInt32 nBufferSize, const void* pBuffer) +{ + if (xnOSStrCmp(m_originalDevice, "PSLink") == 0) + { + return AddPrivateProperty_PSLink(pSource, strPropName, nBufferSize, pBuffer); + } + return AddPrivateProperty_PS1080(pSource, strPropName, nBufferSize, pBuffer); +} + +XnStatus PlayerDevice::AddPrivateProperty_PSLink(PlayerSource* pSource, const XnChar* strPropName, XnUInt32 nBufferSize, const void* pBuffer) +{ + XnStatus nRetVal = XN_STATUS_OK; + + // Find the property name in the PSLink properties. + int numProperties = ARRAYSIZE(PSLinkPropertyList); + for (int i = 0; i < numProperties; ++i) + { + if (strcmp(strPropName, PSLinkPropertyList[i].propertyName) == 0) + { + OniStatus rc = pSource->SetProperty(PSLinkPropertyList[i].propertyId, pBuffer, nBufferSize); + if (rc != ONI_STATUS_OK) + { + nRetVal = XN_STATUS_ERROR; + } + break; + } + } + + return nRetVal; +} +XnStatus PlayerDevice::AddPrivateProperty_PS1080(PlayerSource* pSource, const XnChar* strPropName, XnUInt32 nBufferSize, const void* pBuffer) { XnStatus nRetVal = XN_STATUS_OK; diff --git a/Source/Drivers/OniFile/PlayerDevice.h b/Source/Drivers/OniFile/PlayerDevice.h index 4c97a310..069cf402 100644 --- a/Source/Drivers/OniFile/PlayerDevice.h +++ b/Source/Drivers/OniFile/PlayerDevice.h @@ -82,6 +82,7 @@ class PlayerDevice : public oni::driver::DeviceBase }; void TriggerDriverEOFCallback() { if(m_driverEOFCallback) (m_driverEOFCallback)(m_driverCookie, m_filePath.Data()); }; + const char* getOriginalDevice() {return m_originalDevice;} protected: void Lock() { m_cs.Lock(); } @@ -119,6 +120,8 @@ class PlayerDevice : public oni::driver::DeviceBase static XnStatus XN_CALLBACK_TYPE OnNodeNewData(void* pCookie, const XnChar* strNodeName, XnUInt64 nTimeStamp, XnUInt32 nFrame, const void* pData, XnUInt32 nSize); static void XN_CALLBACK_TYPE OnEndOfFileReached(void* pCookie); XnStatus AddPrivateProperty(PlayerSource* pSource, const XnChar* strPropName, XnUInt32 nBufferSize, const void* pBuffer); + XnStatus AddPrivateProperty_PS1080(PlayerSource* pSource, const XnChar* strPropName, XnUInt32 nBufferSize, const void* pBuffer); + XnStatus AddPrivateProperty_PSLink(PlayerSource* pSource, const XnChar* strPropName, XnUInt32 nBufferSize, const void* pBuffer); static XnStatus XN_CALLBACK_TYPE FileOpen(void* pCookie); static XnStatus XN_CALLBACK_TYPE FileRead(void* pCookie, void* pBuffer, XnUInt32 nSize, XnUInt32* pnBytesRead); @@ -191,6 +194,8 @@ class PlayerDevice : public oni::driver::DeviceBase // Critical section. xnl::CriticalSection m_cs; + + char m_originalDevice[ONI_MAX_STR]; }; } // namespace oni_files_player diff --git a/Source/Drivers/OniFile/PlayerProperties.h b/Source/Drivers/OniFile/PlayerProperties.h index 64ce6b96..7236a4fb 100644 --- a/Source/Drivers/OniFile/PlayerProperties.h +++ b/Source/Drivers/OniFile/PlayerProperties.h @@ -84,6 +84,9 @@ class PlayerProperties return ONI_STATUS_OK; } + typedef xnl::Hash PropertiesHash; + PropertiesHash::ConstIterator Begin() const {return m_properties.Begin();} + PropertiesHash::ConstIterator End() const {return m_properties.End();} private: OniGeneralBuffer* CreateBuffer(const void* data, int dataSize) @@ -113,7 +116,6 @@ class PlayerProperties XN_DELETE(pBuffer); } - typedef xnl::Hash PropertiesHash; PropertiesHash m_properties; }; diff --git a/Source/Drivers/OniFile/PlayerSource.h b/Source/Drivers/OniFile/PlayerSource.h index 631a079c..a8552759 100644 --- a/Source/Drivers/OniFile/PlayerSource.h +++ b/Source/Drivers/OniFile/PlayerSource.h @@ -86,6 +86,8 @@ class PlayerSource void SetRequiredFrameSize(int requiredFrameSize) { m_requiredFrameSize = requiredFrameSize; } int GetRequiredFrameSize() const { return m_requiredFrameSize; } + PlayerProperties::PropertiesHash::ConstIterator Begin() {return m_properties.Begin();} + PlayerProperties::PropertiesHash::ConstIterator End() {return m_properties.End();} protected: XN_DISABLE_COPY_AND_ASSIGN(PlayerSource); diff --git a/Source/Drivers/OniFile/PlayerStream.cpp b/Source/Drivers/OniFile/PlayerStream.cpp index 265cd274..e2d0412d 100644 --- a/Source/Drivers/OniFile/PlayerStream.cpp +++ b/Source/Drivers/OniFile/PlayerStream.cpp @@ -24,6 +24,8 @@ #include "PlayerStream.h" #include "PlayerSource.h" +#include "PlayerDevice.h" +#include "FileProperties.h" #include "XnMemory.h" #include "OniProperties.h" #include "XnPlatform.h" @@ -31,8 +33,8 @@ namespace oni_file { -PlayerStream::PlayerStream(PlayerSource* pSource) : - m_pSource(pSource), m_newDataHandle(NULL), m_isStarted(false), m_requiredFrameSize(0) +PlayerStream::PlayerStream(PlayerDevice* pDevice, PlayerSource* pSource) : + m_pSource(pSource), m_newDataHandle(NULL), m_isStarted(false), m_requiredFrameSize(0), m_pDevice(pDevice) { } @@ -256,4 +258,21 @@ void PlayerStream::Unlock() m_cs.Unlock(); } +void PlayerStream::notifyAllProperties() +{ + raisePropertyChanged(ONI_FILE_PROPERTY_ORIGINAL_DEVICE, m_pDevice->getOriginalDevice(), ONI_MAX_STR); + + for (PlayerProperties::PropertiesHash::ConstIterator property = m_properties.Begin(); + property != m_properties.End(); ++property) + { + raisePropertyChanged(property->Key(), property->Value()->data, property->Value()->dataSize); + } + + for (PlayerProperties::PropertiesHash::ConstIterator property = m_pSource->Begin(); + property != m_pSource->End(); ++property) + { + raisePropertyChanged(property->Key(), property->Value()->data, property->Value()->dataSize); + } +} + } // namespace oni_files_player diff --git a/Source/Drivers/OniFile/PlayerStream.h b/Source/Drivers/OniFile/PlayerStream.h index 5d2d7164..b273b5ed 100644 --- a/Source/Drivers/OniFile/PlayerStream.h +++ b/Source/Drivers/OniFile/PlayerStream.h @@ -33,6 +33,7 @@ namespace oni_file { class Decoder; +class PlayerDevice; /// Implements a stream from a virtual OpenNI device. class PlayerStream : public oni::driver::StreamBase @@ -59,7 +60,7 @@ class PlayerStream : public oni::driver::StreamBase public: /// Constructor. - PlayerStream(PlayerSource* pSource); + PlayerStream(PlayerDevice* pDevice, PlayerSource* pSource); /// Destructor. virtual ~PlayerStream(); @@ -103,6 +104,7 @@ class PlayerStream : public oni::driver::StreamBase void Lock(); void Unlock(); + void notifyAllProperties(); private: void destroy(); @@ -137,6 +139,8 @@ class PlayerStream : public oni::driver::StreamBase bool m_isStarted; int m_requiredFrameSize; + + PlayerDevice* m_pDevice; }; } // namespace oni_files_player diff --git a/Source/Drivers/OniFile/XnPropNames.h b/Source/Drivers/OniFile/XnPropNames.h index 7019a6dd..561bc9f3 100644 --- a/Source/Drivers/OniFile/XnPropNames.h +++ b/Source/Drivers/OniFile/XnPropNames.h @@ -62,4 +62,6 @@ #define XN_PROP_ONI_PIXEL_FORMAT "oniPixelFormat" #define XN_PROP_ONI_REQUIRED_FRAME_SIZE "oniRequiredFrameSize" +#define XN_PROP_ORIGINAL_DEVICE "oniOriginalDevice" + #endif //__XN_PROP_NAMES_H__ From cc226bcc3b3711fcd20ad23ea17f704930fb6f4f Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Tue, 16 Jul 2013 12:27:48 +0300 Subject: [PATCH 014/188] Update version to 2.3.0.1 --- CHANGES.txt | 9 +++++++++ Include/OniVersion.h | 4 ++-- Packaging/Install/Includes/Variables.wxi | 6 +++--- Packaging/Install/Install.wixproj | 2 +- Packaging/UpdateVersion.py | 4 ++-- ReleaseNotes.txt | 4 ++-- 6 files changed, 19 insertions(+), 10 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 697e6908..24e55c2c 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,6 +1,15 @@ Change Log: ----------- +OpenNI 2.3.0: + - Fix pure-C APIs + - OPENNITWO-493: Single pixel translation is wrong when image res is 1280x1024 + - Bug Fix: no even frame indexes from Capri devices. + - Properties are now saved in recordings of Capri devices and input files + - Link console: allow running a single command and exit + - Build: + - Support gold linker in compilation + OpenNI 2.2.0: - Added getDepthColorSyncEnabled() API - Added log settings API diff --git a/Include/OniVersion.h b/Include/OniVersion.h index 60376a45..63e81fd1 100644 --- a/Include/OniVersion.h +++ b/Include/OniVersion.h @@ -21,9 +21,9 @@ #include "OniPlatform.h" #define ONI_VERSION_MAJOR 2 -#define ONI_VERSION_MINOR 2 +#define ONI_VERSION_MINOR 3 #define ONI_VERSION_MAINTENANCE 0 -#define ONI_VERSION_BUILD 30 +#define ONI_VERSION_BUILD 1 /** OpenNI version (in brief string format): "Major.Minor.Maintenance (Build)" */ #define ONI_BRIEF_VERSION_STRING \ diff --git a/Packaging/Install/Includes/Variables.wxi b/Packaging/Install/Includes/Variables.wxi index 8482c3ff..22779f8a 100644 --- a/Packaging/Install/Includes/Variables.wxi +++ b/Packaging/Install/Includes/Variables.wxi @@ -5,13 +5,13 @@ It's not enough to just include newer files. --> - + - + - + - + diff --git a/Packaging/UpdateVersion.py b/Packaging/UpdateVersion.py index 23dc153e..4014f113 100755 --- a/Packaging/UpdateVersion.py +++ b/Packaging/UpdateVersion.py @@ -28,7 +28,7 @@ VERSION_MAJOR = 2 VERSION_MINOR = 3 VERSION_MAINTENANCE = 0 -VERSION_BUILD = 1 +VERSION_BUILD = 3 def getVersionString(): return str(VERSION_MAJOR) + "." + str(VERSION_MINOR) + "." + str(VERSION_MAINTENANCE) + "." + str(VERSION_BUILD) diff --git a/ReleaseNotes.txt b/ReleaseNotes.txt index a233a3d6..7aea93c2 100644 --- a/ReleaseNotes.txt +++ b/ReleaseNotes.txt @@ -1,5 +1,5 @@ -OpenNI 2.3.0 Build 1 -July 16 2013 +OpenNI 2.3.0 Build 3 +July 30 2013 Minimum Requirements: --------------------- diff --git a/Source/Drivers/PSLink/DriverImpl/LinkOniDevice.cpp b/Source/Drivers/PSLink/DriverImpl/LinkOniDevice.cpp index 87f7cd10..fcdc11e6 100644 --- a/Source/Drivers/PSLink/DriverImpl/LinkOniDevice.cpp +++ b/Source/Drivers/PSLink/DriverImpl/LinkOniDevice.cpp @@ -540,6 +540,29 @@ OniStatus LinkOniDevice::getProperty(int propertyId, void* data, int* pDataSize) XN_IS_STATUS_OK_RET(nRetVal, ONI_STATUS_ERROR); } break; + case PS_PROPERTY_ACC_ENABLED: + { + ENSURE_PROP_SIZE(*pDataSize, XnBool); + + XnBool bActive; + nRetVal = m_pSensor->GetAccActive(bActive); + XN_IS_STATUS_OK_RET(nRetVal, ONI_STATUS_ERROR); + + ASSIGN_PROP_VALUE_INT(data, *pDataSize, bActive) + } + break; + + case LINK_PROP_PROJECTOR_POWER: + { + ENSURE_PROP_SIZE(*pDataSize, XnUInt16); + + XnUInt16 power; + nRetVal = m_pSensor->GetProjectorPower(power); + XN_IS_STATUS_OK_RET(nRetVal, ONI_STATUS_ERROR); + + ASSIGN_PROP_VALUE_INT(data, *pDataSize, power) + } + break; default: return ONI_STATUS_BAD_PARAMETER; @@ -592,6 +615,12 @@ OniStatus LinkOniDevice::setProperty(int propertyId, const void* data, int dataS XN_IS_STATUS_OK_LOG_ERROR_RET("Set emitter active", nRetVal, ONI_STATUS_ERROR); break; + //controls if the firmware runs all its control loops (BIST) + case PS_PROPERTY_ACC_ENABLED: + nRetVal = m_pSensor->SetAccActive(*(XnBool*)data); + XN_IS_STATUS_OK_LOG_ERROR_RET("Set Acc active", nRetVal, ONI_STATUS_ERROR); + break; + // string props case LINK_PROP_PRESET_FILE: nRetVal = m_pSensor->RunPresetFile((XnChar *)data); @@ -619,6 +648,12 @@ OniStatus LinkOniDevice::setProperty(int propertyId, const void* data, int dataS } break; + case LINK_PROP_PROJECTOR_POWER: + ENSURE_PROP_SIZE(dataSize, XnUInt16); + nRetVal = m_pSensor->SetProjectorPower(*(XnUInt16*)data); + XN_IS_STATUS_OK_RET(nRetVal, ONI_STATUS_ERROR); + break; + default: return ONI_STATUS_BAD_PARAMETER; } @@ -641,9 +676,11 @@ OniBool LinkOniDevice::isPropertySupported(int propertyId) case LINK_PROP_VERSIONS_INFO_COUNT: case LINK_PROP_VERSIONS_INFO: case LINK_PROP_EMITTER_ACTIVE: + case PS_PROPERTY_ACC_ENABLED: case LINK_PROP_PRESET_FILE: case PS_PROPERTY_USB_INTERFACE: case LINK_PROP_BOOT_STATUS: + case LINK_PROP_PROJECTOR_POWER: return true; default: return false; @@ -890,6 +927,8 @@ OniStatus LinkOniDevice::invoke(int commandId, void* data, int dataSize) for (int i = 0; i < (int)devices.GetSize(); ++i) { + pArgs->devices[i].masterId = devices[i].m_nMasterID; + pArgs->devices[i].slaveId = devices[i].m_nSlaveID; pArgs->devices[i].id = devices[i].m_nID; xnOSStrCopy(pArgs->devices[i].name, devices[i].m_strName, sizeof(pArgs->devices[i].name)); } @@ -1276,6 +1315,28 @@ OniStatus LinkOniDevice::invoke(int commandId, void* data, int dataSize) } break; + case LINK_COMMAND_SET_PROJECTOR_PULSE: + { + EXACT_PROP_SIZE_DO(dataSize, XnCommandSetProjectorPulse) + { + m_driverServices.errorLoggerAppend("Unexpected size: %d != %d\n", dataSize, sizeof(XnCommandSetProjectorPulse)); + XN_ASSERT(FALSE); + return ONI_STATUS_BAD_PARAMETER; + } + + XnCommandSetProjectorPulse* pArgs = reinterpret_cast(data); + nRetVal = m_pSensor->EnableProjectorPulse((XnUInt16)pArgs->delay, (XnUInt16)pArgs->width, (XnUInt16)pArgs->frames); + XN_IS_STATUS_OK_LOG_ERROR_RET("Enable projector pulse", nRetVal, ONI_STATUS_ERROR); + } + break; + + case LINK_COMMAND_DISABLE_PROJECTOR_PULSE: + { + nRetVal = m_pSensor->DisableProjectorPulse(); + XN_IS_STATUS_OK_LOG_ERROR_RET("Disable projector pulse", nRetVal, ONI_STATUS_ERROR); + } + break; + default: return DeviceBase::invoke(commandId, data, dataSize); } diff --git a/Source/Drivers/PSLink/DriverImpl/LinkOniMapStream.cpp b/Source/Drivers/PSLink/DriverImpl/LinkOniMapStream.cpp index f2698f61..6f7f7bf1 100644 --- a/Source/Drivers/PSLink/DriverImpl/LinkOniMapStream.cpp +++ b/Source/Drivers/PSLink/DriverImpl/LinkOniMapStream.cpp @@ -134,6 +134,16 @@ OniStatus LinkOniMapStream::getProperty(int propertyId, void* data, int* pDataSi ASSIGN_PROP_VALUE_INT(data, *pDataSize, m_pInputStream->GetVideoMode().m_nCompression); break; + case PS_PROPERTY_GAIN: + { + ENSURE_PROP_SIZE(*pDataSize, XnUInt16); + XnUInt16 gain; + nRetVal = m_pInputStream->GetGain(gain); + XN_IS_STATUS_OK_RET(nRetVal, ONI_STATUS_ERROR); + ASSIGN_PROP_VALUE_INT(data, *pDataSize, gain); + } + break; + default: { return LinkOniStream::getProperty(propertyId, data, pDataSize); @@ -187,6 +197,14 @@ OniStatus LinkOniMapStream::setProperty(int propertyId, const void* data, int da break; } + case PS_PROPERTY_GAIN: + { + ENSURE_PROP_SIZE(dataSize, XnUInt16); + nRetVal = m_pInputStream->SetGain(*(XnUInt16*)data); + XN_IS_STATUS_OK_RET(nRetVal, ONI_STATUS_ERROR); + break; + } + default: return LinkOniStream::setProperty(propertyId, data, dataSize); } @@ -242,10 +260,12 @@ XnStatus LinkOniMapStream::SetVideoMode(OniVideoMode* pVideoMode) { XnStatus nRetVal = XN_STATUS_OK; - OniVideoMode current; - GetVideoMode(¤t); + XnFwStreamVideoMode currFwMode = m_pInputStream->GetVideoMode(); - if (!xnOSMemCmp(¤t, pVideoMode, sizeof(OniVideoMode))) + if ((int)currFwMode.m_nXRes == pVideoMode->resolutionX && + (int)currFwMode.m_nYRes == pVideoMode->resolutionY && + (int)currFwMode.m_nFPS == pVideoMode->fps && + m_pInputStream->GetOutputFormat() == pVideoMode->pixelFormat) { // nothing to do here return (ONI_STATUS_OK); @@ -260,8 +280,17 @@ XnStatus LinkOniMapStream::SetVideoMode(OniVideoMode* pVideoMode) pVideoMode->resolutionY == (int)supportedModes[i].m_nYRes && pVideoMode->fps == (int)supportedModes[i].m_nFPS) { - selectedIndex = i; - break; + // prefer the one that also keeps on other parameters. If no such mode exists, switch to the first one on the list + if (supportedModes[i].m_nPixelFormat == currFwMode.m_nPixelFormat && + supportedModes[i].m_nCompression == currFwMode.m_nCompression) + { + selectedIndex = i; + break; + } + else if (selectedIndex == -1) + { + selectedIndex = i; + } } } diff --git a/Source/Drivers/PSLink/LinkProtoLib/XnClientUSBInDataEndpoint.cpp b/Source/Drivers/PSLink/LinkProtoLib/XnClientUSBInDataEndpoint.cpp index 74c6f2c1..73938598 100644 --- a/Source/Drivers/PSLink/LinkProtoLib/XnClientUSBInDataEndpoint.cpp +++ b/Source/Drivers/PSLink/LinkProtoLib/XnClientUSBInDataEndpoint.cpp @@ -103,10 +103,11 @@ void ClientUSBInDataEndpoint::Disconnect() XnStatus nRetVal = XN_STATUS_OK; if (m_bConnected) { + xnLogVerbose(XN_MASK_USB, "Shutting down endpoint 0x%x read thread...", m_nEndpointID); nRetVal = xnUSBShutdownReadThread(m_hEndpoint); if (nRetVal != XN_STATUS_OK) { - xnLogWarning("Failed to shutdown usb read thread: %s", xnGetStatusString(nRetVal)); + xnLogWarning(XN_MASK_USB, "Failed to shutdown endpoint 0x%x read thread: %s", m_nEndpointID, xnGetStatusString(nRetVal)); XN_ASSERT(FALSE); } m_bConnected = FALSE; diff --git a/Source/Drivers/PSLink/LinkProtoLib/XnLinkControlEndpoint.cpp b/Source/Drivers/PSLink/LinkProtoLib/XnLinkControlEndpoint.cpp index 6d61c54e..0a643b26 100644 --- a/Source/Drivers/PSLink/LinkProtoLib/XnLinkControlEndpoint.cpp +++ b/Source/Drivers/PSLink/LinkProtoLib/XnLinkControlEndpoint.cpp @@ -1595,6 +1595,36 @@ XnStatus LinkControlEndpoint::SetEmitterActive(XnBool bActive) return (XN_STATUS_OK); } +// Enables/Disables the BIST +XnStatus LinkControlEndpoint::SetAccActive(XnBool bActive) +{ + XnStatus nRetVal = XN_STATUS_OK; + + xnLogVerbose(XN_MASK_LINK, "LINK: Turning Acc %s...", bActive ? "on" : "off"); + + nRetVal = SetIntProperty(XN_LINK_STREAM_ID_NONE, XN_LINK_PROP_ID_ACC_ENABLED, XnUInt64(bActive)); + XN_IS_STATUS_OK(nRetVal); + + xnLogInfo(XN_MASK_LINK, "LINK: Acc was turned %s", bActive ? "on" : "off"); + + return (XN_STATUS_OK); +} + +XnStatus LinkControlEndpoint::GetAccActive(XnBool& bActive) +{ + XnUInt64 nValue; + + xnLogVerbose(XN_MASK_LINK, "LINK: Getting Acc ..."); + + XnStatus nRetVal = GetIntProperty(XN_LINK_STREAM_ID_NONE, XN_LINK_PROP_ID_ACC_ENABLED, nValue); + XN_IS_STATUS_OK(nRetVal); + + bActive = (nValue == TRUE); + + xnLogInfo(XN_MASK_LINK, "LINK: Acc is %s", bActive ? "on" : "off"); + + return nRetVal; +} XnStatus LinkControlEndpoint::GetStreamFragLevel(XnUInt16 nStreamID, XnStreamFragLevel& streamFragLevel) { XnStatus nRetVal = XN_STATUS_OK; @@ -1739,4 +1769,112 @@ XnStatus LinkControlEndpoint::CloseFWLogFile(XnUInt8 logID, XnUInt16 nLogStreamI return XN_STATUS_OK; } +XnStatus LinkControlEndpoint::SetProjectorPulse(XnBool enabled, XnUInt16 delay, XnUInt16 width, XnUInt16 framesToskip) +{ + XnStatus nRetVal = XN_STATUS_OK; + + xnLogVerbose(XN_MASK_LINK, "LINK: Setting projector pulse..."); + + XnLinkProjectorPulse pulse; + pulse.m_bEnabled = enabled ? 1 : 0; + pulse.m_nDelay = XN_PREPARE_VAR16_IN_BUFFER(delay); + pulse.m_nWidth = XN_PREPARE_VAR16_IN_BUFFER(width); + pulse.m_nFramesToSkip = XN_PREPARE_VAR16_IN_BUFFER(framesToskip); + + nRetVal = SetGeneralProperty(XN_LINK_PROP_ID_NONE, XN_LINK_PROP_ID_PROJECTOR_PULSE, sizeof(pulse), &pulse); + XN_IS_STATUS_OK(nRetVal); + + xnLogInfo(XN_MASK_LINK, "LINK: Projector pulse set"); + + return XN_STATUS_OK; +} + +XnStatus LinkControlEndpoint::GetProjectorPulse(XnBool& enabled, XnUInt16& delay, XnUInt16& width, XnUInt16& framesToskip) +{ + XnStatus nRetVal = XN_STATUS_OK; + + xnLogVerbose(XN_MASK_LINK, "LINK: Getting projector pulse..."); + + XnLinkProjectorPulse pulse; + XnUInt32 nPropSize = sizeof(pulse); + nRetVal = GetGeneralProperty(XN_LINK_PROP_ID_NONE, XN_LINK_PROP_ID_FW_VERSION, nPropSize, &pulse); + XN_IS_STATUS_OK_LOG_ERROR("Execute get version command", nRetVal); + + if (nPropSize != sizeof(pulse)) + { + xnLogError(XN_MASK_LINK, "LINK: Got bad size of projector pulse property: %u instead of %u", nPropSize, sizeof(pulse)); + XN_ASSERT(FALSE); + return XN_STATUS_LINK_BAD_RESPONSE_SIZE; + } + + enabled = (pulse.m_bEnabled != 0); + delay = XN_PREPARE_VAR16_IN_BUFFER(pulse.m_nDelay); + width = XN_PREPARE_VAR16_IN_BUFFER(pulse.m_nWidth); + framesToskip = XN_PREPARE_VAR16_IN_BUFFER(pulse.m_nFramesToSkip); + + return XN_STATUS_OK; +} + +XnStatus LinkControlEndpoint::SetProjectorPower(XnUInt16 power) +{ + XnStatus nRetVal = XN_STATUS_OK; + + xnLogVerbose(XN_MASK_LINK, "LINK: Setting emitter power to %u...", power); + + nRetVal = SetIntProperty(XN_LINK_STREAM_ID_NONE, XN_LINK_PROP_ID_PROJECTOR_POWER, XnUInt64(power)); + XN_IS_STATUS_OK(nRetVal); + + xnLogInfo(XN_MASK_LINK, "LINK: Emitter power was set to %u", power); + + return (XN_STATUS_OK); +} + +XnStatus LinkControlEndpoint::GetProjectorPower(XnUInt16& power) +{ + XnStatus nRetVal = XN_STATUS_OK; + + xnLogVerbose(XN_MASK_LINK, "LINK: Getting projector power..."); + + XnUInt64 power64 = 0; + nRetVal = GetIntProperty(XN_LINK_STREAM_ID_NONE, XN_LINK_PROP_ID_PROJECTOR_POWER, power64); + XN_IS_STATUS_OK(nRetVal); + + power = (XnUInt16)power64; + + xnLogInfo(XN_MASK_LINK, "LINK: Projector power is %u", power); + + return (XN_STATUS_OK); +} + +XnStatus LinkControlEndpoint::SetGain(XnUInt16 streamID, XnUInt16 gain) +{ + XnStatus nRetVal = XN_STATUS_OK; + + xnLogVerbose(XN_MASK_LINK, "LINK: Setting stream %u gain to %u...", streamID, gain); + + nRetVal = SetIntProperty(streamID, XN_LINK_PROP_ID_GAIN, XnUInt64(gain)); + XN_IS_STATUS_OK(nRetVal); + + xnLogInfo(XN_MASK_LINK, "LINK: Stream %u gain was set to %u", streamID, gain); + + return (XN_STATUS_OK); +} + +XnStatus LinkControlEndpoint::GetGain(XnUInt16 streamID, XnUInt16& gain) +{ + XnStatus nRetVal = XN_STATUS_OK; + + xnLogVerbose(XN_MASK_LINK, "LINK: Getting stream %u gain...", streamID); + + XnUInt64 gain64 = 0; + nRetVal = GetIntProperty(streamID, XN_LINK_PROP_ID_GAIN, gain64); + XN_IS_STATUS_OK(nRetVal); + + gain = (XnUInt16)gain64; + + xnLogInfo(XN_MASK_LINK, "LINK: Stream %u gain is %u", streamID, gain); + + return (XN_STATUS_OK); +} + } diff --git a/Source/Drivers/PSLink/LinkProtoLib/XnLinkControlEndpoint.h b/Source/Drivers/PSLink/LinkProtoLib/XnLinkControlEndpoint.h index dee023d2..54757112 100644 --- a/Source/Drivers/PSLink/LinkProtoLib/XnLinkControlEndpoint.h +++ b/Source/Drivers/PSLink/LinkProtoLib/XnLinkControlEndpoint.h @@ -83,11 +83,18 @@ class LinkControlEndpoint XnStatus SetCropping(XnUInt16 nStreamID, const OniCropping& cropping); XnStatus GetCropping(XnUInt16 nStreamID, OniCropping& cropping); XnStatus SetEmitterActive(XnBool bActive); + XnStatus SetAccActive(XnBool bActive); + XnStatus GetAccActive(XnBool& bActive); XnStatus GetSupportedLogFiles(xnl::Array& supportedFiles); XnStatus OpenFWLogFile(XnUInt8 logID, XnUInt16 nLogStreamID); XnStatus CloseFWLogFile(XnUInt8 logID, XnUInt16 nLogStreamID); - - //TODO: Implement Get emitter active + XnStatus SetProjectorPulse(XnBool enabled, XnUInt16 delay, XnUInt16 width, XnUInt16 framesToskip); + XnStatus GetProjectorPulse(XnBool& enabled, XnUInt16& delay, XnUInt16& width, XnUInt16& framesToskip); + XnStatus SetProjectorPower(XnUInt16 power); + XnStatus GetProjectorPower(XnUInt16& power); + XnStatus SetGain(XnUInt16 streamID, XnUInt16 gain); + XnStatus GetGain(XnUInt16 streamID, XnUInt16& gain); + //TODO: Implement Get emitter active XnStatus GetStreamFragLevel(XnUInt16 nStreamID, XnStreamFragLevel& streamFragLevel); XnStatus GetMirror(XnUInt16 nStreamID, XnBool& bMirror); diff --git a/Source/Drivers/PSLink/LinkProtoLib/XnLinkInputStream.cpp b/Source/Drivers/PSLink/LinkProtoLib/XnLinkInputStream.cpp index 6832785d..aad123c3 100644 --- a/Source/Drivers/PSLink/LinkProtoLib/XnLinkInputStream.cpp +++ b/Source/Drivers/PSLink/LinkProtoLib/XnLinkInputStream.cpp @@ -170,4 +170,14 @@ XnStatus LinkInputStream::SetOutputFormat(OniPixelFormat format) return XN_STATUS_OK; } +XnStatus LinkInputStream::SetGain(XnUInt16 gain) +{ + return m_pLinkControlEndpoint->SetGain(m_nStreamID, gain); +} + +XnStatus LinkInputStream::GetGain(XnUInt16& gain) +{ + return m_pLinkControlEndpoint->GetGain(m_nStreamID, gain); +} + } diff --git a/Source/Drivers/PSLink/LinkProtoLib/XnLinkInputStream.h b/Source/Drivers/PSLink/LinkProtoLib/XnLinkInputStream.h index 89705d2a..454ef428 100644 --- a/Source/Drivers/PSLink/LinkProtoLib/XnLinkInputStream.h +++ b/Source/Drivers/PSLink/LinkProtoLib/XnLinkInputStream.h @@ -51,6 +51,9 @@ class LinkInputStream virtual XnBool GetMirror() const; virtual XnStatus SetMirror(XnBool bMirror); + virtual XnStatus SetGain(XnUInt16 gain); + virtual XnStatus GetGain(XnUInt16& gain); + protected: virtual XnStatus StartImpl() = 0; virtual XnStatus StopImpl() = 0; diff --git a/Source/Drivers/PSLink/LinkProtoLib/XnLinkProtoUtils.cpp b/Source/Drivers/PSLink/LinkProtoLib/XnLinkProtoUtils.cpp index 13737a32..8ee0ff07 100644 --- a/Source/Drivers/PSLink/LinkProtoLib/XnLinkProtoUtils.cpp +++ b/Source/Drivers/PSLink/LinkProtoLib/XnLinkProtoUtils.cpp @@ -975,6 +975,8 @@ XnStatus xnLinkParseSupportedI2CDevices(const XnLinkSupportedI2CDevices* pDevice supportedDevices[i].m_nID = XN_PREPARE_VAR32_IN_BUFFER(pDevicesList->m_aI2CDevices[i].m_nID); nRetVal = xnOSStrCopy(supportedDevices[i].m_strName, pDevicesList->m_aI2CDevices[i].m_strName, sizeof(supportedDevices[i].m_strName)); XN_IS_STATUS_OK_LOG_ERROR("Copy I2C device name", nRetVal); + supportedDevices[i].m_nMasterID = pDevicesList->m_aI2CDevices[i].m_nMasterID; + supportedDevices[i].m_nSlaveID = pDevicesList->m_aI2CDevices[i].m_nSlaveID; } return XN_STATUS_OK; diff --git a/Source/Drivers/PSLink/PSLinkConsole/PSLinkConsole.cpp b/Source/Drivers/PSLink/PSLinkConsole/PSLinkConsole.cpp index 4e76193e..f35bec53 100644 --- a/Source/Drivers/PSLink/PSLinkConsole/PSLinkConsole.cpp +++ b/Source/Drivers/PSLink/PSLinkConsole/PSLinkConsole.cpp @@ -1071,6 +1071,45 @@ int Emitter(int argc, const char* argv[]) return nRetVal; } +// Enables/Disables the BIST (XN_LINK_PROP_ID_ACC_ENABLED) +int Acc(int argc, const char* argv[]) +{ + XnBool bAccEnabled; + Status nRetVal; + if(argc == 1) + { + nRetVal = g_device.getProperty(PS_PROPERTY_ACC_ENABLED, &bAccEnabled); + if (nRetVal == STATUS_OK) + { + printf("Acc is %s.\n\n", (bAccEnabled ? "on" : "off")); + } + else + { + printf("Failed to get Acc: %s\n\n", OpenNI::getExtendedError()); + } + + return nRetVal; + } + + if((xnOSStrCaseCmp(argv[1], "on") != 0) && (xnOSStrCaseCmp(argv[1], "off") != 0)) + { + printf("Usage: %s \n\n", argv[0]); + return -1; + } + const XnChar* strAccActive = argv[1]; + bAccEnabled = (xnOSStrCaseCmp(strAccActive, "on") == 0); + nRetVal = g_device.setProperty(PS_PROPERTY_ACC_ENABLED, bAccEnabled); + if (nRetVal == STATUS_OK) + { + printf("Acc is now %s.\n\n", strAccActive); + } + else + { + printf("Failed to set Acc %s: %s\n\n", strAccActive, OpenNI::getExtendedError()); + } + + return nRetVal; +} xnl::Array& GetLogMaskList() { static xnl::Array s_masks; @@ -1253,9 +1292,13 @@ int PrintLogFilesList(int /*argc*/, const char* /*argv*/[]) int PrintI2CList(int /*argc*/, const char* /*argv*/[]) { xnl::Array& deviceList = GetI2CDeviceList(); + + printf("%2s %32s %9s %8s", "ID", "NAME", "MASTER-ID", "SLAVE-ID\n"); + printf("%2s %32s %9s %8s", "==", "====", "=========", "========\n"); + for (XnUInt32 i = 0; i < deviceList.GetSize(); ++i) { - printf("%4u %s\n", deviceList[i].id, deviceList[i].name); + printf("%2u %32s %9u %8u\n", deviceList[i].id, deviceList[i].name, deviceList[i].masterId, deviceList[i].slaveId); } return 0; @@ -1296,24 +1339,24 @@ int RunBist(int argc, const char* argv[]) return -1; } - xnl::BitSet requestedTests; + XnBistInfo bistInfos[20]; + XnCommandGetBistList supportedTests; + supportedTests.tests = bistInfos; + supportedTests.count = sizeof(bistInfos)/sizeof(bistInfos[0]); - if (xnOSStrCaseCmp(argv[1], "ALL") == 0) + if (STATUS_OK != g_device.invoke(PS_COMMAND_GET_BIST_LIST, supportedTests)) { - XnBistInfo tests[20]; - XnCommandGetBistList args; - args.tests = tests; - args.count = sizeof(tests)/sizeof(tests[0]); + printf("Failed getting tests list: %s\n\n", OpenNI::getExtendedError()); + return -2; + } - if (STATUS_OK != g_device.invoke(PS_COMMAND_GET_BIST_LIST, args)) - { - printf("Failed getting tests list: %s\n\n", OpenNI::getExtendedError()); - return -2; - } + xnl::BitSet requestedTests; - for (XnUInt32 i = 0; i < args.count; ++i) + if (xnOSStrCaseCmp(argv[1], "ALL") == 0) + { + for (XnUInt32 i = 0; i < supportedTests.count; ++i) { - requestedTests.Set(tests[i].id, TRUE); + requestedTests.Set(supportedTests.tests[i].id, TRUE); } } else @@ -1335,7 +1378,19 @@ int RunBist(int argc, const char* argv[]) continue; } - printf("Executing test %u...\n", i); + // search for test in list (for its name) + const XnChar* testName = "Unknown"; + for (XnUInt32 j = 0; j < supportedTests.count; ++j) + { + if (supportedTests.tests[j].id == i) + { + testName = supportedTests.tests[j].name; + break; + } + } + + printf("Executing test %u (%s)...\n", i, testName); + args.id = i; args.extraDataSize = sizeof(response); nRetVal = g_device.invoke(PS_COMMAND_EXECUTE_BIST, args); @@ -1345,7 +1400,7 @@ int RunBist(int argc, const char* argv[]) return nRetVal; } - printf("Test %u ", i); + printf("Test %u (%s) ", i, testName); if (args.errorCode != 0) { @@ -1501,6 +1556,88 @@ int TestAll(int /*argc*/, const char* /*argv*/[]) return XN_STATUS_OK; } +int Projector(int argc, const char* argv[]) +{ + XnStatus nRetVal = XN_STATUS_OK; + + if (argc > 1) + { + if (xnOSStrCaseCmp(argv[1], "power") == 0) + { + if (argc > 2) + { + // set power + XnUInt16 power = (XnUInt16)MyAtoi(argv[2]); + nRetVal = g_device.setProperty(LINK_PROP_PROJECTOR_POWER, power); + if (nRetVal != XN_STATUS_OK) + { + printf("Failed to set projector power: %s\n\n", xnGetStatusString(nRetVal)); + return -2; + } + + return 0; + } + else + { + // get power + XnUInt16 power; + nRetVal = g_device.getProperty(LINK_PROP_PROJECTOR_POWER, &power); + if (nRetVal != XN_STATUS_OK) + { + printf("Failed to get projector power: %s\n\n", xnGetStatusString(nRetVal)); + return -3; + } + + printf("Projector power is %u\n\n", power); + return 0; + } + } + else if (xnOSStrCaseCmp(argv[1], "pulse") == 0) + { + if (argc > 2) + { + if (xnOSStrCaseCmp(argv[2], "on") == 0 && argc > 5) + { + XnCommandSetProjectorPulse args; + args.delay = MyAtoi(argv[3]); + args.width = MyAtoi(argv[4]); + args.frames = MyAtoi(argv[5]); + + nRetVal = g_device.invoke(LINK_COMMAND_SET_PROJECTOR_PULSE, args); + if (nRetVal != XN_STATUS_OK) + { + printf("Failed to set projector pulse: %s\n\n", xnGetStatusString(nRetVal)); + return -3; + } + + printf("Projector pulse set\n\n"); + return 0; + } + else if (xnOSStrCaseCmp(argv[2], "off") == 0) + { + nRetVal = g_device.invoke(LINK_COMMAND_DISABLE_PROJECTOR_PULSE, NULL, 0); + if (nRetVal != XN_STATUS_OK) + { + printf("Failed to disable projector pulse: %s\n\n", xnGetStatusString(nRetVal)); + return -3; + } + + printf("Projector pulse disabled\n\n"); + return 0; + } + } + } + } + + // if we got here, something was wrong with the arguments + printf("Usage: \n"); + printf("\t%s power [newVal]\n", argv[0]); + printf("\t%s pulse on \n", argv[0]); + printf("\t%s pulse off\n", argv[0]); + printf("\n"); + return -1; +} + void RegisterCommands() { RegisterCommand("Help", Help); @@ -1529,7 +1666,8 @@ void RegisterCommands() RegisterCommand("ReadAHB", ReadAHB); RegisterCommand("SoftReset", SoftReset); RegisterCommand("HardReset", HardReset); - RegisterCommand("Emitter", Emitter); + RegisterCommand("Emitter", Emitter); + RegisterCommand("Acc", Acc); RegisterCommand("Log", Log); RegisterCommand("LogList", PrintLogFilesList); RegisterCommand("Script", Script); @@ -1539,6 +1677,7 @@ void RegisterCommands() RegisterCommand("FormatZone", FormatZone); RegisterCommand("UsbTest", UsbTest); RegisterCommand("TestAll", TestAll); + RegisterCommand("Projector", Projector); RegisterCommand("Quit", Quit); RegisterCommand("Bye", Quit); RegisterCommand("Exit", Quit); diff --git a/Source/Drivers/PSLink/PrimeClient.cpp b/Source/Drivers/PSLink/PrimeClient.cpp index bd871c23..b0816b61 100644 --- a/Source/Drivers/PSLink/PrimeClient.cpp +++ b/Source/Drivers/PSLink/PrimeClient.cpp @@ -335,6 +335,16 @@ XnStatus PrimeClient::SetEmitterActive(XnBool bActive) return m_linkControlEndpoint.SetEmitterActive(bActive); } +XnStatus PrimeClient::SetAccActive(XnBool bActive) +{ + return m_linkControlEndpoint.SetAccActive(bActive); +} + +XnStatus PrimeClient::GetAccActive(XnBool& bActive) +{ + return m_linkControlEndpoint.GetAccActive(bActive); +} + void PrimeClient::LogVersions() { static XnBool bVersionsLoggedOnce = FALSE; @@ -641,4 +651,29 @@ XnStatus PrimeClient::GetBootStatus(XnBootStatus& bootStatus) return m_linkControlEndpoint.GetBootStatus(bootStatus); } +XnStatus PrimeClient::EnableProjectorPulse(XnUInt16 delay, XnUInt16 width, XnUInt16 framesToskip) +{ + return m_linkControlEndpoint.SetProjectorPulse(TRUE, delay, width, framesToskip); +} + +XnStatus PrimeClient::DisableProjectorPulse() +{ + return m_linkControlEndpoint.SetProjectorPulse(FALSE, 0, 0, 0); +} + +XnStatus PrimeClient::GetProjectorPulse(XnBool& enabled, XnUInt16& delay, XnUInt16& width, XnUInt16& framesToskip) +{ + return m_linkControlEndpoint.GetProjectorPulse(enabled, delay, width, framesToskip); +} + +XnStatus PrimeClient::SetProjectorPower(XnUInt16 power) +{ + return m_linkControlEndpoint.SetProjectorPower(power); +} + +XnStatus PrimeClient::GetProjectorPower(XnUInt16& power) +{ + return m_linkControlEndpoint.GetProjectorPower(power); +} + } diff --git a/Source/Drivers/PSLink/PrimeClient.h b/Source/Drivers/PSLink/PrimeClient.h index e95c3f06..19ec43dc 100644 --- a/Source/Drivers/PSLink/PrimeClient.h +++ b/Source/Drivers/PSLink/PrimeClient.h @@ -54,6 +54,8 @@ class PrimeClient : virtual XnStatus SoftReset(); virtual XnStatus HardReset(); virtual XnStatus SetEmitterActive(XnBool bActive); + virtual XnStatus SetAccActive(XnBool bActive); + virtual XnStatus GetAccActive(XnBool& bActive); virtual XnStatus StartFWLog(); virtual XnStatus StopFWLog(); virtual XnStatus OpenFWLogFile(XnUInt8 logID); @@ -89,6 +91,12 @@ class PrimeClient : virtual XnStatus GetFileList(xnl::Array& files); virtual XnStatus DownloadFile(XnUInt16 zone, const XnChar* strFirmwareFileName, const XnChar* strTargetFile); + virtual XnStatus EnableProjectorPulse(XnUInt16 delay, XnUInt16 width, XnUInt16 framesToskip); + virtual XnStatus DisableProjectorPulse(); + virtual XnStatus GetProjectorPulse(XnBool& enabled, XnUInt16& delay, XnUInt16& width, XnUInt16& framesToskip); + virtual XnStatus SetProjectorPower(XnUInt16 power); + virtual XnStatus GetProjectorPower(XnUInt16& power); + virtual void HandleLinkDataEndpointDisconnection(XnUInt16 nEndpointID); protected: diff --git a/Source/Drivers/PSLink/Protocols/XnLinkProto/XnLinkDefs.h b/Source/Drivers/PSLink/Protocols/XnLinkProto/XnLinkDefs.h index 42991ce4..a6f9dff0 100644 --- a/Source/Drivers/PSLink/Protocols/XnLinkProto/XnLinkDefs.h +++ b/Source/Drivers/PSLink/Protocols/XnLinkProto/XnLinkDefs.h @@ -332,6 +332,7 @@ typedef enum XnLinkPropID XN_LINK_PROP_ID_SUPPORTED_BIST_TESTS = 0x0201, //General property, holds XnLinkSupportedBistTests XN_LINK_PROP_ID_SUPPORTED_I2C_DEVICES = 0x0202, //General property, holds XnLinkSupportedI2CDevices XN_LINK_PROP_ID_SUPPORTED_LOG_FILES = 0x0203, //General property, holds XnLinkSupportedLogFiles + XN_LINK_PROP_ID_ACC_ENABLED = 0x0204, //Int property, 0 = ACC & Periodic Thermistor disabled, 1 = enabled //Map generator properties - group 0x05 XN_LINK_PROP_ID_SUPPORTED_VIDEO_MODES = 0x0501, //General property, holds XnLinkSupportedVideoModes diff --git a/Source/Drivers/PSLink/Protocols/XnLinkProto/XnLinkProto.h b/Source/Drivers/PSLink/Protocols/XnLinkProto/XnLinkProto.h index 647a3006..75cae7ef 100644 --- a/Source/Drivers/PSLink/Protocols/XnLinkProto/XnLinkProto.h +++ b/Source/Drivers/PSLink/Protocols/XnLinkProto/XnLinkProto.h @@ -423,6 +423,9 @@ typedef struct XnLinkCameraIntrinsics typedef struct XnLinkI2CDevice { + XnUInt8 m_nMasterID; + XnUInt8 m_nSlaveID; + XnUInt16 m_nReserved; XnUInt32 m_nID; XnChar m_strName[XN_LINK_MAX_I2C_DEVICE_NAME_LENGTH]; } XnLinkI2CDevice; diff --git a/ThirdParty/PSCommon/XnLib/Include/XnOSCpp.h b/ThirdParty/PSCommon/XnLib/Include/XnOSCpp.h index 6485e1bc..e905de76 100644 --- a/ThirdParty/PSCommon/XnLib/Include/XnOSCpp.h +++ b/ThirdParty/PSCommon/XnLib/Include/XnOSCpp.h @@ -63,6 +63,38 @@ class CriticalSection XN_CRITICAL_SECTION_HANDLE m_cs; }; +class Mutex +{ +public: + Mutex() + { + xnOSCreateMutex(&m_mutex); + } + Mutex(const char* name) + { + xnOSCreateNamedMutex(&m_mutex, name); + } + ~Mutex() + { + Unlock(); + xnOSCloseMutex(&m_mutex); + } + XnStatus Lock(XnUInt32 milliseconds = XN_WAIT_INFINITE) + { + return xnOSLockMutex(m_mutex, milliseconds); + } + void Unlock() + { + xnOSUnLockMutex(m_mutex); + } +private: + Mutex(const Mutex& other); + Mutex& operator=(const Mutex& other); + + friend class AutoMutexLocker; + XN_MUTEX_HANDLE m_mutex; +}; + template class VirtualLock {}; @@ -77,15 +109,27 @@ class AutoMutexLocker public: inline AutoMutexLocker(XN_MUTEX_HANDLE hMutex, XnUInt32 nMilliseconds) : m_hMutex(hMutex) { - m_nStatus = xnOSLockMutex(m_hMutex, nMilliseconds); + Lock(nMilliseconds); + } + AutoMutexLocker(const Mutex& mutex, XnUInt32 nMilliseconds) : m_hMutex(mutex.m_mutex) + { + Lock(nMilliseconds); } - XnStatus GetStatus() const { return m_nStatus; } inline ~AutoMutexLocker() + { + Unlock(); + } +private: + void Lock(XnUInt32 milliseconds) + { + m_nStatus = xnOSLockMutex(m_hMutex, milliseconds); + } + void Unlock() { if (m_nStatus == XN_STATUS_OK) { @@ -93,8 +137,6 @@ class AutoMutexLocker xnOSUnLockMutex(m_hMutex); } } - -private: XN_MUTEX_HANDLE m_hMutex; XnStatus m_nStatus; }; From d197cebf76d69b19fe36750ccfacc46158623ca8 Mon Sep 17 00:00:00 2001 From: "eddie.cohen" Date: Tue, 30 Jul 2013 17:25:59 +0300 Subject: [PATCH 024/188] Update release notes with prerequisites --- ReleaseNotes.txt | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/ReleaseNotes.txt b/ReleaseNotes.txt index 7aea93c2..70bafaef 100644 --- a/ReleaseNotes.txt +++ b/ReleaseNotes.txt @@ -20,6 +20,26 @@ Minimum Requirements: - GCC 4.x - Some of the sample applications require a graphics card equivalent to: ATI RADEON x1300 or NVIDIA GeForce 7300. +Prerequisets: +------------- +- Windows: + - Microsoft Kinect SDK v1.6 (for using with Kinect devices) + From: http://go.microsoft.com/fwlink/?LinkID=262831 + +- Linux: + - LibUSB 1.0.x + From: http://sourceforge.net/projects/libusb/files/libusb-1.0/ + Or via apt: + sudo apt-get install libusb-1.0-0 + - LibUDEV + sudo apt-get install libudev0 + - FreeGLUT3 + From: http://freeglut.sourceforge.net/index.php#download + You only need the run-time version to run the OpenGL samples: + sudo apt-get install freeglut3 + If you also want to compile the OpenGL samples, you'll need to install the development version: + sudo apt-get install freeglut3-dev + Notes: ------ - On Android, only native support (and samples) is currently provided. Please note that as bionic (Android linker) does not From 8e070ee466226068ace5aa2eaa5120d379f9c06f Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Tue, 30 Jul 2013 17:28:58 +0300 Subject: [PATCH 025/188] Add release notes and change log to the installation --- Packaging/Harvest.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Packaging/Harvest.py b/Packaging/Harvest.py index 4ce9ed26..e30911ed 100755 --- a/Packaging/Harvest.py +++ b/Packaging/Harvest.py @@ -317,6 +317,10 @@ def run(self): # Include shutil.copytree(os.path.join(rootDir, 'Include'), os.path.join(self.outDir, 'Include')) + # Release notes and change log + shutil.copy(os.path.join(rootDir, 'ReleaseNotes.txt'), self.outDir) + shutil.copy(os.path.join(rootDir, 'CHANGES.txt'), self.outDir) + # Licenses shutil.copy(os.path.join(rootDir, 'NOTICE'), self.outDir) shutil.copy(os.path.join(rootDir, 'LICENSE'), self.outDir) From 3d800afa857f06127f3edaf8255ba959bbe76057 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Wed, 31 Jul 2013 18:40:10 +0300 Subject: [PATCH 026/188] coordinate converted: now also supports depth values in 100 um. --- Source/Core/OniStream.cpp | 24 ++++++++++++++++++++---- Source/Core/OniStream.h | 1 + 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/Source/Core/OniStream.cpp b/Source/Core/OniStream.cpp index ef77f77b..1c193993 100644 --- a/Source/Core/OniStream.cpp +++ b/Source/Core/OniStream.cpp @@ -401,11 +401,13 @@ OniStatus VideoStream::convertDepthToWorldCoordinates(float depthX, float depthY return ONI_STATUS_NOT_SUPPORTED; } + float depthZmm = depthZ * m_worldConvertCache.zFactor; + float normalizedX = depthX / m_worldConvertCache.resolutionX - .5f; float normalizedY = .5f - depthY / m_worldConvertCache.resolutionY; - *pWorldX = normalizedX * depthZ * m_worldConvertCache.xzFactor; - *pWorldY = normalizedY * depthZ * m_worldConvertCache.yzFactor; + *pWorldX = normalizedX * depthZmm * m_worldConvertCache.xzFactor; + *pWorldY = normalizedY * depthZmm * m_worldConvertCache.yzFactor; *pWorldZ = depthZ; return ONI_STATUS_OK; } @@ -418,8 +420,10 @@ OniStatus VideoStream::convertWorldToDepthCoordinates(float worldX, float worldY return ONI_STATUS_NOT_SUPPORTED; } - *pDepthX = m_worldConvertCache.coeffX * worldX / worldZ + m_worldConvertCache.halfResX; - *pDepthY = m_worldConvertCache.halfResY - m_worldConvertCache.coeffY * worldY / worldZ; + float worldZmm = worldZ * m_worldConvertCache.zFactor; + + *pDepthX = m_worldConvertCache.coeffX * worldX / worldZmm + m_worldConvertCache.halfResX; + *pDepthY = m_worldConvertCache.halfResY - m_worldConvertCache.coeffY * worldY / worldZmm; *pDepthZ = worldZ; return ONI_STATUS_OK; } @@ -449,6 +453,18 @@ void VideoStream::refreshWorldConversionCache() m_worldConvertCache.halfResY = m_worldConvertCache.resolutionY / 2; m_worldConvertCache.coeffX = m_worldConvertCache.resolutionX / m_worldConvertCache.xzFactor; m_worldConvertCache.coeffY = m_worldConvertCache.resolutionY / m_worldConvertCache.yzFactor; + + switch (videoMode.pixelFormat) + { + case ONI_PIXEL_FORMAT_DEPTH_1_MM: + m_worldConvertCache.zFactor = 1.f; + break; + case ONI_PIXEL_FORMAT_DEPTH_100_UM: + m_worldConvertCache.zFactor = 0.1f; + break; + default: + XN_ASSERT(FALSE); + } } OniStatus VideoStream::convertDepthToColorCoordinates(VideoStream* colorStream, int depthX, int depthY, OniDepthPixel depthZ, int* pColorX, int* pColorY) diff --git a/Source/Core/OniStream.h b/Source/Core/OniStream.h index f1f30ed0..a3c5e99f 100644 --- a/Source/Core/OniStream.h +++ b/Source/Core/OniStream.h @@ -142,6 +142,7 @@ class VideoStream int resolutionY; int halfResX; int halfResY; + float zFactor; } m_worldConvertCache; }; From 07828c0c2e2206fd935d67d91eaa022f41df973b Mon Sep 17 00:00:00 2001 From: "mark.sandler" Date: Wed, 31 Jul 2013 14:38:54 +0300 Subject: [PATCH 027/188] PSLink: Set depth stream default resolution to QQVGA on ARM and QVGA otherwise --- .../PSLink/DriverImpl/LinkOniDepthStream.cpp | 21 +++++++++++++++++++ .../PSLink/DriverImpl/LinkOniDepthStream.h | 3 +++ .../PSLink/DriverImpl/LinkOniMapStream.cpp | 9 ++++++++ .../PSLink/DriverImpl/LinkOniMapStream.h | 2 ++ 4 files changed, 35 insertions(+) diff --git a/Source/Drivers/PSLink/DriverImpl/LinkOniDepthStream.cpp b/Source/Drivers/PSLink/DriverImpl/LinkOniDepthStream.cpp index 45abe6e2..f7c7505e 100644 --- a/Source/Drivers/PSLink/DriverImpl/LinkOniDepthStream.cpp +++ b/Source/Drivers/PSLink/DriverImpl/LinkOniDepthStream.cpp @@ -227,3 +227,24 @@ void LinkOniDepthStream::notifyAllProperties() raisePropertyChanged(LINK_PROP_DEPTH_TO_SHIFT_TABLE, pTables->pDepthToShiftTable, pTables->nDepthsCount * sizeof(XnUInt16)); } + +XnStatus LinkOniDepthStream::GetDefaultVideoMode( OniVideoMode* pVideoMode ) +{ + if(pVideoMode != NULL) + { + //ARM cannot handle QVGA, so we default to QQVGA +#if (XN_PLATFORM == XN_PLATFORM_LINUX_ARM || XN_PLATFORM == XN_PLATFORM_ANDROID_ARM) + pVideoMode->resolutionX = 160; + pVideoMode->resolutionY = 120; +#else + pVideoMode->resolutionX = 320; + pVideoMode->resolutionY = 240; +#endif + + return XN_STATUS_OK; + } + else + { + return LinkOniMapStream::GetDefaultVideoMode(pVideoMode); + } +} diff --git a/Source/Drivers/PSLink/DriverImpl/LinkOniDepthStream.h b/Source/Drivers/PSLink/DriverImpl/LinkOniDepthStream.h index 61afb7e7..2620dda4 100644 --- a/Source/Drivers/PSLink/DriverImpl/LinkOniDepthStream.h +++ b/Source/Drivers/PSLink/DriverImpl/LinkOniDepthStream.h @@ -37,6 +37,9 @@ class LinkOniDepthStream : virtual OniStatus getProperty(int propertyId, void* data, int* pDataSize); virtual OniBool isPropertySupported(int propertyId); virtual void notifyAllProperties(); + +protected: + virtual XnStatus GetDefaultVideoMode( OniVideoMode* pVideoMode ); }; #endif // __LINK_ONI_DEPTH_STREAM_H__ \ No newline at end of file diff --git a/Source/Drivers/PSLink/DriverImpl/LinkOniMapStream.cpp b/Source/Drivers/PSLink/DriverImpl/LinkOniMapStream.cpp index 6f7f7bf1..45f5c278 100644 --- a/Source/Drivers/PSLink/DriverImpl/LinkOniMapStream.cpp +++ b/Source/Drivers/PSLink/DriverImpl/LinkOniMapStream.cpp @@ -61,6 +61,10 @@ XnStatus LinkOniMapStream::Init() OniVideoMode videoMode; GetVideoMode(&videoMode); + // override with streams default values + GetDefaultVideoMode(&videoMode); + + // override with INI config XnInt32 temp32; if (XN_STATUS_OK == xnOSReadIntFromINI(m_configFile, section, "XResolution", &temp32)) { @@ -358,3 +362,8 @@ XnStatus LinkOniMapStream::SetCropping(const OniCropping &cropping) return m_pInputStream->SetCropping(cropping); } +XnStatus LinkOniMapStream::GetDefaultVideoMode( OniVideoMode* /*pVideoMode*/ ) +{ + return XN_STATUS_IS_EMPTY; +} + diff --git a/Source/Drivers/PSLink/DriverImpl/LinkOniMapStream.h b/Source/Drivers/PSLink/DriverImpl/LinkOniMapStream.h index 76d87e76..ad811f20 100644 --- a/Source/Drivers/PSLink/DriverImpl/LinkOniMapStream.h +++ b/Source/Drivers/PSLink/DriverImpl/LinkOniMapStream.h @@ -59,6 +59,8 @@ class LinkOniMapStream : XnFwPixelFormat nInputFormat; }; + virtual XnStatus GetDefaultVideoMode(OniVideoMode* pVideoMode); + int m_nSupportedModesCount; SupportedVideoMode* m_aSupportedModes; From ca233b2b20e22574b0ea3d58ea43cfb872d89688 Mon Sep 17 00:00:00 2001 From: "mark.sandler" Date: Wed, 31 Jul 2013 14:39:44 +0300 Subject: [PATCH 028/188] PSLink: Remove assertions on HandlePacket errors --- Source/Drivers/PSLink/LinkProtoLib/XnLinkInputStreamsMgr.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/Source/Drivers/PSLink/LinkProtoLib/XnLinkInputStreamsMgr.cpp b/Source/Drivers/PSLink/LinkProtoLib/XnLinkInputStreamsMgr.cpp index 1decd934..2e27ed8c 100644 --- a/Source/Drivers/PSLink/LinkProtoLib/XnLinkInputStreamsMgr.cpp +++ b/Source/Drivers/PSLink/LinkProtoLib/XnLinkInputStreamsMgr.cpp @@ -229,7 +229,6 @@ void LinkInputStreamsMgr::HandlePacket(const LinkPacketHeader* pLinkPacketHeader nPacketID, nStreamID, xnFragmentationFlagsToStr(fragmentation), xnFragmentationFlagsToStr(pStreamInfo->prevFragmentation)); - XN_ASSERT(FALSE); pStreamInfo->packetLoss = TRUE; } @@ -247,7 +246,6 @@ void LinkInputStreamsMgr::HandlePacket(const LinkPacketHeader* pLinkPacketHeader { xnLogWarning(XN_MASK_LINK, "Inconsistent msg type for stream %u - expected 0x%04X but got 0x%04X", nStreamID, pStreamInfo->nMsgType, nMsgType); - XN_ASSERT(FALSE); pStreamInfo->packetLoss = TRUE; return; } @@ -267,7 +265,6 @@ void LinkInputStreamsMgr::HandlePacket(const LinkPacketHeader* pLinkPacketHeader { xnLogWarning(XN_MASK_LINK, "Failed to handle packet of %u bytes in stream %u: %s", pLinkPacketHeader->GetDataSize(), nStreamID, xnGetStatusString(nRetVal)); - XN_ASSERT(FALSE); return; } } From ecffeaac548812f68027da0dc6b78cf98cee2fbf Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Thu, 1 Aug 2013 16:34:23 +0300 Subject: [PATCH 029/188] Update version to 2.3.0.4. --- CHANGES.txt | 12 ++++++++++-- Include/OniVersion.h | 2 +- Packaging/Install/Includes/Variables.wxi | 2 +- Packaging/UpdateVersion.py | 2 +- ReleaseNotes.txt | 4 ++-- 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index e59014af..089122f9 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -3,16 +3,24 @@ Change Log: OpenNI 2.3: - Fix pure-C APIs - - OPENNITWO-493: Single pixel translation is wrong when image res is 1280x1024 + - Bug Fix: Single pixel translation is wrong when image res is 1280x1024 + - Bug Fix: depth/world conversion was wrong when depth is in 100 um format - Bug Fix: no even frame indexes from Capri devices. - Properties are now saved in recordings of Capri devices and input files - Link console: allow running a single command and exit - Capri: - Bug Fix: Depth stops working if switching to QQVGA and then back to VGA - i2c device list now also states the master and slave IDs - - add commands for turning on/off ACC + - Add commands for turning on/off ACC + - Fixed a weird log during shutdown + - Add commands for projector pulse and projector power + - Add commands for setting CMOS gain + - Print test name when running BIST + - Default resolution is now QQVGA on ARM machines - Build: - Support gold linker in compilation + - Add Linux prerequisites to release notes + - Add release notes and change log to installation OpenNI 2.2: - Added getDepthColorSyncEnabled() API diff --git a/Include/OniVersion.h b/Include/OniVersion.h index 5448a1f8..71a3df6e 100644 --- a/Include/OniVersion.h +++ b/Include/OniVersion.h @@ -23,7 +23,7 @@ #define ONI_VERSION_MAJOR 2 #define ONI_VERSION_MINOR 3 #define ONI_VERSION_MAINTENANCE 0 -#define ONI_VERSION_BUILD 3 +#define ONI_VERSION_BUILD 4 /** OpenNI version (in brief string format): "Major.Minor.Maintenance (Build)" */ #define ONI_BRIEF_VERSION_STRING \ diff --git a/Packaging/Install/Includes/Variables.wxi b/Packaging/Install/Includes/Variables.wxi index a79397a9..b08398fb 100644 --- a/Packaging/Install/Includes/Variables.wxi +++ b/Packaging/Install/Includes/Variables.wxi @@ -8,7 +8,7 @@ - + diff --git a/Packaging/UpdateVersion.py b/Packaging/UpdateVersion.py index 4014f113..a02a16ca 100755 --- a/Packaging/UpdateVersion.py +++ b/Packaging/UpdateVersion.py @@ -28,7 +28,7 @@ VERSION_MAJOR = 2 VERSION_MINOR = 3 VERSION_MAINTENANCE = 0 -VERSION_BUILD = 3 +VERSION_BUILD = 4 def getVersionString(): return str(VERSION_MAJOR) + "." + str(VERSION_MINOR) + "." + str(VERSION_MAINTENANCE) + "." + str(VERSION_BUILD) diff --git a/ReleaseNotes.txt b/ReleaseNotes.txt index 70bafaef..0c0d2abe 100644 --- a/ReleaseNotes.txt +++ b/ReleaseNotes.txt @@ -1,5 +1,5 @@ -OpenNI 2.3.0 Build 3 -July 30 2013 +OpenNI 2.3.0 Build 4 +August 1 2013 Minimum Requirements: --------------------- From 712597795cfc2d0e8048a3247d00f51a1df024cd Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Mon, 5 Aug 2013 12:47:29 +0300 Subject: [PATCH 030/188] Make sure FOV is zero if not supported by stream --- Source/Core/OniStream.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Core/OniStream.cpp b/Source/Core/OniStream.cpp index 1c193993..b8984896 100644 --- a/Source/Core/OniStream.cpp +++ b/Source/Core/OniStream.cpp @@ -440,8 +440,8 @@ void VideoStream::refreshWorldConversionCache() getProperty(ONI_STREAM_PROPERTY_VIDEO_MODE, &videoMode, &size); size = sizeof(float); - float horizontalFov; - float verticalFov; + float horizontalFov = 0.0; + float verticalFov = 0.0; getProperty(ONI_STREAM_PROPERTY_HORIZONTAL_FOV, &horizontalFov, &size); getProperty(ONI_STREAM_PROPERTY_VERTICAL_FOV, &verticalFov, &size); From b66e05ad5e474df075286dba7aece7076502fb35 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Mon, 5 Aug 2013 12:54:36 +0300 Subject: [PATCH 031/188] PSLink.ini - can't set mirror on/off --- .../Drivers/PSLink/DriverImpl/LinkOniMapStream.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Source/Drivers/PSLink/DriverImpl/LinkOniMapStream.cpp b/Source/Drivers/PSLink/DriverImpl/LinkOniMapStream.cpp index 45f5c278..87dc06e5 100644 --- a/Source/Drivers/PSLink/DriverImpl/LinkOniMapStream.cpp +++ b/Source/Drivers/PSLink/DriverImpl/LinkOniMapStream.cpp @@ -56,8 +56,8 @@ XnStatus LinkOniMapStream::Init() XN_IS_STATUS_OK(nRetVal); // read video mode - XnChar section[255]; - sprintf(section, "%s.VideoMode", m_configSection); + XnChar videoModeSection[255]; + sprintf(videoModeSection, "%s.VideoMode", m_configSection); OniVideoMode videoMode; GetVideoMode(&videoMode); @@ -66,19 +66,19 @@ XnStatus LinkOniMapStream::Init() // override with INI config XnInt32 temp32; - if (XN_STATUS_OK == xnOSReadIntFromINI(m_configFile, section, "XResolution", &temp32)) + if (XN_STATUS_OK == xnOSReadIntFromINI(m_configFile, videoModeSection, "XResolution", &temp32)) { videoMode.resolutionX = (int)temp32; } - if (XN_STATUS_OK == xnOSReadIntFromINI(m_configFile, section, "YResolution", &temp32)) + if (XN_STATUS_OK == xnOSReadIntFromINI(m_configFile, videoModeSection, "YResolution", &temp32)) { videoMode.resolutionY = (int)temp32; } - if (XN_STATUS_OK == xnOSReadIntFromINI(m_configFile, section, "FPS", &temp32)) + if (XN_STATUS_OK == xnOSReadIntFromINI(m_configFile, videoModeSection, "FPS", &temp32)) { videoMode.fps = (int)temp32; } - if (XN_STATUS_OK == xnOSReadIntFromINI(m_configFile, section, "PixelFormat", &temp32)) + if (XN_STATUS_OK == xnOSReadIntFromINI(m_configFile, videoModeSection, "PixelFormat", &temp32)) { videoMode.pixelFormat = (OniPixelFormat)temp32; } @@ -93,7 +93,7 @@ XnStatus LinkOniMapStream::Init() XN_IS_STATUS_OK(nRetVal); OniBool bMirror = TRUE; - if (XN_STATUS_OK == xnOSReadIntFromINI(m_configFile, section, "Mirror", &temp32)) + if (XN_STATUS_OK == xnOSReadIntFromINI(m_configFile, m_configSection, "Mirror", &temp32)) { bMirror = (temp32 == 1); } From 636204fc8c32253901fe7049f376b9c68fa944d7 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Tue, 6 Aug 2013 09:03:47 +0300 Subject: [PATCH 032/188] Merge branch 'test_device' into develop --- Include/OniTest.h | 40 ++ Source/Core/OpenNI.vcxproj | 1 + Source/Core/OpenNI.vcxproj.filters | 3 + Source/Drivers/TestDevice/TestDevice.cpp | 420 ++----------------- Source/Drivers/TestDevice/TestDevice.h | 51 +++ Source/Drivers/TestDevice/TestDevice.vcxproj | 7 + Source/Drivers/TestDevice/TestDriver.cpp | 88 ++++ Source/Drivers/TestDevice/TestDriver.h | 45 ++ Source/Drivers/TestDevice/TestStream.cpp | 181 ++++++++ Source/Drivers/TestDevice/TestStream.h | 60 +++ 10 files changed, 522 insertions(+), 374 deletions(-) create mode 100644 Include/OniTest.h create mode 100644 Source/Drivers/TestDevice/TestDevice.h create mode 100644 Source/Drivers/TestDevice/TestDriver.cpp create mode 100644 Source/Drivers/TestDevice/TestDriver.h create mode 100644 Source/Drivers/TestDevice/TestStream.cpp create mode 100644 Source/Drivers/TestDevice/TestStream.h diff --git a/Include/OniTest.h b/Include/OniTest.h new file mode 100644 index 00000000..06f67925 --- /dev/null +++ b/Include/OniTest.h @@ -0,0 +1,40 @@ +/***************************************************************************** +* * +* OpenNI 2.x Alpha * +* Copyright (C) 2012 PrimeSense Ltd. * +* * +* This file is part of OpenNI. * +* * +* Licensed under the Apache License, Version 2.0 (the "License"); * +* you may not use this file except in compliance with the License. * +* You may obtain a copy of the License at * +* * +* http://www.apache.org/licenses/LICENSE-2.0 * +* * +* Unless required by applicable law or agreed to in writing, software * +* distributed under the License is distributed on an "AS IS" BASIS, * +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * +* See the License for the specific language governing permissions and * +* limitations under the License. * +* * +*****************************************************************************/ +#ifndef _ONI_TEST_H_ +#define _ONI_TEST_H_ + +#define TEST_DEVICE_NAME "Test" // use with device.open() to create a test device + +/** +* Additional commands for Test device streams +*/ +enum +{ + TEST_COMMAND_ISSUE_FRAME = 0xFFFF0001, // TestCommandIssueFrame +}; + +typedef struct TestCommandIssueFrame +{ + uint64_t timestamp; + void* data; +} TestCommandIssueFrame; + +#endif //_ONI_TEST_H_ \ No newline at end of file diff --git a/Source/Core/OpenNI.vcxproj b/Source/Core/OpenNI.vcxproj index cde1020f..4a585524 100644 --- a/Source/Core/OpenNI.vcxproj +++ b/Source/Core/OpenNI.vcxproj @@ -189,6 +189,7 @@ + diff --git a/Source/Core/OpenNI.vcxproj.filters b/Source/Core/OpenNI.vcxproj.filters index 772c332e..5b8b818b 100644 --- a/Source/Core/OpenNI.vcxproj.filters +++ b/Source/Core/OpenNI.vcxproj.filters @@ -91,6 +91,9 @@ Header files + + Header files\API + diff --git a/Source/Drivers/TestDevice/TestDevice.cpp b/Source/Drivers/TestDevice/TestDevice.cpp index e1832bfb..b6389141 100644 --- a/Source/Drivers/TestDevice/TestDevice.cpp +++ b/Source/Drivers/TestDevice/TestDevice.cpp @@ -18,403 +18,75 @@ * limitations under the License. * * * *****************************************************************************/ -#include "Driver\OniDriverAPI.h" -#include "XnLib.h" -#include "XnHash.h" -#include "XnEvent.h" +#include "TestDevice.h" -#define TEST_RESOLUTION_X 320 -#define TEST_RESOLUTION_Y 240 - -class TestStream : public oni::driver::StreamBase +TestDevice::TestDevice(OniDeviceInfo* pInfo, oni::driver::DriverServices& driverServices) : m_pInfo(pInfo), m_driverServices(driverServices) { -public: - TestStream() : oni::driver::StreamBase() - { - m_osEvent.Create(TRUE); - m_sendCount = 0; - } - - ~TestStream() - { - stop(); - } - - OniStatus start() - { - xnOSCreateThread(threadFunc, this, &m_threadHandle); - - return ONI_STATUS_OK; - } - - void stop() - { - m_running = false; - } - - virtual OniStatus SetVideoMode(OniVideoMode*) = 0; - virtual OniStatus GetVideoMode(OniVideoMode* pVideoMode) = 0; - - OniStatus getProperty(int propertyId, void* data, int* pDataSize) - { - if (propertyId == ONI_STREAM_PROPERTY_VIDEO_MODE) - { - if (*pDataSize != sizeof(OniVideoMode)) - { - printf("Unexpected size: %d != %d\n", *pDataSize, sizeof(OniVideoMode)); - return ONI_STATUS_ERROR; - } - return GetVideoMode((OniVideoMode*)data); - } - - return ONI_STATUS_NOT_IMPLEMENTED; - } - - OniStatus setProperty(int propertyId, const void* data, int dataSize) - { - if (propertyId == ONI_STREAM_PROPERTY_VIDEO_MODE) - { - if (dataSize != sizeof(OniVideoMode)) - { - printf("Unexpected size: %d != %d\n", dataSize, sizeof(OniVideoMode)); - return ONI_STATUS_ERROR; - } - return SetVideoMode((OniVideoMode*)data); - } - else if (propertyId == 666) - { - if (dataSize != sizeof(int)) - { - printf("Unexpected size: %d != %d\n", dataSize, sizeof(int)); - return ONI_STATUS_ERROR; - } - - // Increment the send count. - m_cs.Lock(); - m_sendCount += *((int*)data); - m_cs.Unlock(); - - // Raise the OS event, to allow thread to start working. - m_osEvent.Set(); - } - - return ONI_STATUS_NOT_IMPLEMENTED; - } + OniSensorType sensorTypes[] = { ONI_SENSOR_DEPTH, ONI_SENSOR_COLOR, ONI_SENSOR_IR }; + int count = sizeof(sensorTypes)/sizeof(sensorTypes[0]); - virtual int GetBytesPerPixel() = 0; + XN_ASSERT(count < sizeof(m_sensors)/sizeof(m_sensors[0])); -protected: - - // Thread - static XN_THREAD_PROC threadFunc(XN_THREAD_PARAM pThreadParam) + for (int i = 0; i < count; ++i) { - TestStream* pStream = (TestStream*)pThreadParam; - pStream->m_running = true; - - while (pStream->m_running) - { - pStream->m_osEvent.Wait(XN_WAIT_INFINITE); - int count = 0; - do - { - // Get the current count. - pStream->m_cs.Lock(); - count = pStream->m_sendCount; - if (pStream->m_sendCount > 0) - { - pStream->m_sendCount--; - } - pStream->m_cs.Unlock(); - - // Send the frame. - if (count > 0) - { - OniFrame* pFrame = pStream->getServices().acquireFrame(); - pStream->BuildFrame(pFrame); - pStream->raiseNewFrame(pFrame); - pStream->getServices().releaseFrame(pFrame); - } - - } while (count > 0); - } - - XN_THREAD_PROC_RETURN(XN_STATUS_OK); + m_sensors[i].sensorType = sensorTypes[i]; + m_sensors[i].numSupportedVideoModes = 1; + m_sensors[i].pSupportedVideoModes = XN_NEW_ARR(OniVideoMode, 1); + m_sensors[i].pSupportedVideoModes[0].pixelFormat = TestStream::getDefaultPixelFormat(m_sensors[i].sensorType); + m_sensors[i].pSupportedVideoModes[0].fps = DEFAULT_FPS; + m_sensors[i].pSupportedVideoModes[0].resolutionX = DEFAULT_RESOLUTION_X; + m_sensors[i].pSupportedVideoModes[0].resolutionY = DEFAULT_RESOLUTION_Y; } - virtual int BuildFrame(OniFrame* pFrame) = 0; - - int singleRes(int x, int y) {return y*TEST_RESOLUTION_X+x;} - - bool m_running; - int m_sendCount; + m_numSensors = count; +} - XN_THREAD_HANDLE m_threadHandle; - - xnl::CriticalSection m_cs; - xnl::OSEvent m_osEvent; -}; - -class TestDepthStream : public TestStream +OniDeviceInfo* TestDevice::GetInfo() { -public: + return m_pInfo; +} - TestDepthStream() : TestStream() - { - m_frameId = 1; - } - - OniStatus SetVideoMode(OniVideoMode*) {return ONI_STATUS_NOT_IMPLEMENTED;} - OniStatus GetVideoMode(OniVideoMode* pVideoMode) - { - pVideoMode->pixelFormat = ONI_PIXEL_FORMAT_DEPTH_1_MM; - pVideoMode->fps = 30; - pVideoMode->resolutionX = TEST_RESOLUTION_X; - pVideoMode->resolutionY = TEST_RESOLUTION_Y; - return ONI_STATUS_OK; - } - - virtual int GetBytesPerPixel() { return sizeof(OniDepthPixel); } - -private: - - virtual int BuildFrame(OniFrame* pFrame) - { - pFrame->frameIndex = m_frameId; - - pFrame->videoMode.pixelFormat = ONI_PIXEL_FORMAT_DEPTH_1_MM; - pFrame->videoMode.resolutionX = TEST_RESOLUTION_X; - pFrame->videoMode.resolutionY = TEST_RESOLUTION_Y; - pFrame->videoMode.fps = 30; - - pFrame->width = TEST_RESOLUTION_X; - pFrame->height = TEST_RESOLUTION_Y; - - pFrame->cropOriginX = pFrame->cropOriginY = 0; - pFrame->croppingEnabled = FALSE; - - pFrame->sensorType = ONI_SENSOR_DEPTH; - pFrame->stride = TEST_RESOLUTION_X*sizeof(OniDepthPixel); - pFrame->timestamp = m_frameId*33000; - m_frameId++; - return 1; - } - - int m_frameId; -}; - -class TestImageStream : public TestStream +OniStatus TestDevice::getSensorInfoList(OniSensorInfo** pSensors, int* numSensors) { -public: - TestImageStream() : TestStream() - { - m_frameId = 1; - } + *numSensors = m_numSensors; + *pSensors = m_sensors; - OniStatus SetVideoMode(OniVideoMode*) {return ONI_STATUS_NOT_IMPLEMENTED;} - OniStatus GetVideoMode(OniVideoMode* pVideoMode) - { - pVideoMode->pixelFormat = ONI_PIXEL_FORMAT_RGB888; - pVideoMode->fps = 30; - pVideoMode->resolutionX = TEST_RESOLUTION_X; - pVideoMode->resolutionY = TEST_RESOLUTION_Y; - return ONI_STATUS_OK; - } - - virtual int GetBytesPerPixel() { return sizeof(OniRGB888Pixel); } - -private: - - virtual int BuildFrame(OniFrame* pFrame) - { - pFrame->frameIndex = m_frameId; - - pFrame->videoMode.pixelFormat = ONI_PIXEL_FORMAT_RGB888; - pFrame->videoMode.resolutionX = TEST_RESOLUTION_X; - pFrame->videoMode.resolutionY = TEST_RESOLUTION_Y; - pFrame->videoMode.fps = 30; - - pFrame->width = TEST_RESOLUTION_X; - pFrame->height = TEST_RESOLUTION_Y; - - pFrame->cropOriginX = pFrame->cropOriginY = 0; - pFrame->croppingEnabled = FALSE; + return ONI_STATUS_OK; +} - pFrame->sensorType = ONI_SENSOR_COLOR; - pFrame->stride = TEST_RESOLUTION_X*sizeof(OniRGB888Pixel); - pFrame->timestamp = m_frameId*33000; - m_frameId++; - return 1; - } - - int m_frameId; -}; - -class TestDevice : public oni::driver::DeviceBase +oni::driver::StreamBase* TestDevice::createStream(OniSensorType sensorType) { -public: - TestDevice(OniDeviceInfo* pInfo, oni::driver::DriverServices& driverServices) : m_pInfo(pInfo), m_driverServices(driverServices) - { - m_numSensors = 2; - - m_sensors[0].pSupportedVideoModes = XN_NEW_ARR(OniVideoMode, 1); - m_sensors[0].sensorType = ONI_SENSOR_DEPTH; - m_sensors[0].numSupportedVideoModes = 1; - m_sensors[0].pSupportedVideoModes[0].pixelFormat = ONI_PIXEL_FORMAT_DEPTH_1_MM; - m_sensors[0].pSupportedVideoModes[0].fps = 30; - m_sensors[0].pSupportedVideoModes[0].resolutionX = TEST_RESOLUTION_X; - m_sensors[0].pSupportedVideoModes[0].resolutionY = TEST_RESOLUTION_Y; - - m_sensors[1].pSupportedVideoModes = XN_NEW_ARR(OniVideoMode, 1); - m_sensors[1].sensorType = ONI_SENSOR_COLOR; - m_sensors[1].numSupportedVideoModes = 1; - m_sensors[1].pSupportedVideoModes[0].pixelFormat = ONI_PIXEL_FORMAT_RGB888; - m_sensors[1].pSupportedVideoModes[0].fps = 30; - m_sensors[1].pSupportedVideoModes[0].resolutionX = TEST_RESOLUTION_X; - m_sensors[1].pSupportedVideoModes[0].resolutionY = TEST_RESOLUTION_Y; - - } - OniDeviceInfo* GetInfo() - { - return m_pInfo; - } - - OniStatus getSensorInfoList(OniSensorInfo** pSensors, int* numSensors) - { - *numSensors = m_numSensors; - *pSensors = m_sensors; - - return ONI_STATUS_OK; - } - - oni::driver::StreamBase* createStream(OniSensorType sensorType) - { - if (sensorType == ONI_SENSOR_DEPTH) - { - TestDepthStream* pDepth = XN_NEW(TestDepthStream); - return pDepth; - } - if (sensorType == ONI_SENSOR_COLOR) - { - TestImageStream* pImage = XN_NEW(TestImageStream); - return pImage; - } - - m_driverServices.errorLoggerAppend("TestDevice: Can't create a stream of type %d", sensorType); - return NULL; - } - - void destroyStream(oni::driver::StreamBase* pStream) - { - XN_DELETE(pStream); - } - - OniStatus getProperty(int propertyId, void* data, int* pDataSize) - { - OniStatus rc = ONI_STATUS_OK; - - switch (propertyId) - { - case ONI_DEVICE_PROPERTY_DRIVER_VERSION: - { - if (*pDataSize == sizeof(OniVersion)) - { - OniVersion* version = (OniVersion*)data; - version->major = version->minor = version->maintenance = version->build = 2; - } - else - { - m_driverServices.errorLoggerAppend("Unexpected size: %d != %d\n", *pDataSize, sizeof(OniVersion)); - rc = ONI_STATUS_ERROR; - } - } - break; - default: - m_driverServices.errorLoggerAppend("Unknown property: %d\n", propertyId); - rc = ONI_STATUS_ERROR; - } - return rc; - } -private: - TestDevice(const TestDevice&); - void operator=(const TestDevice&); - - OniDeviceInfo* m_pInfo; - int m_numSensors; - OniSensorInfo m_sensors[10]; - oni::driver::DriverServices& m_driverServices; -}; + return XN_NEW(TestStream, sensorType); +} +void TestDevice::destroyStream(oni::driver::StreamBase* pStream) +{ + XN_DELETE(pStream); +} -class TestDriver : public oni::driver::DriverBase +OniStatus TestDevice::getProperty(int propertyId, void* data, int* pDataSize) { -public: - TestDriver(OniDriverServices* pDriverServices) : DriverBase(pDriverServices) - {} + OniStatus rc = ONI_STATUS_OK; - virtual oni::driver::DeviceBase* deviceOpen(const char* uri, const char* /*mode*/) + switch (propertyId) { - for (xnl::Hash::Iterator iter = m_devices.Begin(); iter != m_devices.End(); ++iter) + case ONI_DEVICE_PROPERTY_DRIVER_VERSION: { - if (xnOSStrCmp(iter->Key()->uri, uri) == 0) + if (*pDataSize == sizeof(OniVersion)) { - // Found - if (iter->Value() != NULL) - { - // already using - return iter->Value(); - } - - TestDevice* pDevice = XN_NEW(TestDevice, iter->Key(), getServices()); - iter->Value() = pDevice; - return pDevice; + OniVersion* version = (OniVersion*)data; + version->major = version->minor = version->maintenance = version->build = 2; } - } - - getServices().errorLoggerAppend("Looking for '%s'", uri); - return NULL; - } - - virtual void deviceClose(oni::driver::DeviceBase* pDevice) - { - for (xnl::Hash::Iterator iter = m_devices.Begin(); iter != m_devices.End(); ++iter) - { - if (iter->Value() == pDevice) + else { - iter->Value() = NULL; - XN_DELETE(pDevice); - return; + m_driverServices.errorLoggerAppend("Unexpected size: %d != %d\n", *pDataSize, sizeof(OniVersion)); + rc = ONI_STATUS_ERROR; } } - - // not our device?! - XN_ASSERT(FALSE); - } - - virtual OniStatus tryDevice(const char* uri) - { - if (xnOSStrCmp(uri, "Test")) - { - return ONI_STATUS_ERROR; - } - - - OniDeviceInfo* pInfo = XN_NEW(OniDeviceInfo); - xnOSStrCopy(pInfo->uri, uri, ONI_MAX_STR); - xnOSStrCopy(pInfo->vendor, "Test", ONI_MAX_STR); - m_devices[pInfo] = NULL; - - deviceConnected(pInfo); - - return ONI_STATUS_OK; + break; + default: + m_driverServices.errorLoggerAppend("Unknown property: %d\n", propertyId); + rc = ONI_STATUS_ERROR; } - - void shutdown() {} - -protected: - - XN_THREAD_HANDLE m_threadHandle; - - xnl::Hash m_devices; -}; - -ONI_EXPORT_DRIVER(TestDriver); + return rc; +} diff --git a/Source/Drivers/TestDevice/TestDevice.h b/Source/Drivers/TestDevice/TestDevice.h new file mode 100644 index 00000000..d57e6aa2 --- /dev/null +++ b/Source/Drivers/TestDevice/TestDevice.h @@ -0,0 +1,51 @@ +/***************************************************************************** +* * +* OpenNI 2.x Alpha * +* Copyright (C) 2012 PrimeSense Ltd. * +* * +* This file is part of OpenNI. * +* * +* Licensed under the Apache License, Version 2.0 (the "License"); * +* you may not use this file except in compliance with the License. * +* You may obtain a copy of the License at * +* * +* http://www.apache.org/licenses/LICENSE-2.0 * +* * +* Unless required by applicable law or agreed to in writing, software * +* distributed under the License is distributed on an "AS IS" BASIS, * +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * +* See the License for the specific language governing permissions and * +* limitations under the License. * +* * +*****************************************************************************/ +#ifndef _TEST_DEVICE_H_ +#define _TEST_DEVICE_H_ + +#include +#include "TestStream.h" + +class TestDevice : public oni::driver::DeviceBase +{ +public: + TestDevice(OniDeviceInfo* pInfo, oni::driver::DriverServices& driverServices); + OniDeviceInfo* GetInfo(); + + OniStatus getSensorInfoList(OniSensorInfo** pSensors, int* numSensors); + + oni::driver::StreamBase* createStream(OniSensorType sensorType); + + void destroyStream(oni::driver::StreamBase* pStream); + + OniStatus getProperty(int propertyId, void* data, int* pDataSize); + +private: + TestDevice(const TestDevice&); + void operator=(const TestDevice&); + + OniDeviceInfo* m_pInfo; + int m_numSensors; + OniSensorInfo m_sensors[10]; + oni::driver::DriverServices& m_driverServices; +}; + +#endif //_TEST_DEVICE_H_ \ No newline at end of file diff --git a/Source/Drivers/TestDevice/TestDevice.vcxproj b/Source/Drivers/TestDevice/TestDevice.vcxproj index e20a074d..51631c60 100644 --- a/Source/Drivers/TestDevice/TestDevice.vcxproj +++ b/Source/Drivers/TestDevice/TestDevice.vcxproj @@ -172,6 +172,13 @@ + + + + + + + diff --git a/Source/Drivers/TestDevice/TestDriver.cpp b/Source/Drivers/TestDevice/TestDriver.cpp new file mode 100644 index 00000000..96bc223f --- /dev/null +++ b/Source/Drivers/TestDevice/TestDriver.cpp @@ -0,0 +1,88 @@ +/***************************************************************************** +* * +* OpenNI 2.x Alpha * +* Copyright (C) 2012 PrimeSense Ltd. * +* * +* This file is part of OpenNI. * +* * +* Licensed under the Apache License, Version 2.0 (the "License"); * +* you may not use this file except in compliance with the License. * +* You may obtain a copy of the License at * +* * +* http://www.apache.org/licenses/LICENSE-2.0 * +* * +* Unless required by applicable law or agreed to in writing, software * +* distributed under the License is distributed on an "AS IS" BASIS, * +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * +* See the License for the specific language governing permissions and * +* limitations under the License. * +* * +*****************************************************************************/ +#include "TestDriver.h" +#include "TestDevice.h" +#include + +TestDriver::TestDriver(OniDriverServices* pDriverServices) : DriverBase(pDriverServices) +{} + +oni::driver::DeviceBase* TestDriver::deviceOpen(const char* uri, const char* /*mode*/) +{ + for (xnl::Hash::Iterator iter = m_devices.Begin(); iter != m_devices.End(); ++iter) + { + if (xnOSStrCmp(iter->Key()->uri, uri) == 0) + { + // Found + if (iter->Value() != NULL) + { + // already using + return iter->Value(); + } + + TestDevice* pDevice = XN_NEW(TestDevice, iter->Key(), getServices()); + iter->Value() = pDevice; + return pDevice; + } + } + + getServices().errorLoggerAppend("Looking for '%s'", uri); + return NULL; +} + +void TestDriver::deviceClose(oni::driver::DeviceBase* pDevice) +{ + for (xnl::Hash::Iterator iter = m_devices.Begin(); iter != m_devices.End(); ++iter) + { + if (iter->Value() == pDevice) + { + iter->Value() = NULL; + XN_DELETE(pDevice); + return; + } + } + + // not our device?! + XN_ASSERT(FALSE); +} + +OniStatus TestDriver::tryDevice(const char* uri) +{ + if (xnOSStrCmp(uri, TEST_DEVICE_NAME)) + { + return ONI_STATUS_ERROR; + } + + + OniDeviceInfo* pInfo = XN_NEW(OniDeviceInfo); + xnOSStrCopy(pInfo->uri, uri, ONI_MAX_STR); + xnOSStrCopy(pInfo->vendor, "Test", ONI_MAX_STR); + m_devices[pInfo] = NULL; + + deviceConnected(pInfo); + + return ONI_STATUS_OK; +} + +void TestDriver::shutdown() +{} + +ONI_EXPORT_DRIVER(TestDriver); diff --git a/Source/Drivers/TestDevice/TestDriver.h b/Source/Drivers/TestDevice/TestDriver.h new file mode 100644 index 00000000..51f993cc --- /dev/null +++ b/Source/Drivers/TestDevice/TestDriver.h @@ -0,0 +1,45 @@ +/***************************************************************************** +* * +* OpenNI 2.x Alpha * +* Copyright (C) 2012 PrimeSense Ltd. * +* * +* This file is part of OpenNI. * +* * +* Licensed under the Apache License, Version 2.0 (the "License"); * +* you may not use this file except in compliance with the License. * +* You may obtain a copy of the License at * +* * +* http://www.apache.org/licenses/LICENSE-2.0 * +* * +* Unless required by applicable law or agreed to in writing, software * +* distributed under the License is distributed on an "AS IS" BASIS, * +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * +* See the License for the specific language governing permissions and * +* limitations under the License. * +* * +*****************************************************************************/ +#ifndef _TEST_DRIVER_H_ +#define _TEST_DRIVER_H_ + +#include +#include +#include + +class TestDriver : public oni::driver::DriverBase +{ +public: + TestDriver(OniDriverServices* pDriverServices); + + virtual oni::driver::DeviceBase* deviceOpen(const char* uri, const char* mode); + virtual void deviceClose(oni::driver::DeviceBase* pDevice); + virtual OniStatus tryDevice(const char* uri); + + void shutdown(); + +protected: + XN_THREAD_HANDLE m_threadHandle; + xnl::Hash m_devices; +}; + +#endif //_TEST_DRIVER_H_ + diff --git a/Source/Drivers/TestDevice/TestStream.cpp b/Source/Drivers/TestDevice/TestStream.cpp new file mode 100644 index 00000000..9b9d051e --- /dev/null +++ b/Source/Drivers/TestDevice/TestStream.cpp @@ -0,0 +1,181 @@ +/***************************************************************************** +* * +* OpenNI 2.x Alpha * +* Copyright (C) 2012 PrimeSense Ltd. * +* * +* This file is part of OpenNI. * +* * +* Licensed under the Apache License, Version 2.0 (the "License"); * +* you may not use this file except in compliance with the License. * +* You may obtain a copy of the License at * +* * +* http://www.apache.org/licenses/LICENSE-2.0 * +* * +* Unless required by applicable law or agreed to in writing, software * +* distributed under the License is distributed on an "AS IS" BASIS, * +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * +* See the License for the specific language governing permissions and * +* limitations under the License. * +* * +*****************************************************************************/ +#include "TestStream.h" +#include + +TestStream::TestStream(OniSensorType sensorType) : oni::driver::StreamBase() +{ + m_osEvent.Create(TRUE); + m_sensorType = sensorType; + m_videoMode.resolutionX = DEFAULT_RESOLUTION_X; + m_videoMode.resolutionY = DEFAULT_RESOLUTION_Y; + m_videoMode.fps = DEFAULT_FPS; + m_videoMode.pixelFormat = getDefaultPixelFormat(sensorType); + m_frameIndex = 0; +} + +TestStream::~TestStream() +{ + stop(); +} + +OniPixelFormat TestStream::getDefaultPixelFormat(OniSensorType sensorType) +{ + switch (sensorType) + { + case ONI_SENSOR_DEPTH: + return ONI_PIXEL_FORMAT_DEPTH_1_MM; + case ONI_SENSOR_COLOR: + return ONI_PIXEL_FORMAT_RGB888; + case ONI_SENSOR_IR: + return ONI_PIXEL_FORMAT_GRAY16; + default: + XN_ASSERT(FALSE); + return (OniPixelFormat)-1; + } +} + +OniStatus TestStream::start() +{ + m_running = true; + return ONI_STATUS_OK; +} + +void TestStream::stop() +{ + m_running = false; +} + +OniStatus TestStream::getProperty(int propertyId, void* data, int* pDataSize) +{ + if (propertyId == ONI_STREAM_PROPERTY_VIDEO_MODE) + { + if (*pDataSize != sizeof(OniVideoMode)) + { + printf("Unexpected size: %d != %d\n", *pDataSize, sizeof(OniVideoMode)); + return ONI_STATUS_ERROR; + } + return getVideoMode((OniVideoMode*)data); + } + + return ONI_STATUS_NOT_IMPLEMENTED; +} + +OniStatus TestStream::setProperty(int propertyId, const void* data, int dataSize) +{ + if (propertyId == ONI_STREAM_PROPERTY_VIDEO_MODE) + { + if (dataSize != sizeof(OniVideoMode)) + { + printf("Unexpected size: %d != %d\n", dataSize, sizeof(OniVideoMode)); + return ONI_STATUS_ERROR; + } + return setVideoMode((OniVideoMode*)data); + } + + return ONI_STATUS_NOT_IMPLEMENTED; +} + +OniStatus TestStream::setVideoMode(OniVideoMode* pVideoMode) +{ + xnOSMemCopy(&m_videoMode, pVideoMode, sizeof(m_videoMode)); + return ONI_STATUS_OK; +} + +OniStatus TestStream::getVideoMode(OniVideoMode* pVideoMode) +{ + xnOSMemCopy(pVideoMode, &m_videoMode, sizeof(m_videoMode)); + return ONI_STATUS_OK; +} + +int getBytesPerPixel(OniPixelFormat format) +{ + switch (format) + { + case ONI_PIXEL_FORMAT_GRAY8: + return 1; + case ONI_PIXEL_FORMAT_DEPTH_1_MM: + case ONI_PIXEL_FORMAT_DEPTH_100_UM: + case ONI_PIXEL_FORMAT_SHIFT_9_2: + case ONI_PIXEL_FORMAT_SHIFT_9_3: + case ONI_PIXEL_FORMAT_GRAY16: + return 2; + case ONI_PIXEL_FORMAT_RGB888: + return 3; + case ONI_PIXEL_FORMAT_YUV422: + case ONI_PIXEL_FORMAT_YUYV: + return 2; + case ONI_PIXEL_FORMAT_JPEG: + return 1; + default: + XN_ASSERT(FALSE); + return 0; + } +} + +OniStatus TestStream::invoke(int commandId, void* data, int dataSize) +{ + switch (commandId) + { + case TEST_COMMAND_ISSUE_FRAME: + { + if (dataSize != sizeof(TestCommandIssueFrame)) + { + printf("Unexpected size: %d != %d\n", dataSize, sizeof(TestCommandIssueFrame)); + return ONI_STATUS_BAD_PARAMETER; + } + + if (!m_running) + { + printf("Can't issue a frame if stream is not started\n"); + return ONI_STATUS_BAD_PARAMETER; + } + + TestCommandIssueFrame* pArgs = (TestCommandIssueFrame*)data; + + OniFrame* pFrame = getServices().acquireFrame(); + pFrame->frameIndex = ++m_frameIndex; + pFrame->timestamp = pArgs->timestamp; + xnOSMemCopy(pFrame->data, pArgs->data, pFrame->dataSize); + + pFrame->videoMode = m_videoMode; + + pFrame->width = m_videoMode.resolutionX; + pFrame->height = m_videoMode.resolutionY; + + pFrame->cropOriginX = pFrame->cropOriginY = 0; + pFrame->croppingEnabled = FALSE; + + pFrame->sensorType = m_sensorType; + pFrame->stride = m_videoMode.resolutionX * getBytesPerPixel(m_videoMode.pixelFormat); + + raiseNewFrame(pFrame); + getServices().releaseFrame(pFrame); + } + break; + + default: + return ONI_STATUS_BAD_PARAMETER; + } + + return ONI_STATUS_OK; +} + diff --git a/Source/Drivers/TestDevice/TestStream.h b/Source/Drivers/TestDevice/TestStream.h new file mode 100644 index 00000000..18366fb2 --- /dev/null +++ b/Source/Drivers/TestDevice/TestStream.h @@ -0,0 +1,60 @@ +/***************************************************************************** +* * +* OpenNI 2.x Alpha * +* Copyright (C) 2012 PrimeSense Ltd. * +* * +* This file is part of OpenNI. * +* * +* Licensed under the Apache License, Version 2.0 (the "License"); * +* you may not use this file except in compliance with the License. * +* You may obtain a copy of the License at * +* * +* http://www.apache.org/licenses/LICENSE-2.0 * +* * +* Unless required by applicable law or agreed to in writing, software * +* distributed under the License is distributed on an "AS IS" BASIS, * +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * +* See the License for the specific language governing permissions and * +* limitations under the License. * +* * +*****************************************************************************/ +#ifndef _TEST_STREAM_H_ +#define _TEST_STREAM_H_ + +#include +#include +#include + +#define DEFAULT_RESOLUTION_X 640 +#define DEFAULT_RESOLUTION_Y 480 +#define DEFAULT_FPS 30 + +class TestStream : public oni::driver::StreamBase +{ +public: + TestStream(OniSensorType sensorType); + virtual ~TestStream(); + virtual OniStatus start(); + virtual void stop(); + virtual OniStatus getProperty(int propertyId, void* data, int* pDataSize); + virtual OniStatus setProperty(int propertyId, const void* data, int dataSize); + virtual OniStatus invoke(int commandId, void* data, int dataSize); + + static OniPixelFormat getDefaultPixelFormat(OniSensorType sensorType); + +protected: + OniStatus setVideoMode(OniVideoMode*); + OniStatus getVideoMode(OniVideoMode* pVideoMode); + + bool m_running; + OniVideoMode m_videoMode; + OniSensorType m_sensorType; + int m_frameIndex; + + XN_THREAD_HANDLE m_threadHandle; + + xnl::CriticalSection m_cs; + xnl::OSEvent m_osEvent; +}; + +#endif //_TEST_STREAM_H_ \ No newline at end of file From d58793f6f8e43844bb753a0f8588b0414d261436 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Tue, 20 Aug 2013 11:39:35 +0300 Subject: [PATCH 033/188] PSLink: Handle some link error codes that weren't handled --- Source/Core/OpenNI.vcxproj.filters | 2 +- Source/Drivers/PSLink/LinkProtoLib/XnLinkProtoUtils.cpp | 8 ++++++++ Source/Drivers/PSLink/LinkProtoLib/XnLinkStatusCodes.h | 8 ++++---- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Source/Core/OpenNI.vcxproj.filters b/Source/Core/OpenNI.vcxproj.filters index 26fd1755..e31de03d 100644 --- a/Source/Core/OpenNI.vcxproj.filters +++ b/Source/Core/OpenNI.vcxproj.filters @@ -95,7 +95,7 @@ Header files\API - Header files\API + Header files diff --git a/Source/Drivers/PSLink/LinkProtoLib/XnLinkProtoUtils.cpp b/Source/Drivers/PSLink/LinkProtoLib/XnLinkProtoUtils.cpp index 8ee0ff07..4db2a56d 100644 --- a/Source/Drivers/PSLink/LinkProtoLib/XnLinkProtoUtils.cpp +++ b/Source/Drivers/PSLink/LinkProtoLib/XnLinkProtoUtils.cpp @@ -64,6 +64,14 @@ XnStatus xnLinkResponseCodeToStatus(XnUInt16 nResponseCode) return XN_STATUS_LINK_RESP_BAD_PARAMETERS; case XN_LINK_RESPONSE_CORRUPT_PACKET: return XN_STATUS_LINK_RESP_CORRUPT_PACKET; + case XN_LINK_RESPONSE_FILE_CORRUPT: + return XN_STATUS_LINK_RESP_CORRUPT_FILE; + case XN_LINK_RESPONSE_BAD_CRC: + return XN_STATUS_LINK_RESP_BAD_CRC; + case XN_LINK_RESPONSE_INCORRECT_SIZE: + return XN_STATUS_LINK_RESP_INCORRECT_SIZE; + case XN_LINK_RESPONSE_INPUT_BUFFER_OVERFLOW: + return XN_STATUS_LINK_RESP_INPUT_BUFFER_OVERFLOW; default: return XN_STATUS_LINK_RESP_UNKNOWN; } diff --git a/Source/Drivers/PSLink/LinkProtoLib/XnLinkStatusCodes.h b/Source/Drivers/PSLink/LinkProtoLib/XnLinkStatusCodes.h index f460699b..acd89f5e 100644 --- a/Source/Drivers/PSLink/LinkProtoLib/XnLinkStatusCodes.h +++ b/Source/Drivers/PSLink/LinkProtoLib/XnLinkStatusCodes.h @@ -60,16 +60,16 @@ XN_STATUS_MESSAGE(XN_STATUS_LINK_RESP_BAD_PARAMETERS, "Link response: bad parame XN_STATUS_MESSAGE(XN_STATUS_LINK_RESP_CORRUPT_PACKET, "Link response: Corrupt packet") //31785 -XN_STATUS_MESSAGE(XN_STATUS_LINK_RESERVED1, "RESERVED1") +XN_STATUS_MESSAGE(XN_STATUS_LINK_RESP_CORRUPT_FILE, "Link response: File is corrupt") //31786 -XN_STATUS_MESSAGE(XN_STATUS_LINK_RESERVED2, "RESERVED2") +XN_STATUS_MESSAGE(XN_STATUS_LINK_RESP_BAD_CRC, "Link response: Bad CRC") //31787 -XN_STATUS_MESSAGE(XN_STATUS_LINK_RESERVED3, "RESERVED3") +XN_STATUS_MESSAGE(XN_STATUS_LINK_RESP_INCORRECT_SIZE, "Link response: Incorrect size") //31788 -XN_STATUS_MESSAGE(XN_STATUS_LINK_RESERVED4, "RESERVED4") +XN_STATUS_MESSAGE(XN_STATUS_LINK_RESP_INPUT_BUFFER_OVERFLOW, "Link response: Input buffer overflow") //31789 XN_STATUS_MESSAGE(XN_STATUS_LINK_RESP_UNKNOWN, "Link response: Unknown response code") From f58b0dd9348f56acc1a34254aa6fb8cb7af064ab Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Thu, 22 Aug 2013 10:13:01 +0300 Subject: [PATCH 034/188] Update PSCommon --- ThirdParty/PSCommon/XnLib/Include/Win32/XnPlatformWin32.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ThirdParty/PSCommon/XnLib/Include/Win32/XnPlatformWin32.h b/ThirdParty/PSCommon/XnLib/Include/Win32/XnPlatformWin32.h index 174a7822..12a4c2df 100644 --- a/ThirdParty/PSCommon/XnLib/Include/Win32/XnPlatformWin32.h +++ b/ThirdParty/PSCommon/XnLib/Include/Win32/XnPlatformWin32.h @@ -253,5 +253,5 @@ typedef HMODULE XN_LIB_HANDLE; return TRUE; \ } -#define XN_ASSERT(assertion) assert(assertion) +#define XN_ASSERT(assertion) _ASSERT(assertion) #endif //_XN_PLATFORM_WIN32_H_ From c7c64c45cc54b8ddf3d89288d0013968b33263a7 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Thu, 22 Aug 2013 10:13:57 +0300 Subject: [PATCH 035/188] PSLink: fix error codes not printing correctly --- Source/Drivers/PSLink/LinkErrorCodes.cpp | 24 ++++++++++++++++++++ Source/Drivers/PSLink/PSLink.vcxproj | 1 + Source/Drivers/PSLink/PSLink.vcxproj.filters | 3 +++ 3 files changed, 28 insertions(+) create mode 100644 Source/Drivers/PSLink/LinkErrorCodes.cpp diff --git a/Source/Drivers/PSLink/LinkErrorCodes.cpp b/Source/Drivers/PSLink/LinkErrorCodes.cpp new file mode 100644 index 00000000..daac84fb --- /dev/null +++ b/Source/Drivers/PSLink/LinkErrorCodes.cpp @@ -0,0 +1,24 @@ +/***************************************************************************** +* * +* OpenNI 2.x Alpha * +* Copyright (C) 2012 PrimeSense Ltd. * +* * +* This file is part of OpenNI. * +* * +* Licensed under the Apache License, Version 2.0 (the "License"); * +* you may not use this file except in compliance with the License. * +* You may obtain a copy of the License at * +* * +* http://www.apache.org/licenses/LICENSE-2.0 * +* * +* Unless required by applicable law or agreed to in writing, software * +* distributed under the License is distributed on an "AS IS" BASIS, * +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * +* See the License for the specific language governing permissions and * +* limitations under the License. * +* * +*****************************************************************************/ + +// Register status codes +#include +#include "XnLinkStatusCodes.h" diff --git a/Source/Drivers/PSLink/PSLink.vcxproj b/Source/Drivers/PSLink/PSLink.vcxproj index 8915163a..f4c2570c 100644 --- a/Source/Drivers/PSLink/PSLink.vcxproj +++ b/Source/Drivers/PSLink/PSLink.vcxproj @@ -249,6 +249,7 @@ + diff --git a/Source/Drivers/PSLink/PSLink.vcxproj.filters b/Source/Drivers/PSLink/PSLink.vcxproj.filters index bcf95649..058e8734 100644 --- a/Source/Drivers/PSLink/PSLink.vcxproj.filters +++ b/Source/Drivers/PSLink/PSLink.vcxproj.filters @@ -327,5 +327,8 @@ + + DriverImpl + \ No newline at end of file From 9647ab5c740c7bdfbdcabfa13dd5d1d0ab9fa998 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Thu, 22 Aug 2013 12:38:07 +0300 Subject: [PATCH 036/188] PS1080Console Bug Fix: "startread" did not work properly. --- Source/Drivers/PS1080/PS1080Console/PS1080Console.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Drivers/PS1080/PS1080Console/PS1080Console.cpp b/Source/Drivers/PS1080/PS1080Console/PS1080Console.cpp index 99291100..6f5ffba1 100644 --- a/Source/Drivers/PS1080/PS1080Console/PS1080Console.cpp +++ b/Source/Drivers/PS1080/PS1080Console/PS1080Console.cpp @@ -1616,7 +1616,7 @@ bool StartReadData(openni::Device& Device, vector& Command) if (!g_colorStream.isValid()) { - rc = g_depthStream.create(Device, openni::SENSOR_COLOR); + rc = g_colorStream.create(Device, openni::SENSOR_COLOR); if (rc != openni::STATUS_OK) { printf("Can't create image stream: %s\n", openni::OpenNI::getExtendedError()); From 9bb130049e3a2d49184649df44f479f36b70eab2 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Thu, 22 Aug 2013 17:12:33 +0300 Subject: [PATCH 037/188] PS1080: cleaner handling of cases where magic isn't found in beginning of packet. If magic is not found where it's supposed to be, just drop the entire buffer we got from the driver. There's no need to compensate for USB problems. We'll loose a frame, and go on from there. --- .../PS1080/Sensor/XnDeviceSensorProtocol.cpp | 35 +++---------------- 1 file changed, 5 insertions(+), 30 deletions(-) diff --git a/Source/Drivers/PS1080/Sensor/XnDeviceSensorProtocol.cpp b/Source/Drivers/PS1080/Sensor/XnDeviceSensorProtocol.cpp index 9ac8b1c5..f36643b8 100644 --- a/Source/Drivers/PS1080/Sensor/XnDeviceSensorProtocol.cpp +++ b/Source/Drivers/PS1080/Sensor/XnDeviceSensorProtocol.cpp @@ -81,43 +81,18 @@ XnBool XN_CALLBACK_TYPE XnDeviceSensorProtocolUsbEpCb(XnUChar* pBuffer, XnUInt32 case XN_LOOKING_FOR_MAGIC: nMagic = XN_PREPARE_VAR16_IN_BUFFER(pDevicePrivateData->FWInfo.nFWMagic); - - if (pCurrState->nMissingBytesInState == sizeof(XnUInt8) && // first byte already found - pBuffer[0] == ((XnUInt8*)&nMagic)[1]) // we have here second byte + if (nMagic == *(XnUInt16*)(pBuffer)) { - // move to next byte - pBuffer++; - - // move to next state pCurrState->CurrHeader.nMagic = nMagic; pCurrState->State = XN_PACKET_HEADER; pCurrState->nMissingBytesInState = sizeof(XnSensorProtocolResponseHeader); - break; - } - - while (pBuffer < pBufEnd) - { - if ((pBuffer + sizeof(XnUInt16) <= pBufEnd) && - nMagic == *(XnUInt16*)(pBuffer)) - { - pCurrState->CurrHeader.nMagic = nMagic; - pCurrState->State = XN_PACKET_HEADER; - pCurrState->nMissingBytesInState = sizeof(XnSensorProtocolResponseHeader); - break; - } - else - { - pBuffer++; - } } - - if (pBuffer == pBufEnd && // magic wasn't found - pBuffer[-1] == ((XnUInt8*)&nMagic)[0]) // last byte in buffer is first in magic + else { - // mark that we found first one - pCurrState->nMissingBytesInState--; + // no magic! ignore the rest of this buffer + xnLogWarning(XN_MASK_SENSOR_PROTOCOL, "Can't find magic. Dropping usb buffer."); + pBuffer = pBufEnd; } - break; case XN_PACKET_HEADER: From c2f4111e755b8abe3d367c68e2c58bfcfe45b810 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Wed, 28 Aug 2013 07:58:13 +0300 Subject: [PATCH 038/188] Update version to 2.3.0.5 --- Include/OniVersion.h | 2 +- Packaging/Install/Includes/Variables.wxi | 2 +- Packaging/UpdateVersion.py | 2 +- ReleaseNotes.txt | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Include/OniVersion.h b/Include/OniVersion.h index 71a3df6e..588bc152 100644 --- a/Include/OniVersion.h +++ b/Include/OniVersion.h @@ -23,7 +23,7 @@ #define ONI_VERSION_MAJOR 2 #define ONI_VERSION_MINOR 3 #define ONI_VERSION_MAINTENANCE 0 -#define ONI_VERSION_BUILD 4 +#define ONI_VERSION_BUILD 5 /** OpenNI version (in brief string format): "Major.Minor.Maintenance (Build)" */ #define ONI_BRIEF_VERSION_STRING \ diff --git a/Packaging/Install/Includes/Variables.wxi b/Packaging/Install/Includes/Variables.wxi index b08398fb..123eb2bf 100644 --- a/Packaging/Install/Includes/Variables.wxi +++ b/Packaging/Install/Includes/Variables.wxi @@ -8,7 +8,7 @@ - + diff --git a/Packaging/UpdateVersion.py b/Packaging/UpdateVersion.py index a02a16ca..0dd4514d 100755 --- a/Packaging/UpdateVersion.py +++ b/Packaging/UpdateVersion.py @@ -28,7 +28,7 @@ VERSION_MAJOR = 2 VERSION_MINOR = 3 VERSION_MAINTENANCE = 0 -VERSION_BUILD = 4 +VERSION_BUILD = 5 def getVersionString(): return str(VERSION_MAJOR) + "." + str(VERSION_MINOR) + "." + str(VERSION_MAINTENANCE) + "." + str(VERSION_BUILD) diff --git a/ReleaseNotes.txt b/ReleaseNotes.txt index 0c0d2abe..91d285f4 100644 --- a/ReleaseNotes.txt +++ b/ReleaseNotes.txt @@ -1,5 +1,5 @@ -OpenNI 2.3.0 Build 4 -August 1 2013 +OpenNI 2.3.0 Build 5 +August 28 2013 Minimum Requirements: --------------------- From 2315b46ab952fd9804a6bc7a683f664318f857f0 Mon Sep 17 00:00:00 2001 From: Ziv Hendel Date: Thu, 29 Aug 2013 01:03:49 +0300 Subject: [PATCH 039/188] PS1080: Added support for FW 5.9. --- Include/PS1080.h | 1 + Source/Drivers/PS1080/PS1080Console/PS1080Console.cpp | 8 ++++++++ Source/Drivers/PS1080/Sensor/XnHostProtocol.cpp | 10 +++++++--- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Include/PS1080.h b/Include/PS1080.h index 561f7664..e9235400 100644 --- a/Include/PS1080.h +++ b/Include/PS1080.h @@ -212,6 +212,7 @@ typedef enum XN_SENSOR_FW_VER_5_6 = 12, XN_SENSOR_FW_VER_5_7 = 13, XN_SENSOR_FW_VER_5_8 = 14, + XN_SENSOR_FW_VER_5_9 = 15, } XnFWVer; typedef enum { diff --git a/Source/Drivers/PS1080/PS1080Console/PS1080Console.cpp b/Source/Drivers/PS1080/PS1080Console/PS1080Console.cpp index 6f5ffba1..d3523923 100644 --- a/Source/Drivers/PS1080/PS1080Console/PS1080Console.cpp +++ b/Source/Drivers/PS1080/PS1080Console/PS1080Console.cpp @@ -219,6 +219,14 @@ bool Version(openni::Device& Device, vector& /*Command*/) { printf ("V5.7"); } + else if (g_DeviceVersion.FWVer == XN_SENSOR_FW_VER_5_8) + { + printf ("V5.8"); + } + else if (g_DeviceVersion.FWVer == XN_SENSOR_FW_VER_5_9) + { + printf ("V5.9"); + } else if (g_DeviceVersion.FWVer == XN_SENSOR_FW_VER_UNKNOWN) { printf ("Unknown"); diff --git a/Source/Drivers/PS1080/Sensor/XnHostProtocol.cpp b/Source/Drivers/PS1080/Sensor/XnHostProtocol.cpp index 6fd4c50f..7b81fb33 100644 --- a/Source/Drivers/PS1080/Sensor/XnHostProtocol.cpp +++ b/Source/Drivers/PS1080/Sensor/XnHostProtocol.cpp @@ -82,7 +82,11 @@ inline XnInt32 CompareVersion(XnUInt8 nMajor1, XnUInt8 nMinor1, XnUInt16 nBuild1 static XnFWVer GetFWVersion(XnUInt8 nMajor, XnUInt8 nMinor, XnUInt16 nBuild) { - if (CompareVersion(nMajor, nMinor, nBuild, 5, 8, 0) >= 0) + if (CompareVersion(nMajor, nMinor, nBuild, 5, 9, 0) >= 0) + { + return XN_SENSOR_FW_VER_5_9; + } + else if (CompareVersion(nMajor, nMinor, nBuild, 5, 8, 0) >= 0) { return XN_SENSOR_FW_VER_5_8; } @@ -667,9 +671,9 @@ XnStatus XnHostProtocolInitFWParams(XnDevicePrivateData* pDevicePrivateData, XnU pDevicePrivateData->FWInfo.nISOLowDepthAlternativeInterface = 2; } - if (CompareVersion(nMajor, nMinor, nBuild, 5, 9, 0) >= 0) + if (CompareVersion(nMajor, nMinor, nBuild, 5, 10, 0) >= 0) { - xnLogWarning(XN_MASK_SENSOR_PROTOCOL, "Sensor version %d.%d.%x is newer than latest known. Trying to use 5.8 protocol...", nMajor, nMinor, nBuild); + xnLogWarning(XN_MASK_SENSOR_PROTOCOL, "Sensor version %d.%d.%x is newer than latest known. Trying to use 5.9 protocol...", nMajor, nMinor, nBuild); } // If FW is already known, update image modes From ad234a953d5e560ed2e18fa68700534ab4a68843 Mon Sep 17 00:00:00 2001 From: Ziv Hendel Date: Thu, 29 Aug 2013 01:07:41 +0300 Subject: [PATCH 040/188] PS1080: Updated version to 5.2.0.0. --- Source/Drivers/PS1080/Include/XnPsVersion.h | 6 +-- Source/Drivers/PS1080/XnPsVersion.h | 57 --------------------- 2 files changed, 3 insertions(+), 60 deletions(-) delete mode 100644 Source/Drivers/PS1080/XnPsVersion.h diff --git a/Source/Drivers/PS1080/Include/XnPsVersion.h b/Source/Drivers/PS1080/Include/XnPsVersion.h index 78dbc750..64e7abb7 100644 --- a/Source/Drivers/PS1080/Include/XnPsVersion.h +++ b/Source/Drivers/PS1080/Include/XnPsVersion.h @@ -32,11 +32,11 @@ /** Xiron major version. */ #define XN_PS_MAJOR_VERSION 5 /** Xiron minor version. */ -#define XN_PS_MINOR_VERSION 1 +#define XN_PS_MINOR_VERSION 2 /** Xiron maintenance version. */ -#define XN_PS_MAINTENANCE_VERSION 4 +#define XN_PS_MAINTENANCE_VERSION 0 /** Xiron build version. */ -#define XN_PS_BUILD_VERSION 1 +#define XN_PS_BUILD_VERSION 0 /** Xiron version (in brief string format): "Major.Minor.Maintenance (Build)" */ #define XN_PS_BRIEF_VERSION_STRING \ diff --git a/Source/Drivers/PS1080/XnPsVersion.h b/Source/Drivers/PS1080/XnPsVersion.h deleted file mode 100644 index 78dbc750..00000000 --- a/Source/Drivers/PS1080/XnPsVersion.h +++ /dev/null @@ -1,57 +0,0 @@ -/***************************************************************************** -* * -* OpenNI 2.x Alpha * -* Copyright (C) 2012 PrimeSense Ltd. * -* * -* This file is part of OpenNI. * -* * -* Licensed under the Apache License, Version 2.0 (the "License"); * -* you may not use this file except in compliance with the License. * -* You may obtain a copy of the License at * -* * -* http://www.apache.org/licenses/LICENSE-2.0 * -* * -* Unless required by applicable law or agreed to in writing, software * -* distributed under the License is distributed on an "AS IS" BASIS, * -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * -* See the License for the specific language governing permissions and * -* limitations under the License. * -* * -*****************************************************************************/ -#ifndef _XN_PS_VERSION_H_ -#define _XN_PS_VERSION_H_ - -//--------------------------------------------------------------------------- -// Includes -//--------------------------------------------------------------------------- -#include - -//--------------------------------------------------------------------------- -// Defines -//--------------------------------------------------------------------------- -/** Xiron major version. */ -#define XN_PS_MAJOR_VERSION 5 -/** Xiron minor version. */ -#define XN_PS_MINOR_VERSION 1 -/** Xiron maintenance version. */ -#define XN_PS_MAINTENANCE_VERSION 4 -/** Xiron build version. */ -#define XN_PS_BUILD_VERSION 1 - -/** Xiron version (in brief string format): "Major.Minor.Maintenance (Build)" */ -#define XN_PS_BRIEF_VERSION_STRING \ - XN_STRINGIFY(XN_PS_MAJOR_VERSION) "." \ - XN_STRINGIFY(XN_PS_MINOR_VERSION) "." \ - XN_STRINGIFY(XN_PS_MAINTENANCE_VERSION) \ - " (Build " XN_STRINGIFY(XN_PS_BUILD_VERSION) ")" - -/** Xiron version (in numeric format): (Xiron major version * 100000000 + Xiron minor version * 1000000 + Xiron maintenance version * 10000 + Xiron build version). */ -#define XN_PS_VERSION (XN_PS_MAJOR_VERSION*100000000 + XN_PS_MINOR_VERSION*1000000 + XN_PS_MAINTENANCE_VERSION*10000 + XN_PS_BUILD_VERSION) - -/** Xiron version (in string format): "Major.Minor.Maintenance.Build-Platform (MMM DD YYYY HH:MM:SS)". */ -#define XN_PS_VERSION_STRING \ - XN_PS_BRIEF_VERSION_STRING "-" \ - XN_PLATFORM_STRING " (" XN_TIMESTAMP ")" - -#endif //_XN_VERSION_H_ - From 08251e443ab07339300ee90d601141490d901c3d Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Thu, 29 Aug 2013 08:50:41 +0300 Subject: [PATCH 041/188] OniFile: allow setting video mode if not changed --- Source/Drivers/OniFile/PlayerStream.cpp | 32 +++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/Source/Drivers/OniFile/PlayerStream.cpp b/Source/Drivers/OniFile/PlayerStream.cpp index 51a9d6da..e8f0b245 100644 --- a/Source/Drivers/OniFile/PlayerStream.cpp +++ b/Source/Drivers/OniFile/PlayerStream.cpp @@ -111,9 +111,37 @@ OniStatus PlayerStream::getProperty(int propertyId, void* pData, int* pDataSize) return rc; } -OniStatus PlayerStream::setProperty(int /*propertyId*/, const void* /*pData*/, int /*dataSize*/) +OniStatus PlayerStream::setProperty(int propertyId, const void* pData, int dataSize) { - return ONI_STATUS_ERROR; + OniStatus nRetVal = ONI_STATUS_OK; + + if (propertyId == ONI_STREAM_PROPERTY_VIDEO_MODE) + { + if (dataSize != sizeof(OniVideoMode)) + { + return ONI_STATUS_BAD_PARAMETER; + } + + OniVideoMode currMode; + int size = sizeof(currMode); + nRetVal = getProperty(ONI_STREAM_PROPERTY_VIDEO_MODE, &currMode, &size); + XN_ASSERT(nRetVal == ONI_STATUS_OK); + + OniVideoMode* pRequestedMode = (OniVideoMode*)pData; + if (pRequestedMode->resolutionX == currMode.resolutionX && + pRequestedMode->resolutionY == currMode.resolutionY && + pRequestedMode->fps == currMode.fps && + pRequestedMode->pixelFormat == currMode.pixelFormat) + { + return ONI_STATUS_OK; + } + + return ONI_STATUS_BAD_PARAMETER; + } + else + { + return ONI_STATUS_ERROR; + } } OniStatus PlayerStream::RegisterReadyForDataEvent(ReadyForDataCallback callback, void* pCookie, OniCallbackHandle& handle) From 824ee850221a019cc54ebea655e8a382b520fd08 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Thu, 29 Aug 2013 08:51:06 +0300 Subject: [PATCH 042/188] Java SimpleViewer: allow passing file name in command prompt --- .../SimpleViewer/SimpleViewerApplication.java | 17 +++++-- .../PSCommon/BuildSystem/BuildJavaWindows.py | 2 +- .../PSCommon/BuildSystem/CommonJavaMakefile | 2 +- ThirdParty/PSCommon/XnLib/Include/XnEvent.h | 18 ++++++- .../XnLib/Source/Linux/XnLinuxSharedLibs.cpp | 47 +++++++++++++++---- ThirdParty/PSCommon/XnLib/XnLib.sln | 7 +++ 6 files changed, 75 insertions(+), 18 deletions(-) diff --git a/Samples/SimpleViewer.java/src/org/openni/Samples/SimpleViewer/SimpleViewerApplication.java b/Samples/SimpleViewer.java/src/org/openni/Samples/SimpleViewer/SimpleViewerApplication.java index 2f52385f..3516b57c 100755 --- a/Samples/SimpleViewer.java/src/org/openni/Samples/SimpleViewer/SimpleViewerApplication.java +++ b/Samples/SimpleViewer.java/src/org/openni/Samples/SimpleViewer/SimpleViewerApplication.java @@ -188,14 +188,21 @@ void run() { public static void main(String s[]) { // initialize OpenNI OpenNI.initialize(); + + String uri; - List devicesInfo = OpenNI.enumerateDevices(); - if (devicesInfo.isEmpty()) { - JOptionPane.showMessageDialog(null, "No device is connected", "Error", JOptionPane.ERROR_MESSAGE); - return; + if (s.length > 0) { + uri = s[0]; + } else { + List devicesInfo = OpenNI.enumerateDevices(); + if (devicesInfo.isEmpty()) { + JOptionPane.showMessageDialog(null, "No device is connected", "Error", JOptionPane.ERROR_MESSAGE); + return; + } + uri = devicesInfo.get(0).getUri(); } - Device device = Device.open(devicesInfo.get(0).getUri()); + Device device = Device.open(uri); final SimpleViewerApplication app = new SimpleViewerApplication(device); app.run(); diff --git a/ThirdParty/PSCommon/BuildSystem/BuildJavaWindows.py b/ThirdParty/PSCommon/BuildSystem/BuildJavaWindows.py index f58e5f2e..82f12a62 100644 --- a/ThirdParty/PSCommon/BuildSystem/BuildJavaWindows.py +++ b/ThirdParty/PSCommon/BuildSystem/BuildJavaWindows.py @@ -108,7 +108,7 @@ if main_class != "": print "Creating batch file..." batch = open(BATCH_FILE, 'w') - batch.write('java -Xmx768m -jar ' + proj_name + '.jar\n') + batch.write('java -Xmx768m -jar ' + proj_name + '.jar %*\n') batch.close() # copy batch to Bin/Debug diff --git a/ThirdParty/PSCommon/BuildSystem/CommonJavaMakefile b/ThirdParty/PSCommon/BuildSystem/CommonJavaMakefile index 15cdfbbd..e4e6fac2 100644 --- a/ThirdParty/PSCommon/BuildSystem/CommonJavaMakefile +++ b/ThirdParty/PSCommon/BuildSystem/CommonJavaMakefile @@ -51,7 +51,7 @@ endif CREATE_SHORTCUT = ifneq (, $(MAIN_CLASS)) SHORTCUT = $(OUT_DIR)/$(JAR_NAME) - CREATE_SHORTCUT = echo LD_LIBRARY_PATH=. java -jar $(OUTPUT_NAME) > $(SHORTCUT); chmod +x $(SHORTCUT) + CREATE_SHORTCUT = echo LD_LIBRARY_PATH=. java -jar $(OUTPUT_NAME) \$$* > $(SHORTCUT); chmod +x $(SHORTCUT) endif ############################################################################# diff --git a/ThirdParty/PSCommon/XnLib/Include/XnEvent.h b/ThirdParty/PSCommon/XnLib/Include/XnEvent.h index 4092e747..9b616aed 100644 --- a/ThirdParty/PSCommon/XnLib/Include/XnEvent.h +++ b/ThirdParty/PSCommon/XnLib/Include/XnEvent.h @@ -48,6 +48,7 @@ class EventInterface { Clear(); xnOSCloseCriticalSection(&m_hLock); + xnOSCloseCriticalSection(&m_hModLock); } XnStatus Register(FuncPtr pFunc, void* pCookie, XnCallbackHandle& handle) { @@ -59,7 +60,7 @@ class EventInterface pCallback = XN_NEW(Callback, pFunc, pCookie); { - AutoCSLocker locker(m_hLock); + AutoCSLocker locker(m_hModLock); retVal = m_toAdd.AddLast(pCallback); } @@ -79,7 +80,7 @@ class EventInterface Callback* pCallback = (Callback*)handle; { - AutoCSLocker locker(m_hLock); + AutoCSLocker locker(m_hModLock); if (!RemoveCallback(m_toAdd, pCallback)) { retVal = m_toRemove.AddLast(pCallback); @@ -103,7 +104,9 @@ class EventInterface { Clear(); AutoCSLocker otherLocker(other.m_hLock); + AutoCSLocker otherModLocker(other.m_hModLock); AutoCSLocker locker(m_hLock); + AutoCSLocker modLocker(m_hModLock); m_callbacks = other.m_callbacks; m_toAdd = other.m_toAdd; @@ -116,6 +119,8 @@ class EventInterface XnStatus Clear() { AutoCSLocker locker(m_hLock); + AutoCSLocker modLocker(m_hModLock); + ApplyListChanges(); for (typename CallbackPtrList::ConstIterator it = m_callbacks.Begin(); it != m_callbacks.End(); ++it) @@ -134,6 +139,7 @@ class EventInterface XnStatus ApplyListChanges() { AutoCSLocker locker(m_hLock); + AutoCSLocker modLocker(m_hModLock); for (typename CallbackPtrList::ConstIterator it = m_toAdd.Begin(); it != m_toAdd.End(); ++it) { @@ -167,6 +173,7 @@ class EventInterface CallbackPtrList m_toAdd; CallbackPtrList m_toRemove; private: + XN_CRITICAL_SECTION_HANDLE m_hModLock; void Init() { m_hLock = NULL; @@ -175,6 +182,13 @@ class EventInterface { //XN_ASSERT(false); } + + m_hModLock = NULL; + retVal = xnOSCreateCriticalSection(&m_hModLock); + if (retVal != XN_STATUS_OK) + { + //XN_ASSERT(false); + } } }; diff --git a/ThirdParty/PSCommon/XnLib/Source/Linux/XnLinuxSharedLibs.cpp b/ThirdParty/PSCommon/XnLib/Source/Linux/XnLinuxSharedLibs.cpp index 720300c2..1d691ea5 100644 --- a/ThirdParty/PSCommon/XnLib/Source/Linux/XnLinuxSharedLibs.cpp +++ b/ThirdParty/PSCommon/XnLib/Source/Linux/XnLinuxSharedLibs.cpp @@ -28,31 +28,60 @@ //--------------------------------------------------------------------------- // Code //--------------------------------------------------------------------------- +#if XN_PLATFORM == XN_PLATFORM_ANDROID_ARM +static XnStatus FindLibrary(const XnChar* strLibName, XnChar* cpLibPath, const XnUInt32 nBufferSize) +{ + XnChar strAppLibDir[XN_FILE_MAX_PATH]; + XnBool bExists; + + xnOSGetApplicationLibDir(strAppLibDir, sizeof(strAppLibDir)); + + snprintf(cpLibPath, nBufferSize, "%s/%s", strAppLibDir, strLibName); + xnOSDoesFileExist(cpLibPath, &bExists); + if (bExists) + { + return XN_STATUS_OK; + } + + snprintf(cpLibPath, nBufferSize, "/system/lib/%s", strLibName); + xnOSDoesFileExist(cpLibPath, &bExists); + if (bExists) + { + return XN_STATUS_OK; + } + + return XN_STATUS_OS_FILE_NOT_FOUND; +} +#endif + XN_C_API XnStatus xnOSLoadLibrary(const XnChar* cpFileName, XN_LIB_HANDLE* pLibHandle) { // Validate the input/output pointers (to make sure none of them is NULL) XN_VALIDATE_INPUT_PTR(cpFileName); XN_VALIDATE_OUTPUT_PTR(pLibHandle); -#ifndef XN_PLATFORM_ANDROID_OS + XnChar strLibPath[XN_FILE_MAX_PATH]; + +#if XN_PLATFORM == XN_PLATFORM_ANDROID_ARM + XnStatus nRetVal = FindLibrary(cpFileName, strLibPath, sizeof(strLibPath)); + if (nRetVal != XN_STATUS_OK) + { + return nRetVal; + } +#else // Resolve the file name to the absolute path. This is necessary because // we need to get the absolute path of this library by dladdr() later. // Note dladdr() seems to return the path specified to dlopen() "as it is". - XnChar* strAbsoluteFileName = realpath(cpFileName, NULL); - if (strAbsoluteFileName == NULL) + if (NULL == realpath(cpFileName, strLibPath)) { // error xnLogWarning(XN_MASK_OS, "Failed to get absolute path for lib: %s\n", cpFileName); return XN_STATUS_OS_CANT_LOAD_LIB; } +#endif // Load the requested shared library via the OS - *pLibHandle = dlopen(strAbsoluteFileName, RTLD_NOW); - - free(strAbsoluteFileName); // Don't forget to free the memory allocated by realpath(). -#else - *pLibHandle = dlopen(cpFileName, RTLD_NOW); -#endif + *pLibHandle = dlopen(strLibPath, RTLD_NOW); // Make sure it succeeded (return value is not NULL). If not return an error.... if (*pLibHandle == NULL) diff --git a/ThirdParty/PSCommon/XnLib/XnLib.sln b/ThirdParty/PSCommon/XnLib/XnLib.sln index 2263f7b3..cbef0c42 100644 --- a/ThirdParty/PSCommon/XnLib/XnLib.sln +++ b/ThirdParty/PSCommon/XnLib/XnLib.sln @@ -6,12 +6,19 @@ EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 + Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {72D595BB-8C52-449B-91DB-0E9F6AEAF5BB}.Debug|Win32.ActiveCfg = Debug|Win32 {72D595BB-8C52-449B-91DB-0E9F6AEAF5BB}.Debug|Win32.Build.0 = Debug|Win32 + {72D595BB-8C52-449B-91DB-0E9F6AEAF5BB}.Debug|x64.ActiveCfg = Debug|x64 + {72D595BB-8C52-449B-91DB-0E9F6AEAF5BB}.Debug|x64.Build.0 = Debug|x64 {72D595BB-8C52-449B-91DB-0E9F6AEAF5BB}.Release|Win32.ActiveCfg = Release|Win32 + {72D595BB-8C52-449B-91DB-0E9F6AEAF5BB}.Release|Win32.Build.0 = Release|Win32 + {72D595BB-8C52-449B-91DB-0E9F6AEAF5BB}.Release|x64.ActiveCfg = Release|x64 + {72D595BB-8C52-449B-91DB-0E9F6AEAF5BB}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 61cad6e508be81fef16ec26301e14b7f11fcb74e Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Thu, 29 Aug 2013 10:55:53 +0300 Subject: [PATCH 043/188] SimpleViewer.java: add support for IR streams --- .../Samples/SimpleViewer/SimpleViewer.java | 31 ++++++++++++++++++- .../SimpleViewer/SimpleViewerApplication.java | 9 ++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/Samples/SimpleViewer.java/src/org/openni/Samples/SimpleViewer/SimpleViewer.java b/Samples/SimpleViewer.java/src/org/openni/Samples/SimpleViewer/SimpleViewer.java index 3e674d1b..64ec492e 100644 --- a/Samples/SimpleViewer.java/src/org/openni/Samples/SimpleViewer/SimpleViewer.java +++ b/Samples/SimpleViewer.java/src/org/openni/Samples/SimpleViewer/SimpleViewer.java @@ -13,6 +13,7 @@ public class SimpleViewer extends Component float mHistogram[]; int[] mImagePixels; + int mMaxGray16Value = 0; VideoStream mVideoStream; VideoFrameRef mLastFrame; BufferedImage mBufferedImage; @@ -80,7 +81,6 @@ public synchronized void onFrameReady(VideoStream stream) { case SHIFT_9_2: case SHIFT_9_3: calcHist(frameData); - frameData.rewind(); int pos = 0; while(frameData.remaining() > 0) { int depth = (int)frameData.getShort() & 0xFFFF; @@ -99,6 +99,24 @@ public synchronized void onFrameReady(VideoStream stream) { pos++; } break; + case GRAY8: + pos = 0; + while (frameData.remaining() > 0) { + int pixel = (int)frameData.get() & 0xFF; + mImagePixels[pos] = 0xFF000000 | (pixel << 16) | (pixel << 8) | pixel; + pos++; + } + break; + case GRAY16: + calcMaxGray16Value(frameData); + pos = 0; + while (frameData.remaining() > 0) { + int pixel = (int)frameData.getShort() & 0xFFFF; + pixel = (int)(pixel * 255.0 / mMaxGray16Value); + mImagePixels[pos] = 0xFF000000 | (pixel << 16) | (pixel << 8) | pixel; + pos++; + } + break; default: // don't know how to draw mLastFrame.release(); @@ -136,5 +154,16 @@ private void calcHist(ByteBuffer depthBuffer) { mHistogram[i] = (int) (256 * (1.0f - (mHistogram[i] / (float) points))); } } + depthBuffer.rewind(); + } + + private void calcMaxGray16Value(ByteBuffer gray16Buffer) { + while (gray16Buffer.remaining() > 0) { + int pixel = (int)gray16Buffer.getShort() & 0xFFFF; + if (pixel > mMaxGray16Value) { + mMaxGray16Value = pixel; + } + } + gray16Buffer.rewind(); } } diff --git a/Samples/SimpleViewer.java/src/org/openni/Samples/SimpleViewer/SimpleViewerApplication.java b/Samples/SimpleViewer.java/src/org/openni/Samples/SimpleViewer/SimpleViewerApplication.java index 3516b57c..7dc49b31 100755 --- a/Samples/SimpleViewer.java/src/org/openni/Samples/SimpleViewer/SimpleViewerApplication.java +++ b/Samples/SimpleViewer.java/src/org/openni/Samples/SimpleViewer/SimpleViewerApplication.java @@ -76,6 +76,11 @@ public void windowClosing(WindowEvent e) { mComboBoxStreams.addItem("Depth"); } + if (device.getSensorInfo(SensorType.IR) != null) { + mDeviceSensors.add(SensorType.IR); + mComboBoxStreams.addItem("IR"); + } + mComboBoxStreams.addItemListener(this); mComboBoxVideoModes.addItemListener(this); mViewer.setSize(800,600); @@ -128,6 +133,8 @@ void selectedStreamChanged() { case SHIFT_9_2: case SHIFT_9_3: case RGB888: + case GRAY8: + case GRAY16: mSupportedModes.add(mode); break; } @@ -154,6 +161,8 @@ private String pixelFormatToName(PixelFormat format) { case SHIFT_9_2: return "9.2"; case SHIFT_9_3: return "9.3"; case RGB888: return "RGB"; + case GRAY8: return "Gray8"; + case GRAY16: return "Gray16"; default: return "UNKNOWN"; } } From 19a3516d5966fc65e7309454a7aa38bba7a83b2d Mon Sep 17 00:00:00 2001 From: Ziv Hendel Date: Thu, 29 Aug 2013 10:59:03 +0300 Subject: [PATCH 044/188] Reverted "PS1080: cleaner handling of cases where magic isn't found in beginning of packet" until we understand what's going on with the zoom crop mode. --- .../PS1080/Sensor/XnDeviceSensorProtocol.cpp | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/Source/Drivers/PS1080/Sensor/XnDeviceSensorProtocol.cpp b/Source/Drivers/PS1080/Sensor/XnDeviceSensorProtocol.cpp index f36643b8..9ac8b1c5 100644 --- a/Source/Drivers/PS1080/Sensor/XnDeviceSensorProtocol.cpp +++ b/Source/Drivers/PS1080/Sensor/XnDeviceSensorProtocol.cpp @@ -81,18 +81,43 @@ XnBool XN_CALLBACK_TYPE XnDeviceSensorProtocolUsbEpCb(XnUChar* pBuffer, XnUInt32 case XN_LOOKING_FOR_MAGIC: nMagic = XN_PREPARE_VAR16_IN_BUFFER(pDevicePrivateData->FWInfo.nFWMagic); - if (nMagic == *(XnUInt16*)(pBuffer)) + + if (pCurrState->nMissingBytesInState == sizeof(XnUInt8) && // first byte already found + pBuffer[0] == ((XnUInt8*)&nMagic)[1]) // we have here second byte { + // move to next byte + pBuffer++; + + // move to next state pCurrState->CurrHeader.nMagic = nMagic; pCurrState->State = XN_PACKET_HEADER; pCurrState->nMissingBytesInState = sizeof(XnSensorProtocolResponseHeader); + break; + } + + while (pBuffer < pBufEnd) + { + if ((pBuffer + sizeof(XnUInt16) <= pBufEnd) && + nMagic == *(XnUInt16*)(pBuffer)) + { + pCurrState->CurrHeader.nMagic = nMagic; + pCurrState->State = XN_PACKET_HEADER; + pCurrState->nMissingBytesInState = sizeof(XnSensorProtocolResponseHeader); + break; + } + else + { + pBuffer++; + } } - else + + if (pBuffer == pBufEnd && // magic wasn't found + pBuffer[-1] == ((XnUInt8*)&nMagic)[0]) // last byte in buffer is first in magic { - // no magic! ignore the rest of this buffer - xnLogWarning(XN_MASK_SENSOR_PROTOCOL, "Can't find magic. Dropping usb buffer."); - pBuffer = pBufEnd; + // mark that we found first one + pCurrState->nMissingBytesInState--; } + break; case XN_PACKET_HEADER: From 1eca76441d0b2b94bc0718d9dc458a8c9bacc00b Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Thu, 29 Aug 2013 11:40:18 +0300 Subject: [PATCH 045/188] Fix compilation --- Source/Drivers/OniFile/PlayerStream.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/Drivers/OniFile/PlayerStream.cpp b/Source/Drivers/OniFile/PlayerStream.cpp index e8f0b245..9d88be36 100644 --- a/Source/Drivers/OniFile/PlayerStream.cpp +++ b/Source/Drivers/OniFile/PlayerStream.cpp @@ -126,6 +126,7 @@ OniStatus PlayerStream::setProperty(int propertyId, const void* pData, int dataS int size = sizeof(currMode); nRetVal = getProperty(ONI_STREAM_PROPERTY_VIDEO_MODE, &currMode, &size); XN_ASSERT(nRetVal == ONI_STATUS_OK); + XN_REFERENCE_VARIABLE(nRetVal); OniVideoMode* pRequestedMode = (OniVideoMode*)pData; if (pRequestedMode->resolutionX == currMode.resolutionX && From 1e9ac33dd9c4b3fe96294edc3c3d698f48661556 Mon Sep 17 00:00:00 2001 From: Ziv Hendel Date: Thu, 29 Aug 2013 16:50:11 +0300 Subject: [PATCH 046/188] PS1080: Added support for the fast zoom crop (640x480 regular -> 640x480 zoomed). --- Include/PS1080.h | 2 ++ Source/Core/OniRecorder.cpp | 1 + Source/Drivers/OniFile/PlayerDevice.cpp | 1 + Source/Drivers/PS1080/Sensor/XnParams.h | 1 + .../PS1080/Sensor/XnSensorDepthStream.cpp | 21 ++++++++++++++++++- .../PS1080/Sensor/XnSensorDepthStream.h | 3 +++ .../PS1080/Sensor/XnSensorFirmwareParams.cpp | 3 +++ .../PS1080/Sensor/XnSensorFirmwareParams.h | 1 + 8 files changed, 32 insertions(+), 1 deletion(-) diff --git a/Include/PS1080.h b/Include/PS1080.h index e9235400..e4c39280 100644 --- a/Include/PS1080.h +++ b/Include/PS1080.h @@ -143,6 +143,8 @@ enum /** unsigned long long */ XN_STREAM_PROPERTY_CLOSE_RANGE = 0x1080F003, // "CloseRange" + /** unsigned long long */ + XN_STREAM_PROPERTY_FAST_ZOOM_CROP = 0x1080F009, // "FastZoomCrop" /** XnPixelRegistration - get only */ XN_STREAM_PROPERTY_PIXEL_REGISTRATION = 0x10801001, // "PixelRegistration" /** unsigned long long */ diff --git a/Source/Core/OniRecorder.cpp b/Source/Core/OniRecorder.cpp index e5655057..94e1bfa0 100644 --- a/Source/Core/OniRecorder.cpp +++ b/Source/Core/OniRecorder.cpp @@ -73,6 +73,7 @@ const struct PropertyTable { { XN_STREAM_PROPERTY_EMITTER_DCMOS_DISTANCE, "LDDIS" , PROPERTY_TYPE_REAL }, { XN_STREAM_PROPERTY_DCMOS_RCMOS_DISTANCE, "DCRCDIS" , PROPERTY_TYPE_REAL }, { XN_STREAM_PROPERTY_CLOSE_RANGE, "CloseRange" , PROPERTY_TYPE_INTEGER }, + { XN_STREAM_PROPERTY_FAST_ZOOM_CROP, "FastZoomCrop" , PROPERTY_TYPE_INTEGER }, { XN_STREAM_PROPERTY_PIXEL_REGISTRATION, "PixelRegistration" , PROPERTY_TYPE_GENERAL }, // PSLink Properties { LINK_PROP_MAX_SHIFT, "MaxShift", PROPERTY_TYPE_INTEGER}, diff --git a/Source/Drivers/OniFile/PlayerDevice.cpp b/Source/Drivers/OniFile/PlayerDevice.cpp index 4fd5d41c..d3f43372 100644 --- a/Source/Drivers/OniFile/PlayerDevice.cpp +++ b/Source/Drivers/OniFile/PlayerDevice.cpp @@ -79,6 +79,7 @@ static PropertyEntry PS1080PropertyList[] = { XN_STREAM_PROPERTY_EMITTER_DCMOS_DISTANCE, "LDDIS" }, { XN_STREAM_PROPERTY_DCMOS_RCMOS_DISTANCE, "DCRCDIS" }, { XN_STREAM_PROPERTY_CLOSE_RANGE, "CloseRange" }, + { XN_STREAM_PROPERTY_FAST_ZOOM_CROP, "FastZoomCrop" }, { XN_STREAM_PROPERTY_PIXEL_REGISTRATION, "PixelRegistration" }, /*{ XN_MODULE_PROPERTY_SDK_VERSION, "SDKVersion" }, { XN_MODULE_PROPERTY_DEVICE_NAME, "DeviceName" }, diff --git a/Source/Drivers/PS1080/Sensor/XnParams.h b/Source/Drivers/PS1080/Sensor/XnParams.h index b03ad993..4ba28d9c 100644 --- a/Source/Drivers/PS1080/Sensor/XnParams.h +++ b/Source/Drivers/PS1080/Sensor/XnParams.h @@ -122,6 +122,7 @@ typedef enum PARAM_IMAGE_LOW_LIGHT_COMPENSATION_MODE = 82, PARAM_DEPTH_CLOSE_RANGE = 84, PARAM_FILE_SYSTEM_LOCK = 85, + PARAM_FAST_ZOOM_CROP = 86, } EConfig_Params; typedef enum XnExecuter diff --git a/Source/Drivers/PS1080/Sensor/XnSensorDepthStream.cpp b/Source/Drivers/PS1080/Sensor/XnSensorDepthStream.cpp index 445eaa9c..aef82954 100644 --- a/Source/Drivers/PS1080/Sensor/XnSensorDepthStream.cpp +++ b/Source/Drivers/PS1080/Sensor/XnSensorDepthStream.cpp @@ -70,6 +70,7 @@ XnSensorDepthStream::XnSensorDepthStream(const XnChar* strName, XnSensorObjects* m_ActualRead(XN_STREAM_PROPERTY_ACTUAL_READ_DATA, "ActualReadData", FALSE), m_GMCMode(XN_STREAM_PROPERTY_GMC_MODE, "GMCMode", XN_DEPTH_STREAM_DEFAULT_GMC_MODE), m_CloseRange(XN_STREAM_PROPERTY_CLOSE_RANGE, "CloseRange", XN_DEPTH_STREAM_DEFAULT_CLOSE_RANGE), + m_FastZoomCrop(XN_STREAM_PROPERTY_FAST_ZOOM_CROP, "FastZoomCrop", false), m_PixelRegistration(XN_STREAM_PROPERTY_PIXEL_REGISTRATION, "PixelRegistration"), m_HorizontalFOV(ONI_STREAM_PROPERTY_HORIZONTAL_FOV, "HorizontalFov"), m_VerticalFOV(ONI_STREAM_PROPERTY_VERTICAL_FOV, "VerticalFov"), @@ -104,6 +105,7 @@ XnStatus XnSensorDepthStream::Init() m_AGCBin.UpdateGetCallback(GetAGCBinCallback, this); m_GMCMode.UpdateSetCallback(SetGMCModeCallback, this); m_CloseRange.UpdateSetCallback(SetCloseRangeCallback, this); + m_FastZoomCrop.UpdateSetCallback(SetFastZoomCropCallback, this); m_CroppingMode.UpdateSetCallback(SetCroppingModeCallback, this); m_PixelRegistration.UpdateGetCallback(GetPixelRegistrationCallback, this); m_GMCDebug.UpdateSetCallback(SetGMCDebugCallback, this); @@ -112,7 +114,7 @@ XnStatus XnSensorDepthStream::Init() XN_VALIDATE_ADD_PROPERTIES(this, &m_InputFormat, &m_DepthRegistration, &m_HoleFilter, &m_WhiteBalance, &m_Gain, &m_AGCBin, &m_ActualRead, &m_GMCMode, - &m_CloseRange, &m_CroppingMode, &m_RegistrationType, &m_PixelRegistration, + &m_CloseRange, &m_FastZoomCrop, &m_CroppingMode, &m_RegistrationType, &m_PixelRegistration, &m_HorizontalFOV, &m_VerticalFOV, &m_GMCDebug, &m_WavelengthCorrection, &m_WavelengthCorrectionDebug); // register supported modes @@ -307,6 +309,8 @@ XnStatus XnSensorDepthStream::MapPropertiesToFirmware() XN_IS_STATUS_OK(nRetVal);; nRetVal = m_Helper.MapFirmwareProperty(m_CloseRange, GetFirmwareParams()->m_DepthCloseRange, TRUE); XN_IS_STATUS_OK(nRetVal);; + nRetVal = m_Helper.MapFirmwareProperty(m_FastZoomCrop, GetFirmwareParams()->m_FastZoomCrop, TRUE); + XN_IS_STATUS_OK(nRetVal);; nRetVal = m_Helper.MapFirmwareProperty(m_GMCDebug, GetFirmwareParams()->m_GMCDebug, TRUE); XN_IS_STATUS_OK(nRetVal);; nRetVal = m_Helper.MapFirmwareProperty(m_WavelengthCorrection, GetFirmwareParams()->m_WavelengthCorrection, TRUE); @@ -674,6 +678,15 @@ XnStatus XnSensorDepthStream::SetCloseRange(XnBool bCloseRange) return (XN_STATUS_OK); } +XnStatus XnSensorDepthStream::SetFastZoomCrop(XnBool bFastZoomCrop) +{ + XnStatus nRetVal = XN_STATUS_OK; + + nRetVal = m_Helper.SimpleSetFirmwareParam(m_FastZoomCrop, (XnUInt16)bFastZoomCrop); + + return nRetVal; +} + XnStatus XnSensorDepthStream::SetCroppingMode(XnCroppingMode mode) { switch (mode) @@ -1164,6 +1177,12 @@ XnStatus XN_CALLBACK_TYPE XnSensorDepthStream::SetCloseRangeCallback(XnActualInt return pStream->SetCloseRange((XnBool)nValue); } +XnStatus XN_CALLBACK_TYPE XnSensorDepthStream::SetFastZoomCropCallback(XnActualIntProperty* /*pSender*/, XnUInt64 nValue, void* pCookie) +{ + XnSensorDepthStream* pStream = (XnSensorDepthStream*)pCookie; + return pStream->SetFastZoomCrop((XnBool)nValue); +} + XnStatus XN_CALLBACK_TYPE XnSensorDepthStream::SetCroppingModeCallback(XnActualIntProperty* /*pSender*/, XnUInt64 nValue, void* pCookie) { XnSensorDepthStream* pStream = (XnSensorDepthStream*)pCookie; diff --git a/Source/Drivers/PS1080/Sensor/XnSensorDepthStream.h b/Source/Drivers/PS1080/Sensor/XnSensorDepthStream.h index 3f773d38..3c72667b 100644 --- a/Source/Drivers/PS1080/Sensor/XnSensorDepthStream.h +++ b/Source/Drivers/PS1080/Sensor/XnSensorDepthStream.h @@ -117,6 +117,7 @@ class XnSensorDepthStream : public XnDepthStream, public IXnSensorStream XnStatus SetActualRead(XnBool bRead); virtual XnStatus SetGMCMode(XnBool bGMCMode); virtual XnStatus SetCloseRange(XnBool bCloseRange); + virtual XnStatus SetFastZoomCrop(XnBool bFastZoomCrop); virtual XnStatus SetCroppingMode(XnCroppingMode mode); XnStatus GetImageCoordinatesOfDepthPixel(XnUInt32 x, XnUInt32 y, OniDepthPixel z, XnUInt32 imageXRes, XnUInt32 imageYRes, XnUInt32& imageX, XnUInt32& imageY); virtual XnStatus SetGMCDebug(XnBool bGMCDebug); @@ -144,6 +145,7 @@ class XnSensorDepthStream : public XnDepthStream, public IXnSensorStream static XnStatus XN_CALLBACK_TYPE ReadAGCBinsFromFile(XnGeneralProperty* pSender, const XnChar* csINIFile, const XnChar* csSection); static XnStatus XN_CALLBACK_TYPE SetGMCModeCallback(XnActualIntProperty* pSender, XnUInt64 nValue, void* pCookie); static XnStatus XN_CALLBACK_TYPE SetCloseRangeCallback(XnActualIntProperty* pSender, XnUInt64 nValue, void* pCookie); + static XnStatus XN_CALLBACK_TYPE SetFastZoomCropCallback(XnActualIntProperty* pSendoer, XnUInt64 nValue, void* pCookie); static XnStatus XN_CALLBACK_TYPE SetCroppingModeCallback(XnActualIntProperty* pSender, XnUInt64 nValue, void* pCookie); static XnStatus XN_CALLBACK_TYPE GetPixelRegistrationCallback(const XnGeneralProperty* pSender, const OniGeneralBuffer& gbValue, void* pCookie); static XnStatus XN_CALLBACK_TYPE SetGMCDebugCallback(XnActualIntProperty* pSender, XnUInt64 nValue, void* pCookie); @@ -175,6 +177,7 @@ class XnSensorDepthStream : public XnDepthStream, public IXnSensorStream XnActualIntProperty m_ActualRead; XnActualIntProperty m_GMCMode; XnActualIntProperty m_CloseRange; + XnActualIntProperty m_FastZoomCrop; XnGeneralProperty m_PixelRegistration; XnActualRealProperty m_HorizontalFOV; diff --git a/Source/Drivers/PS1080/Sensor/XnSensorFirmwareParams.cpp b/Source/Drivers/PS1080/Sensor/XnSensorFirmwareParams.cpp index f93f333f..abb1f842 100644 --- a/Source/Drivers/PS1080/Sensor/XnSensorFirmwareParams.cpp +++ b/Source/Drivers/PS1080/Sensor/XnSensorFirmwareParams.cpp @@ -82,6 +82,7 @@ XnSensorFirmwareParams::XnSensorFirmwareParams(XnFirmwareInfo* pInfo, XnFirmware m_ImageLowLightCompensation(0, "ImageLowLightCompensation"), m_ImageGain(0, "ImageGain"), m_DepthCloseRange(0, "CloseRange"), + m_FastZoomCrop(0, "FastZoomCrop"), m_LogFilter(0, "LogFilter"), m_GMCDebug(0, "GMCDebug"), m_APCEnabled(0, "APCEnabled"), @@ -209,6 +210,8 @@ XnStatus XnSensorFirmwareParams::Init() XN_IS_STATUS_OK(nRetVal); nRetVal = AddFirmwareParam( m_DepthCloseRange, PARAM_DEPTH_CLOSE_RANGE, XN_SENSOR_FW_VER_5_6, XN_SENSOR_FW_VER_UNKNOWN, FALSE); XN_IS_STATUS_OK(nRetVal); + nRetVal = AddFirmwareParam( m_FastZoomCrop, PARAM_FAST_ZOOM_CROP, XN_SENSOR_FW_VER_5_9, XN_SENSOR_FW_VER_UNKNOWN, FALSE); + XN_IS_STATUS_OK(nRetVal); nRetVal = AddFirmwareParam( m_LogFilter, PARAM_MISC_LOG_FILTER); XN_IS_STATUS_OK(nRetVal); nRetVal = AddFirmwareParam( m_GMCDebug, PARAM_GMC_DEBUG, XN_SENSOR_FW_VER_5_0, XN_SENSOR_FW_VER_UNKNOWN, FALSE); diff --git a/Source/Drivers/PS1080/Sensor/XnSensorFirmwareParams.h b/Source/Drivers/PS1080/Sensor/XnSensorFirmwareParams.h index 6c10a5c7..3e3076d9 100644 --- a/Source/Drivers/PS1080/Sensor/XnSensorFirmwareParams.h +++ b/Source/Drivers/PS1080/Sensor/XnSensorFirmwareParams.h @@ -108,6 +108,7 @@ class XnSensorFirmwareParams XnActualIntProperty m_ImageLowLightCompensation; XnActualIntProperty m_ImageGain; XnActualIntProperty m_DepthCloseRange; + XnActualIntProperty m_FastZoomCrop; XnActualIntProperty m_LogFilter; XnActualIntProperty m_GMCDebug; XnActualIntProperty m_APCEnabled; From a1bbba16a8bb3e2df50ec17c6d9cf5f5bd71d73a Mon Sep 17 00:00:00 2001 From: Ziv Hendel Date: Thu, 29 Aug 2013 19:20:48 +0300 Subject: [PATCH 047/188] NiViewer: Added the 'z' key to demonstrate the fast zoom crop. It only works from VGA -> zoomed VGA. --- Source/Tools/NiViewer/Device.cpp | 45 ++++++++++++++++++++++++++++++ Source/Tools/NiViewer/Device.h | 2 ++ Source/Tools/NiViewer/NiViewer.cpp | 2 ++ 3 files changed, 49 insertions(+) diff --git a/Source/Tools/NiViewer/Device.cpp b/Source/Tools/NiViewer/Device.cpp index d7daae66..c9f56ce5 100644 --- a/Source/Tools/NiViewer/Device.cpp +++ b/Source/Tools/NiViewer/Device.cpp @@ -34,6 +34,11 @@ // -------------------------------- #define MAX_STRINGS 20 +#define ZOOM_CROP_VGA_MODE_X_RES 640 +#define ZOOM_CROP_VGA_MODE_Y_RES 480 +#define ZOOM_CROP_HIRES_MODE_X_RES 1280 +#define ZOOM_CROP_HIRES_MODE_Y_RES 1024 + // -------------------------------- // Global Variables // -------------------------------- @@ -917,6 +922,46 @@ void toggleFrameSync(int) g_bFrameSyncOn = !g_bFrameSyncOn; } +bool g_bZoomCropOn = false; +void toggleZoomCrop(int) +{ + if (g_bZoomCropOn) + { + displayMessage("Fast zoom crop off"); + + openni::VideoMode vm = g_colorStream.getVideoMode(); + vm.setResolution(ZOOM_CROP_VGA_MODE_X_RES, ZOOM_CROP_VGA_MODE_Y_RES); + + g_colorStream.setVideoMode(vm); + + g_colorStream.resetCropping(); + + g_colorStream.start(); + + g_depthStream.setProperty(XN_STREAM_PROPERTY_FAST_ZOOM_CROP, FALSE); + } + else + { + g_depthStream.setProperty(XN_STREAM_PROPERTY_FAST_ZOOM_CROP, TRUE); + + displayMessage("Fast zoom crop on"); + + g_colorStream.stop(); + + g_colorStream.setProperty(XN_STREAM_PROPERTY_CROPPING_MODE, XN_CROPPING_MODE_INCREASED_FPS); + + openni::VideoMode vm = g_colorStream.getVideoMode(); + vm.setResolution(ZOOM_CROP_HIRES_MODE_X_RES, ZOOM_CROP_HIRES_MODE_Y_RES); + g_colorStream.setVideoMode(vm); + + g_colorStream.setCropping(ZOOM_CROP_VGA_MODE_X_RES/2, ZOOM_CROP_VGA_MODE_Y_RES/2, ZOOM_CROP_VGA_MODE_X_RES, ZOOM_CROP_VGA_MODE_Y_RES); + + g_colorStream.start(); + } + + g_bZoomCropOn = !g_bZoomCropOn; +} + bool convertDepthPointToColor(int depthX, int depthY, openni::DepthPixel depthZ, int* pColorX, int* pColorY) { if (!g_depthStream.isValid() || !g_colorStream.isValid()) diff --git a/Source/Tools/NiViewer/Device.h b/Source/Tools/NiViewer/Device.h index fc563caf..be4ca063 100644 --- a/Source/Tools/NiViewer/Device.h +++ b/Source/Tools/NiViewer/Device.h @@ -136,6 +136,8 @@ openni::VideoFrameRef& getIRFrame(); void toggleFrameSync(int); +void toggleZoomCrop(int); + void togglePlaybackRepeat(int /*ignored*/); openni::Status setPlaybackSpeed(float speed); float getPlaybackSpeed(); diff --git a/Source/Tools/NiViewer/NiViewer.cpp b/Source/Tools/NiViewer/NiViewer.cpp index 89a324e4..3ae6c5a5 100644 --- a/Source/Tools/NiViewer/NiViewer.cpp +++ b/Source/Tools/NiViewer/NiViewer.cpp @@ -302,6 +302,8 @@ void createKeyboardMap() startKeyboardGroup(KEYBOARD_GROUP_DEVICE); { registerKey('y', "Frame sync on/off", toggleFrameSync, 0); + registerKey('z', "Zoom crop on/off", toggleZoomCrop, 0); + registerKey('m', "Mirror on/off", toggleMirror, 0); registerKey('/', "Reset all croppings", resetAllCropping, 0); From 8f79a714d006cb2cc4dfa2c1474c65472d3446ac Mon Sep 17 00:00:00 2001 From: "oz.magal" Date: Sun, 1 Sep 2013 15:46:07 +0300 Subject: [PATCH 048/188] Moved fastzoomcrop property to be in the color stream, where it belongs, instead of the depth stream... --- .../PS1080/Sensor/XnSensorDepthStream.cpp | 21 +------------------ .../PS1080/Sensor/XnSensorDepthStream.h | 3 --- .../PS1080/Sensor/XnSensorImageStream.cpp | 21 +++++++++++++++++-- .../PS1080/Sensor/XnSensorImageStream.h | 3 +++ Source/Tools/NiViewer/Device.cpp | 4 ++-- 5 files changed, 25 insertions(+), 27 deletions(-) diff --git a/Source/Drivers/PS1080/Sensor/XnSensorDepthStream.cpp b/Source/Drivers/PS1080/Sensor/XnSensorDepthStream.cpp index aef82954..445eaa9c 100644 --- a/Source/Drivers/PS1080/Sensor/XnSensorDepthStream.cpp +++ b/Source/Drivers/PS1080/Sensor/XnSensorDepthStream.cpp @@ -70,7 +70,6 @@ XnSensorDepthStream::XnSensorDepthStream(const XnChar* strName, XnSensorObjects* m_ActualRead(XN_STREAM_PROPERTY_ACTUAL_READ_DATA, "ActualReadData", FALSE), m_GMCMode(XN_STREAM_PROPERTY_GMC_MODE, "GMCMode", XN_DEPTH_STREAM_DEFAULT_GMC_MODE), m_CloseRange(XN_STREAM_PROPERTY_CLOSE_RANGE, "CloseRange", XN_DEPTH_STREAM_DEFAULT_CLOSE_RANGE), - m_FastZoomCrop(XN_STREAM_PROPERTY_FAST_ZOOM_CROP, "FastZoomCrop", false), m_PixelRegistration(XN_STREAM_PROPERTY_PIXEL_REGISTRATION, "PixelRegistration"), m_HorizontalFOV(ONI_STREAM_PROPERTY_HORIZONTAL_FOV, "HorizontalFov"), m_VerticalFOV(ONI_STREAM_PROPERTY_VERTICAL_FOV, "VerticalFov"), @@ -105,7 +104,6 @@ XnStatus XnSensorDepthStream::Init() m_AGCBin.UpdateGetCallback(GetAGCBinCallback, this); m_GMCMode.UpdateSetCallback(SetGMCModeCallback, this); m_CloseRange.UpdateSetCallback(SetCloseRangeCallback, this); - m_FastZoomCrop.UpdateSetCallback(SetFastZoomCropCallback, this); m_CroppingMode.UpdateSetCallback(SetCroppingModeCallback, this); m_PixelRegistration.UpdateGetCallback(GetPixelRegistrationCallback, this); m_GMCDebug.UpdateSetCallback(SetGMCDebugCallback, this); @@ -114,7 +112,7 @@ XnStatus XnSensorDepthStream::Init() XN_VALIDATE_ADD_PROPERTIES(this, &m_InputFormat, &m_DepthRegistration, &m_HoleFilter, &m_WhiteBalance, &m_Gain, &m_AGCBin, &m_ActualRead, &m_GMCMode, - &m_CloseRange, &m_FastZoomCrop, &m_CroppingMode, &m_RegistrationType, &m_PixelRegistration, + &m_CloseRange, &m_CroppingMode, &m_RegistrationType, &m_PixelRegistration, &m_HorizontalFOV, &m_VerticalFOV, &m_GMCDebug, &m_WavelengthCorrection, &m_WavelengthCorrectionDebug); // register supported modes @@ -309,8 +307,6 @@ XnStatus XnSensorDepthStream::MapPropertiesToFirmware() XN_IS_STATUS_OK(nRetVal);; nRetVal = m_Helper.MapFirmwareProperty(m_CloseRange, GetFirmwareParams()->m_DepthCloseRange, TRUE); XN_IS_STATUS_OK(nRetVal);; - nRetVal = m_Helper.MapFirmwareProperty(m_FastZoomCrop, GetFirmwareParams()->m_FastZoomCrop, TRUE); - XN_IS_STATUS_OK(nRetVal);; nRetVal = m_Helper.MapFirmwareProperty(m_GMCDebug, GetFirmwareParams()->m_GMCDebug, TRUE); XN_IS_STATUS_OK(nRetVal);; nRetVal = m_Helper.MapFirmwareProperty(m_WavelengthCorrection, GetFirmwareParams()->m_WavelengthCorrection, TRUE); @@ -678,15 +674,6 @@ XnStatus XnSensorDepthStream::SetCloseRange(XnBool bCloseRange) return (XN_STATUS_OK); } -XnStatus XnSensorDepthStream::SetFastZoomCrop(XnBool bFastZoomCrop) -{ - XnStatus nRetVal = XN_STATUS_OK; - - nRetVal = m_Helper.SimpleSetFirmwareParam(m_FastZoomCrop, (XnUInt16)bFastZoomCrop); - - return nRetVal; -} - XnStatus XnSensorDepthStream::SetCroppingMode(XnCroppingMode mode) { switch (mode) @@ -1177,12 +1164,6 @@ XnStatus XN_CALLBACK_TYPE XnSensorDepthStream::SetCloseRangeCallback(XnActualInt return pStream->SetCloseRange((XnBool)nValue); } -XnStatus XN_CALLBACK_TYPE XnSensorDepthStream::SetFastZoomCropCallback(XnActualIntProperty* /*pSender*/, XnUInt64 nValue, void* pCookie) -{ - XnSensorDepthStream* pStream = (XnSensorDepthStream*)pCookie; - return pStream->SetFastZoomCrop((XnBool)nValue); -} - XnStatus XN_CALLBACK_TYPE XnSensorDepthStream::SetCroppingModeCallback(XnActualIntProperty* /*pSender*/, XnUInt64 nValue, void* pCookie) { XnSensorDepthStream* pStream = (XnSensorDepthStream*)pCookie; diff --git a/Source/Drivers/PS1080/Sensor/XnSensorDepthStream.h b/Source/Drivers/PS1080/Sensor/XnSensorDepthStream.h index 3c72667b..3f773d38 100644 --- a/Source/Drivers/PS1080/Sensor/XnSensorDepthStream.h +++ b/Source/Drivers/PS1080/Sensor/XnSensorDepthStream.h @@ -117,7 +117,6 @@ class XnSensorDepthStream : public XnDepthStream, public IXnSensorStream XnStatus SetActualRead(XnBool bRead); virtual XnStatus SetGMCMode(XnBool bGMCMode); virtual XnStatus SetCloseRange(XnBool bCloseRange); - virtual XnStatus SetFastZoomCrop(XnBool bFastZoomCrop); virtual XnStatus SetCroppingMode(XnCroppingMode mode); XnStatus GetImageCoordinatesOfDepthPixel(XnUInt32 x, XnUInt32 y, OniDepthPixel z, XnUInt32 imageXRes, XnUInt32 imageYRes, XnUInt32& imageX, XnUInt32& imageY); virtual XnStatus SetGMCDebug(XnBool bGMCDebug); @@ -145,7 +144,6 @@ class XnSensorDepthStream : public XnDepthStream, public IXnSensorStream static XnStatus XN_CALLBACK_TYPE ReadAGCBinsFromFile(XnGeneralProperty* pSender, const XnChar* csINIFile, const XnChar* csSection); static XnStatus XN_CALLBACK_TYPE SetGMCModeCallback(XnActualIntProperty* pSender, XnUInt64 nValue, void* pCookie); static XnStatus XN_CALLBACK_TYPE SetCloseRangeCallback(XnActualIntProperty* pSender, XnUInt64 nValue, void* pCookie); - static XnStatus XN_CALLBACK_TYPE SetFastZoomCropCallback(XnActualIntProperty* pSendoer, XnUInt64 nValue, void* pCookie); static XnStatus XN_CALLBACK_TYPE SetCroppingModeCallback(XnActualIntProperty* pSender, XnUInt64 nValue, void* pCookie); static XnStatus XN_CALLBACK_TYPE GetPixelRegistrationCallback(const XnGeneralProperty* pSender, const OniGeneralBuffer& gbValue, void* pCookie); static XnStatus XN_CALLBACK_TYPE SetGMCDebugCallback(XnActualIntProperty* pSender, XnUInt64 nValue, void* pCookie); @@ -177,7 +175,6 @@ class XnSensorDepthStream : public XnDepthStream, public IXnSensorStream XnActualIntProperty m_ActualRead; XnActualIntProperty m_GMCMode; XnActualIntProperty m_CloseRange; - XnActualIntProperty m_FastZoomCrop; XnGeneralProperty m_PixelRegistration; XnActualRealProperty m_HorizontalFOV; diff --git a/Source/Drivers/PS1080/Sensor/XnSensorImageStream.cpp b/Source/Drivers/PS1080/Sensor/XnSensorImageStream.cpp index 6db13486..0facc0d0 100644 --- a/Source/Drivers/PS1080/Sensor/XnSensorImageStream.cpp +++ b/Source/Drivers/PS1080/Sensor/XnSensorImageStream.cpp @@ -59,6 +59,7 @@ XnSensorImageStream::XnSensorImageStream(const XnChar* StreamName, XnSensorObjec m_Exposure(ONI_STREAM_PROPERTY_EXPOSURE, "Exposure", XN_IMAGE_STREAM_DEFAULT_EXPOSURE_BAR), m_Gain(ONI_STREAM_PROPERTY_GAIN, "Gain", XN_IMAGE_STREAM_DEFAULT_GAIN), + m_FastZoomCrop(XN_STREAM_PROPERTY_FAST_ZOOM_CROP, "FastZoomCrop", false), m_ActualRead(XN_STREAM_PROPERTY_ACTUAL_READ_DATA, "ActualReadData", FALSE), m_HorizontalFOV(ONI_STREAM_PROPERTY_HORIZONTAL_FOV, "HorizontalFov"), @@ -84,12 +85,13 @@ XnStatus XnSensorImageStream::Init() m_AutoExposure.UpdateSetCallback(SetAutoExposureCallback, this); m_Exposure.UpdateSetCallback(SetExposureCallback, this); m_Gain.UpdateSetCallback(SetGainCallback, this); + m_FastZoomCrop.UpdateSetCallback(SetFastZoomCropCallback, this); m_AutoWhiteBalance.UpdateSetCallback(SetAutoWhiteBalanceCallback, this); m_ActualRead.UpdateSetCallback(SetActualReadCallback, this); // add properties XN_VALIDATE_ADD_PROPERTIES(this, &m_InputFormat, &m_AntiFlicker, &m_ImageQuality, - &m_CroppingMode, &m_ActualRead, &m_HorizontalFOV, &m_VerticalFOV, &m_AutoExposure, &m_AutoWhiteBalance, &m_Exposure, &m_Gain); + &m_CroppingMode, &m_ActualRead, &m_HorizontalFOV, &m_VerticalFOV, &m_AutoExposure, &m_AutoWhiteBalance, &m_Exposure, &m_Gain, &m_FastZoomCrop); // set base properties default values nRetVal = ResolutionProperty().UnsafeUpdateValue(XN_IMAGE_STREAM_DEFAULT_RESOLUTION); @@ -216,6 +218,8 @@ XnStatus XnSensorImageStream::MapPropertiesToFirmware() XN_IS_STATUS_OK(nRetVal);; nRetVal = m_Helper.MapFirmwareProperty(m_Gain, GetFirmwareParams()->m_ImageGain, TRUE); XN_IS_STATUS_OK(nRetVal);; + nRetVal = m_Helper.MapFirmwareProperty(m_FastZoomCrop, GetFirmwareParams()->m_FastZoomCrop, TRUE); + XN_IS_STATUS_OK(nRetVal);; return (XN_STATUS_OK); } @@ -754,6 +758,14 @@ XnStatus XnSensorImageStream::SetGain(XnUInt64 nValue) return (XN_STATUS_OK); } +XnStatus XnSensorImageStream::SetFastZoomCrop(XnBool bFastZoomCrop) +{ + XnStatus nRetVal = XN_STATUS_OK; + + nRetVal = m_Helper.SimpleSetFirmwareParam(m_FastZoomCrop, (XnUInt16)bFastZoomCrop); + + return nRetVal; +} XnStatus XnSensorImageStream::CropImpl(OniFrame* pFrame, const OniCropping* pCropping) { @@ -940,4 +952,9 @@ XnStatus XN_CALLBACK_TYPE XnSensorImageStream::SetGainCallback(XnActualIntProper { XnSensorImageStream* pStream = (XnSensorImageStream*)pCookie; return pStream->SetGain(nValue); -} \ No newline at end of file +} +XnStatus XN_CALLBACK_TYPE XnSensorImageStream::SetFastZoomCropCallback(XnActualIntProperty* /*pSender*/, XnUInt64 nValue, void* pCookie) +{ + XnSensorImageStream* pStream = (XnSensorImageStream*)pCookie; + return pStream->SetFastZoomCrop((XnBool)nValue); +} diff --git a/Source/Drivers/PS1080/Sensor/XnSensorImageStream.h b/Source/Drivers/PS1080/Sensor/XnSensorImageStream.h index 5d30c7cc..d35bd0e6 100644 --- a/Source/Drivers/PS1080/Sensor/XnSensorImageStream.h +++ b/Source/Drivers/PS1080/Sensor/XnSensorImageStream.h @@ -112,6 +112,7 @@ class XnSensorImageStream : public XnImageStream, public IXnSensorStream virtual XnStatus SetAutoWhiteBalance(XnBool bAutoWhiteBalance); virtual XnStatus SetExposure(XnUInt64 nValue); virtual XnStatus SetGain(XnUInt64 nValue); + virtual XnStatus SetFastZoomCrop(XnBool bFastZoomCrop); private: XnStatus ValidateMode(); XnStatus SetCroppingImpl(const OniCropping* pCropping, XnCroppingMode mode); @@ -127,6 +128,7 @@ class XnSensorImageStream : public XnImageStream, public IXnSensorStream static XnStatus XN_CALLBACK_TYPE SetAutoWhiteBalanceCallback(XnActualIntProperty* pSender, XnUInt64 nValue, void* pCookie); static XnStatus XN_CALLBACK_TYPE SetExposureCallback(XnActualIntProperty* pSender, XnUInt64 nValue, void* pCookie); static XnStatus XN_CALLBACK_TYPE SetGainCallback(XnActualIntProperty* pSender, XnUInt64 nValue, void* pCookie); + static XnStatus XN_CALLBACK_TYPE SetFastZoomCropCallback(XnActualIntProperty* pSendoer, XnUInt64 nValue, void* pCookie); //--------------------------------------------------------------------------- // Members @@ -149,6 +151,7 @@ class XnSensorImageStream : public XnImageStream, public IXnSensorStream XnActualIntProperty m_AutoWhiteBalance; XnActualIntProperty m_Exposure; XnActualIntProperty m_Gain; + XnActualIntProperty m_FastZoomCrop; XnActualIntProperty m_ActualRead; diff --git a/Source/Tools/NiViewer/Device.cpp b/Source/Tools/NiViewer/Device.cpp index c9f56ce5..81fa50e3 100644 --- a/Source/Tools/NiViewer/Device.cpp +++ b/Source/Tools/NiViewer/Device.cpp @@ -938,11 +938,11 @@ void toggleZoomCrop(int) g_colorStream.start(); - g_depthStream.setProperty(XN_STREAM_PROPERTY_FAST_ZOOM_CROP, FALSE); + g_colorStream.setProperty(XN_STREAM_PROPERTY_FAST_ZOOM_CROP, FALSE); } else { - g_depthStream.setProperty(XN_STREAM_PROPERTY_FAST_ZOOM_CROP, TRUE); + g_colorStream.setProperty(XN_STREAM_PROPERTY_FAST_ZOOM_CROP, TRUE); displayMessage("Fast zoom crop on"); From 38145635ab29e4d460fb44b3431b415bcdb22e56 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Tue, 3 Sep 2013 17:02:09 +0300 Subject: [PATCH 049/188] Update PSCommon --- .../PSCommon/XnLib/Include/Linux-x86/XnPlatformLinux-x86.h | 2 +- ThirdParty/PSCommon/XnLib/Source/XnLogAndroidWriter.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ThirdParty/PSCommon/XnLib/Include/Linux-x86/XnPlatformLinux-x86.h b/ThirdParty/PSCommon/XnLib/Include/Linux-x86/XnPlatformLinux-x86.h index 64f1850e..215e83fd 100644 --- a/ThirdParty/PSCommon/XnLib/Include/Linux-x86/XnPlatformLinux-x86.h +++ b/ThirdParty/PSCommon/XnLib/Include/Linux-x86/XnPlatformLinux-x86.h @@ -139,7 +139,7 @@ typedef size_t XnSizeT; // Files //--------------------------------------------------------------------------- /** The maximum allowed file path size (in bytes). */ -#define XN_FILE_MAX_PATH 256 +#define XN_FILE_MAX_PATH PATH_MAX //--------------------------------------------------------------------------- // Call back diff --git a/ThirdParty/PSCommon/XnLib/Source/XnLogAndroidWriter.cpp b/ThirdParty/PSCommon/XnLib/Source/XnLogAndroidWriter.cpp index 6c9b6c1c..75c4fec2 100644 --- a/ThirdParty/PSCommon/XnLib/Source/XnLogAndroidWriter.cpp +++ b/ThirdParty/PSCommon/XnLib/Source/XnLogAndroidWriter.cpp @@ -58,7 +58,7 @@ void XnLogAndroidWriter::WriteEntry(const XnLogEntry* pEntry) #ifdef XN_PLATFORM_ANDROID_OS ALOGE("OpenNI2: %s\n", pEntry->strMessage); #else - __android_log_print(OpenNISeverityToAndroid(pEntry->nSeverity), "OpenNI", pEntry->strMessage); + __android_log_write(OpenNISeverityToAndroid(pEntry->nSeverity), "OpenNI", pEntry->strMessage); #endif } From 889ecf50b7b515458dbdf9ca720ee9f04b6c4095 Mon Sep 17 00:00:00 2001 From: yinbal Date: Wed, 21 Aug 2013 13:38:27 +0300 Subject: [PATCH 050/188] add commands: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • projector pulse on where both delay and width are in ms, and can be float – enters PWM mode. • projector on/off • periodicbist on/off • temp list • temp read (for example, “temp read 2”) • temp read (for example, “temp read projector”) – finds the name in the list of temperatures and reads it. • A VDD on/off command. --- Include/PSLink.h | 19 +- Include/PrimeSense.h | 21 +- .../PSLink/DriverImpl/LinkOniDevice.cpp | 106 ++++- .../LinkProtoLib/XnLinkControlEndpoint.cpp | 124 +++++- .../LinkProtoLib/XnLinkControlEndpoint.h | 12 +- .../PSLink/LinkProtoLib/XnLinkProtoUtils.cpp | 67 ++++ .../PSLink/LinkProtoLib/XnLinkProtoUtils.h | 2 + .../PSLink/PSLinkConsole/PSLinkConsole.cpp | 369 +++++++++++++----- Source/Drivers/PSLink/PrimeClient.cpp | 38 +- Source/Drivers/PSLink/PrimeClient.h | 14 +- .../PSLink/Protocols/XnLinkProto/XnLinkDefs.h | 14 +- .../Protocols/XnLinkProto/XnLinkProto.h | 31 +- 12 files changed, 667 insertions(+), 150 deletions(-) diff --git a/Include/PSLink.h b/Include/PSLink.h index d2b2fe87..18e39af3 100644 --- a/Include/PSLink.h +++ b/Include/PSLink.h @@ -14,13 +14,20 @@ enum /* General - array - XnComponentVersion * count elements, get only */ LINK_PROP_VERSIONS_INFO = 0x12000003, // "VersionsInfo" /* Int - 0 means off, 1 means on. */ - LINK_PROP_EMITTER_ACTIVE = 0x12000008, // "EmitterActive" + LINK_PROP_PROJECTOR_ACTIVE = 0x12000008, // "ProjectorActive" /* String. Set only */ LINK_PROP_PRESET_FILE = 0x1200000a, // "PresetFile" /* Get only */ LINK_PROP_BOOT_STATUS = 0x1200000b, /* Int - system specific units */ - LINK_PROP_PROJECTOR_POWER = 0x1200000c, + LINK_PROP_PROJECTOR_POWER = 0x1200000c, + /* SetAccActive*/ + LINK_PROP_ACC_ENABLED = 0x1200000d, + /* SetAccActive*/ + LINK_PROP_VDD_ENABLED = 0x1200000e, + /* SetAccActive*/ + LINK_PROP_PERIODIC_BIST_ENABLED = 0x1200000f, + /**** Device commands ****/ /* XnCommandGetFwStreams */ @@ -42,7 +49,7 @@ enum /* XnCommandSetProjectorPulse */ LINK_COMMAND_SET_PROJECTOR_PULSE = 0x1200F009, /* No args */ - LINK_COMMAND_DISABLE_PROJECTOR_PULSE = 0x1200F00a, + LINK_COMMAND_DISABLE_PROJECTOR_PULSE = 0x1200F00a, /**** Stream properties ****/ /* Int. 1 - Shifts 9.3, 2 - Grayscale16, 3 - YUV422, 4 - Bayer8 */ @@ -202,9 +209,9 @@ typedef struct XnCommandGetFwStreamVideoMode typedef struct XnCommandSetProjectorPulse { - int delay; - int width; - int frames; + float delay; //start delay - delay time before start pulse + float width; //DC - duty cycle - the percentage of the pulse out of total cycle + float cycle; } XnCommandSetProjectorPulse; #pragma pack (pop) diff --git a/Include/PrimeSense.h b/Include/PrimeSense.h index 1f2bf873..0a2c1215 100644 --- a/Include/PrimeSense.h +++ b/Include/PrimeSense.h @@ -42,7 +42,6 @@ enum // Device Properties PS_PROPERTY_USB_INTERFACE = 0x1d27F001, // values from XnUsbInterfaceType - PS_PROPERTY_ACC_ENABLED = 0x1d27F002, // SetAccActive }; /** @@ -77,6 +76,8 @@ enum PS_COMMAND_SET_LOG_MASK_STATE = 0x1d27E013, // XnCommandSetLogMaskState PS_COMMAND_START_LOG = 0x1d27E014, // no arguments PS_COMMAND_STOP_LOG = 0x1d27E015, // no arguments + PS_COMMAND_READ_TEMPERATURE = 0x1d27E016, // no arguments + LINK_COMMAND_GET_TEMP_LIST = 0x1d27E017,// PrintTempList }; typedef enum XnUsbInterfaceType @@ -127,6 +128,12 @@ typedef struct XnBistInfo char name[32]; } XnBistInfo; +typedef struct XnTempInfo +{ + uint32_t id; + char name[16]; +} XnTempInfo; + typedef struct XnFwLogMask { uint32_t id; @@ -201,6 +208,12 @@ typedef struct XnCommandGetBistList XnBistInfo* tests; } XnCommandGetBistList; +typedef struct XnCommandGetTempList +{ + uint32_t count; // in: number of allocated elements in tests array. out: number of written elements in the array + XnTempInfo* pTempInfos; +} XnCommandGetTempList; + typedef struct XnCommandExecuteBist { uint32_t id; @@ -209,6 +222,12 @@ typedef struct XnCommandExecuteBist uint8_t* extraData; } XnCommandExecuteBist; +typedef struct XnCommandTemperatureResponse +{ + uint32_t id; + float temperature; +} XnCommandTemperatureResponse; + typedef struct XnCommandUsbTest { uint32_t seconds; diff --git a/Source/Drivers/PSLink/DriverImpl/LinkOniDevice.cpp b/Source/Drivers/PSLink/DriverImpl/LinkOniDevice.cpp index fcdc11e6..6526a0b6 100644 --- a/Source/Drivers/PSLink/DriverImpl/LinkOniDevice.cpp +++ b/Source/Drivers/PSLink/DriverImpl/LinkOniDevice.cpp @@ -540,7 +540,7 @@ OniStatus LinkOniDevice::getProperty(int propertyId, void* data, int* pDataSize) XN_IS_STATUS_OK_RET(nRetVal, ONI_STATUS_ERROR); } break; - case PS_PROPERTY_ACC_ENABLED: + case LINK_PROP_ACC_ENABLED: { ENSURE_PROP_SIZE(*pDataSize, XnBool); @@ -552,6 +552,31 @@ OniStatus LinkOniDevice::getProperty(int propertyId, void* data, int* pDataSize) } break; + case LINK_PROP_VDD_ENABLED: + { + ENSURE_PROP_SIZE(*pDataSize, XnBool); + + XnBool bActive; + nRetVal = m_pSensor->GetVDDActive(bActive); + XN_IS_STATUS_OK_RET(nRetVal, ONI_STATUS_ERROR); + + ASSIGN_PROP_VALUE_INT(data, *pDataSize, bActive) + } + break; + + case LINK_PROP_PERIODIC_BIST_ENABLED: + { + ENSURE_PROP_SIZE(*pDataSize, XnBool); + + XnBool bActive; + nRetVal = m_pSensor->GetPeriodicBistActive(bActive); + XN_IS_STATUS_OK_RET(nRetVal, ONI_STATUS_ERROR); + + ASSIGN_PROP_VALUE_INT(data, *pDataSize, bActive) + } + break; + + case LINK_PROP_PROJECTOR_POWER: { ENSURE_PROP_SIZE(*pDataSize, XnUInt16); @@ -610,15 +635,27 @@ OniStatus LinkOniDevice::setProperty(int propertyId, const void* data, int dataS // Internal Link Properties // int props - case LINK_PROP_EMITTER_ACTIVE: - nRetVal = m_pSensor->SetEmitterActive(*(XnBool*)data); - XN_IS_STATUS_OK_LOG_ERROR_RET("Set emitter active", nRetVal, ONI_STATUS_ERROR); + case LINK_PROP_PROJECTOR_ACTIVE: + nRetVal = m_pSensor->SetProjectorActive(*(XnBool*)data); + XN_IS_STATUS_OK_LOG_ERROR_RET("Set Projector active", nRetVal, ONI_STATUS_ERROR); break; //controls if the firmware runs all its control loops (BIST) - case PS_PROPERTY_ACC_ENABLED: + case LINK_PROP_ACC_ENABLED: nRetVal = m_pSensor->SetAccActive(*(XnBool*)data); XN_IS_STATUS_OK_LOG_ERROR_RET("Set Acc active", nRetVal, ONI_STATUS_ERROR); + break; + + // + case LINK_PROP_VDD_ENABLED: + nRetVal = m_pSensor->SetVDDActive(*(XnBool*)data); + XN_IS_STATUS_OK_LOG_ERROR_RET("Set VDD active", nRetVal, ONI_STATUS_ERROR); + break; + + // + case LINK_PROP_PERIODIC_BIST_ENABLED: + nRetVal = m_pSensor->SetPeriodicBistActive(*(XnBool*)data); + XN_IS_STATUS_OK_LOG_ERROR_RET("Set PeriodicBist active", nRetVal, ONI_STATUS_ERROR); break; // string props @@ -675,8 +712,10 @@ OniBool LinkOniDevice::isPropertySupported(int propertyId) case LINK_PROP_FW_VERSION: case LINK_PROP_VERSIONS_INFO_COUNT: case LINK_PROP_VERSIONS_INFO: - case LINK_PROP_EMITTER_ACTIVE: - case PS_PROPERTY_ACC_ENABLED: + case LINK_PROP_PROJECTOR_ACTIVE: + case LINK_PROP_ACC_ENABLED: + case LINK_PROP_VDD_ENABLED: + case LINK_PROP_PERIODIC_BIST_ENABLED: case LINK_PROP_PRESET_FILE: case PS_PROPERTY_USB_INTERFACE: case LINK_PROP_BOOT_STATUS: @@ -972,6 +1011,55 @@ OniStatus LinkOniDevice::invoke(int commandId, void* data, int dataSize) } break; + case LINK_COMMAND_GET_TEMP_LIST: + { + EXACT_PROP_SIZE_DO(dataSize, XnCommandGetTempList) + { + m_driverServices.errorLoggerAppend("Unexpected size: %d != %d\n", dataSize, sizeof(XnCommandGetTempList)); + XN_ASSERT(FALSE); + return ONI_STATUS_BAD_PARAMETER; + } + + XnCommandGetTempList* pArgs = reinterpret_cast(data); + if (pArgs->pTempInfos == NULL) + { + m_driverServices.errorLoggerAppend("Temp array must point to valid memory: \n"); + XN_ASSERT(FALSE); + return ONI_STATUS_BAD_PARAMETER; + } + + xnl::Array tempInfos; + nRetVal = m_pSensor->GetSupportedTempList(tempInfos); + XN_IS_STATUS_OK_LOG_ERROR_RET("Get Temp list", nRetVal, ONI_STATUS_ERROR); + + if (pArgs->count < tempInfos.GetSize()) + { + m_driverServices.errorLoggerAppend("Insufficient memory for Temperature list. available: %d, required: %d\n", pArgs->pTempInfos, tempInfos.GetSize()); + XN_ASSERT(FALSE); + return ONI_STATUS_BAD_PARAMETER; + } + + for (int i = 0; i < (int)tempInfos.GetSize(); ++i) + { + pArgs->pTempInfos[i] = tempInfos[i]; + } + pArgs->count = tempInfos.GetSize(); + } + break; + case PS_COMMAND_READ_TEMPERATURE: + { + XnCommandTemperatureResponse* pArg; + EXACT_PROP_SIZE_DO(dataSize,XnCommandTemperatureResponse) + { + m_driverServices.errorLoggerAppend("Unexpected size: %d != %d\n", dataSize, sizeof(XnCommandTemperatureResponse)); + XN_ASSERT(FALSE); + return ONI_STATUS_BAD_PARAMETER; + } + pArg = reinterpret_cast(data); + nRetVal = m_pSensor->GetTemperature(*pArg); + XN_IS_STATUS_OK_LOG_ERROR_RET("Get Temperature", nRetVal, ONI_STATUS_ERROR); + } + break; case PS_COMMAND_EXECUTE_BIST: { EXACT_PROP_SIZE_DO(dataSize, XnCommandExecuteBist) @@ -1325,7 +1413,7 @@ OniStatus LinkOniDevice::invoke(int commandId, void* data, int dataSize) } XnCommandSetProjectorPulse* pArgs = reinterpret_cast(data); - nRetVal = m_pSensor->EnableProjectorPulse((XnUInt16)pArgs->delay, (XnUInt16)pArgs->width, (XnUInt16)pArgs->frames); + nRetVal = m_pSensor->EnableProjectorPulse((XnFloat)pArgs->delay, (XnFloat)pArgs->width, (XnFloat)pArgs->cycle); XN_IS_STATUS_OK_LOG_ERROR_RET("Enable projector pulse", nRetVal, ONI_STATUS_ERROR); } break; @@ -1363,6 +1451,8 @@ OniBool LinkOniDevice::isCommandSupported(int commandId) case PS_COMMAND_DUMP_ENDPOINT: case PS_COMMAND_GET_I2C_DEVICE_LIST: case PS_COMMAND_GET_BIST_LIST: + case LINK_COMMAND_GET_TEMP_LIST: + case PS_COMMAND_READ_TEMPERATURE: case PS_COMMAND_EXECUTE_BIST: case PS_COMMAND_USB_TEST: case PS_COMMAND_GET_LOG_MASK_LIST: diff --git a/Source/Drivers/PSLink/LinkProtoLib/XnLinkControlEndpoint.cpp b/Source/Drivers/PSLink/LinkProtoLib/XnLinkControlEndpoint.cpp index 0a643b26..1f798216 100644 --- a/Source/Drivers/PSLink/LinkProtoLib/XnLinkControlEndpoint.cpp +++ b/Source/Drivers/PSLink/LinkProtoLib/XnLinkControlEndpoint.cpp @@ -890,6 +890,40 @@ XnStatus LinkControlEndpoint::GetSupportedBistTests(xnl::Array& supp return XN_STATUS_OK; } +XnStatus LinkControlEndpoint::GetSupportedTempList(xnl::Array& supportedTempList) +{ + XnStatus nRetVal = XN_STATUS_OK; + xnLogVerbose(XN_MASK_LINK, "LINK: Getting supported Temperature list..."); + + XnLinkTemperatureSensorsList* pSupportedList = + reinterpret_cast(m_pIncomingResponse); + XnUInt32 nResponseSize = m_nMaxResponseSize; + + nRetVal = GetGeneralProperty(XN_LINK_STREAM_ID_NONE, XN_LINK_PROP_ID_TEMPERATURE_LIST, nResponseSize, pSupportedList); + XN_IS_STATUS_OK_LOG_ERROR("Execute get supported Temperature list command", nRetVal); + + nRetVal = xnLinkParseSupportedTempList(pSupportedList, nResponseSize, supportedTempList); + XN_IS_STATUS_OK(nRetVal); + + return XN_STATUS_OK; +} +XnStatus LinkControlEndpoint::GetTemperature(XnCommandTemperatureResponse& tempData) +{ + XnStatus nRetVal = XN_STATUS_OK; + xnLogVerbose(XN_MASK_LINK, "LINK: Getting Temperature for id %d...",tempData.id); + + XnLinkTemperatureResponse* pTemp = + reinterpret_cast(m_pIncomingResponse); + XnUInt32 nResponseSize = m_nMaxResponseSize; + + nRetVal = ExecuteCommand(XN_LINK_MSG_READ_TEMPERATURE, XN_LINK_STREAM_ID_NONE, &tempData,sizeof(XnCommandTemperatureResponse),pTemp, nResponseSize); + XN_IS_STATUS_OK_LOG_ERROR("Execute Get Temperature command", nRetVal); + + nRetVal = xnLinkParseGetTemperature(pTemp, nResponseSize, tempData); + XN_IS_STATUS_OK(nRetVal); + + return XN_STATUS_OK; +} XnStatus LinkControlEndpoint::ExecuteBistTests(XnUInt32 nID, uint32_t& errorCode, uint32_t& extraDataSize, uint8_t* extraData) { XnStatus nRetVal = XN_STATUS_OK; @@ -1581,16 +1615,16 @@ XnStatus LinkControlEndpoint::GetSupportedInterfaces(XnUInt16 nStreamID, xnl::Bi return XN_STATUS_OK; } -XnStatus LinkControlEndpoint::SetEmitterActive(XnBool bActive) +XnStatus LinkControlEndpoint::SetProjectorActive(XnBool bActive) { XnStatus nRetVal = XN_STATUS_OK; - xnLogVerbose(XN_MASK_LINK, "LINK: Turning emitter %s...", bActive ? "on" : "off"); + xnLogVerbose(XN_MASK_LINK, "LINK: Turning Projector %s...", bActive ? "on" : "off"); - nRetVal = SetIntProperty(XN_LINK_STREAM_ID_NONE, XN_LINK_PROP_ID_EMITTER_ACTIVE, XnUInt64(bActive)); + nRetVal = SetIntProperty(XN_LINK_STREAM_ID_NONE, XN_LINK_PROP_ID_PROJECTOR_ENABLED, XnUInt64(bActive)); XN_IS_STATUS_OK(nRetVal); - xnLogInfo(XN_MASK_LINK, "LINK: Emitter was turned %s", bActive ? "on" : "off"); + xnLogInfo(XN_MASK_LINK, "LINK: Projector was turned %s", bActive ? "on" : "off"); return (XN_STATUS_OK); } @@ -1625,6 +1659,70 @@ XnStatus LinkControlEndpoint::GetAccActive(XnBool& bActive) return nRetVal; } + +// Enables/Disables the BIST +XnStatus LinkControlEndpoint::SetVDDActive(XnBool bActive) +{ + XnStatus nRetVal = XN_STATUS_OK; + + xnLogVerbose(XN_MASK_LINK, "LINK: Turning VDD %s...", bActive ? "on" : "off"); + + nRetVal = SetIntProperty(XN_LINK_STREAM_ID_NONE, XN_LINK_PROP_ID_VDD_ENABLED, XnUInt64(bActive)); + XN_IS_STATUS_OK(nRetVal); + + xnLogInfo(XN_MASK_LINK, "LINK: VDD was turned %s", bActive ? "on" : "off"); + + return (XN_STATUS_OK); +} +// Enables/Disables the VDD - Valid Depth Detect (XN_LINK_PROP_ID_VDD_ENABLED) +//on - Safety mechanism is on | off - reduce power +XnStatus LinkControlEndpoint::GetVDDActive(XnBool& bActive) +{ + XnUInt64 nValue; + + xnLogVerbose(XN_MASK_LINK, "LINK: Getting VDD ..."); + + XnStatus nRetVal = GetIntProperty(XN_LINK_STREAM_ID_NONE, XN_LINK_PROP_ID_VDD_ENABLED, nValue); + XN_IS_STATUS_OK(nRetVal); + + bActive = (nValue == TRUE); + + xnLogInfo(XN_MASK_LINK, "LINK: VDD is %s", bActive ? "on" : "off"); + + return nRetVal; +} + + +// Enables/Disables the Periodic BIST - monitors the +XnStatus LinkControlEndpoint::SetPeriodicBistActive(XnBool bActive) +{ + XnStatus nRetVal = XN_STATUS_OK; + + xnLogVerbose(XN_MASK_LINK, "LINK: Turning Periodic BIST %s...", bActive ? "on" : "off"); + + nRetVal = SetIntProperty(XN_LINK_STREAM_ID_NONE, XN_LINK_PROP_ID_PERIODIC_BIST_ENABLED, XnUInt64(bActive)); + XN_IS_STATUS_OK(nRetVal); + + xnLogInfo(XN_MASK_LINK, "LINK: Periodic BIST was turned %s", bActive ? "on" : "off"); + + return (XN_STATUS_OK); +} + +XnStatus LinkControlEndpoint::GetPeriodicBistActive(XnBool& bActive) +{ + XnUInt64 nValue; + + xnLogVerbose(XN_MASK_LINK, "LINK: Getting Periodic BIST ..."); + + XnStatus nRetVal = GetIntProperty(XN_LINK_STREAM_ID_NONE, XN_LINK_PROP_ID_PERIODIC_BIST_ENABLED, nValue); + XN_IS_STATUS_OK(nRetVal); + + bActive = (nValue == TRUE); + + xnLogInfo(XN_MASK_LINK, "LINK: Periodic BIST is %s", bActive ? "on" : "off"); + + return nRetVal; +} XnStatus LinkControlEndpoint::GetStreamFragLevel(XnUInt16 nStreamID, XnStreamFragLevel& streamFragLevel) { XnStatus nRetVal = XN_STATUS_OK; @@ -1769,7 +1867,7 @@ XnStatus LinkControlEndpoint::CloseFWLogFile(XnUInt8 logID, XnUInt16 nLogStreamI return XN_STATUS_OK; } -XnStatus LinkControlEndpoint::SetProjectorPulse(XnBool enabled, XnUInt16 delay, XnUInt16 width, XnUInt16 framesToskip) +XnStatus LinkControlEndpoint::SetProjectorPulse(XnBool enabled, XnFloat delay, XnFloat width, XnFloat cycle) { XnStatus nRetVal = XN_STATUS_OK; @@ -1777,9 +1875,9 @@ XnStatus LinkControlEndpoint::SetProjectorPulse(XnBool enabled, XnUInt16 delay, XnLinkProjectorPulse pulse; pulse.m_bEnabled = enabled ? 1 : 0; - pulse.m_nDelay = XN_PREPARE_VAR16_IN_BUFFER(delay); - pulse.m_nWidth = XN_PREPARE_VAR16_IN_BUFFER(width); - pulse.m_nFramesToSkip = XN_PREPARE_VAR16_IN_BUFFER(framesToskip); + pulse.m_nDelay = XN_PREPARE_VAR_FLOAT_IN_BUFFER(delay); + pulse.m_nWidth = XN_PREPARE_VAR_FLOAT_IN_BUFFER(width); + pulse.m_nCycle = XN_PREPARE_VAR_FLOAT_IN_BUFFER(cycle); nRetVal = SetGeneralProperty(XN_LINK_PROP_ID_NONE, XN_LINK_PROP_ID_PROJECTOR_PULSE, sizeof(pulse), &pulse); XN_IS_STATUS_OK(nRetVal); @@ -1789,7 +1887,7 @@ XnStatus LinkControlEndpoint::SetProjectorPulse(XnBool enabled, XnUInt16 delay, return XN_STATUS_OK; } -XnStatus LinkControlEndpoint::GetProjectorPulse(XnBool& enabled, XnUInt16& delay, XnUInt16& width, XnUInt16& framesToskip) +XnStatus LinkControlEndpoint::GetProjectorPulse(XnBool& enabled, XnFloat& delay, XnFloat& width, XnFloat& framesToskip) { XnStatus nRetVal = XN_STATUS_OK; @@ -1808,9 +1906,9 @@ XnStatus LinkControlEndpoint::GetProjectorPulse(XnBool& enabled, XnUInt16& delay } enabled = (pulse.m_bEnabled != 0); - delay = XN_PREPARE_VAR16_IN_BUFFER(pulse.m_nDelay); + delay = XN_PREPARE_VAR_FLOAT_IN_BUFFER(pulse.m_nDelay); width = XN_PREPARE_VAR16_IN_BUFFER(pulse.m_nWidth); - framesToskip = XN_PREPARE_VAR16_IN_BUFFER(pulse.m_nFramesToSkip); + framesToskip = XnFloat(pulse.m_nCycle); return XN_STATUS_OK; } @@ -1819,12 +1917,12 @@ XnStatus LinkControlEndpoint::SetProjectorPower(XnUInt16 power) { XnStatus nRetVal = XN_STATUS_OK; - xnLogVerbose(XN_MASK_LINK, "LINK: Setting emitter power to %u...", power); + xnLogVerbose(XN_MASK_LINK, "LINK: Setting Projector power to %u...", power); nRetVal = SetIntProperty(XN_LINK_STREAM_ID_NONE, XN_LINK_PROP_ID_PROJECTOR_POWER, XnUInt64(power)); XN_IS_STATUS_OK(nRetVal); - xnLogInfo(XN_MASK_LINK, "LINK: Emitter power was set to %u", power); + xnLogInfo(XN_MASK_LINK, "LINK: Projector power was set to %u", power); return (XN_STATUS_OK); } diff --git a/Source/Drivers/PSLink/LinkProtoLib/XnLinkControlEndpoint.h b/Source/Drivers/PSLink/LinkProtoLib/XnLinkControlEndpoint.h index 54757112..55128ed7 100644 --- a/Source/Drivers/PSLink/LinkProtoLib/XnLinkControlEndpoint.h +++ b/Source/Drivers/PSLink/LinkProtoLib/XnLinkControlEndpoint.h @@ -65,6 +65,8 @@ class LinkControlEndpoint XnStatus SoftReset(); XnStatus HardReset(); XnStatus GetSupportedBistTests(xnl::Array& supportedTests); + XnStatus GetSupportedTempList(xnl::Array& supportedTests); + XnStatus GetTemperature(XnCommandTemperatureResponse& temp); XnStatus ExecuteBistTests(XnUInt32 nID, uint32_t& errorCode, uint32_t& extraDataSize, uint8_t* extraData); XnStatus StartUsbTest(); XnStatus StopUsbTest(); @@ -82,14 +84,18 @@ class LinkControlEndpoint XnStatus DestroyInputStream(XnUInt16 nStreamID); XnStatus SetCropping(XnUInt16 nStreamID, const OniCropping& cropping); XnStatus GetCropping(XnUInt16 nStreamID, OniCropping& cropping); - XnStatus SetEmitterActive(XnBool bActive); + XnStatus SetProjectorActive(XnBool bActive); XnStatus SetAccActive(XnBool bActive); XnStatus GetAccActive(XnBool& bActive); + XnStatus SetVDDActive(XnBool bActive); + XnStatus GetVDDActive(XnBool& bActive); + XnStatus SetPeriodicBistActive(XnBool bActive); + XnStatus GetPeriodicBistActive(XnBool& bActive); XnStatus GetSupportedLogFiles(xnl::Array& supportedFiles); XnStatus OpenFWLogFile(XnUInt8 logID, XnUInt16 nLogStreamID); XnStatus CloseFWLogFile(XnUInt8 logID, XnUInt16 nLogStreamID); - XnStatus SetProjectorPulse(XnBool enabled, XnUInt16 delay, XnUInt16 width, XnUInt16 framesToskip); - XnStatus GetProjectorPulse(XnBool& enabled, XnUInt16& delay, XnUInt16& width, XnUInt16& framesToskip); + XnStatus SetProjectorPulse(XnBool enabled, XnFloat delay, XnFloat width, XnFloat cycle); + XnStatus GetProjectorPulse(XnBool& enabled, XnFloat& delay, XnFloat& width, XnFloat& framesToskip); XnStatus SetProjectorPower(XnUInt16 power); XnStatus GetProjectorPower(XnUInt16& power); XnStatus SetGain(XnUInt16 streamID, XnUInt16 gain); diff --git a/Source/Drivers/PSLink/LinkProtoLib/XnLinkProtoUtils.cpp b/Source/Drivers/PSLink/LinkProtoLib/XnLinkProtoUtils.cpp index 4db2a56d..4aa5799a 100644 --- a/Source/Drivers/PSLink/LinkProtoLib/XnLinkProtoUtils.cpp +++ b/Source/Drivers/PSLink/LinkProtoLib/XnLinkProtoUtils.cpp @@ -1068,6 +1068,73 @@ XnStatus xnLinkParseSupportedBistTests(const XnLinkSupportedBistTests* pSupporte return XN_STATUS_OK; } +XnStatus xnLinkParseSupportedTempList(const XnLinkTemperatureSensorsList* pSupportedList, XnUInt32 nBufferSize, xnl::Array& supportedTempList) +{ + XnStatus nRetVal = XN_STATUS_OK; + XnUInt32 nTemp = 0; + XnUInt32 nExpectedSize = 0; + + XN_VALIDATE_INPUT_PTR(pSupportedList); + + if (nBufferSize < sizeof(pSupportedList->m_nCount)) + { + xnLogError(XN_MASK_LINK, "Size of link supported Temperature list was only %u bytes, must be at least %u.", nBufferSize, + sizeof(pSupportedList->m_nCount)); + XN_ASSERT(FALSE); + return XN_STATUS_LINK_BAD_PROP_SIZE; + } + + nTemp = XN_PREPARE_VAR32_IN_BUFFER(pSupportedList->m_nCount); + nExpectedSize = (sizeof(pSupportedList->m_nCount) + + (sizeof(pSupportedList->m_aSensors[0]) * nTemp)); + if (nBufferSize != nExpectedSize) + { + xnLogError(XN_MASK_LINK, "Got bad size of 'supported Temperature list' property: %u instead of %u", nBufferSize, nExpectedSize); + XN_ASSERT(FALSE); + return XN_STATUS_LINK_BAD_RESPONSE_SIZE; + } + + nRetVal = supportedTempList.SetSize(nTemp); + XN_IS_STATUS_OK_LOG_ERROR("Set size of output supported Temperature list array", nRetVal); + + for (XnUInt32 i = 0; i < nTemp; i++) + { + supportedTempList[i].id = XN_PREPARE_VAR32_IN_BUFFER(pSupportedList->m_aSensors[i].m_nID); + nRetVal = xnOSStrCopy(supportedTempList[i].name, (const XnChar*) pSupportedList->m_aSensors[i].m_strName, sizeof(supportedTempList[i].name)); + XN_IS_STATUS_OK_LOG_ERROR("Copy Temperature list name", nRetVal); + } + + return XN_STATUS_OK; +} + +XnStatus xnLinkParseGetTemperature(const XnLinkTemperatureResponse* tempResponse, XnUInt32 nBufferSize, XnCommandTemperatureResponse& tempData) +{ + XnStatus nRetVal = XN_STATUS_OK; + XnUInt32 nExpectedSize = 0; + + XN_VALIDATE_INPUT_PTR(tempResponse); + + if (nBufferSize < sizeof(tempData.temperature)) + { + xnLogError(XN_MASK_LINK, "Size of link Get Temperature was only %u bytes, must be at least %u.", nBufferSize, + sizeof(tempData.temperature)); + XN_ASSERT(FALSE); + return XN_STATUS_LINK_BAD_PROP_SIZE; + } + + nExpectedSize = (sizeof(tempResponse)); + if (nBufferSize != nExpectedSize) + { + xnLogError(XN_MASK_LINK, "Got bad size of 'Temperature struct' property: %u instead of %u", nBufferSize, nExpectedSize); + XN_ASSERT(FALSE); + return XN_STATUS_LINK_BAD_RESPONSE_SIZE; + } + tempData.id = XN_PREPARE_VAR32_IN_BUFFER(tempResponse->m_nID); + tempData.temperature = XN_PREPARE_VAR_FLOAT_IN_BUFFER(tempResponse->value); + XN_IS_STATUS_OK_LOG_ERROR("Copy Temperature value", nRetVal); + + return XN_STATUS_OK; +} const XnChar* xnLinkPixelFormatToName(XnFwPixelFormat pixelFormat) { switch (pixelFormat) diff --git a/Source/Drivers/PSLink/LinkProtoLib/XnLinkProtoUtils.h b/Source/Drivers/PSLink/LinkProtoLib/XnLinkProtoUtils.h index d3f16b73..0f5ae16d 100644 --- a/Source/Drivers/PSLink/LinkProtoLib/XnLinkProtoUtils.h +++ b/Source/Drivers/PSLink/LinkProtoLib/XnLinkProtoUtils.h @@ -152,6 +152,8 @@ XnStatus xnLinkParseFrameSyncStreamIDsProp(XnLinkPropType propType, const void* XnStatus xnLinkParseComponentVersionsListProp(XnLinkPropType propType, const void* pValue, XnUInt32 nValueSize, xnl::Array& componentVersions); XnStatus xnLinkParseSupportedBistTests(const XnLinkSupportedBistTests* pSupportedTests, XnUInt32 nBufferSize, xnl::Array& supportedTests); +XnStatus xnLinkParseSupportedTempList(const XnLinkTemperatureSensorsList* pSupportedList, XnUInt32 nBufferSize, xnl::Array& supportedTempList); +XnStatus xnLinkParseGetTemperature(const XnLinkTemperatureResponse* tempResponse, XnUInt32 nBufferSize, XnCommandTemperatureResponse& tempData); XnStatus xnLinkParseSupportedI2CDevices(const XnLinkSupportedI2CDevices* pSupportedTests, XnUInt32 nBufferSize, xnl::Array& supportedDevices); XnStatus xnLinkParseSupportedLogFiles(const XnLinkSupportedLogFiles* pFilesList, XnUInt32 nBufferSize, xnl::Array& supportedFiles); diff --git a/Source/Drivers/PSLink/PSLinkConsole/PSLinkConsole.cpp b/Source/Drivers/PSLink/PSLinkConsole/PSLinkConsole.cpp index f35bec53..bc556d73 100644 --- a/Source/Drivers/PSLink/PSLinkConsole/PSLinkConsole.cpp +++ b/Source/Drivers/PSLink/PSLinkConsole/PSLinkConsole.cpp @@ -1048,44 +1048,101 @@ int HardReset(int /*argc*/, const char* /*argv*/[]) return nRetVal; } -int Emitter(int argc, const char* argv[]) +// Enables/Disables the BIST (XN_LINK_PROP_ID_ACC_ENABLED) +int Acc(int argc, const char* argv[]) { - if ((argc < 2) || - ((xnOSStrCaseCmp(argv[1], "on") != 0) && (xnOSStrCaseCmp(argv[1], "off") != 0))) + XnBool bAccEnabled; + Status nRetVal; + if(argc == 1) + { + nRetVal = g_device.getProperty(LINK_PROP_ACC_ENABLED, &bAccEnabled); + if (nRetVal == STATUS_OK) + { + printf("Acc is %s.\n\n", (bAccEnabled ? "on" : "off")); + } + else + { + printf("Failed to get Acc: %s\n\n", OpenNI::getExtendedError()); + } + + return nRetVal; + } + + if((xnOSStrCaseCmp(argv[1], "on") != 0) && (xnOSStrCaseCmp(argv[1], "off") != 0)) + { + printf("Usage: %s \n\n", argv[0]); + return -1; + } + const XnChar* strAccActive = argv[1]; + bAccEnabled = (xnOSStrCaseCmp(strAccActive, "on") == 0); + nRetVal = g_device.setProperty(LINK_PROP_ACC_ENABLED, bAccEnabled); + if (nRetVal == STATUS_OK) { - printf("Usage: %s \n\n", argv[0]); - return -1; + printf("Acc is now %s.\n\n", strAccActive); + } + else + { + printf("Failed to set Acc %s: %s\n\n", strAccActive, OpenNI::getExtendedError()); } - const XnChar* strEmitterActive = argv[1]; - XnBool bEmitterActive = (xnOSStrCaseCmp(strEmitterActive, "on") == 0); - Status nRetVal = g_device.setProperty(LINK_PROP_EMITTER_ACTIVE, bEmitterActive); + + return nRetVal; +} +// Enables/Disables the VDD - Valid Depth Detect (XN_LINK_PROP_ID_VDD_ENABLED) +//on - Safety mechanism is on | off - reduce power +int VDD(int argc, const char* argv[]) +{ + XnBool bAccEnabled; + Status nRetVal; + if(argc == 1) + { + nRetVal = g_device.getProperty(LINK_PROP_VDD_ENABLED, &bAccEnabled); + if (nRetVal == STATUS_OK) + { + printf("VDD is %s.\n\n", (bAccEnabled ? "on" : "off")); + } + else + { + printf("Failed to get VDD: %s\n\n", OpenNI::getExtendedError()); + } + + return nRetVal; + } + + if((xnOSStrCaseCmp(argv[1], "on") != 0) && (xnOSStrCaseCmp(argv[1], "off") != 0)) + { + printf("Usage: %s \n\n", argv[0]); + return -1; + } + const XnChar* strAccActive = argv[1]; + bAccEnabled = (xnOSStrCaseCmp(strAccActive, "on") == 0); + nRetVal = g_device.setProperty(LINK_PROP_VDD_ENABLED, bAccEnabled); if (nRetVal == STATUS_OK) { - printf("Emitter is now %s.\n\n", strEmitterActive); + printf("VDD is now %s.\n\n", strAccActive); } else { - printf("Failed to set emitter %s: %s\n\n", strEmitterActive, OpenNI::getExtendedError()); + printf("Failed to set VDD %s: %s\n\n", strAccActive, OpenNI::getExtendedError()); } return nRetVal; } -// Enables/Disables the BIST (XN_LINK_PROP_ID_ACC_ENABLED) -int Acc(int argc, const char* argv[]) +// Enables/Disables the Periodic BIST (XN_LINK_PROP_ID_PERIODIC_BIST_ENABLED) +int PeriodicBist(int argc, const char* argv[]) { XnBool bAccEnabled; Status nRetVal; if(argc == 1) { - nRetVal = g_device.getProperty(PS_PROPERTY_ACC_ENABLED, &bAccEnabled); + nRetVal = g_device.getProperty(LINK_PROP_PERIODIC_BIST_ENABLED, &bAccEnabled); if (nRetVal == STATUS_OK) { - printf("Acc is %s.\n\n", (bAccEnabled ? "on" : "off")); + printf("Periodic BIST is %s.\n\n", (bAccEnabled ? "on" : "off")); } else { - printf("Failed to get Acc: %s\n\n", OpenNI::getExtendedError()); + printf("Failed to get Periodic BIST: %s\n\n", OpenNI::getExtendedError()); } return nRetVal; @@ -1098,14 +1155,14 @@ int Acc(int argc, const char* argv[]) } const XnChar* strAccActive = argv[1]; bAccEnabled = (xnOSStrCaseCmp(strAccActive, "on") == 0); - nRetVal = g_device.setProperty(PS_PROPERTY_ACC_ENABLED, bAccEnabled); + nRetVal = g_device.setProperty(LINK_PROP_PERIODIC_BIST_ENABLED, bAccEnabled); if (nRetVal == STATUS_OK) { - printf("Acc is now %s.\n\n", strAccActive); + printf("Periodic BIST is now %s.\n\n", strAccActive); } else { - printf("Failed to set Acc %s: %s\n\n", strAccActive, OpenNI::getExtendedError()); + printf("Failed to set Periodic BIST %s: %s\n\n", strAccActive, OpenNI::getExtendedError()); } return nRetVal; @@ -1328,108 +1385,197 @@ int PrintBistList(int /*argc*/, const char* /*argv*/[]) return 0; } - int RunBist(int argc, const char* argv[]) +{ + Status nRetVal = STATUS_OK; + + if (argc < 2) + { + printf("Usage: %s ALL | ...\n\n", argv[0]); + return -1; + } + + XnBistInfo bistInfos[20]; + XnCommandGetBistList supportedTests; + supportedTests.tests = bistInfos; + supportedTests.count = sizeof(bistInfos)/sizeof(bistInfos[0]); + + if (STATUS_OK != g_device.invoke(PS_COMMAND_GET_BIST_LIST, supportedTests)) + { + printf("Failed getting tests list: %s\n\n", OpenNI::getExtendedError()); + return -2; + } + + xnl::BitSet requestedTests; + + if (xnOSStrCaseCmp(argv[1], "ALL") == 0) + { + for (XnUInt32 i = 0; i < supportedTests.count; ++i) + { + requestedTests.Set(supportedTests.tests[i].id, TRUE); + } + } + else + { + for (int i = 1; i < argc; ++i) + { + requestedTests.Set(MyAtoi(argv[i]), TRUE); + } + } + + XnUInt8 response[512]; + XnCommandExecuteBist args; + args.extraData = response; + + for (XnUInt32 i = 0; i < requestedTests.GetSize(); ++i) + { + if (!requestedTests.IsSet(i)) + { + continue; + } + + // search for test in list (for its name) + const XnChar* testName = "Unknown"; + for (XnUInt32 j = 0; j < supportedTests.count; ++j) + { + if (supportedTests.tests[j].id == i) + { + testName = supportedTests.tests[j].name; + break; + } + } + + printf("Executing test %u (%s)...\n", i, testName); + + args.id = i; + args.extraDataSize = sizeof(response); + nRetVal = g_device.invoke(PS_COMMAND_EXECUTE_BIST, args); + if (nRetVal != STATUS_OK) + { + printf("\nFailed to execute: %s\n\n", OpenNI::getExtendedError()); + return nRetVal; + } + + printf("Test %u (%s) ", i, testName); + + if (args.errorCode != 0) + { + printf("Failed (error code 0x%04X).", args.errorCode); + } + else + { + printf("Passed."); + } + + printf("\n"); + + // extra data + if (args.extraDataSize > 0) + { + printf("Extra Data: "); + for (XnUInt32 j = 0; j < args.extraDataSize; ++j) + { + printf("%02X ", args.extraData[j]); + } + printf("\n"); + } + } + + printf("\n"); + + return (XN_STATUS_OK); +} +//Prints option list in which the user can choose to get the temperature +int PrintTempList(int /*argc*/, const char* /*argv*/[]) +{ + XnTempInfo tempInfo[20]; + XnCommandGetTempList args; + args.pTempInfos = tempInfo; + args.count = sizeof(tempInfo)/sizeof(tempInfo[0]); + + if (STATUS_OK != g_device.invoke(LINK_COMMAND_GET_TEMP_LIST, args)) + { + printf("Failed getting Temperature list: %s\n\n", OpenNI::getExtendedError()); + return 1; + } + else + { + for (XnUInt32 i = 0; i < args.count; ++i) + { + printf("%4u %s\n", tempInfo[i].id, tempInfo[i].name); + } + + printf("\n"); + } + + return 0; +} +int ReadTemps(int argc, const char* argv[]) { Status nRetVal = STATUS_OK; if (argc < 2) { - printf("Usage: %s ALL | ...\n\n", argv[0]); + printf("Usage: %s ALL | | ...\n\n", argv[0]); return -1; } - XnBistInfo bistInfos[20]; - XnCommandGetBistList supportedTests; - supportedTests.tests = bistInfos; - supportedTests.count = sizeof(bistInfos)/sizeof(bistInfos[0]); + XnTempInfo TempInfos[20]; + XnCommandGetTempList supportedTempList; + supportedTempList.pTempInfos = TempInfos; + supportedTempList.count = sizeof(TempInfos)/sizeof(TempInfos[0]); - if (STATUS_OK != g_device.invoke(PS_COMMAND_GET_BIST_LIST, supportedTests)) + if (STATUS_OK != g_device.invoke(LINK_COMMAND_GET_TEMP_LIST, supportedTempList)) { - printf("Failed getting tests list: %s\n\n", OpenNI::getExtendedError()); + printf("Failed getting Temperature list: %s\n\n", OpenNI::getExtendedError()); return -2; } - xnl::BitSet requestedTests; + XnCommandTemperatureResponse response; if (xnOSStrCaseCmp(argv[1], "ALL") == 0) { - for (XnUInt32 i = 0; i < supportedTests.count; ++i) + for (XnUInt32 i = 0; i < supportedTempList.count; ++i) { - requestedTests.Set(supportedTests.tests[i].id, TRUE); + response.id = supportedTempList.pTempInfos[i].id; + nRetVal = g_device.invoke(PS_COMMAND_READ_TEMPERATURE, response); + if(nRetVal != STATUS_OK) + { + printf("Failed getting Temperature data for id %d: %s\n\n", response.id, OpenNI::getExtendedError()); + } + else + { + printf("%s \t Temperature: %f \n\n", supportedTempList.pTempInfos[i].name, response.temperature); + } } } else - { - for (int i = 1; i < argc; ++i) - { - requestedTests.Set(MyAtoi(argv[i]), TRUE); - } - } - - XnUInt8 response[512]; - XnCommandExecuteBist args; - args.extraData = response; - - for (XnUInt32 i = 0; i < requestedTests.GetSize(); ++i) - { - if (!requestedTests.IsSet(i)) - { - continue; - } - - // search for test in list (for its name) - const XnChar* testName = "Unknown"; - for (XnUInt32 j = 0; j < supportedTests.count; ++j) - { - if (supportedTests.tests[j].id == i) - { - testName = supportedTests.tests[j].name; - break; - } - } - - printf("Executing test %u (%s)...\n", i, testName); - - args.id = i; - args.extraDataSize = sizeof(response); - nRetVal = g_device.invoke(PS_COMMAND_EXECUTE_BIST, args); - if (nRetVal != STATUS_OK) - { - printf("\nFailed to execute: %s\n\n", OpenNI::getExtendedError()); - return nRetVal; - } - - printf("Test %u (%s) ", i, testName); - - if (args.errorCode != 0) - { - printf("Failed (error code 0x%04X).", args.errorCode); - } - else - { - printf("Passed."); - } - - printf("\n"); - - // extra data - if (args.extraDataSize > 0) - { - printf("Extra Data: "); - for (XnUInt32 j = 0; j < args.extraDataSize; ++j) - { - printf("%02X ", args.extraData[j]); - } - printf("\n"); - } + { + XnInt32 argInt= (argv[1][0] >= '0' && argv[1][0] <= '9') ? MyAtoi(argv[1]) : -1; + for (XnUInt32 i = 0; i < supportedTempList.count; ++i) + { + if ((xnOSStrCaseCmp(argv[1],supportedTempList.pTempInfos[i].name) == 0) + || (argInt == (XnInt32)supportedTempList.pTempInfos[i].id) ) + { + response.id = supportedTempList.pTempInfos[i].id; + nRetVal = g_device.invoke(PS_COMMAND_READ_TEMPERATURE, response); + if(nRetVal != STATUS_OK) + { + printf("Failed getting Temperature data for id %d: %s\n\n", response.id, OpenNI::getExtendedError()); + } + else + { + printf("%s \t Temperature: %f \n\n", supportedTempList.pTempInfos[i].name, response.temperature); + } + break; + } + } } - printf("\n"); - return (XN_STATUS_OK); } + int Quit(int /*argc*/, const char* /*argv*/[]) { g_continue = FALSE; @@ -1562,6 +1708,23 @@ int Projector(int argc, const char* argv[]) if (argc > 1) { + //Projector command + XnBool bProjectorActive = (xnOSStrCaseCmp(argv[1], "on") == 0); + if((bProjectorActive || xnOSStrCaseCmp(argv[1], "off") == 0)) + { + Status nRetVal = g_device.setProperty(LINK_PROP_PROJECTOR_ACTIVE, bProjectorActive); + if (nRetVal == STATUS_OK) + { + printf("Projector is now %s.\n\n", argv[1]); + } + else + { + printf("Failed to set Projector %s: %s\n\n", argv[1], OpenNI::getExtendedError()); + } + + return nRetVal; + } + if (xnOSStrCaseCmp(argv[1], "power") == 0) { if (argc > 2) @@ -1599,9 +1762,9 @@ int Projector(int argc, const char* argv[]) if (xnOSStrCaseCmp(argv[2], "on") == 0 && argc > 5) { XnCommandSetProjectorPulse args; - args.delay = MyAtoi(argv[3]); - args.width = MyAtoi(argv[4]); - args.frames = MyAtoi(argv[5]); + args.delay = (float)atof(argv[3]); + args.cycle = (float)atof(argv[5]); + args.width = (float)atof(argv[4]); //where both delay and width are in ms, and can be float nRetVal = g_device.invoke(LINK_COMMAND_SET_PROJECTOR_PULSE, args); if (nRetVal != XN_STATUS_OK) @@ -1631,8 +1794,9 @@ int Projector(int argc, const char* argv[]) // if we got here, something was wrong with the arguments printf("Usage: \n"); + printf("\t%s \n", argv[0]); printf("\t%s power [newVal]\n", argv[0]); - printf("\t%s pulse on \n", argv[0]); + printf("\t%s pulse on \n", argv[0]); printf("\t%s pulse off\n", argv[0]); printf("\n"); return -1; @@ -1665,14 +1829,17 @@ void RegisterCommands() RegisterCommand("WriteAHB", WriteAHB); RegisterCommand("ReadAHB", ReadAHB); RegisterCommand("SoftReset", SoftReset); - RegisterCommand("HardReset", HardReset); - RegisterCommand("Emitter", Emitter); + RegisterCommand("HardReset", HardReset); RegisterCommand("Acc", Acc); + RegisterCommand("VDD", VDD); + RegisterCommand("PeriodBist", PeriodicBist); RegisterCommand("Log", Log); RegisterCommand("LogList", PrintLogFilesList); RegisterCommand("Script", Script); RegisterCommand("BistList", PrintBistList); - RegisterCommand("Bist", RunBist); + RegisterCommand("Bist", RunBist); + RegisterCommand("TempList", PrintTempList); + RegisterCommand("Temp", ReadTemps); RegisterCommand("UsbInterface", UsbInterface); RegisterCommand("FormatZone", FormatZone); RegisterCommand("UsbTest", UsbTest); diff --git a/Source/Drivers/PSLink/PrimeClient.cpp b/Source/Drivers/PSLink/PrimeClient.cpp index b0816b61..4fdf733e 100644 --- a/Source/Drivers/PSLink/PrimeClient.cpp +++ b/Source/Drivers/PSLink/PrimeClient.cpp @@ -330,9 +330,9 @@ XnStatus PrimeClient::DownloadFile(XnUInt16 zone, const XnChar* strFirmwareFileN return m_linkControlEndpoint.DownloadFile(zone, strFirmwareFileName, strTargetFile); } -XnStatus PrimeClient::SetEmitterActive(XnBool bActive) +XnStatus PrimeClient::SetProjectorActive(XnBool bActive) { - return m_linkControlEndpoint.SetEmitterActive(bActive); + return m_linkControlEndpoint.SetProjectorActive(bActive); } XnStatus PrimeClient::SetAccActive(XnBool bActive) @@ -345,6 +345,25 @@ XnStatus PrimeClient::GetAccActive(XnBool& bActive) return m_linkControlEndpoint.GetAccActive(bActive); } +XnStatus PrimeClient::SetVDDActive(XnBool bActive) +{ + return m_linkControlEndpoint.SetVDDActive(bActive); +} + +XnStatus PrimeClient::GetVDDActive(XnBool& bActive) +{ + return m_linkControlEndpoint.GetVDDActive(bActive); +} + +XnStatus PrimeClient::SetPeriodicBistActive(XnBool bActive) +{ + return m_linkControlEndpoint.SetPeriodicBistActive(bActive); +} + +XnStatus PrimeClient::GetPeriodicBistActive(XnBool& bActive) +{ + return m_linkControlEndpoint.GetPeriodicBistActive(bActive); +} void PrimeClient::LogVersions() { static XnBool bVersionsLoggedOnce = FALSE; @@ -623,7 +642,14 @@ XnStatus PrimeClient::GetSupportedBistTests(xnl::Array& supportedTes { return m_linkControlEndpoint.GetSupportedBistTests(supportedTests); } - +XnStatus PrimeClient::GetSupportedTempList(xnl::Array& supportedTempList) +{ + return m_linkControlEndpoint.GetSupportedTempList(supportedTempList); +} +XnStatus PrimeClient::GetTemperature(XnCommandTemperatureResponse& temp) +{ + return m_linkControlEndpoint.GetTemperature(temp); +} XnStatus PrimeClient::GetSupportedI2CDevices(xnl::Array& supportedDevices) { return m_linkControlEndpoint.GetSupportedI2CDevices(supportedDevices); @@ -651,9 +677,9 @@ XnStatus PrimeClient::GetBootStatus(XnBootStatus& bootStatus) return m_linkControlEndpoint.GetBootStatus(bootStatus); } -XnStatus PrimeClient::EnableProjectorPulse(XnUInt16 delay, XnUInt16 width, XnUInt16 framesToskip) +XnStatus PrimeClient::EnableProjectorPulse(XnFloat delay, XnFloat width, XnFloat cycle) { - return m_linkControlEndpoint.SetProjectorPulse(TRUE, delay, width, framesToskip); + return m_linkControlEndpoint.SetProjectorPulse(TRUE, delay, width, cycle); } XnStatus PrimeClient::DisableProjectorPulse() @@ -661,7 +687,7 @@ XnStatus PrimeClient::DisableProjectorPulse() return m_linkControlEndpoint.SetProjectorPulse(FALSE, 0, 0, 0); } -XnStatus PrimeClient::GetProjectorPulse(XnBool& enabled, XnUInt16& delay, XnUInt16& width, XnUInt16& framesToskip) +XnStatus PrimeClient::GetProjectorPulse(XnBool& enabled, XnFloat& delay, XnFloat& width, XnFloat& framesToskip) { return m_linkControlEndpoint.GetProjectorPulse(enabled, delay, width, framesToskip); } diff --git a/Source/Drivers/PSLink/PrimeClient.h b/Source/Drivers/PSLink/PrimeClient.h index 19ec43dc..da49109c 100644 --- a/Source/Drivers/PSLink/PrimeClient.h +++ b/Source/Drivers/PSLink/PrimeClient.h @@ -53,9 +53,13 @@ class PrimeClient : virtual XnStatus ReadAHB(XnUInt32 nAddress, XnUInt8 nBitOffset, XnUInt8 nBitWidth, XnUInt32& nValue); virtual XnStatus SoftReset(); virtual XnStatus HardReset(); - virtual XnStatus SetEmitterActive(XnBool bActive); + virtual XnStatus SetProjectorActive(XnBool bActive); virtual XnStatus SetAccActive(XnBool bActive); - virtual XnStatus GetAccActive(XnBool& bActive); + virtual XnStatus GetAccActive(XnBool& bActive); + virtual XnStatus SetVDDActive(XnBool bActive); + virtual XnStatus GetVDDActive(XnBool& bActive); + virtual XnStatus SetPeriodicBistActive(XnBool bActive); + virtual XnStatus GetPeriodicBistActive(XnBool& bActive); virtual XnStatus StartFWLog(); virtual XnStatus StopFWLog(); virtual XnStatus OpenFWLogFile(XnUInt8 logID); @@ -64,6 +68,8 @@ class PrimeClient : virtual XnStatus RunPresetFile(const XnChar* strFileName); virtual XnStatus GetSupportedBistTests(xnl::Array& supportedTests); + virtual XnStatus GetSupportedTempList(xnl::Array& supportedTempList); + virtual XnStatus GetTemperature(XnCommandTemperatureResponse& temp); virtual XnStatus ExecuteBist(XnUInt32 nID, uint32_t& errorCode, uint32_t& extraDataSize, uint8_t* extraData); virtual XnStatus FormatZone(XnUInt8 nZone); //TODO: Implement Get emitter active @@ -91,9 +97,9 @@ class PrimeClient : virtual XnStatus GetFileList(xnl::Array& files); virtual XnStatus DownloadFile(XnUInt16 zone, const XnChar* strFirmwareFileName, const XnChar* strTargetFile); - virtual XnStatus EnableProjectorPulse(XnUInt16 delay, XnUInt16 width, XnUInt16 framesToskip); + virtual XnStatus EnableProjectorPulse(XnFloat delay, XnFloat width, XnFloat cycle); virtual XnStatus DisableProjectorPulse(); - virtual XnStatus GetProjectorPulse(XnBool& enabled, XnUInt16& delay, XnUInt16& width, XnUInt16& framesToskip); + virtual XnStatus GetProjectorPulse(XnBool& enabled, XnFloat& delay, XnFloat& width, XnFloat& framesToskip); virtual XnStatus SetProjectorPower(XnUInt16 power); virtual XnStatus GetProjectorPower(XnUInt16& power); diff --git a/Source/Drivers/PSLink/Protocols/XnLinkProto/XnLinkDefs.h b/Source/Drivers/PSLink/Protocols/XnLinkProto/XnLinkDefs.h index a6f9dff0..18b88f83 100644 --- a/Source/Drivers/PSLink/Protocols/XnLinkProto/XnLinkDefs.h +++ b/Source/Drivers/PSLink/Protocols/XnLinkProto/XnLinkDefs.h @@ -22,6 +22,8 @@ #define XN_LINK_MAX_VERSION_LENGTH 32 #define XN_LINK_MAX_I2C_DEVICE_NAME_LENGTH 32 #define XN_LINK_MAX_LOG_FILE_NAME_LENGTH 32 +#define XN_LINK_MAX_SENSOR_NAME_LENGTH 16 +#define XN_LINK_MAX_TEMPERATURE_SENSORS 2 /* Interface ID's */ typedef enum XnLinkInterfaceID @@ -108,6 +110,8 @@ typedef enum XnLinkMsgType XN_LINK_MSG_STOP_USB_TEST = 0x020B, XN_LINK_MSG_START_LOG_FILE = 0x020C, XN_LINK_MSG_STOP_LOG_FILE = 0x020D, + XN_LINK_MSG_READ_TEMPERATURE = 0x020E, + //XN_LINK_INTERFACE_DATA_STREAMING - Data streaming messages - group 0x03 XN_LINK_MSG_START_STREAMING = 0x0300, @@ -324,7 +328,7 @@ typedef enum XnLinkPropID XN_LINK_PROP_ID_SUPPORTED_PROPS = 0x0005, //General property, holds XnLinkIDSet (read only property) XN_LINK_PROP_ID_HW_VERSION = 0x0006, //Int property (read only property) XN_LINK_PROP_ID_SERIAL_NUMBER = 0x0007, //General property, holds XnLinkSerialNumber (read only property) - XN_LINK_PROP_ID_EMITTER_ACTIVE = 0x0008, //Int property, 1/0 for emitter on/off + XN_LINK_PROP_ID_RESERVED = 0x0008, XN_LINK_PROP_ID_COMPONENT_VERSIONS = 0x0009, //General property, holds XnLinkComponentVersionsList (read only property) XN_LINK_PROP_ID_BOOT_STATUS = 0x000A, //General property, holds XnLinkBootStatus (read only property) @@ -332,7 +336,6 @@ typedef enum XnLinkPropID XN_LINK_PROP_ID_SUPPORTED_BIST_TESTS = 0x0201, //General property, holds XnLinkSupportedBistTests XN_LINK_PROP_ID_SUPPORTED_I2C_DEVICES = 0x0202, //General property, holds XnLinkSupportedI2CDevices XN_LINK_PROP_ID_SUPPORTED_LOG_FILES = 0x0203, //General property, holds XnLinkSupportedLogFiles - XN_LINK_PROP_ID_ACC_ENABLED = 0x0204, //Int property, 0 = ACC & Periodic Thermistor disabled, 1 = enabled //Map generator properties - group 0x05 XN_LINK_PROP_ID_SUPPORTED_VIDEO_MODES = 0x0501, //General property, holds XnLinkSupportedVideoModes @@ -367,7 +370,12 @@ typedef enum XnLinkPropID // PROJECTOR_MGMT messages - group 0x2B XN_LINK_PROP_ID_PROJECTOR_PULSE = 0x2B01, //General property, holds XnLinkProjectorPulse XN_LINK_PROP_ID_PROJECTOR_POWER = 0x2B02, //Int property - + XN_LINK_PROP_ID_ACC_ENABLED = 0x2B03, //Int property ACC, 0 = disabled, 1 = enabled + XN_LINK_PROP_ID_VDD_ENABLED = 0x2B04, //Int property vdd sampling , 0 = disabled, 1 = enabled + XN_LINK_PROP_ID_PROJECTOR_ENABLED = 0x2B05, //Int property projector, 0 = OFF, 1 = ON + XN_LINK_PROP_ID_PERIODIC_BIST_ENABLED = 0x2B06, //Int property voltage sampling , 0 = disabled, 1 = enabled + XN_LINK_PROP_ID_TEMPERATURE_LIST = 0x2B07, + //INVALID XN_LINK_PROP_ID_INVALID = 0xFFFF, //Indicates invalid property ID } XnLinkPropID; diff --git a/Source/Drivers/PSLink/Protocols/XnLinkProto/XnLinkProto.h b/Source/Drivers/PSLink/Protocols/XnLinkProto/XnLinkProto.h index 75cae7ef..b75790f5 100644 --- a/Source/Drivers/PSLink/Protocols/XnLinkProto/XnLinkProto.h +++ b/Source/Drivers/PSLink/Protocols/XnLinkProto/XnLinkProto.h @@ -450,13 +450,23 @@ typedef struct XnLinkSupportedLogFiles typedef struct XnLinkProjectorPulse { - XnUInt8 m_bEnabled; - XnUInt8 m_nReserved; - XnUInt16 m_nDelay; // Delay between frame start and the start of pulse, in milliseconds - XnUInt16 m_nWidth; // Pulse width, in milliseconds - XnUInt16 m_nFramesToSkip; // number of frames to skip between projector pulses, from pulse start to next pulse start. + XnUInt16 m_bEnabled; + XnUInt16 m_nReserved; + XnFloat m_nDelay; // Delay between frame start and the start of pulse, in milliseconds + XnFloat m_nWidth; // Pulse width, in milliseconds + XnFloat m_nCycle; // in pulse mode: number of frames to skip between projector pulses, from pulse start to next pulse start. in PWM : Cycle time } XnLinkProjectorPulse; +typedef struct XnLinkTemperatureSensor +{ + XnUInt32 m_nID; + XnUInt8 m_strName[XN_LINK_MAX_SENSOR_NAME_LENGTH]; +} XnLinkTemperatureSensor; + +typedef struct XnLinkTemperatureSensorsList{ + XnUInt32 m_nCount; + XnLinkTemperatureSensor m_aSensors[XN_LINK_MAX_TEMPERATURE_SENSORS]; +}XnLinkTemperatureSensorsList; //----------------------------------------------------------------------- // Command Parameters //----------------------------------------------------------------------- @@ -579,9 +589,20 @@ typedef struct XnLinkLogOpenCloseParams XnUInt8 m_nID; } XnLinkLogOpenCloseParams; +typedef struct XnLinkGetTemperatureParams +{ + XnUInt32 m_nID; +} XnLinkGetTemperatureParams; + //----------------------------------------------------------------------- // Command Response Structures //----------------------------------------------------------------------- +typedef struct XnLinkTemperatureResponse +{ + XnUInt32 m_nID; + XnFloat value; +} XnLinkTemperatureResponse; + typedef struct XnLinkResponseInfo { XnUInt16 m_nResponseCode; From fe7a3a97ae4b7684928189a7ac5fdafdd9546be8 Mon Sep 17 00:00:00 2001 From: "Inbal.Yefet" Date: Sun, 15 Sep 2013 16:48:31 +0300 Subject: [PATCH 051/188] fix the Max Pixel IR Value for 1080 and 1200 --- Include/OniCTypes.h | 1 + Source/Drivers/PS1080/DDK/XnIRStream.cpp | 15 ++++++++-- Source/Drivers/PS1080/DDK/XnIRStream.h | 21 +++++++++++++- .../PS1080/DriverImpl/XnOniIRStream.cpp | 28 +++++++++++++++++-- .../Drivers/PS1080/DriverImpl/XnOniIRStream.h | 4 ++- .../Drivers/PS1080/Include/XnStreamParams.h | 6 ++++ Source/Drivers/PS1080/Sensor/XnDeviceSensor.h | 2 ++ .../PS1080/Sensor/XnSensorIRStream.cpp | 10 ++++--- .../PSLink/DriverImpl/LinkOniIRStream.cpp | 21 +++++++++++++- .../PSLink/DriverImpl/LinkOniIRStream.h | 1 + 10 files changed, 98 insertions(+), 11 deletions(-) diff --git a/Include/OniCTypes.h b/Include/OniCTypes.h index 076915b0..faf6e6e2 100644 --- a/Include/OniCTypes.h +++ b/Include/OniCTypes.h @@ -141,6 +141,7 @@ typedef struct Pixel type used to store depth images. */ typedef uint16_t OniDepthPixel; +typedef uint16_t OniIRPixel; /** Pixel type used to store 16-bit grayscale images diff --git a/Source/Drivers/PS1080/DDK/XnIRStream.cpp b/Source/Drivers/PS1080/DDK/XnIRStream.cpp index 8858fe20..95b59325 100644 --- a/Source/Drivers/PS1080/DDK/XnIRStream.cpp +++ b/Source/Drivers/PS1080/DDK/XnIRStream.cpp @@ -26,7 +26,18 @@ //--------------------------------------------------------------------------- // Code //--------------------------------------------------------------------------- -XnIRStream::XnIRStream(const XnChar* csName, XnBool bAllowCustomResolutions) : - XnPixelStream(XN_STREAM_TYPE_IR, csName, bAllowCustomResolutions) +XnIRStream::XnIRStream(const XnChar* csName, XnBool bAllowCustomResolutions, OniIRPixel nDeviceMaxIR) : + XnPixelStream(XN_STREAM_TYPE_IR, csName, bAllowCustomResolutions), + m_DeviceMaxIR(XN_STREAM_PROPERTY_DEVICE_MAX_IR, "DeviceMaxIR", nDeviceMaxIR) { } + +XnStatus XnIRStream::Init() +{ + XnStatus nRetVal = XnPixelStream::Init(); + XN_IS_STATUS_OK(nRetVal); + + XN_VALIDATE_ADD_PROPERTIES(this, &m_DeviceMaxIR); + + return XN_STATUS_OK; +} diff --git a/Source/Drivers/PS1080/DDK/XnIRStream.h b/Source/Drivers/PS1080/DDK/XnIRStream.h index fe132bba..d0fba9f8 100644 --- a/Source/Drivers/PS1080/DDK/XnIRStream.h +++ b/Source/Drivers/PS1080/DDK/XnIRStream.h @@ -34,7 +34,26 @@ class XnIRStream : public XnPixelStream { public: - XnIRStream(const XnChar* csName, XnBool bAllowCustomResolutions); + XnIRStream(const XnChar* csName, XnBool bAllowCustomResolutions, OniIRPixel nDeviceMaxIR); + + XnStatus Init(); + + //--------------------------------------------------------------------------- + // Getters + //--------------------------------------------------------------------------- + inline OniIRPixel GetDeviceMaxIR() const { return (OniIRPixel)m_DeviceMaxIR.GetValue(); } + +protected: + //--------------------------------------------------------------------------- + // Properties Getters + //--------------------------------------------------------------------------- + inline XnActualIntProperty& DeviceMaxIRProperty() { return m_DeviceMaxIR; } + +private: + //--------------------------------------------------------------------------- + // Members + //--------------------------------------------------------------------------- + XnActualIntProperty m_DeviceMaxIR; }; #endif //__XN_IR_STREAM_H__ \ No newline at end of file diff --git a/Source/Drivers/PS1080/DriverImpl/XnOniIRStream.cpp b/Source/Drivers/PS1080/DriverImpl/XnOniIRStream.cpp index 413b5fb3..1821b35d 100644 --- a/Source/Drivers/PS1080/DriverImpl/XnOniIRStream.cpp +++ b/Source/Drivers/PS1080/DriverImpl/XnOniIRStream.cpp @@ -27,9 +27,33 @@ // XnOniIRStream class //--------------------------------------------------------------------------- -XnOniIRStream::XnOniIRStream(XnSensor* pSensor, XnOniDevice* pDevice) : - XnOniMapStream(pSensor, XN_STREAM_TYPE_IR, ONI_SENSOR_IR, pDevice) +XnOniIRStream::XnOniIRStream(XnSensor* pSensor, XnOniDevice* pDevice) : XnOniMapStream(pSensor, XN_STREAM_TYPE_IR, ONI_SENSOR_IR, pDevice) { } +OniStatus XnOniIRStream::getProperty(int propertyId, void* data, int* pDataSize) +{ + switch (propertyId) + { + case ONI_STREAM_PROPERTY_MAX_VALUE: + if (*pDataSize != sizeof(int)) + { + return ONI_STATUS_BAD_PARAMETER; + } + + XnUInt64 nValue; + m_pSensor->GetProperty(m_strType, XN_STREAM_PROPERTY_DEVICE_MAX_IR, &nValue); + + *(int*)data = (int)nValue; + return ONI_STATUS_OK; + default: + return XnOniMapStream::getProperty(propertyId, data, pDataSize); + } +} +OniBool XnOniIRStream::isPropertySupported(int propertyId) +{ + return ( + propertyId == ONI_STREAM_PROPERTY_MAX_VALUE || + XnOniMapStream::isPropertySupported(propertyId)); +} diff --git a/Source/Drivers/PS1080/DriverImpl/XnOniIRStream.h b/Source/Drivers/PS1080/DriverImpl/XnOniIRStream.h index 52a42b4d..0f5007e7 100644 --- a/Source/Drivers/PS1080/DriverImpl/XnOniIRStream.h +++ b/Source/Drivers/PS1080/DriverImpl/XnOniIRStream.h @@ -34,7 +34,9 @@ class XnOniIRStream : public XnOniMapStream { public: - XnOniIRStream(XnSensor* pSensor, XnOniDevice* pDevice); + XnOniIRStream(XnSensor* pSensor, XnOniDevice* pDevice); + virtual OniStatus getProperty(int propertyId, void* data, int* pDataSize); + virtual OniBool isPropertySupported(int propertyId); }; #endif // __XN_ONI_IR_STREAM_H__ \ No newline at end of file diff --git a/Source/Drivers/PS1080/Include/XnStreamParams.h b/Source/Drivers/PS1080/Include/XnStreamParams.h index d2c158ec..30b16ce2 100644 --- a/Source/Drivers/PS1080/Include/XnStreamParams.h +++ b/Source/Drivers/PS1080/Include/XnStreamParams.h @@ -116,6 +116,12 @@ enum /** Integer */ XN_STREAM_PROPERTY_DEVICE_MAX_DEPTH = 0x1080FF43, // "DeviceMaxDepth" + //--------------------------------------------------------------------------- + // IR Specific Properties + //--------------------------------------------------------------------------- + /** Integer */ + XN_STREAM_PROPERTY_DEVICE_MAX_IR = 0x1080FF48, // "DeviceMaxIR" + //--------------------------------------------------------------------------- // Image Specific Properties //--------------------------------------------------------------------------- diff --git a/Source/Drivers/PS1080/Sensor/XnDeviceSensor.h b/Source/Drivers/PS1080/Sensor/XnDeviceSensor.h index 110f802a..3e385052 100644 --- a/Source/Drivers/PS1080/Sensor/XnDeviceSensor.h +++ b/Source/Drivers/PS1080/Sensor/XnDeviceSensor.h @@ -53,6 +53,8 @@ #define XN_DEVICE_SENSOR_NO_DEPTH_VALUE 0 #define XN_DEVICE_SENSOR_MAX_SHIFT_VALUE 2048/*336*/ +#define XN_DEVICE_SENSOR_MAX_IR 1023 + #define XN_DEVICE_SENSOR_BOARDID_SEP ":" #define XN_DEVICE_SENSOR_DEFAULT_ID "*" diff --git a/Source/Drivers/PS1080/Sensor/XnSensorIRStream.cpp b/Source/Drivers/PS1080/Sensor/XnSensorIRStream.cpp index 31e390c7..789afdd1 100644 --- a/Source/Drivers/PS1080/Sensor/XnSensorIRStream.cpp +++ b/Source/Drivers/PS1080/Sensor/XnSensorIRStream.cpp @@ -36,7 +36,7 @@ // XnSensorIRStream class //--------------------------------------------------------------------------- XnSensorIRStream::XnSensorIRStream(const XnChar* StreamName, XnSensorObjects* pObjects) : - XnIRStream(StreamName, FALSE), + XnIRStream(StreamName, FALSE, XN_DEVICE_SENSOR_MAX_IR), m_InputFormat(XN_STREAM_PROPERTY_INPUT_FORMAT, "InputFormat", 0), m_CroppingMode(XN_STREAM_PROPERTY_CROPPING_MODE, "CroppingMode", XN_CROPPING_MODE_NORMAL), m_Helper(pObjects), @@ -60,7 +60,7 @@ XnStatus XnSensorIRStream::Init() // init base nRetVal = XnIRStream::Init(); - XN_IS_STATUS_OK(nRetVal); + XN_IS_STATUS_OK(nRetVal); // add properties XN_VALIDATE_ADD_PROPERTIES(this, &m_InputFormat, &m_ActualRead, &m_CroppingMode); @@ -251,11 +251,13 @@ XnStatus XnSensorIRStream::SetOutputFormat(OniPixelFormat nOutputFormat) switch (nOutputFormat) { case ONI_PIXEL_FORMAT_RGB888: - case ONI_PIXEL_FORMAT_GRAY16: - break; + case ONI_PIXEL_FORMAT_GRAY16: + nRetVal = DeviceMaxIRProperty().UnsafeUpdateValue(XN_DEVICE_SENSOR_MAX_IR); + break; default: XN_LOG_WARNING_RETURN(XN_STATUS_DEVICE_BAD_PARAM, XN_MASK_DEVICE_SENSOR, "Unsupported IR output format: %d", nOutputFormat); } + XN_IS_STATUS_OK(nRetVal); nRetVal = m_Helper.BeforeSettingDataProcessorProperty(); XN_IS_STATUS_OK(nRetVal); diff --git a/Source/Drivers/PSLink/DriverImpl/LinkOniIRStream.cpp b/Source/Drivers/PSLink/DriverImpl/LinkOniIRStream.cpp index f71270e7..71242d3d 100644 --- a/Source/Drivers/PSLink/DriverImpl/LinkOniIRStream.cpp +++ b/Source/Drivers/PSLink/DriverImpl/LinkOniIRStream.cpp @@ -23,6 +23,8 @@ //--------------------------------------------------------------------------- #include "LinkOniIRStream.h" +#define LINK_MAX_IR_PIXEL_VALUE 4095 + //--------------------------------------------------------------------------- // LinkOniIRStream class //--------------------------------------------------------------------------- @@ -32,4 +34,21 @@ LinkOniIRStream::LinkOniIRStream(const char* configFile, xn::PrimeClient* pSenso { } - +OniStatus LinkOniIRStream::getProperty(int propertyId, void* data, int* pDataSize) +{ + switch (propertyId) + { + // int props + case ONI_STREAM_PROPERTY_MAX_VALUE: + { + int value = LINK_MAX_IR_PIXEL_VALUE; + ENSURE_PROP_SIZE(*pDataSize, int); + ASSIGN_PROP_VALUE_INT(data, *pDataSize, value); + } + break; + default: + return LinkOniMapStream::getProperty(propertyId, data, pDataSize); + } + + return ONI_STATUS_OK; +} diff --git a/Source/Drivers/PSLink/DriverImpl/LinkOniIRStream.h b/Source/Drivers/PSLink/DriverImpl/LinkOniIRStream.h index 04b9993f..5b68924f 100644 --- a/Source/Drivers/PSLink/DriverImpl/LinkOniIRStream.h +++ b/Source/Drivers/PSLink/DriverImpl/LinkOniIRStream.h @@ -34,6 +34,7 @@ class LinkOniIRStream : { public: LinkOniIRStream(const char* configFile, xn::PrimeClient* pSensor, LinkOniDevice* pDevice); + OniStatus getProperty(int propertyId, void* data, int* pDataSize); }; #endif // __LINK_ONI_IR_STREAM_H__ \ No newline at end of file From ba4c311af7faf34a2f28394a7561a5c95596e85c Mon Sep 17 00:00:00 2001 From: "Inbal.Yefet" Date: Sun, 15 Sep 2013 16:49:20 +0300 Subject: [PATCH 052/188] Merge branch 'develop' of ssh://git/localhome/GIT/Software/OpenNI2 into develop --- CHANGES.txt | 3 + Include/PS1080.h | 3 + Packaging/Install/Includes/Variables.wxi | 2 +- Packaging/Install/Install.wixproj | 2 +- Source/Core/OniContext.cpp | 31 +- Source/Core/OniContext.h | 1 + Source/Core/OniStream.cpp | 27 ++ Source/Core/OniStream.h | 7 + .../Drivers/PS1080/DriverImpl/XnOniDriver.cpp | 7 +- Source/Drivers/PS1080/Sensor/XnSensor.cpp | 46 ++- Source/Drivers/PS1080/Sensor/XnSensor.h | 3 + Source/Drivers/PSLink/PSLink.vcxproj.filters | 313 +++++++++--------- .../XnLib/Source/Win32/XnUSBWin32.cpp | 15 + .../PSCommon/XnLib/Source/Win32/XnUSBWin32.h | 3 + 14 files changed, 305 insertions(+), 158 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 089122f9..1b4f8057 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -22,6 +22,9 @@ OpenNI 2.3: - Add Linux prerequisites to release notes - Add release notes and change log to installation +OpenNI 2.2.1: + - PS1080: Added a property for reading from all endpoints, regardless of streams + OpenNI 2.2: - Added getDepthColorSyncEnabled() API - Added log settings API diff --git a/Include/PS1080.h b/Include/PS1080.h index e4c39280..b77d7cdf 100644 --- a/Include/PS1080.h +++ b/Include/PS1080.h @@ -127,6 +127,9 @@ enum XN_MODULE_PROPERTY_APC_ENABLED = 0x1080FF91, // "APCEnabled" /** Boolean */ XN_MODULE_PROPERTY_FIRMWARE_TEC_DEBUG_PRINT = 0x1080FF92, // "TecDebugPrint" + /** Boolean, set only */ + XN_MODULE_PROPERTY_READ_ALL_ENDPOINTS = 0x1080FF93, + /*******************************************************************/ /* Common stream properties */ diff --git a/Packaging/Install/Includes/Variables.wxi b/Packaging/Install/Includes/Variables.wxi index 123eb2bf..d1e35a20 100644 --- a/Packaging/Install/Includes/Variables.wxi +++ b/Packaging/Install/Includes/Variables.wxi @@ -6,7 +6,7 @@ --> - + diff --git a/Packaging/Install/Install.wixproj b/Packaging/Install/Install.wixproj index 4b31fa03..bc19e5e4 100644 --- a/Packaging/Install/Install.wixproj +++ b/Packaging/Install/Install.wixproj @@ -223,4 +223,4 @@ if errorlevel 1 exit 1 --> - \ No newline at end of file + diff --git a/Source/Core/OniContext.cpp b/Source/Core/OniContext.cpp index 4446185c..933b9caf 100644 --- a/Source/Core/OniContext.cpp +++ b/Source/Core/OniContext.cpp @@ -32,7 +32,7 @@ ONI_NAMESPACE_IMPLEMENTATION_BEGIN OniBool Context::s_valid = FALSE; -Context::Context() : m_errorLogger(xnl::ErrorLogger::GetInstance()), m_initializationCounter(0) +Context::Context() : m_errorLogger(xnl::ErrorLogger::GetInstance()), m_initializationCounter(0), m_lastFPSPrint(0) { xnOSMemSet(m_overrideDevice, 0, XN_FILE_MAX_PATH); } @@ -1028,11 +1028,40 @@ void Context::addToLogger(const XnChar* cpFormat, ...) void Context::onNewFrame() { + XnUInt64 nNow; + xnOSGetHighResTimeStamp(&nNow); + nNow /= 1000000; + m_cs.Lock(); for (xnl::Hash::Iterator it = m_waitingThreads.Begin(); it != m_waitingThreads.End(); ++it) { xnOSSetEvent(it->Value()); } + + if (nNow != m_lastFPSPrint) + { + XnChar fpsInfo[2048] = ""; + XnUInt32 written = 0; + XnUInt32 writtenNow = 0; + xnOSStrFormat(fpsInfo + written, sizeof(fpsInfo) - written, &writtenNow, "[FPS] "); + written += writtenNow; + + for (xnl::List::Iterator it = m_streams.Begin(); it != m_streams.End(); ++it) + { + VideoStream* pStream = *it; + if (written > sizeof(fpsInfo)) + { + break; + } + + xnOSStrFormat(fpsInfo + written, sizeof(fpsInfo) - written, &writtenNow, "%s: %.2f ", + pStream->getSensorName(), pStream->calcCurrentFPS()); + written += writtenNow; + } + + xnLogVerbose(XN_MASK_ONI_CONTEXT, "%s", fpsInfo); + m_lastFPSPrint = nNow; + } m_cs.Unlock(); } diff --git a/Source/Core/OniContext.h b/Source/Core/OniContext.h index d9ee2afb..6da4eced 100644 --- a/Source/Core/OniContext.h +++ b/Source/Core/OniContext.h @@ -137,6 +137,7 @@ class Context char m_overrideDevice[XN_FILE_MAX_PATH]; int m_initializationCounter; + XnUInt64 m_lastFPSPrint; }; ONI_NAMESPACE_IMPLEMENTATION_END diff --git a/Source/Core/OniStream.cpp b/Source/Core/OniStream.cpp index b8984896..b99d6295 100644 --- a/Source/Core/OniStream.cpp +++ b/Source/Core/OniStream.cpp @@ -57,6 +57,9 @@ VideoStream::VideoStream(Sensor* pSensor, const OniSensorInfo* pSensorInfo, Devi m_driverHandler.streamSetPropertyChangedCallback(m_pSensor->streamHandle(), stream_PropertyChanged, this); refreshWorldConversionCache(); + + xnFPSInit(&m_FPS, 180); + xnOSStrCopy(m_sensorName, getSensorName(pSensorInfo->sensorType), sizeof(m_sensorName)); } // Stream @@ -65,6 +68,8 @@ VideoStream::~VideoStream() // Make sure stream is stopped. stop(); + xnFPSFree(&m_FPS); + if (m_hNewFrameEvent != NULL) { //If device has no handle then the m_pSensor object is not valid @@ -346,6 +351,7 @@ void ONI_CALLBACK_TYPE VideoStream::stream_NewFrame(OniFrame* pFrame, void* pCoo void VideoStream::raiseNewFrameEvent() { + xnFPSMarkFrame(&m_FPS); xnOSSetEvent(m_newFrameInternalEvent); xnOSSetEvent(m_newFrameInternalEventForFrameHolder); m_newFrameCallback(m_newFrameCookie); @@ -488,4 +494,25 @@ int VideoStream::getRequiredFrameSize() return m_driverHandler.streamGetRequiredFrameSize(m_pSensor->streamHandle()); } +double VideoStream::calcCurrentFPS() +{ + return xnFPSCalc(&m_FPS); +} + +const XnChar* VideoStream::getSensorName(OniSensorType sensorType) +{ + switch (sensorType) + { + case ONI_SENSOR_DEPTH: + return "Depth"; + case ONI_SENSOR_COLOR: + return "Color"; + case ONI_SENSOR_IR: + return "IR"; + default: + XN_ASSERT(FALSE); + return "(Unknown)"; + } +} + ONI_NAMESPACE_IMPLEMENTATION_END diff --git a/Source/Core/OniStream.h b/Source/Core/OniStream.h index a3c5e99f..669996e3 100644 --- a/Source/Core/OniStream.h +++ b/Source/Core/OniStream.h @@ -30,6 +30,7 @@ #include "XnErrorLogger.h" #include "XnHash.h" #include "XnLockable.h" +#include ONI_NAMESPACE_IMPLEMENTATION_BEGIN @@ -70,6 +71,7 @@ class VideoStream const OniSensorInfo* getSensorInfo() const; Device& getDevice(); + const XnChar* getSensorName() { return m_sensorName; } void* getHandle() const; @@ -90,6 +92,8 @@ class VideoStream int getRequiredFrameSize(); + double calcCurrentFPS(); + protected: XN_EVENT_HANDLE m_newFrameInternalEvent; XN_EVENT_HANDLE m_newFrameInternalEventForFrameHolder; @@ -114,6 +118,7 @@ class VideoStream static void ONI_CALLBACK_TYPE stream_PropertyChanged(void* streamHandle, int propertyId, const void* data, int dataSize, void* pCookie); void refreshWorldConversionCache(); + static const XnChar* getSensorName(OniSensorType sensorType); NewFrameFuncPtr m_newFrameCallback; void* m_newFrameCookie; @@ -131,6 +136,8 @@ class VideoStream // Recorder* -> Recorder* map to mimic a set. typedef xnl::Lockable > Recorders; Recorders m_recorders; + XnFPSData m_FPS; + XnChar m_sensorName[80]; struct WorldConversionCache { diff --git a/Source/Drivers/PS1080/DriverImpl/XnOniDriver.cpp b/Source/Drivers/PS1080/DriverImpl/XnOniDriver.cpp index 84c5a697..0c1b0935 100644 --- a/Source/Drivers/PS1080/DriverImpl/XnOniDriver.cpp +++ b/Source/Drivers/PS1080/DriverImpl/XnOniDriver.cpp @@ -233,11 +233,8 @@ void XN_CALLBACK_TYPE XnOniDriver::OnDevicePropertyChanged(const XnChar* ModuleN XnStatus nRetVal = pSensor->GetProperty(ModuleName, XN_MODULE_PROPERTY_ERROR_STATE, &errorState); if (nRetVal == XN_STATUS_OK) { - if (errorState == XN_STATUS_DEVICE_NOT_CONNECTED) - { - pThis->deviceDisconnected(pDevice->GetInfo()); - } - else + // ignore NOT_CONNECTED state. It's already handled by the DeviceEnumeration class + if (errorState != XN_STATUS_DEVICE_NOT_CONNECTED) { int errorStateValue = XN_ERROR_STATE_OK; switch (errorState) diff --git a/Source/Drivers/PS1080/Sensor/XnSensor.cpp b/Source/Drivers/PS1080/Sensor/XnSensor.cpp index 7f74a40f..00c5c41c 100644 --- a/Source/Drivers/PS1080/Sensor/XnSensor.cpp +++ b/Source/Drivers/PS1080/Sensor/XnSensor.cpp @@ -100,6 +100,7 @@ XnSensor::XnSensor(XnBool bResetOnStartup /* = TRUE */, XnBool bLeanInit /* = FA m_FirmwareCPUInterval(XN_MODULE_PROPERTY_FIRMWARE_CPU_INTERVAL, "FirmwareCPUInterval", 0), m_APCEnabled(XN_MODULE_PROPERTY_APC_ENABLED, "APCEnabled", TRUE), m_FirmwareTecDebugPrint(XN_MODULE_PROPERTY_FIRMWARE_TEC_DEBUG_PRINT, "TecDebugPrint", FALSE), + m_ReadAllEndpoints(XN_MODULE_PROPERTY_READ_ALL_ENDPOINTS, "ReadAllEndpoints", 0), m_I2C(XN_MODULE_PROPERTY_I2C, "I2C", NULL), m_DeleteFile(XN_MODULE_PROPERTY_DELETE_FILE, "DeleteFile"), m_TecSetPoint(XN_MODULE_PROPERTY_TEC_SET_POINT, "TecSetPoint"), @@ -178,6 +179,7 @@ XnSensor::XnSensor(XnBool bResetOnStartup /* = TRUE */, XnBool bLeanInit /* = FA m_BIST.UpdateSetCallback(RunBISTCallback, this); m_ProjectorFault.UpdateSetCallback(SetProjectorFaultCallback, this); m_FirmwareTecDebugPrint.UpdateSetCallbackToDefault(); + m_ReadAllEndpoints.UpdateSetCallback(SetReadAllEndpointsCallback, this); // Clear the frame-synced streams. m_nFrameSyncEnabled = FALSE; @@ -376,7 +378,7 @@ XnStatus XnSensor::CreateDeviceModule(XnDeviceModuleHolder** ppModuleHolder) &m_FirmwareLogInterval, &m_FirmwareLogPrint, &m_FirmwareCPUInterval, &m_DeleteFile, &m_APCEnabled, &m_TecSetPoint, &m_TecStatus, &m_TecFastConvergenceStatus, &m_EmitterSetPoint, &m_EmitterStatus, &m_I2C, &m_FileAttributes, &m_FlashFile, &m_FirmwareLogFilter, &m_FirmwareLog, &m_FlashChunk, &m_FileList, - &m_ProjectorFault, &m_BIST, &m_FirmwareTecDebugPrint, &m_DeviceName + &m_ProjectorFault, &m_BIST, &m_FirmwareTecDebugPrint, &m_DeviceName, &m_ReadAllEndpoints }; nRetVal = pModule->AddProperties(pProps, sizeof(pProps)/sizeof(XnProperty*)); @@ -1076,6 +1078,42 @@ XnStatus XnSensor::RunBIST(XnUInt32 nTestsMask, XnUInt32* pnFailures) return (XN_STATUS_OK); } +XnStatus XnSensor::SetReadAllEndpoints(XnBool bEnabled) +{ + XnStatus nRetVal = XN_STATUS_OK; + + if (m_ReadAllEndpoints.GetValue() == (XnUInt64)bEnabled) + { + return XN_STATUS_OK; + } + + if (bEnabled) + { + xnLogVerbose(XN_MASK_DEVICE_SENSOR, "Creating USB depth read thread..."); + XnSpecificUsbDevice* pUSB = m_DevicePrivateData.pSpecificDepthUsb; + nRetVal = xnUSBInitReadThread(pUSB->pUsbConnection->UsbEp, pUSB->nChunkReadBytes, pUSB->nNumberOfBuffers, pUSB->nTimeout, XnDeviceSensorProtocolUsbEpCb, pUSB); + XN_IS_STATUS_OK(nRetVal); + + xnLogVerbose(XN_MASK_DEVICE_SENSOR, "Creating USB image read thread..."); + pUSB = m_DevicePrivateData.pSpecificImageUsb; + nRetVal = xnUSBInitReadThread(pUSB->pUsbConnection->UsbEp, pUSB->nChunkReadBytes, pUSB->nNumberOfBuffers, pUSB->nTimeout, XnDeviceSensorProtocolUsbEpCb, pUSB); + XN_IS_STATUS_OK(nRetVal); + } + else + { + xnLogVerbose(XN_MASK_DEVICE_SENSOR, "Shutting down USB depth read thread..."); + xnUSBShutdownReadThread(m_DevicePrivateData.pSpecificDepthUsb->pUsbConnection->UsbEp); + + xnLogVerbose(XN_MASK_DEVICE_SENSOR, "Shutting down USB image read thread..."); + xnUSBShutdownReadThread(m_DevicePrivateData.pSpecificImageUsb->pUsbConnection->UsbEp); + } + + nRetVal = m_ReadAllEndpoints.UnsafeUpdateValue(bEnabled); + XN_IS_STATUS_OK(nRetVal); + + return (XN_STATUS_OK); +} + XnStatus XnSensor::SetErrorState(XnStatus errorState) { XnStatus nRetVal = XN_STATUS_OK; @@ -1831,6 +1869,12 @@ XnStatus XN_CALLBACK_TYPE XnSensor::SetFirmwareCPUIntervalCallback(XnActualIntPr return pThis->SetFirmwareCPUInterval((XnUInt32)nValue); } +XnStatus XN_CALLBACK_TYPE XnSensor::SetReadAllEndpointsCallback(XnActualIntProperty* /*pSender*/, XnUInt64 nValue, void* pCookie) +{ + XnSensor* pThis = (XnSensor*)pCookie; + return pThis->SetReadAllEndpoints((XnBool)nValue); +} + XnStatus XN_CALLBACK_TYPE XnSensor::SetAPCEnabledCallback(XnActualIntProperty* /*pSender*/, XnUInt64 nValue, void* pCookie) { XnSensor* pThis = (XnSensor*)pCookie; diff --git a/Source/Drivers/PS1080/Sensor/XnSensor.h b/Source/Drivers/PS1080/Sensor/XnSensor.h index 40b52858..7d00767c 100644 --- a/Source/Drivers/PS1080/Sensor/XnSensor.h +++ b/Source/Drivers/PS1080/Sensor/XnSensor.h @@ -165,6 +165,7 @@ class XnSensor : public XnDeviceBase XnStatus WriteFlashFile(const XnParamFileData* pFile); XnStatus SetProjectorFault(XnProjectorFaultData* pProjectorFaultData); XnStatus RunBIST(XnUInt32 nTestsMask, XnUInt32* pnFailures); + XnStatus SetReadAllEndpoints(XnBool bEnabled); //--------------------------------------------------------------------------- // Callbacks @@ -202,6 +203,7 @@ class XnSensor : public XnDeviceBase static XnStatus XN_CALLBACK_TYPE SetFirmwareLogIntervalCallback(XnActualIntProperty* pSender, XnUInt64 nValue, void* pCookie); static XnStatus XN_CALLBACK_TYPE SetFirmwareLogPrintCallback(XnActualIntProperty* pSender, XnUInt64 nValue, void* pCookie); static XnStatus XN_CALLBACK_TYPE SetFirmwareCPUIntervalCallback(XnActualIntProperty* pSender, XnUInt64 nValue, void* pCookie); + static XnStatus XN_CALLBACK_TYPE SetReadAllEndpointsCallback(XnActualIntProperty* pSender, XnUInt64 nValue, void* pCookie); static XnStatus XN_CALLBACK_TYPE SetAPCEnabledCallback(XnActualIntProperty* pSender, XnUInt64 nValue, void* pCookie); static XnStatus XN_CALLBACK_TYPE SetI2CCallback(XnGeneralProperty* pSender, const OniGeneralBuffer& gbValue, void* pCookie); static XnStatus XN_CALLBACK_TYPE DeleteFileCallback(XnIntProperty* pSender, XnUInt64 nValue, void* pCookie); @@ -259,6 +261,7 @@ class XnSensor : public XnDeviceBase XnActualIntProperty m_FirmwareCPUInterval; XnActualIntProperty m_APCEnabled; XnActualIntProperty m_FirmwareTecDebugPrint; + XnActualIntProperty m_ReadAllEndpoints; XnGeneralProperty m_I2C; XnIntProperty m_DeleteFile; XnIntProperty m_TecSetPoint; diff --git a/Source/Drivers/PSLink/PSLink.vcxproj.filters b/Source/Drivers/PSLink/PSLink.vcxproj.filters index 058e8734..ab8b6d4e 100644 --- a/Source/Drivers/PSLink/PSLink.vcxproj.filters +++ b/Source/Drivers/PSLink/PSLink.vcxproj.filters @@ -10,6 +10,21 @@ {9ad7f4c4-30f7-4229-a39e-869596ebeb88} + + {1fd8ff78-3304-4e56-a928-985d804a94a9} + + + {694a7b9e-e358-4446-ab98-9f7d02befa4c} + + + {594fa818-6886-4fbe-bfa7-93cdea955e82} + + + {aa427e5a-0908-4545-938f-0e8164954f70} + + + {b274b874-bb4a-4afd-a68e-99f7155eb917} + @@ -32,166 +47,166 @@ DriverImpl - - LinkProtoLib - - - LinkProtoLib - - + LinkProtoLib - + LinkProtoLib - + LinkProtoLib - - LinkProtoLib + + + + Protocol - - LinkProtoLib + + Protocol - - LinkProtoLib + + LinkProtoLib\Connections - LinkProtoLib + LinkProtoLib\Connections - LinkProtoLib + LinkProtoLib\Connections - LinkProtoLib + LinkProtoLib\Connections - LinkProtoLib + LinkProtoLib\Connections - LinkProtoLib + LinkProtoLib\Connections - - LinkProtoLib + + LinkProtoLib\Connections - - LinkProtoLib + + LinkProtoLib\Connections + + + LinkProtoLib\Connections + + + LinkProtoLib\Connections + + + LinkProtoLib\Connections + + + LinkProtoLib\Connections - LinkProtoLib + LinkProtoLib\Parsers - LinkProtoLib + LinkProtoLib\Parsers - LinkProtoLib + LinkProtoLib\Parsers - LinkProtoLib + LinkProtoLib\Parsers - LinkProtoLib + LinkProtoLib\Parsers - LinkProtoLib - - - LinkProtoLib + LinkProtoLib\Streams - LinkProtoLib - - - LinkProtoLib + LinkProtoLib\Streams - - LinkProtoLib + + LinkProtoLib\Parsers - - LinkProtoLib + + LinkProtoLib\Parsers - LinkProtoLib + LinkProtoLib\Parsers - - LinkProtoLib + + LinkProtoLib\Endpoints - - LinkProtoLib + + LinkProtoLib\Endpoints - LinkProtoLib + LinkProtoLib\Endpoints - LinkProtoLib + LinkProtoLib\Streams - - LinkProtoLib + + LinkProtoLib\Streams - - LinkProtoLib + + LinkProtoLib\Streams - - LinkProtoLib + + LinkProtoLib\Streams - - LinkProtoLib + + LinkProtoLib\Streams - - LinkProtoLib + + LinkProtoLib\Parsers - - LinkProtoLib + + LinkProtoLib\Parsers - LinkProtoLib + LinkProtoLib\Parsers - LinkProtoLib + LinkProtoLib\Parsers - LinkProtoLib - - - LinkProtoLib + LinkProtoLib\Parsers - - LinkProtoLib + + LinkProtoLib\Connections - - LinkProtoLib + + LinkProtoLib\Connections - - LinkProtoLib + + LinkProtoLib\Connections - - LinkProtoLib + + LinkProtoLib\Connections - LinkProtoLib + LinkProtoLib\Connections - - LinkProtoLib + + LinkProtoLib\Connections - - LinkProtoLib + + LinkProtoLib\Connections - - LinkProtoLib + + LinkProtoLib\Connections - - LinkProtoLib + + LinkProtoLib\Utils - - LinkProtoLib + + LinkProtoLib\Utils - - - - Protocol + + LinkProtoLib\Utils - - Protocol + + LinkProtoLib\Utils + + + LinkProtoLib\Utils @@ -217,118 +232,118 @@ DriverImpl + + + + DriverImpl + - LinkProtoLib + LinkProtoLib\Connections - LinkProtoLib + LinkProtoLib\Connections - LinkProtoLib + LinkProtoLib\Connections - LinkProtoLib + LinkProtoLib\Connections - LinkProtoLib + LinkProtoLib\Connections - LinkProtoLib - - - LinkProtoLib + LinkProtoLib\Connections - LinkProtoLib + LinkProtoLib\Parsers - LinkProtoLib + LinkProtoLib\Parsers - LinkProtoLib + LinkProtoLib\Parsers - LinkProtoLib + LinkProtoLib\Parsers - - LinkProtoLib + + LinkProtoLib\Parsers - - LinkProtoLib + + LinkProtoLib\Streams - LinkProtoLib + LinkProtoLib\Streams - - LinkProtoLib - - - LinkProtoLib + + LinkProtoLib\Parsers - - LinkProtoLib + + LinkProtoLib\Parsers - LinkProtoLib + LinkProtoLib\Parsers - - LinkProtoLib + + LinkProtoLib\Endpoints - - LinkProtoLib + + LinkProtoLib\Endpoints - LinkProtoLib + LinkProtoLib\Endpoints + + + LinkProtoLib\Streams + + + LinkProtoLib\Streams - LinkProtoLib + LinkProtoLib\Streams - LinkProtoLib + LinkProtoLib\Streams - LinkProtoLib - - - LinkProtoLib + LinkProtoLib\Parsers - LinkProtoLib + LinkProtoLib\Parsers - LinkProtoLib + LinkProtoLib\Parsers - LinkProtoLib + LinkProtoLib\Parsers - LinkProtoLib + LinkProtoLib\Parsers - - LinkProtoLib + + LinkProtoLib\Connections - - LinkProtoLib + + LinkProtoLib\Connections - - LinkProtoLib + + LinkProtoLib\Connections - LinkProtoLib + LinkProtoLib\Connections - - LinkProtoLib + + LinkProtoLib\Connections - - LinkProtoLib + + LinkProtoLib\Utils - - LinkProtoLib + + LinkProtoLib\Utils - - - - DriverImpl + + LinkProtoLib\Utils \ No newline at end of file diff --git a/ThirdParty/PSCommon/XnLib/Source/Win32/XnUSBWin32.cpp b/ThirdParty/PSCommon/XnLib/Source/Win32/XnUSBWin32.cpp index 68f3ec46..ae00c879 100644 --- a/ThirdParty/PSCommon/XnLib/Source/Win32/XnUSBWin32.cpp +++ b/ThirdParty/PSCommon/XnLib/Source/Win32/XnUSBWin32.cpp @@ -1373,6 +1373,10 @@ XN_THREAD_PROC xnUSBReadThreadMain(XN_THREAD_PARAM pThreadParam) return (XN_STATUS_ERROR); } + XnUInt64 nLastPrint; + xnOSGetHighResTimeStamp(&nLastPrint); + XnUInt32 nTotalBytesSinceLastPrint = 0; + // Dereference common variables hEPOvlp = pThreadData->pEPHandle->hEPHandleOvlp; pOvlpIO = pThreadData->pOvlpIO; @@ -1448,6 +1452,7 @@ XN_THREAD_PROC xnUSBReadThreadMain(XN_THREAD_PARAM pThreadParam) if (bResult == TRUE) { pCallbackFunction(pBuffersInfo[nOVIdx].pBuffer, nBytesRead, pCallbackData); + nTotalBytesSinceLastPrint += nBytesRead; } // Re-queue the request @@ -1463,6 +1468,16 @@ XN_THREAD_PROC xnUSBReadThreadMain(XN_THREAD_PARAM pThreadParam) } } */ + + XnUInt64 nNow; + xnOSGetHighResTimeStamp(&nNow); + if (nNow - nLastPrint > 1000000) + { + XnDouble bandwidth = nTotalBytesSinceLastPrint / 1024. / (nNow - nLastPrint) * 1e6; + xnLogVerbose(XN_MASK_USB, "Endpoint 0x%x bandwidth: %.2f KB/s", pThreadData->pEPHandle->nEndPointID, bandwidth); + nLastPrint = nNow; + nTotalBytesSinceLastPrint = 0; + } } } diff --git a/ThirdParty/PSCommon/XnLib/Source/Win32/XnUSBWin32.h b/ThirdParty/PSCommon/XnLib/Source/Win32/XnUSBWin32.h index e985bb3a..50f76525 100644 --- a/ThirdParty/PSCommon/XnLib/Source/Win32/XnUSBWin32.h +++ b/ThirdParty/PSCommon/XnLib/Source/Win32/XnUSBWin32.h @@ -81,6 +81,9 @@ typedef struct xnUSBReadThreadData xnUSBBuffersInfo* pBuffersInfo; OVERLAPPED* pOvlpIO; + + XnUInt32 nTotalBytesSinceLastPrint; + XnUInt64 nLastPrint; } xnUSBReadThreadData; typedef struct XnUSBEndPointHandle From 41bf512e6d97c9db6b4fb6b5caa2a44889c7927d Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Mon, 16 Sep 2013 18:04:15 +0300 Subject: [PATCH 053/188] Update version to 2.3.0.6 --- CHANGES.txt | 42 ++++++++++++++++++++---- Include/OniVersion.h | 2 +- Packaging/Install/Includes/Variables.wxi | 4 +-- Packaging/UpdateVersion.py | 2 +- ReleaseNotes.txt | 4 +-- 5 files changed, 42 insertions(+), 12 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 1b4f8057..214b6b06 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -3,24 +3,54 @@ Change Log: OpenNI 2.3: - Fix pure-C APIs - - Bug Fix: Single pixel translation is wrong when image res is 1280x1024 - Bug Fix: depth/world conversion was wrong when depth is in 100 um format - - Bug Fix: no even frame indexes from Capri devices. - - Properties are now saved in recordings of Capri devices and input files - - Link console: allow running a single command and exit + - Adding logs for endpoints bandwidth and FPS + - Better handling of cases where device does not report its FOV + - NiViewer: + - IR emitter on/off is added for both PS1080 and Kinect. + - Near mode on/off is added for Kinect (was already there for PS1080) + - Java SimpleViewer + - Allow passing file name in command prompt + - Add support for IR streams + - Carmine: + - Add support for FW 5.9 + - PS1080Console bug: "startread" did not work properly + - Added support for the fast zoom crop (640x480 regular -> 640x480 zoomed) - 'z' in NiViewer + - Add a property that allows reading from endpoints without creating streams + - Bug Fix: Disconnect event was fired twice + - Implement MAX_PIXEL_VALUE for IR stream + - Bug Fix: Single pixel translation is wrong when image res is 1280x1024 + - Kinect: + - Add mirror support + - Rewrite image registration for better performance + - Support of additional properties (exposed via KinectProperties.h): + - 3D sensing properties: Near Mode, IR Emitter On/Off + - Non-3D sensing properties: Camera Elevation, Accelerometer, Audio Array ID - Capri: - Bug Fix: Depth stops working if switching to QQVGA and then back to VGA - i2c device list now also states the master and slave IDs - - Add commands for turning on/off ACC - Fixed a weird log during shutdown - - Add commands for projector pulse and projector power + - Add projector commands: projector on/off, pulse on/off - Add commands for setting CMOS gain + - Add commands for reading temperature sensors + - Add commands for toggling ACC, periodic-BIST and VDD - Print test name when running BIST - Default resolution is now QQVGA on ARM machines + - Bug Fix: Setting Mirror from INI file didn't work + - Handle some protocol error codes that weren't handled + - Bug Fix: error strings were missing from log + - Implement MAX_PIXEL_VALUE for IR stream + - Bug Fix: no even frame indexes from Capri devices. + - Properties are now saved in recordings + - PSLinkConsole: allow running a single command and exit + - OniFile: + - Allow calling setVideoMode() as long as it's the same mode (needed by some applications) + - Properties are now saved in recordings - Build: - Support gold linker in compilation - Add Linux prerequisites to release notes - Add release notes and change log to installation + - Refactor TestDevice so it can actually be used for testing OpenNI 2.2.1: - PS1080: Added a property for reading from all endpoints, regardless of streams diff --git a/Include/OniVersion.h b/Include/OniVersion.h index 588bc152..f2bf4d48 100644 --- a/Include/OniVersion.h +++ b/Include/OniVersion.h @@ -23,7 +23,7 @@ #define ONI_VERSION_MAJOR 2 #define ONI_VERSION_MINOR 3 #define ONI_VERSION_MAINTENANCE 0 -#define ONI_VERSION_BUILD 5 +#define ONI_VERSION_BUILD 6 /** OpenNI version (in brief string format): "Major.Minor.Maintenance (Build)" */ #define ONI_BRIEF_VERSION_STRING \ diff --git a/Packaging/Install/Includes/Variables.wxi b/Packaging/Install/Includes/Variables.wxi index d1e35a20..826282c4 100644 --- a/Packaging/Install/Includes/Variables.wxi +++ b/Packaging/Install/Includes/Variables.wxi @@ -6,9 +6,9 @@ --> - + - + diff --git a/Packaging/UpdateVersion.py b/Packaging/UpdateVersion.py index 0dd4514d..bc2a9cee 100755 --- a/Packaging/UpdateVersion.py +++ b/Packaging/UpdateVersion.py @@ -28,7 +28,7 @@ VERSION_MAJOR = 2 VERSION_MINOR = 3 VERSION_MAINTENANCE = 0 -VERSION_BUILD = 5 +VERSION_BUILD = 6 def getVersionString(): return str(VERSION_MAJOR) + "." + str(VERSION_MINOR) + "." + str(VERSION_MAINTENANCE) + "." + str(VERSION_BUILD) diff --git a/ReleaseNotes.txt b/ReleaseNotes.txt index 91d285f4..8087a5dd 100644 --- a/ReleaseNotes.txt +++ b/ReleaseNotes.txt @@ -1,5 +1,5 @@ -OpenNI 2.3.0 Build 5 -August 28 2013 +OpenNI 2.3.0 Build 6 +September 16 2013 Minimum Requirements: --------------------- From 3d4500e4a29d112ea2ef1e445da5f7fcfbecb07b Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Mon, 23 Sep 2013 17:26:33 +0300 Subject: [PATCH 054/188] Merge branch 'android' into develop --- Config/OpenNI.ini | 10 +- Include/OniCTypes.h | 17 + Include/OpenNI.h | 18 +- Makefile | 50 +- OpenNI.sln | 2 +- Packaging/Harvest.py | 303 +++++++----- Packaging/Install/Install.wixproj | 2 +- Packaging/ReleaseVersion.py | 118 +++-- Samples/SimpleRead.Android/.classpath | 9 + Samples/SimpleRead.Android/.project | 33 ++ .../SimpleRead.Android/AndroidManifest.xml | 26 ++ Samples/SimpleRead.Android/build.xml | 96 ++++ .../SimpleRead.Android/ic_launcher-web.png | Bin 0 -> 51394 bytes .../SimpleRead.Android/proguard-project.txt | 20 + Samples/SimpleRead.Android/project.properties | 15 + .../res/drawable-hdpi/ic_launcher.png | Bin 0 -> 7658 bytes .../res/drawable-mdpi/ic_launcher.png | Bin 0 -> 3777 bytes .../res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 12516 bytes .../res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 24777 bytes .../res/layout/activity_simple_read.xml | 16 + .../res/values-sw600dp/dimens.xml | 8 + .../res/values-sw720dp-land/dimens.xml | 9 + .../res/values-v11/styles.xml | 11 + .../SimpleRead.Android/res/values/dimens.xml | 7 + .../SimpleRead.Android/res/values/strings.xml | 7 + .../SimpleRead.Android/res/values/styles.xml | 20 + .../simpleread/SimpleReadActivity.java | 190 ++++++++ Samples/SimpleViewer.Android/.classpath | 9 + Samples/SimpleViewer.Android/.project | 33 ++ .../SimpleViewer.Android/AndroidManifest.xml | 29 ++ Samples/SimpleViewer.Android/build.xml | 96 ++++ .../SimpleViewer.Android/ic_launcher-web.png | Bin 0 -> 51394 bytes .../SimpleViewer.Android/proguard-project.txt | 20 + .../SimpleViewer.Android/project.properties | 15 + .../res/drawable-hdpi/ic_launcher.png | Bin 0 -> 7658 bytes .../res/drawable-mdpi/ic_launcher.png | Bin 0 -> 3777 bytes .../res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 12516 bytes .../res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 24777 bytes .../res/layout/activity_simple_viewer.xml | 23 + .../res/values-sw600dp/dimens.xml | 8 + .../res/values-sw720dp-land/dimens.xml | 9 + .../res/values-v11/styles.xml | 11 + .../res/values/dimens.xml | 7 + .../res/values/strings.xml | 7 + .../res/values/styles.xml | 20 + .../simpleviewer/SimpleViewerActivity.java | 225 +++++++++ Source/Core/OniContext.cpp | 338 +++++++++----- Source/Core/OniContext.h | 16 +- Source/Documentation/Doxyfile | 2 +- Source/Documentation/Runme.py | 2 +- Source/Drivers/PS1080/Sensor/XnSensor.cpp | 26 +- .../PSLink/DriverImpl/LinkOniDriver.cpp | 18 + .../LinkProtoLib/XnLinkFrameInputStream.cpp | 4 +- Source/Tools/NiViewer.Android/.classpath | 9 + Source/Tools/NiViewer.Android/.project | 33 ++ .../NiViewer.Android/AndroidManifest.xml | 28 ++ Source/Tools/NiViewer.Android/build.xml | 96 ++++ .../NiViewer.Android/ic_launcher-web.png | Bin 0 -> 51394 bytes .../NiViewer.Android/proguard-project.txt | 20 + .../Tools/NiViewer.Android/project.properties | 15 + .../res/drawable-hdpi/ic_launcher.png | Bin 0 -> 7658 bytes .../res/drawable-mdpi/ic_launcher.png | Bin 0 -> 3777 bytes .../res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 12516 bytes .../res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 24777 bytes .../res/layout/activity_simple_viewer.xml | 59 +++ .../res/menu/simple_viewer.xml | 9 + .../res/values-sw600dp/dimens.xml | 8 + .../res/values-sw720dp-land/dimens.xml | 9 + .../res/values-v11/styles.xml | 11 + .../NiViewer.Android/res/values/dimens.xml | 7 + .../NiViewer.Android/res/values/strings.xml | 11 + .../NiViewer.Android/res/values/styles.xml | 20 + .../tools/niviewer/NiViewerActivity.java | 408 ++++++++++++++++ .../PSCommon/XnLib/Include/XnSimpleString.h | 82 ++++ .../XnLib/Source/Linux/XnLinuxSharedLibs.cpp | 13 +- .../PSCommon/XnLib/Source/XnLib.vcxproj | 1 + .../XnLib/Source/XnLib.vcxproj.filters | 3 + Wrappers/java/.classpath | 9 + Wrappers/java/.cproject | 59 +++ Wrappers/java/.project | 33 ++ Wrappers/java/AndroidManifest.xml | 7 + Wrappers/java/Build.bat | 1 + Wrappers/java/Makefile | 11 + Wrappers/java/OpenNI.java/Build.bat | 1 - Wrappers/java/OpenNI.java/Makefile | 11 - .../src/org/openni/VideoStream.java | 1 - Wrappers/java/OpenNI.jni/CreateMethods.py | 51 -- Wrappers/java/OpenNI.jni/UpdateHeaders.bat | 3 - Wrappers/java/OpenNI.jni/UpdateHeaders.sh | 3 - Wrappers/java/OpenNI.jni/methods.inl | 57 --- Wrappers/java/build.xml | 132 ++++++ Wrappers/java/doc/common-issues.html | 12 + Wrappers/java/doc/images/adb-devices.png | Bin 0 -> 55288 bytes Wrappers/java/doc/images/allow-USB-access.png | Bin 0 -> 45699 bytes Wrappers/java/doc/images/blank-screen.png | Bin 0 -> 17154 bytes Wrappers/java/doc/images/eclipse-run-app.png | Bin 0 -> 91652 bytes .../java/doc/images/enable-USB-debugging.png | Bin 0 -> 149505 bytes .../doc/images/enable-unknown-sources.png | Bin 0 -> 133890 bytes .../doc/images/import-existing-projects.png | Bin 0 -> 96501 bytes Wrappers/java/doc/images/import-projects.png | Bin 0 -> 94755 bytes Wrappers/java/doc/images/install-apk.png | Bin 0 -> 40243 bytes Wrappers/java/doc/images/niviewer.png | Bin 0 -> 147722 bytes .../java/doc/images/select-simple-viewer.png | Bin 0 -> 79278 bytes Wrappers/java/doc/images/select-workspace.png | Bin 0 -> 78517 bytes Wrappers/java/doc/images/simple-read.png | Bin 0 -> 60212 bytes Wrappers/java/doc/images/simple-viewer.png | Bin 0 -> 116049 bytes Wrappers/java/doc/images/start-import.png | Bin 0 -> 84408 bytes Wrappers/java/doc/images/switch-workspace.png | Bin 0 -> 76069 bytes Wrappers/java/doc/images/welcome.png | Bin 0 -> 84007 bytes Wrappers/java/doc/overview.html | 11 + Wrappers/java/doc/samples-tutorial.html | 407 ++++++++++++++++ Wrappers/java/jni/Android.mk | 54 +++ Wrappers/java/jni/Application.mk | 25 + Wrappers/java/{OpenNI.jni => jni}/Makefile | 0 .../java/{OpenNI.jni => jni}/OpenNI.jni.cpp | 67 ++- .../java/{OpenNI.jni => jni}/OpenNI.jni.sln | 0 .../{OpenNI.jni => jni}/OpenNI.jni.vcxproj | 3 + Wrappers/java/jni/UpdateHeaders.py | 119 +++++ Wrappers/java/{OpenNI.jni => jni}/jni.h | 0 Wrappers/java/{OpenNI.jni => jni}/jni_md.h | 0 Wrappers/java/jni/methods.inl | 124 +++++ .../org_openni_NativeMethods.cpp | 132 ++++-- .../org_openni_NativeMethods.h | 48 ++ .../jni/org_openni_android_OpenNIView.cpp | 439 ++++++++++++++++++ .../java/jni/org_openni_android_OpenNIView.h | 167 +++++++ .../org_openni_android_OpenNIView_Renderer.h | 13 + Wrappers/java/proguard-project.txt | 20 + Wrappers/java/project.properties | 15 + Wrappers/java/res/.gitignore | 0 .../src/org/openni/CoordinateConverter.java | 0 .../src/org/openni/CropArea.java | 0 .../src/org/openni/Device.java | 0 .../src/org/openni/DeviceInfo.java | 0 .../src/org/openni/ImageRegistrationMode.java | 0 .../src/org/openni/NativeMethods.java | 14 +- .../src/org/openni/OpenNI.java | 52 ++- .../src/org/openni/OutArg.java | 0 .../src/org/openni/PixelFormat.java | 0 .../src/org/openni/PlaybackControl.java | 0 .../src/org/openni/Point2D.java | 0 .../src/org/openni/Point3D.java | 0 .../src/org/openni/Recorder.java | 0 .../src/org/openni/SensorInfo.java | 0 .../src/org/openni/SensorType.java | 0 .../src/org/openni/Version.java | 0 .../src/org/openni/VideoFrameRef.java | 4 + .../src/org/openni/VideoMode.java | 37 ++ Wrappers/java/src/org/openni/VideoStream.java | 1 + .../src/org/openni/android/OpenNIHelper.java | 240 ++++++++++ .../src/org/openni/android/OpenNIView.java | 128 +++++ 150 files changed, 4739 insertions(+), 519 deletions(-) create mode 100644 Samples/SimpleRead.Android/.classpath create mode 100644 Samples/SimpleRead.Android/.project create mode 100644 Samples/SimpleRead.Android/AndroidManifest.xml create mode 100644 Samples/SimpleRead.Android/build.xml create mode 100644 Samples/SimpleRead.Android/ic_launcher-web.png create mode 100644 Samples/SimpleRead.Android/proguard-project.txt create mode 100644 Samples/SimpleRead.Android/project.properties create mode 100644 Samples/SimpleRead.Android/res/drawable-hdpi/ic_launcher.png create mode 100644 Samples/SimpleRead.Android/res/drawable-mdpi/ic_launcher.png create mode 100644 Samples/SimpleRead.Android/res/drawable-xhdpi/ic_launcher.png create mode 100644 Samples/SimpleRead.Android/res/drawable-xxhdpi/ic_launcher.png create mode 100644 Samples/SimpleRead.Android/res/layout/activity_simple_read.xml create mode 100644 Samples/SimpleRead.Android/res/values-sw600dp/dimens.xml create mode 100644 Samples/SimpleRead.Android/res/values-sw720dp-land/dimens.xml create mode 100644 Samples/SimpleRead.Android/res/values-v11/styles.xml create mode 100644 Samples/SimpleRead.Android/res/values/dimens.xml create mode 100644 Samples/SimpleRead.Android/res/values/strings.xml create mode 100644 Samples/SimpleRead.Android/res/values/styles.xml create mode 100644 Samples/SimpleRead.Android/src/org/openni/android/samples/simpleread/SimpleReadActivity.java create mode 100644 Samples/SimpleViewer.Android/.classpath create mode 100644 Samples/SimpleViewer.Android/.project create mode 100644 Samples/SimpleViewer.Android/AndroidManifest.xml create mode 100644 Samples/SimpleViewer.Android/build.xml create mode 100644 Samples/SimpleViewer.Android/ic_launcher-web.png create mode 100644 Samples/SimpleViewer.Android/proguard-project.txt create mode 100644 Samples/SimpleViewer.Android/project.properties create mode 100644 Samples/SimpleViewer.Android/res/drawable-hdpi/ic_launcher.png create mode 100644 Samples/SimpleViewer.Android/res/drawable-mdpi/ic_launcher.png create mode 100644 Samples/SimpleViewer.Android/res/drawable-xhdpi/ic_launcher.png create mode 100644 Samples/SimpleViewer.Android/res/drawable-xxhdpi/ic_launcher.png create mode 100644 Samples/SimpleViewer.Android/res/layout/activity_simple_viewer.xml create mode 100644 Samples/SimpleViewer.Android/res/values-sw600dp/dimens.xml create mode 100644 Samples/SimpleViewer.Android/res/values-sw720dp-land/dimens.xml create mode 100644 Samples/SimpleViewer.Android/res/values-v11/styles.xml create mode 100644 Samples/SimpleViewer.Android/res/values/dimens.xml create mode 100644 Samples/SimpleViewer.Android/res/values/strings.xml create mode 100644 Samples/SimpleViewer.Android/res/values/styles.xml create mode 100644 Samples/SimpleViewer.Android/src/org/openni/android/samples/simpleviewer/SimpleViewerActivity.java create mode 100644 Source/Tools/NiViewer.Android/.classpath create mode 100644 Source/Tools/NiViewer.Android/.project create mode 100644 Source/Tools/NiViewer.Android/AndroidManifest.xml create mode 100644 Source/Tools/NiViewer.Android/build.xml create mode 100644 Source/Tools/NiViewer.Android/ic_launcher-web.png create mode 100644 Source/Tools/NiViewer.Android/proguard-project.txt create mode 100644 Source/Tools/NiViewer.Android/project.properties create mode 100644 Source/Tools/NiViewer.Android/res/drawable-hdpi/ic_launcher.png create mode 100644 Source/Tools/NiViewer.Android/res/drawable-mdpi/ic_launcher.png create mode 100644 Source/Tools/NiViewer.Android/res/drawable-xhdpi/ic_launcher.png create mode 100644 Source/Tools/NiViewer.Android/res/drawable-xxhdpi/ic_launcher.png create mode 100644 Source/Tools/NiViewer.Android/res/layout/activity_simple_viewer.xml create mode 100644 Source/Tools/NiViewer.Android/res/menu/simple_viewer.xml create mode 100644 Source/Tools/NiViewer.Android/res/values-sw600dp/dimens.xml create mode 100644 Source/Tools/NiViewer.Android/res/values-sw720dp-land/dimens.xml create mode 100644 Source/Tools/NiViewer.Android/res/values-v11/styles.xml create mode 100644 Source/Tools/NiViewer.Android/res/values/dimens.xml create mode 100644 Source/Tools/NiViewer.Android/res/values/strings.xml create mode 100644 Source/Tools/NiViewer.Android/res/values/styles.xml create mode 100644 Source/Tools/NiViewer.Android/src/org/openni/android/tools/niviewer/NiViewerActivity.java create mode 100644 ThirdParty/PSCommon/XnLib/Include/XnSimpleString.h create mode 100644 Wrappers/java/.classpath create mode 100644 Wrappers/java/.cproject create mode 100644 Wrappers/java/.project create mode 100644 Wrappers/java/AndroidManifest.xml create mode 100644 Wrappers/java/Build.bat create mode 100644 Wrappers/java/Makefile delete mode 100644 Wrappers/java/OpenNI.java/Build.bat delete mode 100644 Wrappers/java/OpenNI.java/Makefile delete mode 100644 Wrappers/java/OpenNI.java/src/org/openni/VideoStream.java delete mode 100644 Wrappers/java/OpenNI.jni/CreateMethods.py delete mode 100644 Wrappers/java/OpenNI.jni/UpdateHeaders.bat delete mode 100755 Wrappers/java/OpenNI.jni/UpdateHeaders.sh delete mode 100644 Wrappers/java/OpenNI.jni/methods.inl create mode 100644 Wrappers/java/build.xml create mode 100644 Wrappers/java/doc/common-issues.html create mode 100644 Wrappers/java/doc/images/adb-devices.png create mode 100644 Wrappers/java/doc/images/allow-USB-access.png create mode 100644 Wrappers/java/doc/images/blank-screen.png create mode 100644 Wrappers/java/doc/images/eclipse-run-app.png create mode 100644 Wrappers/java/doc/images/enable-USB-debugging.png create mode 100644 Wrappers/java/doc/images/enable-unknown-sources.png create mode 100644 Wrappers/java/doc/images/import-existing-projects.png create mode 100644 Wrappers/java/doc/images/import-projects.png create mode 100644 Wrappers/java/doc/images/install-apk.png create mode 100644 Wrappers/java/doc/images/niviewer.png create mode 100644 Wrappers/java/doc/images/select-simple-viewer.png create mode 100644 Wrappers/java/doc/images/select-workspace.png create mode 100644 Wrappers/java/doc/images/simple-read.png create mode 100644 Wrappers/java/doc/images/simple-viewer.png create mode 100644 Wrappers/java/doc/images/start-import.png create mode 100644 Wrappers/java/doc/images/switch-workspace.png create mode 100644 Wrappers/java/doc/images/welcome.png create mode 100644 Wrappers/java/doc/overview.html create mode 100644 Wrappers/java/doc/samples-tutorial.html create mode 100644 Wrappers/java/jni/Android.mk create mode 100644 Wrappers/java/jni/Application.mk rename Wrappers/java/{OpenNI.jni => jni}/Makefile (100%) rename Wrappers/java/{OpenNI.jni => jni}/OpenNI.jni.cpp (69%) rename Wrappers/java/{OpenNI.jni => jni}/OpenNI.jni.sln (100%) rename Wrappers/java/{OpenNI.jni => jni}/OpenNI.jni.vcxproj (97%) create mode 100755 Wrappers/java/jni/UpdateHeaders.py rename Wrappers/java/{OpenNI.jni => jni}/jni.h (100%) rename Wrappers/java/{OpenNI.jni => jni}/jni_md.h (100%) create mode 100644 Wrappers/java/jni/methods.inl rename Wrappers/java/{OpenNI.jni => jni}/org_openni_NativeMethods.cpp (86%) rename Wrappers/java/{OpenNI.jni => jni}/org_openni_NativeMethods.h (92%) create mode 100644 Wrappers/java/jni/org_openni_android_OpenNIView.cpp create mode 100644 Wrappers/java/jni/org_openni_android_OpenNIView.h create mode 100644 Wrappers/java/jni/org_openni_android_OpenNIView_Renderer.h create mode 100644 Wrappers/java/proguard-project.txt create mode 100644 Wrappers/java/project.properties create mode 100644 Wrappers/java/res/.gitignore rename Wrappers/java/{OpenNI.java => }/src/org/openni/CoordinateConverter.java (100%) rename Wrappers/java/{OpenNI.java => }/src/org/openni/CropArea.java (100%) rename Wrappers/java/{OpenNI.java => }/src/org/openni/Device.java (100%) rename Wrappers/java/{OpenNI.java => }/src/org/openni/DeviceInfo.java (100%) rename Wrappers/java/{OpenNI.java => }/src/org/openni/ImageRegistrationMode.java (100%) rename Wrappers/java/{OpenNI.java => }/src/org/openni/NativeMethods.java (95%) rename Wrappers/java/{OpenNI.java => }/src/org/openni/OpenNI.java (87%) rename Wrappers/java/{OpenNI.java => }/src/org/openni/OutArg.java (100%) rename Wrappers/java/{OpenNI.java => }/src/org/openni/PixelFormat.java (100%) rename Wrappers/java/{OpenNI.java => }/src/org/openni/PlaybackControl.java (100%) rename Wrappers/java/{OpenNI.java => }/src/org/openni/Point2D.java (100%) rename Wrappers/java/{OpenNI.java => }/src/org/openni/Point3D.java (100%) rename Wrappers/java/{OpenNI.java => }/src/org/openni/Recorder.java (100%) rename Wrappers/java/{OpenNI.java => }/src/org/openni/SensorInfo.java (100%) rename Wrappers/java/{OpenNI.java => }/src/org/openni/SensorType.java (100%) rename Wrappers/java/{OpenNI.java => }/src/org/openni/Version.java (100%) rename Wrappers/java/{OpenNI.java => }/src/org/openni/VideoFrameRef.java (99%) rename Wrappers/java/{OpenNI.java => }/src/org/openni/VideoMode.java (79%) create mode 100644 Wrappers/java/src/org/openni/VideoStream.java create mode 100644 Wrappers/java/src/org/openni/android/OpenNIHelper.java create mode 100644 Wrappers/java/src/org/openni/android/OpenNIView.java diff --git a/Config/OpenNI.ini b/Config/OpenNI.ini index 3375b84d..44c2f57d 100644 --- a/Config/OpenNI.ini +++ b/Config/OpenNI.ini @@ -3,12 +3,14 @@ Verbosity=3 LogToConsole=0 LogToFile=0 +LogWriteToAndroidLog=0 [Device] -;Override="" +;Override= [Drivers] -; Location of the drivers specified by a relative path based on OpenNI's shared library or an absolute path. -; Path separator "/" can be used to be portable for any platforms. -; Default - OpenNI2/Drivers +; Location of the drivers, relative to OpenNI shared library location. When not provided, "OpenNI2/Drivers" will be used. ;Repository=OpenNI2/Drivers + +; List of drivers to load, separated by commas. When not provided, OpenNI will try to load each shared library in Repository. +;List= \ No newline at end of file diff --git a/Include/OniCTypes.h b/Include/OniCTypes.h index faf6e6e2..de858464 100644 --- a/Include/OniCTypes.h +++ b/Include/OniCTypes.h @@ -183,6 +183,23 @@ typedef struct uint8_t y2; } OniYUV422DoublePixel; +/** + Holds the value of two pixels in YUV422 format (Luminance/Chrominance,16-bits/pixel). + The first pixel has the values y1, u, v. + The second pixel has the values y2, u, v. +*/ +typedef struct +{ + /** Overall luminance value of first pixel. */ + uint8_t y1; + /** First chrominance value for two pixels, stored as blue luminance difference signal. */ + uint8_t u; + /** Overall luminance value of second pixel. */ + uint8_t y2; + /** Second chrominance value for two pixels, stored as red luminance difference signal. */ + uint8_t v; +} OniYUYVDoublePixel; + #pragma pack (pop) typedef struct diff --git a/Include/OpenNI.h b/Include/OpenNI.h index 893d0ffa..093d0d46 100644 --- a/Include/OpenNI.h +++ b/Include/OpenNI.h @@ -82,6 +82,23 @@ typedef struct uint8_t y2; } YUV422DoublePixel; +/** + Holds the value of two pixels in YUV422 format (Luminance/Chrominance,16-bits/pixel). + The first pixel has the values y1, u, v. + The second pixel has the values y2, u, v. +*/ +typedef struct +{ + /** Overall luminance value of first pixel. */ + uint8_t y1; + /** First chrominance value for two pixels, stored as blue luminance difference signal. */ + uint8_t u; + /** Overall luminance value of second pixel. */ + uint8_t y2; + /** Second chrominance value for two pixels, stored as red luminance difference signal. */ + uint8_t v; +} YUYVDoublePixel; + /** This special URI can be passed to @ref Device::open() when the application has no concern for a specific device. */ #if ONI_PLATFORM != ONI_PLATFORM_WIN32 #pragma GCC diagnostic ignored "-Wunused-variable" @@ -2295,7 +2312,6 @@ class OpenNI /** * Set minimum severity for log produce - * @param const char * strMask [in] Logger name * @param int nMinSeverity [in] Logger severity * * @retval STATUS_OK Upon successful completion. diff --git a/Makefile b/Makefile index a436a84f..a5c8d154 100644 --- a/Makefile +++ b/Makefile @@ -40,8 +40,8 @@ ALL_DRIVERS = \ # list all wrappers ALL_WRAPPERS = \ - Wrappers/java/OpenNI.jni \ - Wrappers/java/OpenNI.java + Wrappers/java \ + Wrappers/java/jni # list all tools ALL_TOOLS = \ @@ -121,29 +121,29 @@ samples: $(ALL_SAMPLES) $(foreach proj,$(ALL_PROJS),$(eval $(call CREATE_PROJ_TARGET,$(proj)))) # additional dependencies -$(OPENNI): $(XNLIB) -Wrappers/java/OpenNI.jni: $(OPENNI) $(XNLIB) - -Source/Drivers/DummyDevice: $(OPENNI) $(XNLIB) -Source/Drivers/RawDevice: $(OPENNI) $(XNLIB) -Source/Drivers/PS1080: $(OPENNI) $(XNLIB) $(DEPTH_UTILS) -Source/Drivers/PS1080/PS1080Console: $(OPENNI) $(XNLIB) -Source/Drivers/PSLink: $(OPENNI) $(XNLIB) -Source/Drivers/PSLink/PSLinkConsole: $(OPENNI) $(XNLIB) -Source/Drivers/OniFile: $(OPENNI) $(XNLIB) - -Source/Tools/NiViewer: $(OPENNI) $(XNLIB) - -Samples/SimpleRead: $(OPENNI) -Samples/EventBasedRead: $(OPENNI) -Samples/MultipleStreamRead: $(OPENNI) -Samples/MWClosestPoint: $(OPENNI) -Samples/MWClosestPointApp: $(OPENNI) Samples/MWClosestPoint - -Samples/SimpleViewer: $(OPENNI) -Samples/MultiDepthViewer: $(OPENNI) -Samples/ClosestPointViewer: $(OPENNI) Samples/MWClosestPoint -Samples/SimpleViewer.java: Wrappers/java/OpenNI.java +$(OPENNI): $(XNLIB) +Wrappers/java/jni: $(OPENNI) $(XNLIB) + +Source/Drivers/DummyDevice: $(OPENNI) $(XNLIB) +Source/Drivers/RawDevice: $(OPENNI) $(XNLIB) +Source/Drivers/PS1080: $(OPENNI) $(XNLIB) $(DEPTH_UTILS) +Source/Drivers/PS1080/PS1080Console: $(OPENNI) $(XNLIB) +Source/Drivers/PSLink: $(OPENNI) $(XNLIB) +Source/Drivers/PSLink/PSLinkConsole: $(OPENNI) $(XNLIB) +Source/Drivers/OniFile: $(OPENNI) $(XNLIB) + +Source/Tools/NiViewer: $(OPENNI) $(XNLIB) + +Samples/SimpleRead: $(OPENNI) +Samples/EventBasedRead: $(OPENNI) +Samples/MultipleStreamRead: $(OPENNI) +Samples/MWClosestPoint: $(OPENNI) +Samples/MWClosestPointApp: $(OPENNI) Samples/MWClosestPoint + +Samples/SimpleViewer: $(OPENNI) +Samples/MultiDepthViewer: $(OPENNI) +Samples/ClosestPointViewer: $(OPENNI) Samples/MWClosestPoint +Samples/SimpleViewer.java: Wrappers/java $(FINAL_DIR): mkdir -p $(FINAL_DIR) diff --git a/OpenNI.sln b/OpenNI.sln index 9af176a6..4c867bf4 100644 --- a/OpenNI.sln +++ b/OpenNI.sln @@ -104,7 +104,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PSLinkConsole", "Source\Dri EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Wrappers", "Wrappers", "{9FCEE1ED-B0D9-46D7-A014-98FBDD0EF6A9}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OpenNI.jni", "Wrappers\java\OpenNI.jni\OpenNI.jni.vcxproj", "{1723CBBA-8EE7-439A-93FB-2E94B4DB2E63}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OpenNI.jni", "Wrappers\java\jni\OpenNI.jni.vcxproj", "{1723CBBA-8EE7-439A-93FB-2E94B4DB2E63}" ProjectSection(ProjectDependencies) = postProject {72D595BB-8C52-449B-91DB-0E9F6AEAF53A} = {72D595BB-8C52-449B-91DB-0E9F6AEAF53A} EndProjectSection diff --git a/Packaging/Harvest.py b/Packaging/Harvest.py index e30911ed..c80ca359 100755 --- a/Packaging/Harvest.py +++ b/Packaging/Harvest.py @@ -21,6 +21,7 @@ #* * #****************************************************************************/ import os +import glob import re import sys import shutil @@ -29,42 +30,45 @@ import xml.dom.minidom class Harvest: - def __init__(self, rootDir, outDir, arch): + def __init__(self, rootDir, outDir, arch, osName): self.rootDir = rootDir self.outDir = outDir self.arch = arch - self.osName = platform.system() - self.binDir = os.path.join(rootDir, 'Bin', arch + '-Release') + self.osName = osName self.platformSuffix = '' self.glutSuffix = '32' - + self.binDir = os.path.join(rootDir, 'Bin', arch + '-Release') + + # override some defaults if self.osName == 'Windows': if arch == 'x86': self.binDir = os.path.join(rootDir, 'Bin', 'Win32-Release') elif arch == 'x64': self.platformSuffix = '64' self.glutSuffix = '64' + elif self.osName == 'Android': + self.binDir = os.path.join(rootDir, 'Wrappers', 'java', 'libs', 'armeabi-v7a') def copySharedObject(self, sourceDir, name, targetDir): if self.osName == 'Windows': shutil.copy(os.path.join(sourceDir, name + '.dll'), targetDir) shutil.copy(os.path.join(sourceDir, name + '.pdb'), targetDir) - elif self.osName == 'Linux': + elif self.osName == 'Linux' or self.osName == 'Android': shutil.copy(os.path.join(sourceDir, 'lib' + name + '.so'), targetDir) elif self.osName == 'Darwin': shutil.copy(os.path.join(sourceDir, 'lib' + name + '.dylib'), targetDir) else: raise 'Unsupported platform!' - + def copyExecutable(self, sourceDir, name, targetDir): if self.osName == 'Windows': shutil.copy(os.path.join(sourceDir, name + '.exe'), targetDir) shutil.copy(os.path.join(sourceDir, name + '.pdb'), targetDir) else: shutil.copy(os.path.join(sourceDir, name), targetDir) - + def regxReplace(self, findStr, repStr, filePath): - "replaces all findStr by repStr in file filePath using regualr expression" + "replaces all findStr by repStr in file filePath using regular expression" findStrRegx = re.compile(findStr) tempName = filePath+'~~~' fileMode = os.stat(filePath).st_mode @@ -77,48 +81,71 @@ def regxReplace(self, findStr, repStr, filePath): input.close() os.remove(filePath) os.rename(tempName, filePath) - + def copyRedistFiles(self, targetDir): os.makedirs(targetDir) # start with OpenNI itself self.copySharedObject(self.binDir, 'OpenNI2', targetDir) self.copySharedObject(self.binDir, 'OpenNI2.jni', targetDir) - shutil.copy(os.path.join(self.binDir, 'org.openni.jar'), targetDir) - shutil.copy(os.path.join(self.rootDir, 'Config', 'OpenNI.ini'), targetDir) + + if self.osName != 'Android': + shutil.copy(os.path.join(self.binDir, 'org.openni.jar'), targetDir) + shutil.copy(os.path.join(self.rootDir, 'Config', 'OpenNI.ini'), targetDir) + # and now all drivers - binDriversDir = os.path.join(self.binDir, 'OpenNI2', 'Drivers') - targetDriversDir = os.path.join(targetDir, 'OpenNI2', 'Drivers') - os.makedirs(targetDriversDir) + if self.osName != 'Android': + binDriversDir = os.path.join(self.binDir, 'OpenNI2', 'Drivers') + targetDriversDir = os.path.join(targetDir, 'OpenNI2', 'Drivers') + os.makedirs(targetDriversDir) + else: + binDriversDir = self.binDir + targetDriversDir = targetDir + self.copySharedObject(binDriversDir, 'OniFile', targetDriversDir) self.copySharedObject(binDriversDir, 'PS1080', targetDriversDir) self.copySharedObject(binDriversDir, 'PSLink', targetDriversDir) - shutil.copy(os.path.join(self.rootDir, 'Config', 'OpenNI2', 'Drivers', 'PS1080.ini'), targetDriversDir) - shutil.copy(os.path.join(self.rootDir, 'Config', 'OpenNI2', 'Drivers', 'PSLink.ini'), targetDriversDir) + + if self.osName != 'Android': + shutil.copy(os.path.join(self.rootDir, 'Config', 'OpenNI2', 'Drivers', 'PS1080.ini'), targetDriversDir) + shutil.copy(os.path.join(self.rootDir, 'Config', 'OpenNI2', 'Drivers', 'PSLink.ini'), targetDriversDir) + if self.osName == 'Windows': self.copySharedObject(binDriversDir, 'Kinect', targetDriversDir) - - def copySample(self, samplesDir, name, isLibrary = False, isGL = False, isJava = False): + + def copySample(self, samplesDir, targetBinDir, name, isLibrary = False, isGL = False, isJava = False, sourceSamplesDir = None): if self.arch == 'Arm' and isGL: return - + + if sourceSamplesDir is None: + sourceSamplesDir = os.path.join(self.rootDir, 'Samples') + sampleTargetDir = os.path.join(samplesDir, name) - sampleSourceDir = os.path.join(self.rootDir, 'Samples', name) + sampleSourceDir = os.path.join(sourceSamplesDir, name) + + if self.osName == 'Android': + # remove the .Android in the end + sampleTargetDir = os.path.splitext(sampleTargetDir)[0] # copy sources - for root, dirs, files in os.walk(sampleSourceDir): - # take dir name without 'root' and append to target - dst = os.path.join(samplesDir, name, os.path.relpath(root, sampleSourceDir)) - #print dst - for file in files: - if (isJava and file.endswith('.java')) or (not isJava and (file.endswith('.h') or file.endswith('.cpp'))): - if not os.path.exists(dst): - os.makedirs(dst) - shutil.copy(os.path.join(root, file), dst) - + if self.osName == 'Android': + shutil.copytree(os.path.join(sampleSourceDir, 'src'), os.path.join(sampleTargetDir, 'src')) + shutil.copytree(os.path.join(sampleSourceDir, 'res'), os.path.join(sampleTargetDir, 'res')) + if os.path.exists(os.path.join(sampleSourceDir, 'jni')): + shutil.copytree(os.path.join(sampleSourceDir, 'jni'), os.path.join(sampleTargetDir, 'jni')) + else: + for root, dirs, files in os.walk(sampleSourceDir): + # take dir name without 'root' and append to target + dst = os.path.join(sampleTargetDir, os.path.relpath(root, sampleSourceDir)) + for file in files: + if (isJava and file.endswith('.java')) or (not isJava and (file.endswith('.h') or file.endswith('.cpp'))): + if not os.path.exists(dst): + os.makedirs(dst) + shutil.copy(os.path.join(root, file), dst) + # copy common header - if not isJava and not isLibrary: + if not isJava and not isLibrary and self.osName != 'Android': shutil.copy(os.path.join(self.rootDir, 'Samples', 'Common', 'OniSampleUtilities.h'), sampleTargetDir) - + # copy GL headers if self.osName == 'Windows' and isGL: shutil.copytree(os.path.join(self.rootDir, 'ThirdParty', 'GL', 'GL'), os.path.join(sampleTargetDir, 'GL')) @@ -128,7 +155,7 @@ def copySample(self, samplesDir, name, isLibrary = False, isGL = False, isJava = shutil.copy(os.path.join(self.rootDir, 'ThirdParty', 'GL', 'glut64.lib'), sampleTargetDir) shutil.copy(os.path.join(self.rootDir, 'ThirdParty', 'GL', 'glut32.dll'), sampleTargetDir) shutil.copy(os.path.join(self.rootDir, 'ThirdParty', 'GL', 'glut64.dll'), sampleTargetDir) - + # and project file / makefile if self.osName == 'Windows': if isJava: @@ -151,27 +178,27 @@ def copySample(self, samplesDir, name, isLibrary = False, isGL = False, isJava = buildFile.write(')\n') buildFile.write(buildScript) buildFile.close() - + else: shutil.copy(os.path.join(sampleSourceDir, name + '.vcxproj'), sampleTargetDir) projFile = os.path.join(sampleTargetDir, name + '.vcxproj') #ET.register_namespace('', 'http://schemas.microsoft.com/developer/msbuild/2003') doc = xml.dom.minidom.parse(projFile) - + # remove OutDir and IntDir (make them default) for propertyGroup in doc.getElementsByTagName("PropertyGroup"): if len(propertyGroup.getElementsByTagName("OutDir")) > 0: propertyGroup.parentNode.removeChild(propertyGroup) - + for group in doc.getElementsByTagName("ItemDefinitionGroup"): condAttr = group.getAttribute('Condition') if condAttr.find('x64') != -1: postfix = '64' glPostfix = '64' - else: + else: postfix = '' glPostfix = '32' - + incDirs = group.getElementsByTagName('ClCompile')[0].getElementsByTagName('AdditionalIncludeDirectories')[0] val = incDirs.firstChild.data @@ -181,7 +208,7 @@ def copySample(self, samplesDir, name, isLibrary = False, isGL = False, isJava = val = re.sub('..\\\\Common', r'.', val) # fix OpenNI include dir val = re.sub('..\\\\..\\\\Include', '$(OPENNI2_INCLUDE' + postfix + ')', val) - + incDirs.firstChild.data = val # fix additional library directories @@ -189,22 +216,22 @@ def copySample(self, samplesDir, name, isLibrary = False, isGL = False, isJava = val = libDirs.firstChild.data val = re.sub('\$\(OutDir\)', '$(OutDir);$(OPENNI2_LIB' + postfix + ')', val) libDirs.firstChild.data = val - + # add post-build event to copy OpenNI redist post = doc.createElement('PostBuildEvent') cmd = 'xcopy /D /S /F /Y "$(OPENNI2_REDIST' + postfix + ')\*" "$(OutDir)"\n' if isGL: cmd += 'xcopy /D /F /Y "$(ProjectDir)\\glut' + glPostfix + '.dll" "$(OutDir)"\n' - + cmdNode = doc.createElement('Command') cmdNode.appendChild(doc.createTextNode(cmd)) post.appendChild(cmdNode) group.appendChild(post) - + proj = open(projFile, 'w') proj.write(doc.toxml()) proj.close() - + elif self.osName == 'Linux' or self.osName == 'Darwin': shutil.copy(os.path.join(sampleSourceDir, 'Makefile'), sampleTargetDir) shutil.copy(os.path.join(rootDir, 'ThirdParty', 'PSCommon', 'BuildSystem', 'CommonDefs.mak'), sampleTargetDir) @@ -216,13 +243,13 @@ def copySample(self, samplesDir, name, isLibrary = False, isGL = False, isJava = shutil.copy(os.path.join(rootDir, 'ThirdParty', 'PSCommon', 'BuildSystem', 'CommonJavaMakefile'), sampleTargetDir) else: shutil.copy(os.path.join(rootDir, 'ThirdParty', 'PSCommon', 'BuildSystem', 'CommonCppMakefile'), sampleTargetDir) - + # fix common makefiles path self.regxReplace('../../ThirdParty/PSCommon/BuildSystem/', '', os.path.join(sampleTargetDir, 'Makefile')) - + # fix BIN dir self.regxReplace('BIN_DIR = ../../Bin', 'BIN_DIR = Bin', os.path.join(sampleTargetDir, 'Makefile')) - + # fix include dirs and copy openni_redist add = r''' ifndef OPENNI2_INCLUDE @@ -238,110 +265,176 @@ def copySample(self, samplesDir, name, isLibrary = False, isGL = False, isJava = .PHONY: copy-redist copy-redist: cp -R $(OPENNI2_REDIST)/* $(OUT_DIR) - + $(OUTPUT_FILE): copy-redist -''' +''' self.regxReplace(r'include (Common.*Makefile)', add, os.path.join(sampleTargetDir, 'Makefile')) + elif self.osName == 'Android': + shutil.copy(os.path.join(sampleSourceDir, '.classpath'), sampleTargetDir) + shutil.copy(os.path.join(sampleSourceDir, '.project'), sampleTargetDir) + shutil.copy(os.path.join(sampleSourceDir, 'AndroidManifest.xml'), sampleTargetDir) + shutil.copy(os.path.join(sampleSourceDir, 'build.xml'), sampleTargetDir) + shutil.copy(os.path.join(sampleSourceDir, 'proguard-project.txt'), sampleTargetDir) + shutil.copy(os.path.join(sampleSourceDir, 'project.properties'), sampleTargetDir) + # fix dependency + self.regxReplace('../../../Wrappers/java', '../../OpenNIAndroidLibrary', os.path.join(sampleTargetDir, 'project.properties')) + self.regxReplace('../../Wrappers/java', '../../OpenNIAndroidLibrary', os.path.join(sampleTargetDir, 'project.properties')) # and executable - if isJava: + if self.osName == 'Android': + apkName = glob.glob(os.path.join(sampleSourceDir, 'bin', '*.apk'))[0] + realName = os.path.split(sampleTargetDir)[1] + shutil.copy(apkName, os.path.join(targetBinDir, realName + '.apk')) + elif isJava: splitName = os.path.splitext(name) # copy jar - shutil.copy(os.path.join(self.binDir, 'org.openni.Samples.' + splitName[0] + '.jar'), os.path.join(samplesDir, 'Bin')) + shutil.copy(os.path.join(self.binDir, 'org.openni.Samples.' + splitName[0] + '.jar'), targetBinDir) # and script if not isLibrary: if self.osName == 'Windows': - shutil.copy(os.path.join(self.binDir, 'org.openni.Samples.' + splitName[0] + '.bat'), os.path.join(samplesDir, 'Bin')) + shutil.copy(os.path.join(self.binDir, 'org.openni.Samples.' + splitName[0] + '.bat'), targetBinDir) else: - shutil.copy(os.path.join(self.binDir, 'org.openni.Samples.' + splitName[0]), os.path.join(samplesDir, 'Bin')) + shutil.copy(os.path.join(self.binDir, 'org.openni.Samples.' + splitName[0]), targetBinDir) elif isLibrary: - self.copySharedObject(self.binDir, name, os.path.join(samplesDir, 'Bin')) + self.copySharedObject(self.binDir, name, targetBinDir) if self.osName == 'Windows': - shutil.copy(os.path.join(self.binDir, name + '.lib'), os.path.join(samplesDir, 'Bin')) + shutil.copy(os.path.join(self.binDir, name + '.lib'), targetBinDir) else: # regular executable - self.copyExecutable(self.binDir, name, os.path.join(samplesDir, 'Bin')) - + self.copyExecutable(self.binDir, name, targetBinDir) + def copyTool(self, toolsDir, name, isGL = False): if self.arch == 'Arm' and isGL: return - + self.copyExecutable(self.binDir, name, toolsDir) def copyDocumentation(self, docDir): + os.makedirs(docDir) if self.osName == 'Windows': - os.makedirs(docDir) - shutil.copy(os.path.join(self.rootDir, 'Source', 'Documentation', 'html', 'OpenNI.chm'), docDir) + shutil.copy(os.path.join(self.rootDir, 'Source', 'Documentation', 'cpp', 'OpenNI.chm'), docDir) + else: + shutil.copytree(os.path.join(self.rootDir, 'Source', 'Documentation', 'cpp'), os.path.join(docDir, 'cpp')) + + if self.osName == 'Android': + shutil.copytree(os.path.join(self.rootDir, 'Wrappers', 'java', 'doc', 'gen'), os.path.join(docDir, 'java')) else: - shutil.copytree(os.path.join(self.rootDir, 'Source', 'Documentation', 'html'), docDir) - - shutil.copytree(os.path.join(self.rootDir, 'Source', 'Documentation', 'java'), os.path.join(docDir, 'java')) - + shutil.copytree(os.path.join(self.rootDir, 'Source', 'Documentation', 'java'), os.path.join(docDir, 'java')) + def copyGLUT(self, targetDir): if self.osName == 'Windows': - shutil.copy(os.path.join(rootDir, 'ThirdParty', 'GL', 'glut' + self.glutSuffix + '.dll'), targetDir) - + shutil.copy(os.path.join(self.rootDir, 'ThirdParty', 'GL', 'glut' + self.glutSuffix + '.dll'), targetDir) + + def copyAndroidLib(self, targetDir): + os.makedirs(targetDir) + shutil.copytree(os.path.join(self.rootDir, 'Wrappers', 'java', 'src'), os.path.join(targetDir, 'src')) + shutil.copytree(os.path.join(self.rootDir, 'Wrappers', 'java', 'res'), os.path.join(targetDir, 'res')) + shutil.copytree(os.path.join(self.rootDir, 'Wrappers', 'java', 'jni'), os.path.join(targetDir, 'jni')) + shutil.copytree(os.path.join(self.rootDir, 'Wrappers', 'java', 'libs'), os.path.join(targetDir, 'libs')) + shutil.copy(os.path.join(self.rootDir, 'Wrappers', 'java', '.classpath'), targetDir) + shutil.copy(os.path.join(self.rootDir, 'Wrappers', 'java', '.project'), targetDir) + shutil.copy(os.path.join(self.rootDir, 'Wrappers', 'java', 'AndroidManifest.xml'), targetDir) + shutil.copy(os.path.join(self.rootDir, 'Wrappers', 'java', 'build.xml'), targetDir) + shutil.copy(os.path.join(self.rootDir, 'Wrappers', 'java', 'proguard-project.txt'), targetDir) + shutil.copy(os.path.join(self.rootDir, 'Wrappers', 'java', 'project.properties'), targetDir) + # remove redundant file + os.remove(os.path.join(targetDir, 'res', '.gitignore')) + + def copyAssets(self, targetDir): + os.makedirs(targetDir) + shutil.copy(os.path.join(self.rootDir, 'Config', 'OpenNI.ini'), targetDir) + shutil.copy(os.path.join(self.rootDir, 'Config', 'OpenNI2', 'Drivers', 'PS1080.ini'), targetDir) + shutil.copy(os.path.join(self.rootDir, 'Config', 'OpenNI2', 'Drivers', 'PSLink.ini'), targetDir) + def run(self): if os.path.exists(self.outDir): shutil.rmtree(self.outDir) os.makedirs(self.outDir) - + # Redist - self.copyRedistFiles(os.path.join(self.outDir, 'Redist')) - + if self.osName == 'Android': + redistDir = os.path.join(self.outDir, 'Libs') + else: + redistDir = os.path.join(self.outDir, 'Redist') + self.copyRedistFiles(redistDir) + # Samples samplesDir = os.path.join(self.outDir, 'Samples') - self.copyRedistFiles(os.path.join(samplesDir, 'Bin')) - self.copyGLUT(os.path.join(samplesDir, 'Bin')) - self.copySample(samplesDir, 'SimpleRead') - self.copySample(samplesDir, 'SimpleViewer', isGL = True) - self.copySample(samplesDir, 'SimpleViewer.java', isJava = True) - self.copySample(samplesDir, 'EventBasedRead') - self.copySample(samplesDir, 'MultiDepthViewer', isGL = True) - self.copySample(samplesDir, 'MultipleStreamRead') - self.copySample(samplesDir, 'MWClosestPoint', isLibrary = True) - self.copySample(samplesDir, 'MWClosestPointApp') - self.copySample(samplesDir, 'ClosestPointViewer', isGL = True) - + if self.osName != 'Android': + samplesBinDir = os.path.join(samplesDir, 'Bin') + self.copyRedistFiles(samplesBinDir) + self.copyGLUT(samplesBinDir) + self.copySample(samplesDir, samplesBinDir, 'SimpleRead') + self.copySample(samplesDir, samplesBinDir, 'SimpleViewer', isGL = True) + self.copySample(samplesDir, samplesBinDir, 'SimpleViewer.java', isJava = True) + self.copySample(samplesDir, samplesBinDir, 'EventBasedRead') + self.copySample(samplesDir, samplesBinDir, 'MultiDepthViewer', isGL = True) + self.copySample(samplesDir, samplesBinDir, 'MultipleStreamRead') + self.copySample(samplesDir, samplesBinDir, 'MWClosestPoint', isLibrary = True) + self.copySample(samplesDir, samplesBinDir, 'MWClosestPointApp') + self.copySample(samplesDir, samplesBinDir, 'ClosestPointViewer', isGL = True) + else: + samplesBinDir = os.path.join(samplesDir, 'Prebuilt') + os.makedirs(samplesBinDir) + self.copySample(samplesDir, samplesBinDir, 'SimpleRead.Android') + self.copySample(samplesDir, samplesBinDir, 'SimpleViewer.Android') + # Tools toolsDir = os.path.join(self.outDir, 'Tools') - self.copyRedistFiles(toolsDir) - self.copyGLUT(toolsDir) - self.copyTool(toolsDir, 'NiViewer', isGL = True) - self.copyTool(toolsDir, 'PS1080Console') - self.copyTool(toolsDir, 'PSLinkConsole') - + if self.osName != 'Android': + self.copyRedistFiles(toolsDir) + self.copyGLUT(toolsDir) + self.copyTool(toolsDir, 'NiViewer', isGL = True) + self.copyTool(toolsDir, 'PS1080Console') + self.copyTool(toolsDir, 'PSLinkConsole') + else: + toolsSourceDir = os.path.join(self.rootDir, 'Source', 'Tools') + toolsBinDir = os.path.join(toolsDir, 'Prebuilt') + os.makedirs(toolsBinDir) + self.copySample(toolsDir, toolsBinDir, 'NiViewer.Android', sourceSamplesDir = toolsSourceDir) + # Documentation docDir = os.path.join(self.outDir, 'Documentation') self.copyDocumentation(docDir) - + # Include - shutil.copytree(os.path.join(rootDir, 'Include'), os.path.join(self.outDir, 'Include')) - + shutil.copytree(os.path.join(self.rootDir, 'Include'), os.path.join(self.outDir, 'Include')) + + # Android lib + if self.osName == 'Android': + self.copyAndroidLib(os.path.join(self.outDir, 'OpenNIAndroidLibrary')) + self.copyAssets(os.path.join(self.outDir, 'Assets', 'openni')) + # Release notes and change log - shutil.copy(os.path.join(rootDir, 'ReleaseNotes.txt'), self.outDir) - shutil.copy(os.path.join(rootDir, 'CHANGES.txt'), self.outDir) - + shutil.copy(os.path.join(self.rootDir, 'ReleaseNotes.txt'), self.outDir) + shutil.copy(os.path.join(self.rootDir, 'CHANGES.txt'), self.outDir) + # Licenses - shutil.copy(os.path.join(rootDir, 'NOTICE'), self.outDir) - shutil.copy(os.path.join(rootDir, 'LICENSE'), self.outDir) - + shutil.copy(os.path.join(self.rootDir, 'NOTICE'), self.outDir) + shutil.copy(os.path.join(self.rootDir, 'LICENSE'), self.outDir) + if self.osName == 'Windows': # Driver - shutil.copytree(os.path.join(rootDir, 'ThirdParty', 'PSCommon', 'XnLib', 'Driver', 'Win32', 'Bin'), os.path.join(self.outDir, 'Driver')) - + shutil.copytree(os.path.join(self.rootDir, 'ThirdParty', 'PSCommon', 'XnLib', 'Driver', 'Win32', 'Bin'), os.path.join(self.outDir, 'Driver')) + # Library libDir = os.path.join(self.outDir, 'Lib') os.makedirs(libDir) shutil.copy(os.path.join(self.binDir, 'OpenNI2.lib'), libDir) - else: + elif self.osName != 'Android': # install script shutil.copy(os.path.join(self.rootDir, 'Packaging', 'Linux', 'install.sh'), self.outDir) shutil.copy(os.path.join(self.rootDir, 'Packaging', 'Linux', 'primesense-usb.rules'), self.outDir) -if len(sys.argv) < 3: - print 'Usage: ' + sys.argv[0] + ' ' - exit(1) - -rootDir = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), '..')) -harvest = Harvest(rootDir, sys.argv[1], sys.argv[2]) -harvest.run() +if __name__ == '__main__': + if len(sys.argv) < 3: + print 'Usage: ' + sys.argv[0] + ' ' + exit(1) + + rootDir = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), '..')) + arch = sys.argv[2] + osName = platform.system() + if sys.argv[2] == 'Android': + arch = 'Arm' + osName = 'Android' + harvest = Harvest(rootDir, sys.argv[1], arch, osName) + harvest.run() diff --git a/Packaging/Install/Install.wixproj b/Packaging/Install/Install.wixproj index bc19e5e4..1cc7f34f 100644 --- a/Packaging/Install/Install.wixproj +++ b/Packaging/Install/Install.wixproj @@ -200,7 +200,7 @@ echo "Building Java Wrappers..." -call "$(SolutionDir)\Wrappers\java\OpenNI.java\Build.bat" $(PlatformName) +call "$(SolutionDir)\Wrappers\java\Build.bat" $(PlatformName) if errorlevel 1 exit 1 echo "Building SimpleViewer.java..." call "$(SolutionDir)\Samples\SimpleViewer.java\Build.bat" $(PlatformName) diff --git a/Packaging/ReleaseVersion.py b/Packaging/ReleaseVersion.py index e2fdf5fb..9178c5e1 100755 --- a/Packaging/ReleaseVersion.py +++ b/Packaging/ReleaseVersion.py @@ -30,11 +30,12 @@ import stat import UpdateVersion +from Harvest import Harvest if len(sys.argv) < 2 or sys.argv[1] in ('-h','--help'): - print "usage: " + sys.argv[0] + " [UpdateVersion]" + print "usage: " + sys.argv[0] + " [UpdateVersion]" sys.exit(1) - + plat = sys.argv[1] origDir = os.getcwd() @@ -47,6 +48,17 @@ UpdateVersion.VERSION_BUILD += 1 UpdateVersion.update() +def check_call(cmd, outputFile = None): + if platform.system() == 'Windows': + useShell=True + else: + useShell=False + + rc = subprocess.call(cmd, shell=useShell, stdout=outputFile, stderr=outputFile) + if rc != 0: + print 'Failed to execute command: ' + str(cmd) + sys.exit(9) + def get_reg_values(reg_key, value_list): # open the reg key try: @@ -74,7 +86,7 @@ def get_reg_values(reg_key, value_list): def calc_jobs_number(): cores = 1 - + try: if isinstance(self, OSMac): txt = gop('sysctl -n hw.physicalcpu') @@ -84,54 +96,72 @@ def calc_jobs_number(): cores = int(txt) except: pass - + return str(cores * 2) +def build_android_project(path, outputFile, target = 'release'): + if not 'NDK_HOME' in os.environ: + print 'Please define NDK_HOME!' + sys.exit(2) + + if not 'ANDROID_HOME' in os.environ: + print 'Please define ANDROID_HOME!' + sys.exit(2) + + sdkDir = os.environ['ANDROID_HOME'] + check_call([os.path.join(sdkDir, 'tools', 'android'), 'update', 'project', '-p', path], outputFile) + check_call(['ant', '-f', os.path.join(path, 'build.xml'), target], outputFile) + +def build_android(): + logFile = open('build.android.log', 'w') + + libraries = ['Wrappers/java'] + samples = ['Samples/SimpleRead.Android', 'Samples/SimpleViewer.Android'] + tools = ['Source/Tools/NiViewer.Android'] + + # build all projects + android_projects = libraries + samples + tools + # clean all + print 'Cleaning...' + for proj in android_projects: + logFile.write('**** Cleaning ' + proj + "...****\n") + build_android_project(os.path.join('..', proj), outputFile=logFile, target='clean') + # and build all + for proj in android_projects: + logFile.write('**** Building ' + proj + "...****\n") + print 'Building ' + proj + '...', + build_android_project(os.path.join('..', proj), outputFile=logFile) + print 'OK' + + # build documentation + print 'Creating C++ documentation...', + check_call([os.path.join('..', 'Source', 'Documentation', 'Runme.py')], outputFile=logFile) + print 'OK' + + print 'Creating java documentation...', + build_android_project('../Wrappers/java', outputFile=logFile, target='javadoc') + print 'OK' + # Create installer strVersion = UpdateVersion.getVersionName() print "Creating installer for OpenNI " + strVersion + " " + plat finalDir = "Final" if not os.path.isdir(finalDir): os.mkdir(finalDir) - -if plat == 'android': - if not 'NDK_ROOT' in os.environ: - print 'Please define NDK_ROOT!' - sys.exit(2) - - ndkDir = os.environ['NDK_ROOT'] - buildDir = 'AndroidBuild' - if os.path.isdir(buildDir): - shutil.rmtree(buildDir) - - outputDir = 'OpenNI-android-' + strVersion - if os.path.isdir(outputDir): - shutil.rmtree(outputDir) - - os.makedirs(buildDir + '/jni') - os.symlink('../../../', buildDir + '/jni/OpenNI2') - shutil.copy('../Android.mk', buildDir + '/jni') - shutil.copy('../Application.mk', buildDir + '/jni') - rc = subprocess.call([ ndkDir + '/ndk-build', '-C', buildDir, '-j8' ]) - if rc != 0: - print 'Build failed!' - sys.exit(3) - - finalFile = finalDir + '/' + outputDir + '.tar' - - shutil.move(buildDir + '/libs/armeabi-v7a', outputDir) - - # add config files - shutil.copy('../Config/OpenNI.ini', outputDir) - shutil.copy('../Config/OpenNI2/Drivers/PS1080.ini', outputDir) +if plat == 'Android': + build_android() + outputDir = 'OpenNI-Android-' + strVersion + harvest = Harvest('..', outputDir, 'Arm', 'Android') + harvest.run() + finalFile = outputDir + ".tar" print('Creating archive ' + finalFile) subprocess.check_call(['tar', '-cf', finalFile, outputDir]) elif platform.system() == 'Windows': import win32con,pywintypes,win32api,platform - + (bits,linkage) = platform.architecture() matchObject = re.search('64',bits) is_64_bit_machine = matchObject is not None @@ -140,7 +170,7 @@ def calc_jobs_number(): MSVC_KEY = (win32con.HKEY_LOCAL_MACHINE, r"SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0") else: MSVC_KEY = (win32con.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\VisualStudio\10.0") - + MSVC_VALUES = [("InstallDir", win32con.REG_SZ)] VS_INST_DIR = get_reg_values(MSVC_KEY, MSVC_VALUES)[0] PROJECT_SLN = "..\OpenNI.sln" @@ -152,34 +182,34 @@ def calc_jobs_number(): # everything OK, can remove build log os.remove(bulidLog) - + outFile = 'OpenNI-Windows-' + plat + '-' + strVersion + '.msi' finalFile = os.path.join(finalDir, outFile) if os.path.exists(finalFile): os.remove(finalFile) shutil.move('Install/bin/' + plat + '/en-us/' + outFile, finalDir) - + elif platform.system() == 'Linux' or platform.system() == 'Darwin': devNull = open('/dev/null', 'w') subprocess.check_call(['make', '-C', '../', '-j' + calc_jobs_number(), 'PLATFORM=' + plat, 'clean'], stdout=devNull, stderr=devNull) devNull.close() - + buildLog = open(origDir + '/build.release.' + plat + '.log', 'w') subprocess.check_call(['make', '-C', '../', '-j' + calc_jobs_number(), 'PLATFORM=' + plat, 'release'], stdout=buildLog, stderr=buildLog) buildLog.close() - + # everything OK, can remove build log os.remove(origDir + '/build.release.' + plat + '.log') - + else: print "Unknown OS" sys.exit(2) - + # also copy Release Notes and CHANGES documents shutil.copy('../ReleaseNotes.txt', finalDir) shutil.copy('../CHANGES.txt', finalDir) - + print "Installer can be found under: " + finalDir print "Done" diff --git a/Samples/SimpleRead.Android/.classpath b/Samples/SimpleRead.Android/.classpath new file mode 100644 index 00000000..62aff606 --- /dev/null +++ b/Samples/SimpleRead.Android/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/Samples/SimpleRead.Android/.project b/Samples/SimpleRead.Android/.project new file mode 100644 index 00000000..ce1c2ffd --- /dev/null +++ b/Samples/SimpleRead.Android/.project @@ -0,0 +1,33 @@ + + + SimpleRead + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/Samples/SimpleRead.Android/AndroidManifest.xml b/Samples/SimpleRead.Android/AndroidManifest.xml new file mode 100644 index 00000000..33e037d1 --- /dev/null +++ b/Samples/SimpleRead.Android/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + diff --git a/Samples/SimpleRead.Android/build.xml b/Samples/SimpleRead.Android/build.xml new file mode 100644 index 00000000..f239e59d --- /dev/null +++ b/Samples/SimpleRead.Android/build.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/SimpleRead.Android/ic_launcher-web.png b/Samples/SimpleRead.Android/ic_launcher-web.png new file mode 100644 index 0000000000000000000000000000000000000000..a18cbb48c431dfcc163fce2b6e27e981f8c09f6a GIT binary patch literal 51394 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 literal 0 HcmV?d00001 diff --git a/Samples/SimpleRead.Android/res/drawable-xhdpi/ic_launcher.png b/Samples/SimpleRead.Android/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d4fb7cd9d868f1d7d9964f1686dcbc018ef9495a GIT binary patch literal 12516 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 literal 0 HcmV?d00001 diff --git a/Samples/SimpleRead.Android/res/layout/activity_simple_read.xml b/Samples/SimpleRead.Android/res/layout/activity_simple_read.xml new file mode 100644 index 00000000..222e8907 --- /dev/null +++ b/Samples/SimpleRead.Android/res/layout/activity_simple_read.xml @@ -0,0 +1,16 @@ + + + + + diff --git a/Samples/SimpleRead.Android/res/values-sw600dp/dimens.xml b/Samples/SimpleRead.Android/res/values-sw600dp/dimens.xml new file mode 100644 index 00000000..44f01db7 --- /dev/null +++ b/Samples/SimpleRead.Android/res/values-sw600dp/dimens.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/Samples/SimpleRead.Android/res/values-sw720dp-land/dimens.xml b/Samples/SimpleRead.Android/res/values-sw720dp-land/dimens.xml new file mode 100644 index 00000000..61e3fa8f --- /dev/null +++ b/Samples/SimpleRead.Android/res/values-sw720dp-land/dimens.xml @@ -0,0 +1,9 @@ + + + + 128dp + + diff --git a/Samples/SimpleRead.Android/res/values-v11/styles.xml b/Samples/SimpleRead.Android/res/values-v11/styles.xml new file mode 100644 index 00000000..3c02242a --- /dev/null +++ b/Samples/SimpleRead.Android/res/values-v11/styles.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/Samples/SimpleRead.Android/res/values/dimens.xml b/Samples/SimpleRead.Android/res/values/dimens.xml new file mode 100644 index 00000000..55c1e590 --- /dev/null +++ b/Samples/SimpleRead.Android/res/values/dimens.xml @@ -0,0 +1,7 @@ + + + + 16dp + 16dp + + diff --git a/Samples/SimpleRead.Android/res/values/strings.xml b/Samples/SimpleRead.Android/res/values/strings.xml new file mode 100644 index 00000000..b1d06e4f --- /dev/null +++ b/Samples/SimpleRead.Android/res/values/strings.xml @@ -0,0 +1,7 @@ + + + + SimpleRead + Waiting for frames… + + diff --git a/Samples/SimpleRead.Android/res/values/styles.xml b/Samples/SimpleRead.Android/res/values/styles.xml new file mode 100644 index 00000000..6ce89c7b --- /dev/null +++ b/Samples/SimpleRead.Android/res/values/styles.xml @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/Samples/SimpleRead.Android/src/org/openni/android/samples/simpleread/SimpleReadActivity.java b/Samples/SimpleRead.Android/src/org/openni/android/samples/simpleread/SimpleReadActivity.java new file mode 100644 index 00000000..4baa8c06 --- /dev/null +++ b/Samples/SimpleRead.Android/src/org/openni/android/samples/simpleread/SimpleReadActivity.java @@ -0,0 +1,190 @@ +package org.openni.android.samples.simpleread; + +import java.util.List; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.hardware.usb.UsbDeviceConnection; +import android.os.Bundle; +import android.util.Log; +import android.widget.TextView; + +import org.openni.Device; +import org.openni.DeviceInfo; +import org.openni.OpenNI; +import org.openni.SensorType; +import org.openni.VideoFrameRef; +import org.openni.VideoStream; +import org.openni.android.OpenNIHelper; + +public class SimpleReadActivity + extends Activity + implements OpenNIHelper.DeviceOpenListener { + + private static final String TAG = "SimplerRead"; + private OpenNIHelper mOpenNIHelper; + private UsbDeviceConnection mDeviceConnection; + private boolean mDeviceOpenPending = false; + private Thread mMainLoopThread; + private boolean mShouldRun = true; + private Device mDevice; + private VideoStream mStream; + private TextView mStatusLine; + + @Override + protected void onCreate(Bundle savedInstanceState) { + mOpenNIHelper = new OpenNIHelper(this); + OpenNI.setLogAndroidOutput(true); + OpenNI.setLogMinSeverity(0); + OpenNI.initialize(); + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_simple_read); + mStatusLine = (TextView) findViewById(R.id.status_line); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + + mOpenNIHelper.shutdown(); + OpenNI.shutdown(); + } + + @Override + protected void onResume() { + Log.d(TAG, "onResume"); + + super.onResume(); + + // onResume() is called after the USB permission dialog is closed, in which case, we don't want + // to request device permissions again + if (mDeviceOpenPending) { + return; + } + + // Request opening the first OpenNI-compliant device found + String uri; + + List devices = OpenNI.enumerateDevices(); + if (devices.isEmpty()) { + showAlertAndExit("No OpenNI-compliant device found."); + } + uri = devices.get(0).getUri(); + + mDeviceOpenPending = true; + mOpenNIHelper.requestDeviceOpen(uri, this); + } + + private void showAlertAndExit(String message) { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setMessage(message); + builder.setNeutralButton("OK", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + finish(); + } + }); + builder.show(); + } + + @Override + public void onDeviceOpened(Device aDevice) { + Log.d(TAG, "Permission granted for device " + aDevice.getDeviceInfo().getUri()); + + mDeviceOpenPending = false; + + try { + mDevice = aDevice; + mStream = VideoStream.create(mDevice, SensorType.DEPTH); + mStream.start(); + } catch (RuntimeException e) { + showAlertAndExit("Failed to open stream: " + e.getMessage()); + } + + mShouldRun = true; + mMainLoopThread = new Thread() { + @Override + public void run() { + while (mShouldRun) { + VideoFrameRef frame = null; + + try { + frame = mStream.readFrame(); + // get the middle pixel + int index = frame.getVideoMode().getResolutionY() / 2 * frame.getVideoMode().getResolutionX() + frame.getVideoMode().getResolutionX() / 2; + short depthValue = frame.getData().getShort(index * 2); + updateLabel(String.format("Frame Index: %,d | Timestamp: %.6f seconds | Middle depth value: %,d mm", frame.getFrameIndex(), frame.getTimestamp() / 1e6, depthValue)); + } catch (Exception e) { + Log.e(TAG, "Failed reading frame: " + e); + } + } + }; + }; + + mMainLoopThread.setName("SimpleRead MainLoop Thread"); + mMainLoopThread.start(); + } + + private void stop() { + mShouldRun = false; + + while (mMainLoopThread != null) { + try { + mMainLoopThread.join(); + mMainLoopThread = null; + break; + } catch (InterruptedException e) { + } + } + + if (mStream != null) { + mStream.stop(); + } + + mStatusLine.setText(R.string.waiting_for_frames); + } + + private void updateLabel(final String message) { + runOnUiThread(new Runnable() { + public void run() { + mStatusLine.setText(message); + } + }); + } + + @Override + public void onDeviceOpenFailed(String uri) { + Log.e(TAG, "Failed to open device " + uri); + mDeviceOpenPending = false; + showAlertAndExit("Failed to open device"); + } + + @Override + protected void onPause() { + Log.d(TAG, "onPause"); + + super.onPause(); + + // onPause() is called just before the USB permission dialog is opened, in which case, we don't + // want to shutdown OpenNI + if (mDeviceOpenPending) + return; + + stop(); + + if (mStream != null) { + mStream.destroy(); + mStream = null; + } + + if (mDevice != null) { + mDevice.close(); + mDevice = null; + } + + if (mDeviceConnection != null) { + mDeviceConnection.close(); + mDeviceConnection = null; + } + } +} diff --git a/Samples/SimpleViewer.Android/.classpath b/Samples/SimpleViewer.Android/.classpath new file mode 100644 index 00000000..7bc01d9a --- /dev/null +++ b/Samples/SimpleViewer.Android/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/Samples/SimpleViewer.Android/.project b/Samples/SimpleViewer.Android/.project new file mode 100644 index 00000000..501e0561 --- /dev/null +++ b/Samples/SimpleViewer.Android/.project @@ -0,0 +1,33 @@ + + + SimpleViewer + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/Samples/SimpleViewer.Android/AndroidManifest.xml b/Samples/SimpleViewer.Android/AndroidManifest.xml new file mode 100644 index 00000000..847688ee --- /dev/null +++ b/Samples/SimpleViewer.Android/AndroidManifest.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + diff --git a/Samples/SimpleViewer.Android/build.xml b/Samples/SimpleViewer.Android/build.xml new file mode 100644 index 00000000..acfd02f8 --- /dev/null +++ b/Samples/SimpleViewer.Android/build.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/SimpleViewer.Android/ic_launcher-web.png b/Samples/SimpleViewer.Android/ic_launcher-web.png new file mode 100644 index 0000000000000000000000000000000000000000..a18cbb48c431dfcc163fce2b6e27e981f8c09f6a GIT binary patch literal 51394 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 literal 0 HcmV?d00001 diff --git a/Samples/SimpleViewer.Android/res/drawable-xhdpi/ic_launcher.png b/Samples/SimpleViewer.Android/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d4fb7cd9d868f1d7d9964f1686dcbc018ef9495a GIT binary patch literal 12516 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 literal 0 HcmV?d00001 diff --git a/Samples/SimpleViewer.Android/res/layout/activity_simple_viewer.xml b/Samples/SimpleViewer.Android/res/layout/activity_simple_viewer.xml new file mode 100644 index 00000000..1ce13606 --- /dev/null +++ b/Samples/SimpleViewer.Android/res/layout/activity_simple_viewer.xml @@ -0,0 +1,23 @@ + + + + + + + diff --git a/Samples/SimpleViewer.Android/res/values-sw600dp/dimens.xml b/Samples/SimpleViewer.Android/res/values-sw600dp/dimens.xml new file mode 100644 index 00000000..44f01db7 --- /dev/null +++ b/Samples/SimpleViewer.Android/res/values-sw600dp/dimens.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/Samples/SimpleViewer.Android/res/values-sw720dp-land/dimens.xml b/Samples/SimpleViewer.Android/res/values-sw720dp-land/dimens.xml new file mode 100644 index 00000000..61e3fa8f --- /dev/null +++ b/Samples/SimpleViewer.Android/res/values-sw720dp-land/dimens.xml @@ -0,0 +1,9 @@ + + + + 128dp + + diff --git a/Samples/SimpleViewer.Android/res/values-v11/styles.xml b/Samples/SimpleViewer.Android/res/values-v11/styles.xml new file mode 100644 index 00000000..3c02242a --- /dev/null +++ b/Samples/SimpleViewer.Android/res/values-v11/styles.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/Samples/SimpleViewer.Android/res/values/dimens.xml b/Samples/SimpleViewer.Android/res/values/dimens.xml new file mode 100644 index 00000000..55c1e590 --- /dev/null +++ b/Samples/SimpleViewer.Android/res/values/dimens.xml @@ -0,0 +1,7 @@ + + + + 16dp + 16dp + + diff --git a/Samples/SimpleViewer.Android/res/values/strings.xml b/Samples/SimpleViewer.Android/res/values/strings.xml new file mode 100644 index 00000000..8499e30c --- /dev/null +++ b/Samples/SimpleViewer.Android/res/values/strings.xml @@ -0,0 +1,7 @@ + + + + SimpleViewer + Waiting for frames… + + diff --git a/Samples/SimpleViewer.Android/res/values/styles.xml b/Samples/SimpleViewer.Android/res/values/styles.xml new file mode 100644 index 00000000..6ce89c7b --- /dev/null +++ b/Samples/SimpleViewer.Android/res/values/styles.xml @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/Samples/SimpleViewer.Android/src/org/openni/android/samples/simpleviewer/SimpleViewerActivity.java b/Samples/SimpleViewer.Android/src/org/openni/android/samples/simpleviewer/SimpleViewerActivity.java new file mode 100644 index 00000000..b4d6e2c1 --- /dev/null +++ b/Samples/SimpleViewer.Android/src/org/openni/android/samples/simpleviewer/SimpleViewerActivity.java @@ -0,0 +1,225 @@ +package org.openni.android.samples.simpleviewer; + +import java.util.List; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.hardware.usb.UsbDeviceConnection; +import android.os.Bundle; +import android.util.Log; +import android.view.MotionEvent; +import android.widget.TextView; + +import org.openni.Device; +import org.openni.DeviceInfo; +import org.openni.OpenNI; +import org.openni.SensorType; +import org.openni.VideoFrameRef; +import org.openni.VideoStream; +import org.openni.android.OpenNIHelper; +import org.openni.android.OpenNIView; + +public class SimpleViewerActivity + extends Activity + implements OpenNIHelper.DeviceOpenListener { + + private static final String TAG = "SimplerViewer"; + private OpenNIHelper mOpenNIHelper; + private UsbDeviceConnection mDeviceConnection; + private boolean mDeviceOpenPending = false; + private Thread mMainLoopThread; + private boolean mShouldRun = true; + private Device mDevice; + private VideoStream mStream; + private VideoStream mSecondStream; + private OpenNIView mFrameView; + private TextView mStatusLine; + private int mViewStream = 0; + + @Override + protected void onCreate(Bundle savedInstanceState) { + mOpenNIHelper = new OpenNIHelper(this); + OpenNI.setLogAndroidOutput(true); + OpenNI.setLogMinSeverity(0); + OpenNI.initialize(); + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_simple_viewer); + mFrameView = (OpenNIView) findViewById(R.id.frameView); + mStatusLine = (TextView) findViewById(R.id.status_line); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + + mOpenNIHelper.shutdown(); + OpenNI.shutdown(); + } + + @Override + protected void onResume() { + Log.d(TAG, "onResume"); + + super.onResume(); + + // onResume() is called after the USB permission dialog is closed, in which case, we don't want + // to request device permissions again + if (mDeviceOpenPending) { + return; + } + + // Request opening the first OpenNI-compliant device found + String uri; + + List devices = OpenNI.enumerateDevices(); + if (devices.isEmpty()) { + showAlertAndExit("No OpenNI-compliant device found."); + } + uri = devices.get(0).getUri(); + + mDeviceOpenPending = true; + mOpenNIHelper.requestDeviceOpen(uri, this); + } + + private void showAlertAndExit(String message) { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setMessage(message); + builder.setNeutralButton("OK", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + finish(); + } + }); + builder.show(); + } + + @Override + public void onDeviceOpened(Device aDevice) { + Log.d(TAG, "Permission granted for device " + aDevice.getDeviceInfo().getUri()); + + mDeviceOpenPending = false; + + try { + mDevice = aDevice; + mStream = VideoStream.create(mDevice, SensorType.DEPTH); + mStream.start(); + + if (mDevice.hasSensor(SensorType.COLOR)) { + mSecondStream = VideoStream.create(mDevice, SensorType.COLOR); + mSecondStream.start(); + } else if (mDevice.hasSensor(SensorType.IR)) { + mSecondStream = VideoStream.create(mDevice, SensorType.IR); + mSecondStream.start(); + } + } catch (RuntimeException e) { + showAlertAndExit("Failed to open stream: " + e.getMessage()); + } + + mShouldRun = true; + mMainLoopThread = new Thread() { + @Override + public void run() { + while (mShouldRun) { + VideoStream[] streams = new VideoStream[] { mStream, mSecondStream }; + VideoFrameRef frame = null; + + try { + frame = streams[mViewStream].readFrame(); + // Request rendering of the current OpenNI frame + mFrameView.update(frame); + updateLabel(String.format("Frame Index: %,d | Timestamp: %.6f seconds", frame.getFrameIndex(), frame.getTimestamp() / 1e6)); + } catch (Exception e) { + Log.e(TAG, "Failed reading frame: " + e); + } + } + }; + }; + + mMainLoopThread.setName("SimpleViewer MainLoop Thread"); + mMainLoopThread.start(); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (event.getAction() != MotionEvent.ACTION_DOWN) + return false; + + mViewStream = (mViewStream + 1) % 2; + mFrameView.clear(); + mStatusLine.setText(R.string.waiting_for_frames); + return true; + } + + + private void stop() { + mShouldRun = false; + + while (mMainLoopThread != null) { + try { + mMainLoopThread.join(); + mMainLoopThread = null; + break; + } catch (InterruptedException e) { + } + } + + if (mStream != null) { + mStream.stop(); + } + + if (mSecondStream != null) { + mSecondStream.stop(); + } + + mStatusLine.setText(R.string.waiting_for_frames); + } + + private void updateLabel(final String message) { + runOnUiThread(new Runnable() { + public void run() { + mStatusLine.setText(message); + } + }); + } + + @Override + public void onDeviceOpenFailed(String uri) { + Log.e(TAG, "Failed to open device " + uri); + mDeviceOpenPending = false; + showAlertAndExit("Failed to open device"); + } + + @Override + protected void onPause() { + Log.d(TAG, "onPause"); + + super.onPause(); + + // onPause() is called just before the USB permission dialog is opened, in which case, we don't + // want to shutdown OpenNI + if (mDeviceOpenPending) + return; + + stop(); + + if (mStream != null) { + mStream.destroy(); + mStream = null; + } + + if (mSecondStream != null) { + mSecondStream.destroy(); + mSecondStream = null; + } + + if (mDevice != null) { + mDevice.close(); + mDevice = null; + } + + if (mDeviceConnection != null) { + mDeviceConnection.close(); + mDeviceConnection = null; + } + } +} diff --git a/Source/Core/OniContext.cpp b/Source/Core/OniContext.cpp index 933b9caf..e1f15ed4 100644 --- a/Source/Core/OniContext.cpp +++ b/Source/Core/OniContext.cpp @@ -34,7 +34,8 @@ OniBool Context::s_valid = FALSE; Context::Context() : m_errorLogger(xnl::ErrorLogger::GetInstance()), m_initializationCounter(0), m_lastFPSPrint(0) { - xnOSMemSet(m_overrideDevice, 0, XN_FILE_MAX_PATH); + m_overrideDevice[0] = '\0'; + m_driverRepo[0] = '\0'; } Context::~Context() @@ -42,14 +43,8 @@ Context::~Context() s_valid = FALSE; } -// Dummy function used only for taking its address for the sake of xnOSGetModulePathForProcAddress. -static void dummyFunctionToTakeAddress() {} - OniStatus Context::initialize() { - XnBool repositoryOverridden = FALSE; - XnChar repositoryFromINI[XN_FILE_MAX_PATH] = {0}; - m_initializationCounter++; if (m_initializationCounter > 1) { @@ -57,194 +52,281 @@ OniStatus Context::initialize() return ONI_STATUS_OK; } - XnStatus rc; + XnStatus rc = resolvePathToOpenNI(); + if (rc != XN_STATUS_OK) + { + return OniStatusFromXnStatus(rc); + } + + rc = configure(); + if (rc != XN_STATUS_OK) + { + return OniStatusFromXnStatus(rc); + } + + s_valid = TRUE; + + rc = loadLibraries(); + if (rc == XN_STATUS_OK) + { + m_errorLogger.Clear(); + } + + return OniStatusFromXnStatus(rc); +} + +// Dummy function used only for taking its address for the sake of xnOSGetModulePathForProcAddress. +static void dummyFunctionToTakeAddress() {} + +XnStatus Context::resolvePathToOpenNI() +{ + XnStatus rc = XN_STATUS_OK; XnChar strModulePath[XN_FILE_MAX_PATH]; rc = xnOSGetModulePathForProcAddress(reinterpret_cast(&dummyFunctionToTakeAddress), strModulePath); if (rc != XN_STATUS_OK) { m_errorLogger.Append("Couldn't get the OpenNI shared library module's path: %s", xnGetStatusString(rc)); - return OniStatusFromXnStatus(rc); + return rc; } - XnChar strBaseDir[XN_FILE_MAX_PATH]; - rc = xnOSGetDirName(strModulePath, strBaseDir, XN_FILE_MAX_PATH); + rc = xnOSGetDirName(strModulePath, m_pathToOpenNI, sizeof(m_pathToOpenNI)); if (rc != XN_STATUS_OK) { // Very unlikely to happen, but just in case. m_errorLogger.Append("Couldn't get the OpenNI shared library module's directory: %s", xnGetStatusString(rc)); - return OniStatusFromXnStatus(rc); + return rc; } - s_valid = TRUE; - - // Read configuration file + return XN_STATUS_OK; +} - XnChar strOniConfigurationFile[XN_FILE_MAX_PATH]; - XnBool configurationFileExists = FALSE; +XnStatus Context::resolveConfigurationFile(char* strOniConfigurationFile) +{ + XnStatus rc = XN_STATUS_OK; + XnBool bExists; - // Search the module directory for OpenNI.ini. - xnOSStrCopy(strOniConfigurationFile, strBaseDir, XN_FILE_MAX_PATH); +#if XN_PLATFORM == XN_PLATFORM_ANDROID_ARM + // support for applications + xnOSGetApplicationFilesDir(strOniConfigurationFile, XN_FILE_MAX_PATH); rc = xnOSAppendFilePath(strOniConfigurationFile, ONI_CONFIGURATION_FILE, XN_FILE_MAX_PATH); - if (rc == XN_STATUS_OK) + XN_IS_STATUS_OK(rc); + + xnOSDoesFileExist(strOniConfigurationFile, &bExists); + + if (!bExists) { - xnOSDoesFileExist(strOniConfigurationFile, &configurationFileExists); + // support for native use - search in current dir + rc = xnOSStrCopy(strOniConfigurationFile, ONI_CONFIGURATION_FILE, XN_FILE_MAX_PATH); + XN_IS_STATUS_OK(rc); } -#ifdef ONI_PLATFORM_ANDROID_OS - xnLogSetMaskMinSeverity(XN_LOG_MASK_ALL, (XnLogSeverity)0); - xnLogSetAndroidOutput(TRUE); +#else + xnOSStrCopy(strOniConfigurationFile, m_pathToOpenNI, XN_FILE_MAX_PATH); + rc = xnOSAppendFilePath(strOniConfigurationFile, ONI_CONFIGURATION_FILE, XN_FILE_MAX_PATH); + XN_IS_STATUS_OK(rc); #endif - - if (configurationFileExists) - { - // First, we should process the log related configuration as early as possible. - XnInt32 nValue; - XnChar strLogPath[XN_FILE_MAX_PATH] = {0}; + xnOSDoesFileExist(strOniConfigurationFile, &bExists); - //Test if log redirection is needed - rc = xnOSReadStringFromINI(strOniConfigurationFile, "Log", "LogPath", strLogPath, XN_FILE_MAX_PATH); - if (rc == XN_STATUS_OK) - { - rc = xnLogSetOutputFolder(strLogPath); - if (rc != XN_STATUS_OK) - { - xnLogWarning(XN_MASK_ONI_CONTEXT, "Failed to set log output folder: %s", xnGetStatusString(rc)); - } - else - { - xnLogVerbose(XN_MASK_ONI_CONTEXT, "Log directory redirected to: %s", strLogPath); - } - } + if (!bExists) + { + strOniConfigurationFile[0] = '\0'; + } - rc = xnOSReadIntFromINI(strOniConfigurationFile, "Log", "Verbosity", &nValue); - if (rc == XN_STATUS_OK) - { - xnLogSetMaskMinSeverity(XN_LOG_MASK_ALL, (XnLogSeverity)nValue); - } + return XN_STATUS_OK; +} - rc = xnOSReadIntFromINI(strOniConfigurationFile, "Log", "LogToConsole", &nValue); - if (rc == XN_STATUS_OK) - { - xnLogSetConsoleOutput(nValue == 1); - } - - rc = xnOSReadIntFromINI(strOniConfigurationFile, "Log", "LogToFile", &nValue); - if (rc == XN_STATUS_OK) - { - xnLogSetFileOutput(nValue == 1); - } +XnStatus Context::configure() +{ + XnStatus nRetVal = XN_STATUS_OK; + + XnChar strOniConfigurationFile[XN_FILE_MAX_PATH]; + XnStatus rc = resolveConfigurationFile(strOniConfigurationFile); + if (rc != XN_STATUS_OK) + { + return OniStatusFromXnStatus(rc); + } - // Then, process the other device configurations. +#ifdef ONI_PLATFORM_ANDROID_OS + xnLogSetMaskMinSeverity(XN_LOG_MASK_ALL, (XnLogSeverity)0); + xnLogSetAndroidOutput(TRUE); +#endif + + // First, we should process the log related configuration as early as possible. + XnInt32 nValue; + XnChar strLogPath[XN_FILE_MAX_PATH] = {0}; - rc = xnOSReadStringFromINI(strOniConfigurationFile, "Device", "Override", m_overrideDevice, XN_FILE_MAX_PATH); + //Test if log redirection is needed + rc = xnOSReadStringFromINI(strOniConfigurationFile, "Log", "LogPath", strLogPath, XN_FILE_MAX_PATH); + if (rc == XN_STATUS_OK) + { + rc = xnLogSetOutputFolder(strLogPath); if (rc != XN_STATUS_OK) { - xnLogVerbose(XN_MASK_ONI_CONTEXT, "No override device in configuration file"); + xnLogWarning(XN_MASK_ONI_CONTEXT, "Failed to set log output folder: %s", xnGetStatusString(rc)); } - - rc = xnOSReadStringFromINI(strOniConfigurationFile, "Drivers", "Repository", repositoryFromINI, XN_FILE_MAX_PATH); - if (rc == XN_STATUS_OK) + else { - repositoryOverridden = TRUE; + xnLogVerbose(XN_MASK_ONI_CONTEXT, "Log directory redirected to: %s", strLogPath); } + } + rc = xnOSReadIntFromINI(strOniConfigurationFile, "Log", "Verbosity", &nValue); + if (rc == XN_STATUS_OK) + { + xnLogSetMaskMinSeverity(XN_LOG_MASK_ALL, (XnLogSeverity)nValue); + } - - xnLogVerbose(XN_MASK_ONI_CONTEXT, "Configuration has been read from '%s'", strOniConfigurationFile); + rc = xnOSReadIntFromINI(strOniConfigurationFile, "Log", "LogToConsole", &nValue); + if (rc == XN_STATUS_OK) + { + xnLogSetConsoleOutput(nValue == 1); } - else + + rc = xnOSReadIntFromINI(strOniConfigurationFile, "Log", "LogToFile", &nValue); + if (rc == XN_STATUS_OK) { - xnLogVerbose(XN_MASK_ONI_CONTEXT, "Couldn't find configuration file '%s'", strOniConfigurationFile); + xnLogSetFileOutput(nValue == 1); } + // Now that log was configured, we can start issues some log entries xnLogVerbose(XN_MASK_ONI_CONTEXT, "OpenNI %s", ONI_VERSION_STRING); + if (strOniConfigurationFile[0] != '\0') + { + xnLogVerbose(XN_MASK_ONI_CONTEXT, "Configuration file found at '%s'", strOniConfigurationFile); + } - // Resolve the drive path based on the module's directory. - XnChar strDriverPath[XN_FILE_MAX_PATH]; - xnOSStrCopy(strDriverPath, strBaseDir, XN_FILE_MAX_PATH); - - if (repositoryOverridden) + // Then, process the other device configurations. + rc = xnOSReadStringFromINI(strOniConfigurationFile, "Device", "Override", m_overrideDevice, sizeof(m_overrideDevice)); + if (rc == XN_STATUS_OK) { - xnLogVerbose(XN_MASK_ONI_CONTEXT, "Extending the driver path by '%s', as configured in file '%s'", repositoryFromINI, strOniConfigurationFile); - rc = xnOSAppendFilePath(strDriverPath, repositoryFromINI, XN_FILE_MAX_PATH); + xnLogWarning(XN_MASK_ONI_CONTEXT, "Device will be overridden with '%s'", m_overrideDevice); } - else + + XnChar strRepo[XN_FILE_MAX_PATH]; + +#if XN_PLATFORM != XN_PLATFORM_ANDROID_ARM + xnOSStrCopy(strRepo, ONI_DEFAULT_DRIVERS_REPOSITORY, sizeof(strRepo)); +#endif + + // check if repo was overridden + XnChar strTemp[XN_INI_MAX_LEN]; + rc = xnOSReadStringFromINI(strOniConfigurationFile, "Drivers", "Repository", strTemp, sizeof(strTemp)); + if (rc == XN_STATUS_OK) { - rc = xnOSAppendFilePath(strDriverPath, ONI_DEFAULT_DRIVERS_REPOSITORY, XN_FILE_MAX_PATH); + xnOSStrCopy(strRepo, strTemp, sizeof(strRepo)); } + rc = xnOSStrCopy(m_driverRepo, m_pathToOpenNI, sizeof(m_driverRepo)); + XN_IS_STATUS_OK(nRetVal); + rc = xnOSAppendFilePath(m_driverRepo, strRepo, sizeof(m_driverRepo)); if (rc != XN_STATUS_OK) { + xnLogError(XN_MASK_ONI_CONTEXT, "Driver path is too long!"); m_errorLogger.Append("The driver path gets too long"); - return OniStatusFromXnStatus(rc); + return rc; } - xnLogVerbose(XN_MASK_ONI_CONTEXT, "Using '%s' as driver path", strDriverPath); - rc = loadLibraries(strDriverPath); +#if XN_PLATFORM == XN_PLATFORM_ANDROID_ARM + m_driversList.AddLast("libOniFile.so"); + m_driversList.AddLast("libPS1080.so"); + m_driversList.AddLast("libPSLink.so"); +#endif + // check if driver list is overridden + XnChar strDriversList[2048]; + rc = xnOSReadStringFromINI(strOniConfigurationFile, "Drivers", "List", strDriversList, sizeof(strDriversList)); if (rc == XN_STATUS_OK) { - m_errorLogger.Clear(); + m_driversList.Clear(); + + // parse list + xnl::FileName driver; + int driverLen = 0; + + for (XnChar* c = strDriversList; ; ++c) + { + if (*c == ',' || *c == '\0') + { + driver[driverLen++] = '\0'; + rc = m_driversList.AddLast(driver); + XN_IS_STATUS_OK(rc); + driverLen = 0; + + if (*c == '\0') + break; + } + else + { + driver[driverLen++] = *c; + } + } } - return OniStatusFromXnStatus(rc); + return (XN_STATUS_OK); } -XnStatus Context::loadLibraries(const char* directoryName) + +XnStatus Context::loadLibraries() { XnStatus nRetVal; - // Get a file list of Xiron devices + xnLogVerbose(XN_MASK_ONI_CONTEXT, "Using '%s' as driver path", m_driverRepo); - XnInt32 nFileCount = 0; - typedef XnChar FileName[XN_FILE_MAX_PATH]; - FileName* acsFileList = NULL; + if (m_driversList.IsEmpty()) + { + // search repo for drivers + XnInt32 nFileCount = 0; + XnChar cpSearchString[XN_FILE_MAX_PATH] = ""; -#if (ONI_PLATFORM != ONI_PLATFORM_ANDROID_ARM) - XnChar cpSearchString[XN_FILE_MAX_PATH] = ""; + xnLogVerbose(XN_MASK_ONI_CONTEXT, "Looking for drivers at '%s'", m_driverRepo); - xnLogVerbose(XN_MASK_ONI_CONTEXT, "Looking for drivers in drivers repository '%s'", directoryName); + // Build the search pattern string + XN_VALIDATE_STR_APPEND(cpSearchString, m_driverRepo, XN_FILE_MAX_PATH, nRetVal); + XN_VALIDATE_STR_APPEND(cpSearchString, XN_FILE_DIR_SEP, XN_FILE_MAX_PATH, nRetVal); + XN_VALIDATE_STR_APPEND(cpSearchString, XN_SHARED_LIBRARY_PREFIX, XN_FILE_MAX_PATH, nRetVal); + XN_VALIDATE_STR_APPEND(cpSearchString, XN_FILE_ALL_WILDCARD, XN_FILE_MAX_PATH, nRetVal); + XN_VALIDATE_STR_APPEND(cpSearchString, XN_SHARED_LIBRARY_POSTFIX, XN_FILE_MAX_PATH, nRetVal); - // Build the search pattern string - XN_VALIDATE_STR_APPEND(cpSearchString, directoryName, XN_FILE_MAX_PATH, nRetVal); - XN_VALIDATE_STR_APPEND(cpSearchString, XN_FILE_DIR_SEP, XN_FILE_MAX_PATH, nRetVal); - XN_VALIDATE_STR_APPEND(cpSearchString, XN_SHARED_LIBRARY_PREFIX, XN_FILE_MAX_PATH, nRetVal); - XN_VALIDATE_STR_APPEND(cpSearchString, XN_FILE_ALL_WILDCARD, XN_FILE_MAX_PATH, nRetVal); - XN_VALIDATE_STR_APPEND(cpSearchString, XN_SHARED_LIBRARY_POSTFIX, XN_FILE_MAX_PATH, nRetVal); + nRetVal = xnOSCountFiles(cpSearchString, &nFileCount); + if (nRetVal != XN_STATUS_OK || nFileCount == 0) + { + xnLogError(XN_MASK_ONI_CONTEXT, "Found no drivers matching '%s'", cpSearchString); + m_errorLogger.Append("Found no files matching '%s'", cpSearchString); + return XN_STATUS_NO_MODULES_FOUND; + } - nRetVal = xnOSCountFiles(cpSearchString, &nFileCount); - if (nRetVal != XN_STATUS_OK || nFileCount == 0) - { - xnLogError(XN_MASK_ONI_CONTEXT, "Found no drivers matching '%s'", cpSearchString); - m_errorLogger.Append("Found no files matching '%s'", cpSearchString); - return XN_STATUS_NO_MODULES_FOUND; - } + nRetVal = m_driversList.SetSize(nFileCount); + XN_IS_STATUS_OK(nRetVal); - acsFileList = XN_NEW_ARR(FileName, nFileCount); - nRetVal = xnOSGetFileList(cpSearchString, NULL, acsFileList, nFileCount, &nFileCount); -#else - // Android - nFileCount = 3; - acsFileList = XN_NEW_ARR(FileName, nFileCount); - strcpy(acsFileList[0], "libPS1080.so"); - strcpy(acsFileList[1], "libOniFile.so"); - strcpy(acsFileList[2], "libPSLink.so"); -#endif + typedef XnChar MyFileName[XN_FILE_MAX_PATH]; + MyFileName* acsFileList = XN_NEW_ARR(MyFileName, nFileCount); + + nRetVal = xnOSGetFileList(cpSearchString, NULL, acsFileList, nFileCount, &nFileCount); + XN_IS_STATUS_OK(nRetVal); + + for (int i = 0; i < nFileCount; ++i) + { + m_driversList[i] = acsFileList[i]; + } + + XN_DELETE_ARR(acsFileList); + } // Save directory XnChar workingDir[XN_FILE_MAX_PATH]; xnOSGetCurrentDir(workingDir, XN_FILE_MAX_PATH); // Change directory - xnOSSetCurrentDir(directoryName); + xnOSSetCurrentDir(m_driverRepo); - for (int i = 0; i < nFileCount; ++i) + for (XnUInt32 i = 0; i < m_driversList.GetSize(); ++i) { - DeviceDriver* pDeviceDriver = XN_NEW(DeviceDriver, acsFileList[i], m_frameManager, m_errorLogger); + xnLogVerbose(XN_MASK_ONI_CONTEXT, "Loading device driver '%s'...", m_driversList[i].getData()); + DeviceDriver* pDeviceDriver = XN_NEW(DeviceDriver, m_driversList[i].getData(), m_frameManager, m_errorLogger); if (pDeviceDriver == NULL || !pDeviceDriver->isValid()) { - xnLogVerbose(XN_MASK_ONI_CONTEXT, "Couldn't use file '%s' as a device driver", acsFileList[i]); - m_errorLogger.Append("Couldn't understand file '%s' as a device driver", acsFileList[i]); + xnLogWarning(XN_MASK_ONI_CONTEXT, "Couldn't use file '%s' as a device driver", m_driversList[i].getData()); + m_errorLogger.Append("Couldn't understand file '%s' as a device driver", m_driversList[i].getData()); XN_DELETE(pDeviceDriver); continue; } @@ -254,8 +336,8 @@ XnStatus Context::loadLibraries(const char* directoryName) pDeviceDriver->registerDeviceStateChangedCallback(deviceDriver_DeviceStateChanged, this, dummy); if (!pDeviceDriver->initialize()) { - xnLogVerbose(XN_MASK_ONI_CONTEXT, "Couldn't use file '%s' as a device driver", acsFileList[i]); - m_errorLogger.Append("Couldn't initialize device driver from file '%s'", acsFileList[i]); + xnLogVerbose(XN_MASK_ONI_CONTEXT, "Couldn't use file '%s' as a device driver", m_driversList[i].getData()); + m_errorLogger.Append("Couldn't initialize device driver from file '%s'", m_driversList[i].getData()); XN_DELETE(pDeviceDriver); continue; } @@ -270,14 +352,13 @@ XnStatus Context::loadLibraries(const char* directoryName) if (m_deviceDrivers.Size() == 0) { xnLogError(XN_MASK_ONI_CONTEXT, "Found no valid drivers"); - m_errorLogger.Append("Found no valid drivers in '%s'", directoryName); + m_errorLogger.Append("Found no valid drivers"); return XN_STATUS_NO_MODULES_FOUND; } - XN_DELETE_ARR(acsFileList); - return XN_STATUS_OK; } + void Context::shutdown() { --m_initializationCounter; @@ -327,6 +408,11 @@ void Context::shutdown() m_cs.Unlock(); + m_overrideDevice[0] = '\0'; + m_driverRepo[0] = '\0'; + m_pathToOpenNI[0] = '\0'; + m_driversList.Clear(); + xnLogVerbose(XN_MASK_ONI_CONTEXT, "Shutdown: successful."); xnLogClose(); } diff --git a/Source/Core/OniContext.h b/Source/Core/OniContext.h index 6da4eced..3d915d11 100644 --- a/Source/Core/OniContext.h +++ b/Source/Core/OniContext.h @@ -25,12 +25,14 @@ #include "OniRecorder.h" #include "OniFrameManager.h" -#include "XnList.h" -#include "XnHash.h" -#include "XnEvent.h" #include "OniDriverHandler.h" #include "OniCommon.h" +#include +#include +#include +#include + struct _OniDevice { oni::implementation::Device* pDevice; @@ -112,7 +114,10 @@ class Context Context(const Context& other); Context& operator=(const Context&other); - XnStatus loadLibraries(const char* directoryName); + XnStatus resolvePathToOpenNI(); + XnStatus configure(); + XnStatus resolveConfigurationFile(char* strConfigurationFile); + XnStatus loadLibraries(); void onNewFrame(); XN_EVENT_HANDLE getThreadEvent(); static void XN_CALLBACK_TYPE newFrameCallback(void* pCookie); @@ -134,7 +139,10 @@ class Context xnl::CriticalSection m_cs; + char m_pathToOpenNI[XN_FILE_MAX_PATH]; char m_overrideDevice[XN_FILE_MAX_PATH]; + char m_driverRepo[XN_FILE_MAX_PATH]; + xnl::Array m_driversList; int m_initializationCounter; XnUInt64 m_lastFPSPrint; diff --git a/Source/Documentation/Doxyfile b/Source/Documentation/Doxyfile index 6ba86238..4e99f61d 100644 --- a/Source/Documentation/Doxyfile +++ b/Source/Documentation/Doxyfile @@ -885,7 +885,7 @@ GENERATE_HTML = YES # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. -HTML_OUTPUT = html +HTML_OUTPUT = cpp # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank diff --git a/Source/Documentation/Runme.py b/Source/Documentation/Runme.py index b0b87282..4b864b1f 100755 --- a/Source/Documentation/Runme.py +++ b/Source/Documentation/Runme.py @@ -38,7 +38,7 @@ def create_page(orig_path, page_name, page_header): else: javaDocExe = 'javadoc' -javaSrc = os.path.join('..', '..', 'Wrappers', 'java', 'OpenNI.java', 'src', 'org', 'openni') +javaSrc = os.path.join('..', '..', 'Wrappers', 'java', 'src', 'org', 'openni') # workaround a strange linux behavior where you must pass the list of files cmd = [javaDocExe, '-d', 'java'] diff --git a/Source/Drivers/PS1080/Sensor/XnSensor.cpp b/Source/Drivers/PS1080/Sensor/XnSensor.cpp index 00c5c41c..abba8e8e 100644 --- a/Source/Drivers/PS1080/Sensor/XnSensor.cpp +++ b/Source/Drivers/PS1080/Sensor/XnSensor.cpp @@ -702,10 +702,34 @@ XnStatus XnSensor::ValidateSensorID(XnChar* csSensorID) XnStatus XnSensor::ResolveGlobalConfigFileName(XnChar* strConfigFile, XnUInt32 nBufSize, const XnChar* strConfigDir) { + XnStatus rc = XN_STATUS_OK; + // If strConfigDir is NULL, tries to resolve the config file based on the driver's directory XnChar strBaseDir[XN_FILE_MAX_PATH]; if (strConfigDir == NULL) { +#if XN_PLATFORM == XN_PLATFORM_ANDROID_ARM + // support for applications + xnOSGetApplicationFilesDir(strBaseDir, nBufSize); + + XnChar strTempFileName[XN_FILE_MAX_PATH]; + xnOSStrCopy(strTempFileName, strBaseDir, sizeof(strTempFileName)); + rc = xnOSAppendFilePath(strTempFileName, XN_GLOBAL_CONFIG_FILE_NAME, sizeof(strTempFileName)); + XN_IS_STATUS_OK(rc); + + XnBool bExists; + xnOSDoesFileExist(strTempFileName, &bExists); + + if (bExists) + { + strConfigDir = strBaseDir; + } + else + { + // support for native use - search in current dir + strConfigDir = "."; + } +#else if (xnOSGetModulePathForProcAddress(reinterpret_cast(&XnSensor::ResolveGlobalConfigFileName), strBaseDir) == XN_STATUS_OK && xnOSGetDirName(strBaseDir, strBaseDir, XN_FILE_MAX_PATH) == XN_STATUS_OK) { @@ -717,9 +741,9 @@ XnStatus XnSensor::ResolveGlobalConfigFileName(XnChar* strConfigFile, XnUInt32 n // Something wrong happened. Use the current directory as the fallback. strConfigDir = "."; } +#endif } - XnStatus rc; XN_VALIDATE_STR_COPY(strConfigFile, strConfigDir, nBufSize, rc); return xnOSAppendFilePath(strConfigFile, XN_GLOBAL_CONFIG_FILE_NAME, nBufSize); } diff --git a/Source/Drivers/PSLink/DriverImpl/LinkOniDriver.cpp b/Source/Drivers/PSLink/DriverImpl/LinkOniDriver.cpp index eee80b12..9a69da8a 100644 --- a/Source/Drivers/PSLink/DriverImpl/LinkOniDriver.cpp +++ b/Source/Drivers/PSLink/DriverImpl/LinkOniDriver.cpp @@ -27,6 +27,8 @@ #include #include +#define LINK_CONFIGURATION_FILE "PSLink.ini" + //--------------------------------------------------------------------------- // LinkOniDriver class //--------------------------------------------------------------------------- @@ -292,6 +294,21 @@ void LinkOniDriver::resolveConfigFilePath() { XnChar strModulePath[XN_FILE_MAX_PATH]; +#if XN_PLATFORM == XN_PLATFORM_ANDROID_ARM + XnStatus rc = XN_STATUS_OK; + // support for applications + xnOSGetApplicationFilesDir(strModulePath, XN_FILE_MAX_PATH); + xnOSAppendFilePath(strModulePath, LINK_CONFIGURATION_FILE, XN_FILE_MAX_PATH); + + XnBool bExists; + xnOSDoesFileExist(strModulePath, &bExists); + + if (!bExists) + { + // support for native use - search in current dir + xnOSStrCopy(strModulePath, LINK_CONFIGURATION_FILE, XN_FILE_MAX_PATH); + } +#else if (xnOSGetModulePathForProcAddress(reinterpret_cast(&LinkOniDriver::OnDeviceConnected), strModulePath) != XN_STATUS_OK || xnOSGetDirName(strModulePath, m_configFilePath, sizeof(m_configFilePath)) != XN_STATUS_OK) { @@ -300,5 +317,6 @@ void LinkOniDriver::resolveConfigFilePath() } xnOSAppendFilePath(m_configFilePath, "PSLink.ini", sizeof(m_configFilePath)); +#endif } diff --git a/Source/Drivers/PSLink/LinkProtoLib/XnLinkFrameInputStream.cpp b/Source/Drivers/PSLink/LinkProtoLib/XnLinkFrameInputStream.cpp index 821889e9..40f2f0a9 100644 --- a/Source/Drivers/PSLink/LinkProtoLib/XnLinkFrameInputStream.cpp +++ b/Source/Drivers/PSLink/LinkProtoLib/XnLinkFrameInputStream.cpp @@ -662,7 +662,7 @@ LinkMsgParser* LinkFrameInputStream::CreateLinkMsgParser() if (pixelFormat != XN_FW_PIXEL_FORMAT_SHIFTS_9_3) { xnLogError(XN_MASK_LINK, "Cannot convert from pixel format %d to depth!", pixelFormat); - XN_ASSERT(pixelFormat == XN_LINK_PIXEL_FORMAT_SHIFTS_9_3); + XN_ASSERT(pixelFormat == XN_FW_PIXEL_FORMAT_SHIFTS_9_3); return NULL; } @@ -687,7 +687,7 @@ LinkMsgParser* LinkFrameInputStream::CreateLinkMsgParser() if (pixelFormat != XN_FW_PIXEL_FORMAT_YUV422) { xnLogError(XN_MASK_LINK, "Cannot convert from pixel format %d to YUV422!", pixelFormat); - XN_ASSERT(pixelFormat == XN_LINK_PIXEL_FORMAT_YUV422); + XN_ASSERT(pixelFormat == XN_FW_PIXEL_FORMAT_YUV422); return NULL; } diff --git a/Source/Tools/NiViewer.Android/.classpath b/Source/Tools/NiViewer.Android/.classpath new file mode 100644 index 00000000..7bc01d9a --- /dev/null +++ b/Source/Tools/NiViewer.Android/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/Source/Tools/NiViewer.Android/.project b/Source/Tools/NiViewer.Android/.project new file mode 100644 index 00000000..e85a89d0 --- /dev/null +++ b/Source/Tools/NiViewer.Android/.project @@ -0,0 +1,33 @@ + + + NiViewer + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/Source/Tools/NiViewer.Android/AndroidManifest.xml b/Source/Tools/NiViewer.Android/AndroidManifest.xml new file mode 100644 index 00000000..7fc81738 --- /dev/null +++ b/Source/Tools/NiViewer.Android/AndroidManifest.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + diff --git a/Source/Tools/NiViewer.Android/build.xml b/Source/Tools/NiViewer.Android/build.xml new file mode 100644 index 00000000..f0f9ddd1 --- /dev/null +++ b/Source/Tools/NiViewer.Android/build.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/Tools/NiViewer.Android/ic_launcher-web.png b/Source/Tools/NiViewer.Android/ic_launcher-web.png new file mode 100644 index 0000000000000000000000000000000000000000..a18cbb48c431dfcc163fce2b6e27e981f8c09f6a GIT binary patch literal 51394 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 literal 0 HcmV?d00001 diff --git a/Source/Tools/NiViewer.Android/res/drawable-xhdpi/ic_launcher.png b/Source/Tools/NiViewer.Android/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d4fb7cd9d868f1d7d9964f1686dcbc018ef9495a GIT binary patch literal 12516 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 literal 0 HcmV?d00001 diff --git a/Source/Tools/NiViewer.Android/res/layout/activity_simple_viewer.xml b/Source/Tools/NiViewer.Android/res/layout/activity_simple_viewer.xml new file mode 100644 index 00000000..8d64d913 --- /dev/null +++ b/Source/Tools/NiViewer.Android/res/layout/activity_simple_viewer.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Source/Tools/NiViewer.Android/res/menu/simple_viewer.xml b/Source/Tools/NiViewer.Android/res/menu/simple_viewer.xml new file mode 100644 index 00000000..b0f65bfc --- /dev/null +++ b/Source/Tools/NiViewer.Android/res/menu/simple_viewer.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/Source/Tools/NiViewer.Android/res/values-sw600dp/dimens.xml b/Source/Tools/NiViewer.Android/res/values-sw600dp/dimens.xml new file mode 100644 index 00000000..44f01db7 --- /dev/null +++ b/Source/Tools/NiViewer.Android/res/values-sw600dp/dimens.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/Source/Tools/NiViewer.Android/res/values-sw720dp-land/dimens.xml b/Source/Tools/NiViewer.Android/res/values-sw720dp-land/dimens.xml new file mode 100644 index 00000000..61e3fa8f --- /dev/null +++ b/Source/Tools/NiViewer.Android/res/values-sw720dp-land/dimens.xml @@ -0,0 +1,9 @@ + + + + 128dp + + diff --git a/Source/Tools/NiViewer.Android/res/values-v11/styles.xml b/Source/Tools/NiViewer.Android/res/values-v11/styles.xml new file mode 100644 index 00000000..3c02242a --- /dev/null +++ b/Source/Tools/NiViewer.Android/res/values-v11/styles.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/Source/Tools/NiViewer.Android/res/values/dimens.xml b/Source/Tools/NiViewer.Android/res/values/dimens.xml new file mode 100644 index 00000000..55c1e590 --- /dev/null +++ b/Source/Tools/NiViewer.Android/res/values/dimens.xml @@ -0,0 +1,7 @@ + + + + 16dp + 16dp + + diff --git a/Source/Tools/NiViewer.Android/res/values/strings.xml b/Source/Tools/NiViewer.Android/res/values/strings.xml new file mode 100644 index 00000000..4f0c2688 --- /dev/null +++ b/Source/Tools/NiViewer.Android/res/values/strings.xml @@ -0,0 +1,11 @@ + + + + NiViewer + Sensor Type + Video Mode + Waiting for frames… + Start Recording + Stop Recording + + diff --git a/Source/Tools/NiViewer.Android/res/values/styles.xml b/Source/Tools/NiViewer.Android/res/values/styles.xml new file mode 100644 index 00000000..6ce89c7b --- /dev/null +++ b/Source/Tools/NiViewer.Android/res/values/styles.xml @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/Source/Tools/NiViewer.Android/src/org/openni/android/tools/niviewer/NiViewerActivity.java b/Source/Tools/NiViewer.Android/src/org/openni/android/tools/niviewer/NiViewerActivity.java new file mode 100644 index 00000000..bfd51d1e --- /dev/null +++ b/Source/Tools/NiViewer.Android/src/org/openni/android/tools/niviewer/NiViewerActivity.java @@ -0,0 +1,408 @@ +package org.openni.android.tools.niviewer; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.concurrent.TimeoutException; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.hardware.usb.UsbDeviceConnection; +import android.os.Bundle; +import android.os.Environment; +import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemSelectedListener; +import android.widget.ArrayAdapter; +import android.widget.Spinner; +import android.widget.TextView; + +import org.openni.Device; +import org.openni.DeviceInfo; +import org.openni.OpenNI; +import org.openni.Recorder; +import org.openni.SensorType; +import org.openni.VideoFrameRef; +import org.openni.VideoMode; +import org.openni.VideoStream; +import org.openni.android.OpenNIHelper; +import org.openni.android.OpenNIView; + +public class NiViewerActivity + extends Activity + implements OpenNIHelper.DeviceOpenListener { + + private static final String TAG = "NiViewer"; + private OpenNIHelper mOpenNIHelper; + private UsbDeviceConnection mDeviceConnection; + private boolean mDeviceOpenPending = false; + private Thread mMainLoopThread; + private boolean mShouldRun = true; + private Device mDevice; + private VideoStream mStream; + private Recorder mRecorder; + private String mRecordingName; + private Spinner mSensorSpinner; + private List mDeviceSensors; + private List mStreamVideoModes; + private Spinner mVideoModeSpinner; + private OpenNIView mFrameView; + private TextView mStatusLine; + private String mRecording; + private static SensorType[] SENSORS = { SensorType.DEPTH, SensorType.COLOR, SensorType.IR }; + private static CharSequence[] SENSOR_NAMES = { "Depth", "Color", "IR" }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + mOpenNIHelper = new OpenNIHelper(this); + OpenNI.setLogAndroidOutput(true); + OpenNI.setLogMinSeverity(0); + OpenNI.initialize(); + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_simple_viewer); + mSensorSpinner = (Spinner) findViewById(R.id.spinnerSensor); + mVideoModeSpinner = (Spinner) findViewById(R.id.spinnerVideoMode); + mFrameView = (OpenNIView) findViewById(R.id.frameView); + mStatusLine = (TextView) findViewById(R.id.status_line); + + mSensorSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, + int position, long id) { + onSensorSelected(position); + } + + @Override + public void onNothingSelected(AdapterView parent) { + } + }); + + mVideoModeSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, + int position, long id) { + onVideoModeSelected(position); + } + + @Override + public void onNothingSelected(AdapterView parent) { + } + }); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.simple_viewer, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.record: + toggleRecording(item); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + + mOpenNIHelper.shutdown(); + OpenNI.shutdown(); + } + + @Override + protected void onStart() { + Log.d(TAG, "onStart"); + super.onStart(); + + final android.content.Intent intent = getIntent (); + + if (intent != null) { + final android.net.Uri data = intent.getData (); + if (data != null) { + mRecording = data.getEncodedPath (); + Log.d(TAG, "Will open file " + mRecording); + } + } + } + + @Override + protected void onResume() { + Log.d(TAG, "onResume"); + + super.onResume(); + + // onResume() is called after the USB permission dialog is closed, in which case, we don't want + // to request device permissions again + if (mDeviceOpenPending) { + return; + } + + // Request opening the first OpenNI-compliant device found + String uri; + + if (mRecording != null) { + uri = mRecording; + } else { + List devices = OpenNI.enumerateDevices(); + if (devices.isEmpty()) { + showAlertAndExit("No OpenNI-compliant device found."); + } + uri = devices.get(0).getUri(); + } + + mDeviceOpenPending = true; + mOpenNIHelper.requestDeviceOpen(uri, this); + } + + private void showAlert(String message) { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setMessage(message); + builder.show(); + } + + private void showAlertAndExit(String message) { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setMessage(message); + builder.setNeutralButton("OK", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + finish(); + } + }); + builder.show(); + } + + @Override + public void onDeviceOpened(Device aDevice) { + Log.d(TAG, "Permission granted for device " + aDevice.getDeviceInfo().getUri()); + + mDeviceOpenPending = false; + + mDevice = aDevice; + mDeviceSensors = new ArrayList(); + + List sensors = new ArrayList(); + + for (int i = 0; i < SENSORS.length; ++i) { + if (mDevice.hasSensor(SENSORS[i])) { + sensors.add(SENSOR_NAMES[i]); + mDeviceSensors.add(SENSORS[i]); + } + } + + ArrayAdapter sensorsAdapter = new ArrayAdapter(this, + android.R.layout.simple_spinner_item, sensors); + sensorsAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + mSensorSpinner.setAdapter(sensorsAdapter); + + mSensorSpinner.setSelection(0); + } + + private void onSensorSelected(int pos) { + try { + stop(); + + if (mStream != null) { + mStream.destroy(); + mStream = null; + } + + mStream = VideoStream.create(mDevice, mDeviceSensors.get(pos)); + List videoModesNames = new ArrayList(); + + mStreamVideoModes = mStream.getSensorInfo().getSupportedVideoModes(); + for (int i = 0; i < mStreamVideoModes.size(); ++i) { + VideoMode mode = mStreamVideoModes.get(i); + + videoModesNames.add(String.format("%d x %d @ %d FPS (%s)", + mode.getResolutionX(), + mode.getResolutionY(), + mode.getFps(), + pixelFormatToName(mode.getPixelFormat()))); + } + + ArrayAdapter videoModesAdapter = new ArrayAdapter(this, + android.R.layout.simple_spinner_item, videoModesNames); + videoModesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + mVideoModeSpinner.setAdapter(videoModesAdapter); + + // use default mode + VideoMode currentMode = mStream.getVideoMode(); + int selected = mStreamVideoModes.indexOf(currentMode); + if (selected == -1) { + selected = 0; + } + + mVideoModeSpinner.setSelection(selected); + } catch (RuntimeException e) { + showAlert("Failed to switch to stream: " + e.getMessage()); + } + } + + private CharSequence pixelFormatToName(org.openni.PixelFormat format) { + switch (format) { + case DEPTH_1_MM: return "1 mm"; + case DEPTH_100_UM: return "100 um"; + case SHIFT_9_2: return "9.2"; + case SHIFT_9_3: return "9.3"; + case RGB888: return "RGB"; + case GRAY8: return "Gray8"; + case GRAY16: return "Gray16"; + case YUV422: return "YUV422"; + case YUYV: return "YUYV"; + default: return "UNKNOWN"; + } + } + + private void onVideoModeSelected(int pos) { + try { + stop(); + + mStream.setVideoMode(mStreamVideoModes.get(pos)); + mStream.start(); + } catch (RuntimeException e) { + showAlert("Failed to switch to video mode: " + e.getMessage()); + } + + mShouldRun = true; + mMainLoopThread = new Thread() { + @Override + public void run() { + List streams = new ArrayList(); + streams.add(mStream); + + while (mShouldRun) { + VideoFrameRef frame = null; + + try { + OpenNI.waitForAnyStream(streams, 100); + frame = mStream.readFrame(); + + // Request rendering of the current OpenNI frame + mFrameView.update(frame); + updateLabel(String.format("Frame Index: %,d | Timestamp: %,d", frame.getFrameIndex(), frame.getTimestamp())); + + } catch (TimeoutException e) { + } catch (Exception e) { + Log.e(TAG, "Failed reading frame: " + e); + } + } + }; + }; + + mMainLoopThread.setName("SimpleViewer MainLoop Thread"); + mMainLoopThread.start(); + } + + private void stop() { + mShouldRun = false; + + while (mMainLoopThread != null) { + try { + mMainLoopThread.join(); + mMainLoopThread = null; + break; + } catch (InterruptedException e) { + } + } + + if (mStream != null) { + mStream.stop(); + } + + mFrameView.clear(); + mStatusLine.setText(R.string.waiting_for_frames); + } + + @SuppressLint("SimpleDateFormat") + private void toggleRecording(MenuItem item) { + if (mRecorder == null) { + mRecordingName = Environment.getExternalStorageDirectory().getPath() + + "/" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".oni"; + + try { + mRecorder = Recorder.create(mRecordingName); + mRecorder.addStream(mStream, true); + mRecorder.start(); + } catch (RuntimeException ex) { + mRecorder = null; + showAlert("Failed to start recording: " + ex.getMessage()); + return; + } + + item.setTitle(R.string.stop_record); + } else { + stopRecording(); + item.setTitle(R.string.start_record); + } + } + + private void stopRecording() { + if (mRecorder != null) { + mRecorder.stop(); + mRecorder.destroy(); + mRecorder = null; + + showAlert("Recording saved to: " + mRecordingName); + mRecordingName = null; + } + } + + private void updateLabel(final String message) { + runOnUiThread(new Runnable() { + public void run() { + mStatusLine.setText(message); + } + }); + } + + @Override + public void onDeviceOpenFailed(String uri) { + Log.e(TAG, "Failed to open device " + uri); + mDeviceOpenPending = false; + showAlertAndExit("Failed to open device"); + } + + @Override + protected void onPause() { + Log.d(TAG, "onPause"); + + super.onPause(); + + // onPause() is called just before the USB permission dialog is opened, in which case, we don't + // want to shutdown OpenNI + if (mDeviceOpenPending) + return; + + stop(); + + stopRecording(); + + if (mStream != null) { + mStream.destroy(); + mStream = null; + } + + if (mDevice != null) { + mDevice.close(); + mDevice = null; + } + + if (mDeviceConnection != null) { + mDeviceConnection.close(); + mDeviceConnection = null; + } + } +} diff --git a/ThirdParty/PSCommon/XnLib/Include/XnSimpleString.h b/ThirdParty/PSCommon/XnLib/Include/XnSimpleString.h new file mode 100644 index 00000000..9b5a1472 --- /dev/null +++ b/ThirdParty/PSCommon/XnLib/Include/XnSimpleString.h @@ -0,0 +1,82 @@ +#ifndef _XN_SIMPLE_STRING_H_ +#define _XN_SIMPLE_STRING_H_ + +#include "XnOSStrings.h" + +namespace xnl +{ + +template +class SimpleString +{ +public: + SimpleString() + { + m_data[0] = '\0'; + } + + ~SimpleString() + {} + + SimpleString(const char* str) + { + xnOSStrCopy(m_data, str, sizeof(m_data)); + } + + SimpleString(const SimpleString& other) + { + xnOSStrCopy(m_data, other.m_data, sizeof(m_data)); + } + + SimpleString& operator=(const SimpleString& other) + { + xnOSStrCopy(m_data, other.m_data, sizeof(m_data)); + return *this; + } + + bool operator==(const SimpleString& other) const + { + char* pThis = m_data; + char* pOther = other.m_data; + + for (;;) + { + if (*pThis != *pOther) + return false; + + if (*pThis == '\0') + return true; + + ++pThis; + ++pOther; + } + } + + bool operator!=(const SimpleString& other) const + { + return !operator==(other); + } + + char& operator[](int i) + { + return m_data[i]; + } + const char& operator[](int i) const + { + return m_data[i]; + } + + XnUInt32 length() { return xnOSStrLen(m_data); } + + char* getData() { return m_data; } + const char* getData() const { return m_data; } + +private: + char m_data[LEN]; +}; + +typedef SimpleString FileName; + +} + +#endif //_XN_SIMPLE_STRING_H_ \ No newline at end of file diff --git a/ThirdParty/PSCommon/XnLib/Source/Linux/XnLinuxSharedLibs.cpp b/ThirdParty/PSCommon/XnLib/Source/Linux/XnLinuxSharedLibs.cpp index 1d691ea5..bdb1e1b4 100644 --- a/ThirdParty/PSCommon/XnLib/Source/Linux/XnLinuxSharedLibs.cpp +++ b/ThirdParty/PSCommon/XnLib/Source/Linux/XnLinuxSharedLibs.cpp @@ -31,11 +31,11 @@ #if XN_PLATFORM == XN_PLATFORM_ANDROID_ARM static XnStatus FindLibrary(const XnChar* strLibName, XnChar* cpLibPath, const XnUInt32 nBufferSize) { - XnChar strAppLibDir[XN_FILE_MAX_PATH]; XnBool bExists; + // try application libraries + XnChar strAppLibDir[XN_FILE_MAX_PATH]; xnOSGetApplicationLibDir(strAppLibDir, sizeof(strAppLibDir)); - snprintf(cpLibPath, nBufferSize, "%s/%s", strAppLibDir, strLibName); xnOSDoesFileExist(cpLibPath, &bExists); if (bExists) @@ -43,6 +43,15 @@ static XnStatus FindLibrary(const XnChar* strLibName, XnChar* cpLibPath, const X return XN_STATUS_OK; } + // otherwise, try current dir + snprintf(cpLibPath, nBufferSize, "./%s", strLibName); + xnOSDoesFileExist(cpLibPath, &bExists); + if (bExists) + { + return XN_STATUS_OK; + } + + // otherwise, try system dir snprintf(cpLibPath, nBufferSize, "/system/lib/%s", strLibName); xnOSDoesFileExist(cpLibPath, &bExists); if (bExists) diff --git a/ThirdParty/PSCommon/XnLib/Source/XnLib.vcxproj b/ThirdParty/PSCommon/XnLib/Source/XnLib.vcxproj index 27612225..21678664 100644 --- a/ThirdParty/PSCommon/XnLib/Source/XnLib.vcxproj +++ b/ThirdParty/PSCommon/XnLib/Source/XnLib.vcxproj @@ -49,6 +49,7 @@ + diff --git a/ThirdParty/PSCommon/XnLib/Source/XnLib.vcxproj.filters b/ThirdParty/PSCommon/XnLib/Source/XnLib.vcxproj.filters index 46c91d65..dddbd468 100644 --- a/ThirdParty/PSCommon/XnLib/Source/XnLib.vcxproj.filters +++ b/ThirdParty/PSCommon/XnLib/Source/XnLib.vcxproj.filters @@ -168,6 +168,9 @@ Header Files\API\Win32 + + Header Files\API + diff --git a/Wrappers/java/.classpath b/Wrappers/java/.classpath new file mode 100644 index 00000000..7bc01d9a --- /dev/null +++ b/Wrappers/java/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/Wrappers/java/.cproject b/Wrappers/java/.cproject new file mode 100644 index 00000000..12245a69 --- /dev/null +++ b/Wrappers/java/.cproject @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wrappers/java/.project b/Wrappers/java/.project new file mode 100644 index 00000000..b92f81e8 --- /dev/null +++ b/Wrappers/java/.project @@ -0,0 +1,33 @@ + + + OpenNIForAndroid + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/Wrappers/java/AndroidManifest.xml b/Wrappers/java/AndroidManifest.xml new file mode 100644 index 00000000..a47a47e9 --- /dev/null +++ b/Wrappers/java/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/Wrappers/java/Build.bat b/Wrappers/java/Build.bat new file mode 100644 index 00000000..0f878f72 --- /dev/null +++ b/Wrappers/java/Build.bat @@ -0,0 +1 @@ +@"%0\..\..\..\ThirdParty\PSCommon\BuildSystem\BuildJavaWindows.py" "%1" "%0\..\..\..\Bin" "%0\..\src\org\openni" org.openni diff --git a/Wrappers/java/Makefile b/Wrappers/java/Makefile new file mode 100644 index 00000000..d484096e --- /dev/null +++ b/Wrappers/java/Makefile @@ -0,0 +1,11 @@ +include ../../ThirdParty/PSCommon/BuildSystem/CommonDefs.mak + +BIN_DIR = ../../Bin + +SRC_FILES = \ + src/org/openni/*.java + +JAR_NAME = org.openni + +include ../../ThirdParty/PSCommon/BuildSystem/CommonJavaMakefile + diff --git a/Wrappers/java/OpenNI.java/Build.bat b/Wrappers/java/OpenNI.java/Build.bat deleted file mode 100644 index 3ae8412c..00000000 --- a/Wrappers/java/OpenNI.java/Build.bat +++ /dev/null @@ -1 +0,0 @@ -@"%0\..\..\..\..\ThirdParty\PSCommon\BuildSystem\BuildJavaWindows.py" "%1" "%0\..\..\..\..\Bin" "%0\..\src\org\openni" org.openni \ No newline at end of file diff --git a/Wrappers/java/OpenNI.java/Makefile b/Wrappers/java/OpenNI.java/Makefile deleted file mode 100644 index 3950e4a9..00000000 --- a/Wrappers/java/OpenNI.java/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../../../ThirdParty/PSCommon/BuildSystem/CommonDefs.mak - -BIN_DIR = ../../../Bin - -SRC_FILES = \ - src/org/openni/*.java - -JAR_NAME = org.openni - -include ../../../ThirdParty/PSCommon/BuildSystem/CommonJavaMakefile - diff --git a/Wrappers/java/OpenNI.java/src/org/openni/VideoStream.java b/Wrappers/java/OpenNI.java/src/org/openni/VideoStream.java deleted file mode 100644 index 7acd1517..00000000 --- a/Wrappers/java/OpenNI.java/src/org/openni/VideoStream.java +++ /dev/null @@ -1 +0,0 @@ -package org.openni; import java.util.Map; import java.util.HashMap; import java.util.Iterator; /** * The {@link VideoStream} object encapsulates a single video stream from a device. Once created, it * is used to start data flow from the device, and to read individual frames of data. This is the * central class used to obtain data in OpenNI. It provides the ability to manually read data in a * polling loop, as well as providing events and a Listener class that can be used to implement * event-driven data acquisition. * * Aside from the video data frames themselves, the class offers a number of functions used for * obtaining information about a {@link VideoStream}. Field of view, available video modes, and * minimum and maximum valid pixel values can all be obtained. * * In addition to obtaining data, the {@link VideoStream} object is used to set all configuration * properties that apply to a specific stream (rather than to an entire device). In particular, it * is used to control cropping, mirroring, and video modes. * * A valid, initialized device that provides the desired stream type is required to create a stream. * * Several video streams can be created to stream data from the same sensor. This is useful if * several components of an application need to read frames separately. * * While some device might allow different streams from the same sensor to have different * configurations, most devices will have a single configuration for the sensor, shared by all * streams. */ public class VideoStream { /** * The {@link CameraSettings} object encapsulates camera setting for a single device. Once * created, it is used to get and set auto exposure and auto white balance modes. */ public class CameraSettings { /** * Set Auto Exposure Enabled for corresponding sensor * * @param enabled boolean value for set and unset auto exposure mode */ public void setAutoExposureEnabled(boolean enabled) { NativeMethods.checkReturnStatus(NativeMethods.oniStreamSetProperty(mVideoStream.getHandle(), NativeMethods.STREAM_PROPERTY_AUTO_EXPOSURE, enabled)); } /** * Set Auto White Balance for corresponding sensor * * @param enabled boolean value for set and unset auto white balance mode */ public void setAutoWhiteBalanceEnabled(boolean enabled) { NativeMethods.checkReturnStatus(NativeMethods.oniStreamSetProperty(mVideoStream.getHandle(), NativeMethods.STREAM_PROPERTY_AUTO_WHITE_BALANCE, enabled)); } /** * Set Auto Exposure Enabled for corresponding sensor * * @return enabled boolean value which define auto exposure mode state */ public boolean getAutoExposureEnabled() { OutArg val = new OutArg(); NativeMethods.oniStreamGetBoolProperty(mVideoStream.getHandle(), NativeMethods.STREAM_PROPERTY_AUTO_EXPOSURE, val); return val.mValue; } /** * Set Auto White Balance Enabled for corresponding sensor * * @return enabled boolean value which define auto white balance mode state */ public boolean getAutoWhiteBalanceEnabled() { OutArg val = new OutArg(); NativeMethods.oniStreamGetBoolProperty(mVideoStream.getHandle(), NativeMethods.STREAM_PROPERTY_AUTO_WHITE_BALANCE, val); return val.mValue; } private CameraSettings(VideoStream videoStream) { this.mVideoStream = videoStream; } final private VideoStream mVideoStream; } /** * The VideoStream::NewFrameListener interface is provided to allow the implementation of event * driven frame reading. To use it, create a class that inherits from it and implement override * the onNewFrame() method. Then, register your created class with an active {@link VideoStream} * using the {@link #addNewFrameListener(org.openni.VideoStream.NewFrameListener)} function. Once * this is done, the event handler function you implemented will be called whenever a new frame * becomes available. You may call {@link org.openni.VideoStream#readFrame()} from within the * event handler. */ public interface NewFrameListener { /** * Derived classes should implement this function to handle new frames. */ public void onFrameReady(VideoStream stream); } /** * Creates a stream of frames from a specific sensor type of a specific device. You must supply a * reference to a Device that supplies the sensor type requested. You can use * {@link org.openni.Device#hasSensor(SensorType)} to check whether a given sensor is available on * your target device before calling create(). * * @param device A reference to the {@link Device} you want to create the stream on. * @param sensorType The type of sensor the stream should produce data from. */ public static VideoStream create(Device device, SensorType sensorType) { VideoStream videoStream = new VideoStream(sensorType); if (mFrameListeners == null) mFrameListeners = new HashMap(); NativeMethods.checkReturnStatus(NativeMethods.oniDeviceCreateStream(device.getHandle(), sensorType.toNative(), videoStream)); return videoStream; } /** * Destroy this stream. This function is currently called automatically by the destructor, but it * is considered a best practice for applications to manually call this function on any * {@link VideoStream} that they call create() for. */ public void destroy() { NativeMethods.oniStreamDestroy(getHandle(), mCallbackHandle); mStreamHandle = 0; } /** * Provides the {@link SensorInfo} object associated with the sensor that is producing this * {@link VideoStream}. * * {@link SensorInfo} is useful primarily as a means of learning which video modes are valid for * this VideoStream. * * @return SensorInfo object associated with the sensor providing this stream. */ public final SensorInfo getSensorInfo() { return NativeMethods.oniStreamGetSensorInfo(getHandle()); } /** * Starts data generation from this video stream. */ public void start() { NativeMethods.checkReturnStatus(NativeMethods.oniStreamStart(getHandle())); } /** * Stops data generation from this video stream. */ public void stop() { NativeMethods.oniStreamStop(getHandle()); } /** * Read the next frame from this video stream, delivered as a {@link VideoFrameRef}. This is the * primary method for manually obtaining frames of video data. If no new frame is available, the * call will block until one is available. To avoid blocking, use * {@link VideoStream.NewFrameListener} to implement an event driven architecture. Another * alternative is to use {@link org.openni.OpenNI#waitForAnyStream(java.util.List, int)} to wait * for new frames from several streams * * @return VideoFrameRef object which hold the data of the new frame. */ public VideoFrameRef readFrame() { OutArg frame = new OutArg(); NativeMethods.checkReturnStatus(NativeMethods.oniStreamReadFrame(getHandle(), frame)); return frame.mValue; } /** * Adds a new Listener to receive this VideoStream onNewFrame event. See * {@link VideoStream.NewFrameListener} for more information on implementing an event driven * frame reading architecture. * * @param streamListener Object which implements {@link VideoStream.NewFrameListener} that will * respond to this event. */ public void addNewFrameListener(NewFrameListener streamListener) { mFrameListeners.put(this, streamListener); } /** * Removes a Listener from this video stream list. The listener removed will no longer receive new * frame events from this stream. * * @param streamListener Object of the listener to be removed. */ public void removeNewFrameListener(NewFrameListener streamListener) { for (Map.Entry pairs : mFrameListeners.entrySet()) { VideoStream videoStream = pairs.getKey(); if (videoStream.getHandle() == mStreamHandle) { if (streamListener.equals(pairs.getValue())) { mFrameListeners.remove(pairs.getKey()); return; } } } } /** * This function return stream handle. * * @return OpenNI stream handle. */ public long getHandle() { return mStreamHandle; } /** * Gets an object through which several camera settings can be configured. * * @return null if the stream doesn't support camera settings. */ public CameraSettings getCameraSettings() { if (NativeMethods.oniStreamIsPropertySupported(getHandle(), NativeMethods.STREAM_PROPERTY_AUTO_EXPOSURE) && NativeMethods.oniStreamIsPropertySupported(getHandle(), NativeMethods.STREAM_PROPERTY_AUTO_WHITE_BALANCE)) { return new CameraSettings(this); } return null; } /** * Get the current video mode information for this video stream. This includes its resolution, fps * and stream format. * * @return Current video mode information for this video stream. */ public final VideoMode getVideoMode() { OutArg videoMode = new OutArg(); NativeMethods.checkReturnStatus(NativeMethods.getVideoMode(getHandle(), videoMode)); return videoMode.mValue; } /** * Changes the current video mode of this stream. Recommended practice is to use * {@link org.openni.Device#getSensorInfo(SensorType)}, and then * {@link org.openni.SensorInfo#getSupportedVideoModes()} to obtain a list of valid video mode * settings for this stream. Then, pass a valid {@link VideoMode} to setVideoMode(VideoMode) to * ensure correct operation. * * @param videoMode Desired new video mode for this stream. returns Status code indicating success * or failure of this operation. */ public void setVideoMode(VideoMode videoMode) { NativeMethods.checkReturnStatus(NativeMethods.setVideoMode(getHandle(), videoMode .getResolutionX(), videoMode.getResolutionY(), videoMode.getFps(), videoMode .getPixelFormat().toNative())); } /** * Provides the maximum possible value for pixels obtained by this stream. This is most useful for * getting the maximum possible value of depth streams. * * @return Maximum possible pixel value. */ public int getMaxPixelValue() { OutArg val = new OutArg(); NativeMethods .oniStreamGetIntProperty(getHandle(), NativeMethods.STREAM_PROPERTY_MAX_VALUE, val); return val.mValue; } /** * Provides the smallest possible value for pixels obtains by this VideoStream. This is most * useful for getting the minimum possible value that will be reported by a depth stream. * * @return Minimum possible pixel value that can come from this stream. */ public int getMinPixelValue() { OutArg val = new OutArg(); NativeMethods.checkReturnStatus(NativeMethods.oniStreamGetIntProperty(getHandle(), NativeMethods.STREAM_PROPERTY_MIN_VALUE, val)); return val.mValue; } /** * Checks whether this stream supports cropping. * * @return true if the stream supports cropping, false if it does not. */ public boolean isCroppingSupported() { return NativeMethods.oniStreamIsPropertySupported(getHandle(), NativeMethods.STREAM_PROPERTY_CROPPING); } /** * Obtains the current cropping settings for this stream. * * @return CropArea CropArea object which encapsulated cropping info. */ public CropArea getCropping() { OutArg xRes = new OutArg(); OutArg yRes = new OutArg(); OutArg w = new OutArg(); OutArg h = new OutArg(); NativeMethods.checkReturnStatus(NativeMethods.getCropping(getHandle(), xRes, yRes, w, h)); return new CropArea(xRes.mValue, yRes.mValue, w.mValue, h.mValue); } /** * Changes the cropping settings for this stream. You can use the {@link #isCroppingSupported()} * function to make sure cropping is supported before calling this function. * * @param cropping CropArea object which set corresponding cropping information. */ public void setCropping(CropArea cropping) { NativeMethods.checkReturnStatus(NativeMethods.setCropping(getHandle(), cropping.getOriginX(), cropping.getOriginY(), cropping.getWidth(), cropping.getHeight())); } /** * Disables cropping. */ public void resetCropping() { NativeMethods.checkReturnStatus(NativeMethods.resetCropping(getHandle())); } /** * Check whether mirroring is currently turned on for this stream. * * @return true if mirroring is currently enabled, false otherwise. */ public boolean getMirroringEnabled() { OutArg val = new OutArg(); NativeMethods.checkReturnStatus(NativeMethods.oniStreamGetBoolProperty(getHandle(), NativeMethods.STREAM_PROPERTY_MIRRORING, val)); return val.mValue; } /** * Enable or disable mirroring for this stream. * * @param isEnabled true to enable mirroring, false to disable it. */ public void setMirroringEnabled(boolean isEnabled) { NativeMethods.checkReturnStatus(NativeMethods.oniStreamSetProperty(getHandle(), NativeMethods.STREAM_PROPERTY_MIRRORING, isEnabled)); } /** * Gets the horizontal field of view of frames received from this stream. * * @return Horizontal field of view, in radians. */ public float getHorizontalFieldOfView() { OutArg val = new OutArg(); NativeMethods.checkReturnStatus(NativeMethods.oniStreamGetFloatProperty(getHandle(), NativeMethods.STREAM_PROPERTY_HORIZONTAL_FOV, val)); return val.mValue; } /** * Gets the vertical field of view of frames received from this stream. * * @return Vertical field of view, in radians. */ public float getVerticalFieldOfView() { OutArg val = new OutArg(); NativeMethods.checkReturnStatus(NativeMethods.oniStreamGetFloatProperty(getHandle(), NativeMethods.STREAM_PROPERTY_VERTICAL_FOV, val)); return val.mValue; } /** * Gets the sensor type for this stream. * * @return sensor type. */ public SensorType getSensorType() { return mSensorType; } private VideoStream(SensorType sensorType) { this.mSensorType = sensorType; } private static void onFrameReady(long streamHandle) { for (Map.Entry pairs : mFrameListeners.entrySet()) { VideoStream videoStream = pairs.getKey(); if (videoStream.getHandle() == streamHandle) { pairs.getValue().onFrameReady(videoStream); } } } private final SensorType mSensorType; private static HashMap mFrameListeners; private long mStreamHandle; private long mCallbackHandle; } \ No newline at end of file diff --git a/Wrappers/java/OpenNI.jni/CreateMethods.py b/Wrappers/java/OpenNI.jni/CreateMethods.py deleted file mode 100644 index ff11b393..00000000 --- a/Wrappers/java/OpenNI.jni/CreateMethods.py +++ /dev/null @@ -1,51 +0,0 @@ -#/**************************************************************************** -#* * -#* OpenNI 1.x Alpha * -#* Copyright (C) 2012 PrimeSense Ltd. * -#* * -#* This file is part of OpenNI. * -#* * -#* Licensed under the Apache License, Version 2.0 (the "License"); * -#* you may not use this file except in compliance with the License. * -#* You may obtain a copy of the License at * -#* * -#* http://www.apache.org/licenses/LICENSE-2.0 * -#* * -#* Unless required by applicable law or agreed to in writing, software * -#* distributed under the License is distributed on an "AS IS" BASIS, * -#* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * -#* See the License for the specific language governing permissions and * -#* limitations under the License. * -#* * -#****************************************************************************/ -import os -import re - -# ----------------------- MAIN ------------------------- -java_header = open("org_openni_NativeMethods.h") -cont = java_header.read() -java_header.close() -result = open("methods.inl", "w") -result.write("static JNINativeMethod methods[] = {\n") - -while True: - match = re.search("Method:\s*(\w*)", cont) - if match is None: - break - method_name = match.group(1) - - match = re.search("Signature:\s*([\w\(\)\[;/]*)", cont) - if match is None: - break - signature = match.group(1) - - match = re.search("JNIEXPORT.*JNICALL (\w*)", cont) - if match is None: - break - method = match.group(1) - - result.write('\t{ "' + method_name + '", "' + signature + '", (void*)&' + method + ' },\n') - cont = cont[match.end():]; - -result.write('};\n'); -result.close() diff --git a/Wrappers/java/OpenNI.jni/UpdateHeaders.bat b/Wrappers/java/OpenNI.jni/UpdateHeaders.bat deleted file mode 100644 index 76167269..00000000 --- a/Wrappers/java/OpenNI.jni/UpdateHeaders.bat +++ /dev/null @@ -1,3 +0,0 @@ -call Build.bat -"%JAVA_HOME%\bin\javah" -classpath ..\..\..\Bin\Intermediate\java org.openni.NativeMethods -CreateMethods.py \ No newline at end of file diff --git a/Wrappers/java/OpenNI.jni/UpdateHeaders.sh b/Wrappers/java/OpenNI.jni/UpdateHeaders.sh deleted file mode 100755 index 84e9c502..00000000 --- a/Wrappers/java/OpenNI.jni/UpdateHeaders.sh +++ /dev/null @@ -1,3 +0,0 @@ -./Build.sh -javah -classpath ../../../Bin/Intermediate/java org.openni.NativeMethods -python CreateMethods.py diff --git a/Wrappers/java/OpenNI.jni/methods.inl b/Wrappers/java/OpenNI.jni/methods.inl deleted file mode 100644 index 97434f22..00000000 --- a/Wrappers/java/OpenNI.jni/methods.inl +++ /dev/null @@ -1,57 +0,0 @@ -static JNINativeMethod methods[] = { - { "oniFrameRelease", "(J)V", (void*)&Java_org_openni_NativeMethods_oniFrameRelease }, - { "oniFrameAddRef", "(J)V", (void*)&Java_org_openni_NativeMethods_oniFrameAddRef }, - { "oniDeviceCreateStream", "(JILorg/openni/VideoStream;)I", (void*)&Java_org_openni_NativeMethods_oniDeviceCreateStream }, - { "oniStreamDestroy", "(JJ)V", (void*)&Java_org_openni_NativeMethods_oniStreamDestroy }, - { "oniStreamStart", "(J)I", (void*)&Java_org_openni_NativeMethods_oniStreamStart }, - { "oniStreamStop", "(J)V", (void*)&Java_org_openni_NativeMethods_oniStreamStop }, - { "oniStreamReadFrame", "(JLorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_oniStreamReadFrame }, - { "getCropping", "(JLorg/openni/OutArg;Lorg/openni/OutArg;Lorg/openni/OutArg;Lorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_getCropping }, - { "setCropping", "(JIIII)I", (void*)&Java_org_openni_NativeMethods_setCropping }, - { "isCroppingSupported", "(J)Z", (void*)&Java_org_openni_NativeMethods_isCroppingSupported }, - { "resetCropping", "(J)I", (void*)&Java_org_openni_NativeMethods_resetCropping }, - { "getVideoMode", "(JLorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_getVideoMode }, - { "setVideoMode", "(JIIII)I", (void*)&Java_org_openni_NativeMethods_setVideoMode }, - { "oniStreamGetSensorInfo", "(J)Lorg/openni/SensorInfo;", (void*)&Java_org_openni_NativeMethods_oniStreamGetSensorInfo }, - { "hasSensor", "(JI)Z", (void*)&Java_org_openni_NativeMethods_hasSensor }, - { "oniStreamGetIntProperty", "(JILorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_oniStreamGetIntProperty }, - { "oniStreamGetBoolProperty", "(JILorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_oniStreamGetBoolProperty }, - { "oniStreamGetFloatProperty", "(JILorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_oniStreamGetFloatProperty }, - { "oniStreamSetProperty", "(JII)I", (void*)&Java_org_openni_NativeMethods_oniStreamSetProperty__JII }, - { "oniStreamSetProperty", "(JIZ)I", (void*)&Java_org_openni_NativeMethods_oniStreamSetProperty__JIZ }, - { "oniStreamSetProperty", "(JIF)I", (void*)&Java_org_openni_NativeMethods_oniStreamSetProperty__JIF }, - { "oniStreamIsPropertySupported", "(JI)Z", (void*)&Java_org_openni_NativeMethods_oniStreamIsPropertySupported }, - { "oniDeviceGetSensorInfo", "(JI)Lorg/openni/SensorInfo;", (void*)&Java_org_openni_NativeMethods_oniDeviceGetSensorInfo }, - { "oniDeviceEnableDepthColorSync", "(J)I", (void*)&Java_org_openni_NativeMethods_oniDeviceEnableDepthColorSync }, - { "oniDeviceDisableDepthColorSync", "(J)V", (void*)&Java_org_openni_NativeMethods_oniDeviceDisableDepthColorSync }, - { "seek", "(JJI)I", (void*)&Java_org_openni_NativeMethods_seek }, - { "isImageRegistrationModeSupported", "(JI)Z", (void*)&Java_org_openni_NativeMethods_isImageRegistrationModeSupported }, - { "getImageRegistrationMode", "(JLorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_getImageRegistrationMode }, - { "setImageRegistrationMode", "(JI)I", (void*)&Java_org_openni_NativeMethods_setImageRegistrationMode }, - { "oniDeviceGetInfo", "(J)Lorg/openni/DeviceInfo;", (void*)&Java_org_openni_NativeMethods_oniDeviceGetInfo }, - { "oniRecorderStart", "(J)I", (void*)&Java_org_openni_NativeMethods_oniRecorderStart }, - { "oniRecorderDestroy", "(J)I", (void*)&Java_org_openni_NativeMethods_oniRecorderDestroy }, - { "oniRecorderStop", "(J)V", (void*)&Java_org_openni_NativeMethods_oniRecorderStop }, - { "oniRecorderAttachStream", "(JJZ)I", (void*)&Java_org_openni_NativeMethods_oniRecorderAttachStream }, - { "oniDeviceGetIntProperty", "(JILorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_oniDeviceGetIntProperty }, - { "oniDeviceGetBoolProperty", "(JILorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_oniDeviceGetBoolProperty }, - { "oniDeviceGetFloatProperty", "(JILorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_oniDeviceGetFloatProperty }, - { "oniDeviceSetProperty", "(JII)I", (void*)&Java_org_openni_NativeMethods_oniDeviceSetProperty__JII }, - { "oniDeviceSetProperty", "(JIZ)I", (void*)&Java_org_openni_NativeMethods_oniDeviceSetProperty__JIZ }, - { "oniDeviceSetProperty", "(JIF)I", (void*)&Java_org_openni_NativeMethods_oniDeviceSetProperty__JIF }, - { "oniDeviceIsPropertySupported", "(JI)Z", (void*)&Java_org_openni_NativeMethods_oniDeviceIsPropertySupported }, - { "oniDeviceIsCommandSupported", "(JI)Z", (void*)&Java_org_openni_NativeMethods_oniDeviceIsCommandSupported }, - { "oniInitialize", "()I", (void*)&Java_org_openni_NativeMethods_oniInitialize }, - { "oniShutdown", "()V", (void*)&Java_org_openni_NativeMethods_oniShutdown }, - { "oniGetVersion", "()Lorg/openni/Version;", (void*)&Java_org_openni_NativeMethods_oniGetVersion }, - { "oniGetExtendedError", "()Ljava/lang/String;", (void*)&Java_org_openni_NativeMethods_oniGetExtendedError }, - { "oniGetDeviceList", "(Ljava/util/List;)I", (void*)&Java_org_openni_NativeMethods_oniGetDeviceList }, - { "oniWaitForAnyStream", "([JLorg/openni/OutArg;I)Z", (void*)&Java_org_openni_NativeMethods_oniWaitForAnyStream }, - { "oniCoordinateConverterWorldToDepth", "(JFFFLorg/openni/OutArg;Lorg/openni/OutArg;Lorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_oniCoordinateConverterWorldToDepth }, - { "oniCoordinateConverterDepthToWorld", "(JFFFLorg/openni/OutArg;Lorg/openni/OutArg;Lorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_oniCoordinateConverterDepthToWorld }, - { "oniCoordinateConverterDepthToColor", "(JJIISLorg/openni/OutArg;Lorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_oniCoordinateConverterDepthToColor }, - { "oniCreateRecorder", "(Ljava/lang/String;Lorg/openni/Recorder;)I", (void*)&Java_org_openni_NativeMethods_oniCreateRecorder }, - { "oniDeviceOpen", "(Ljava/lang/String;Lorg/openni/Device;)I", (void*)&Java_org_openni_NativeMethods_oniDeviceOpen__Ljava_lang_String_2Lorg_openni_Device_2 }, - { "oniDeviceOpen", "(Lorg/openni/Device;)I", (void*)&Java_org_openni_NativeMethods_oniDeviceOpen__Lorg_openni_Device_2 }, - { "oniDeviceClose", "(J)I", (void*)&Java_org_openni_NativeMethods_oniDeviceClose }, -}; diff --git a/Wrappers/java/build.xml b/Wrappers/java/build.xml new file mode 100644 index 00000000..7d763098 --- /dev/null +++ b/Wrappers/java/build.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wrappers/java/doc/common-issues.html b/Wrappers/java/doc/common-issues.html new file mode 100644 index 00000000..7004639b --- /dev/null +++ b/Wrappers/java/doc/common-issues.html @@ -0,0 +1,12 @@ +

Common Issues

+

A blank screen appears after launching an SDK sample

+ +

+ Normally after launching an OpenNI-based application, a dialog appears asking + the user to grant USB access permissions to the application. If such a dialog + does not appear, it may indicate that the platform has modified or replaced + the SystemUI package that implements this dialog. +

+

+ The dialog is implemented in frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java. +

diff --git a/Wrappers/java/doc/images/adb-devices.png b/Wrappers/java/doc/images/adb-devices.png new file mode 100644 index 0000000000000000000000000000000000000000..8e22f90d1a3d2ce3895aa3be47ffae8e63d8e31a GIT binary patch literal 55288 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 literal 0 HcmV?d00001 diff --git a/Wrappers/java/doc/images/allow-USB-access.png b/Wrappers/java/doc/images/allow-USB-access.png new file mode 100644 index 0000000000000000000000000000000000000000..3203e647e51e9a76988f14af879801e53c78f57d GIT binary patch literal 45699 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 bSjYbdZbL;3@^ybS00000NkvXXu0mjf9;?_y literal 0 HcmV?d00001 diff --git a/Wrappers/java/doc/images/blank-screen.png b/Wrappers/java/doc/images/blank-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..5ade77988dc7bafd967298c59482781ecbb4be21 GIT binary patch literal 17154 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
Je=;(j5+<=JE-fSq1_g#!Gj$NB>VWA$`} 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 z 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

%WleUFEf(Pdqlf7)lk zW?(b5Yl^<7BZ0eovc`1J{})>0(s^6bZ)sG&t;iOBA65fd?GBkP)iiJXNaOg>CS-m6 zQudP?A!5k9DGv3-nNe^`_7C2+G2?w?zP-HqkBNJ&+ghOYpvsjHRBx+lWm*}V+b{Pn z=^Zb8`sXIZ&{y8}S1{}b@;6Q~wo=h-@3Ba$fAzLKxFa!ZP81_lVHSUY#FI~lBn2I1$h4g#rdrgM}r~V_eb_lng!8Ye7lD8%2wn${?9nyDF z&c_TsFPSlxCv~+KP`y9Plcsl0LW5HJOUDYQP7JuEwJ+M__WUtw1M23arNe<+_d}lh zZIZYaJ%GX&@1@Z~WattIt>;-B7N0Pz9oeBIGL-(lyl?}d+X$*W;J9dwq+MhAFVX+R*h8dN4nVJUGvVwtH3k)QfC zNxxIM&ytwl{*RQei!va42x=|-^877Su+~3z>4FVnkdwml$^izve%iHwr7j`y-E? zUf??ZOW?Oee81n5MWo~1)*7Z_ua7aXHKo;v`(}IL1pezxO_){&=cM!_AB)Z-P{#HT zG+t>e*LDgEVO zM%}?s?j9a8p>xtoN`owk60ZWT{-whm&2RU|Wwn__1Vl3KC7kqmGaqrB!oH0eDS?IN zQZn-LR2fZ*Gz{{!RP}jhMt2UMU*KB(R9sU}qIKp;!cpe$t(hrGZi!e}NN?HKyg!Sd z_Uld&xWqA2T%-i2;!vS3eP zY`JdlG-R`>vr$Uu?4MnXlIjLPLh`ggOx;Cxtn8&%p>D@%UwR!awE#n8cgJ10Vyxl! zM=rMde;UfCom=-5-pV~ZZHHlBRWp9)h`0c}_A=QMk3U9sM6`lR$iErIKQ?x%gE&bM zc6fm&KXExZIq!&P^M-XB&R+&`A5cUQGC!6N!3kE|Bv1DrCh#cRyy6;+(3)B%t}g01 zz?ozksL`FndomH7uC2YZ(HLCNnyRp@z)nkxt!ISqJ>)bi*#+ zZySodD2-(B-_5eizXk3w5||L)+S#c#tX+>}1m9fFnKwBtHu@Z|00F~5PcOtHD5zu1 zwunm!@BzS*pXm>H;Ts$T3%Uj%=rn?0|AWe=Rw#m{a&G}7MJ6oxC@~eERPr~^Xs5PO zuu$CM7u%~EI*gH3+TyQhHwUUim~P_=gW`m@VywYq(9fo#)c2Q9$r#O+H~d~#?oIwk zo>UTMi0+IrH0ZYu|Jw>Ah4X;6dSFr9hn9Hx-}pl#OYM7P0V_tm&=rO3FL627i{_P^ z3n-9Thv2t{;?3AOa}UaVF2RU9T^xMc($JRWxxDn{OxXX*??K+fs_)SLF z+bO`V{q9S=0tz4)sz`fF~aY;Z%6<|G6KvrZq$EG3t&QVWfFiG`)QJK=V-U<5{8srwI3QI{!-!N{(!5< ze<_IIeU9#orK$gh$&RMUQg*h~lK0x{_4%lPfNiCT>fSvb41$Nc&@?Y{k8BQOP#&vYtfbgh|>h>VPk_%xLUI_u+khzn2f zqHi#@qKosSWuaGYOD1Paj(YA?jR$sHhm@_?y@R0;^6M}(K>VWS?L%hK0NT`(p3-3A zPx5bQg5pArJWlVn@SUv2NK)!2*j#MxF-UH;?mIQJS!TGCbLHt5STs~Emw{uA<%Uh# z43G7YsO6u`RHy3@MMv?FedtGMw4V5u{U?ij!>7^3%d05_VAexQU@G}9!9RIT7=js+ z^?V#jjwzU2%g$fg7-35%6fFj1k$AVO=2OmYil|qFuQ`(v>8x?D`{C#*Abjyhor*uO z1@2EzL%T4~+X#HZVx1G7oKYY0wD%;HpTvB%-#P0&iJvcz5ao8GI&yYjfCX#0heFUQW=Qg5q zEa9cC=$*89=uLY|VSNExnZT;fG|Xak6%>e$PE%&B#CmYd_^%0+4B)(%L>mx8lj&M^ zF6ts$?Y>4gtS#o5BFC7n2{qR+uw)Va(GV_{p>!|*37K-GY+vyR(eH9N^F**qO!d(c z6>@N~+dPoo`Nsa;BBv<7Aw`2eL;e2#xo~;XIBnRscGDj*nz&*3tLgtFI!_|5l~{4y zaN`^Hk%wkMj#!pn2S>lK9{H6b2?Sp1iht>_ojTDzP{@!|Q(}3peR9=xR(g z`YcpUzy+aa-5$6Ed24OeqlABz<4X$3H2PV3Y2aojXL9J5wulJ@04x!V=DwGJ`-fe_ zH%-L$&Xz52-;)HeogK3HL}zM)3Q zzSkgyX4p*<+n1_Xe3`Qs;_^Xvify*pQY#+w*X8$O+9=gLa@euHc&{D6PA8A_w|uEf z8RSU6t1aNgP!_i7@uaUia5S@u0JNarAi1%ITg7Y%+neSq6_(tr3hSVdey^|WSkw}# zq@EcIY%N{E^RVbNY*mj#nP^tL%^~xtl>%+r*mINFdI&tsl;AU+L(I?-0KnoS$cx4UwOp-Z-oGmx3m+u(61_qn95OXaPY7wf(OzV&-_Chy6QCq+<# z6n%LLIR*9mN70l@7>WX^Nrp1Pf^JZiq)6oD#$`3q^>U1tnJ5(Fv}=D2L~&9H7ov|z8#4JJ+9)BnVh@-ve6$#6|Ij9Wo#^7SAX zlo61!{K@mIcSz6v%Rb3;*kwDh9xU7Vk)A|J0?W*^vGq|J;jN(eW=)UDj6HnT(!<^L zucJc7V0DS zVqSUfPRNAem;wOu-rk8Xj~r%9v4O<(jXW5pV5>1$|MB6MN113E6H` zxBhiPfE-(}nms4f5VO15DR)pXl`QtXD^I>vE1vrM|%-Hf(X80Whu>!dZW{=JG6vFH?wnvixG83Tl!we^zMoM|i-&$BTV;};>n5S+L%S*#8gx?aZvtf-{6 zx8r{$XWK>`s~ILj_Fl~WzC)S|@a|=j1}yynQ#W`<;c<%VUq>2rnZ9-;6!4RwK**i^ zx0uCWG^rwpXw7lU4g)!2XM4L4zX)YiZ~NoK4u!;Avj8XXhNj)f)T=*j;eW4rs7bzw z*{;EXAlGagv#mF-B>D`8`-`pvYIuO0nyQM*O5nMA6cTc~MNN*Fz5(=YkUl^%*b_lu zB$q<<3FX#BNMZ663Bw=Et5_={VuSCZ_A?A1=R1zy=oascuQtn)RH64D7yc1s9bv~I zfi#oIf<)oXgVZ%q`x{hQ&t$?RBuDDQP^%XrQlAYx5vY>^&2StV9=86whxL2Xb!mf> zE;v=hu%~A;x{Ymp=Y?w&0YAU#l>h48@13KtyKrfkpnYlcW4kuZm-xsqw=TfT(uo{F zwxTb`NO0SF0|eUp{U^$3f+I7N3eQu|Jg8z0{52Rw8KUlbpRbXT70BL?$EdrB(nl;d z@|f4IhmnB7u`tTc7G*Wbx7{FyKlu)%?tVhcw5Nzmg`mB7a@*#>z}>XEWc{0^0XTzcphsN^Q0frvjd@H<#DEjP0^Tw>Q z%=)9ouE4mb z5ICJEh8;2_8QhNkQjy{jZVHw99_fmXx{lPJ&yCrSNqxV&(_lvztA{FzOMS+kWw}Vc z?o1ITWPmeC_mN<1+w)u80Ye0>o_ipsjl+l$TZy|rBsq-`_~Bpiolf}A!Yvw1Tv;;F zmj=aUWzSi{BF1Puw$-GS*XepEx`xK@mb*;n8dpUa6zG(W@E#3S`%^q}KdaB#!(rm8 za82R;KAvq-lXM?-6WU^Q8+(E~Y`Qr&oI{SH0L0b@f!(FB-9h)SEpfre<;LTb(Z%?8 zoD&t~HvoQ{ym=@Y_)a{>fnMd|%6xr*4|JtNgz_WA@zg-4bXoFxp^FeIc^*zKbzC&= zeY}kOX0`iWGCl?SW66M=?L84Ar41XNB$;G;V|Th*omfS^vnWL4qHaaor`4}Q{*J?k zoDvN?i6oU6fEUQGIkoQ!-BQ z070Di-gBCxr3fc(GhO?Q8tCeK|C@IkbHP5<{!%3+iE?{?>=W?R!a%(~zwFjw+WR>M z?)GpdV9@17k)BjA_w+cy?3Kk+Q-X`mv+o1(A)R>ZHqNi%NG$t91imLT@$G?(w)U^P znMd&ws`BrbbDwFw{4ht`A+&WBXl~R~y!Ymkr<75Kn zv49T|%@^WVq^ND3`-TT%JJim3eq=Y-&Y2p)bM(wip>&X~=NWL)I=9_5>Tus!*YG<@a5b>3hW`Zi=vFh}NX4K9O#2Ul@ zH%!6C^={)?WQ8m8If>nu*G`9<#Y~|P(ZMWWzSQgFJ8>w`j&LwPk%JN-Ny(_dn}f*) zolDofE*uGeI4||x0b{WkPf>b>_=%H@zP1aTg0iwG5N4MXpxO>EEM!xSVIMtp><{`C zjz1HxoAVNV!>{g7)YW@?K`fOSN)Mb}=&pCiv40|rYz2$K@RkLQ0F z&gUh7frZ^=w_B4nKkZ^W{`Ia|-Tv3{yQE{Zo3Pn(`tJnzuV=X;suPGAlO9X03fmlk z+?#95#zS35c%JAs-5gD7dI$BM9x@L!Rcuo&3*Tg^Glx~>HoKo%uD86`)`o1=-#am( zGP?#>I1W}rIm{1nDWg$x2GTlOL6d$J_Lm}`Goa7%Iaq$O-jH-XdXo2xEu~RSRB{XV zQh&i={l}acpxf&3@uPKXu^t&EdqlXJ`B@xE+WggEUn$ z1KykuKAg*SWO<%KO@)a`R6aWU-+lv^L*ZZ z%CjVvr1zF)xL!RdU6s*yoQD)cBP!`uQd&d9_UhTl68Bp*2Gt$jf;Xf>JJQ^73jHb2 zr#;}CmmG>&IjI8pJ&>fc^V2523n}`ypL@ZKVZzxYUxfGKsyRe&$p2VzPA z7liXjC4$msAl1i{rXg~$Pjq`fqb?p9dv8GDE`B>w{+r4B5fyxo?t;Bb-bqgG(MDOG zue)QD4)p2;|3baG$Y>DnS%B&Hob$DlKBW`_(87iWLEDsu7r={(+Ys&U^b0Pdb%~CK z^bUNb!~gJa$K7`eJ4x@IzEYU6wFz7|N;Nv_@Z^joRoq9-qzNnugm>$q`f=OUY1gy& z5>~RGWRa40|LWgRT#OG6?Sx6j4qBZ~{`$RA5Z`Tz<2P(}@vmN$ebf(XOcbXeeOb7e zZ~6*1)PKEfqK#4x<7wq-w?r_`=f(VpfGD5LkhMXEN$yyr9@FcR({DyfF(fm~qhn)j z{NpM3wJyIggf3=pqQ?8in6Gic6!LsMI4NFIExsE)Oic<|t%|4XNf`h5aktq6-ge5| zxS+QcW)0d(^Io3f;*C6I6(%8ehoODx=q-O9iw*Wv~?&}AdnvNeLp&)nGT9wd!m6= z{1zSKI##O$sXrp9F+LvF&9Q64c)7VMk7dNP|I(pTN9DF2A4a$o%LJ5oadD5JxmoClYs# zH1B@GoEPgA7KVA-2<69T=p7VWhq3y{ga1~>r{`VX``AqG+w7ifcBL=7uJ|V5=8Kyd zNp6*QY*ZhsZ1&7T>YJm~mfuxX)eCn>iF+Iq6X>JnVBGel4wE{|k%7(2T6j`FFS`|;Y8_=5R zPAvpK3@@*>ih0b~`rWO(K67cnu{!yfR0tN8R%H@F+YI0k7#etw-&*r{_*T)%gK7%< zx;y@8XG4r&=(X?oc<0m!2sAwtDHHSPRHu&N)J4B!OX0)lSh!i%Bz>xxJd>*d=rXoh zB&lJ|xU7cc@KciAX;1a_UgV}-Vt&#M<05O~-H>9EORgZkbIEQ2DahoNqSPfQ;xX9M zX!C|4d4ta+@aJ5PGqdKw8)x6m1CA@rHDZ(`)HoonOJ?EAyO;Ug$LM~jokcBusje*F ztEk+wvu@Zp4ncWUyTs%8jZ$uQsZu&o6(InD)W9>Uc`sweV0x=!js~>STCP_DAY9L7 zM#_Py6HInZt#`r*`MOgAdcnR?JkRNBZt=r-jRCW) zx;j$sD_}I+(9lp^yxDQRQg6t;*yIxV;wHSzajpu`hzSC8yB!2W#66r}9)Fa1=J3BKT{61vv3r!7tV$Ty4`=*N2uY`PE{$^OP#jCdhEve zPcDolPm*0{gyRD)!V0*ur(~VcHkG^jEs;(jSIn32YyvgQJ}S9{0slKH83KB8^f2&w z&}yz zxJdB#`%~ueojfy#^kl4=qO-lj@}1fvjEec!1ss7Qqc0pRx`~2sCDFR&6wZN)&hpgb zT4sq)4)PnQwbjm81qF-$*&m)<;FV6#I#YawO`38>cEUCb3VU5*#F{y&ktZKWup2ZmxYqnqBKN4J zVOB)cqPZyQerHIe{rOy{4l==A5nkHG1=%t7;n_aF4;GsFhEXE^+2@Z$SxuK9VTm3C z?aBSQstnBuslK-l|0?tIyU&fv5^0WUUsZ9XOXpe#q;bC-o0{aczG_dza`rvyjxii) z(|(%rw>dysl;L?>*hdN|Yf1Sx@GD6Xc@RfuaQ(gmfD;@oMgMrmn-PaJA^TZ*bA5{w zx@pbgv&6ZPFVZFcj+$x}*L?Bu7iQ)>tEVnYLHyGlVUr+0-02rxa9kYW19pyvR6r3> z^FA(u;EfpjUZ6$=#_6R3GxvtiXoAf4n%uWW!R#2Pv`rq{!=2R^Ms8bG2G!5@x%!9o zs%4E%xi)N{%fCNFcTP3Ls~j@~&sG?AkYq}-xjq#!Z^^h6FUnLgBzRgja8}X4GGj0x zqot-Wl?eB5aIl|Ii)bSZAe|6*jQd1a2&I5Yk0O9(M}8IHd0u6zg>4YoqqHi-RD}BT zMn~#~%W7CBcu6KDokRfza3g=0SgyNRA;h`@5=eHNF4Qi0u`gM3UH zsj0d8&j&74n!5)S2PwaCB z=aYgI>pwTK1<(Dh?eo2l34*^1|9Q!IdaUDq{hkK6~i3Q(i{^TYryRjPdAsLZ^sR}Oj}J=-7 z%44tH?ODBh8hq0}4K@!J3Z=r=r8j9@b}u~B)5nATNb@*zFUP> zG9r(oo|eDztUaGKP%8Hr;Hs_zztMb+WBgR|SNv0g6hAM@`s9D_YIB|E61KR!&xDEM z^W{S0j}F8*#AAG}4&_z|n0`p)y;%s9!+U2YRgcnZ!0qT3?GQmj6Q3UO2r^l-#!Ak9 zVxTr!#8bHNmY+Y7-Q$&ax;(kynJkk7w4w6yLs02>&PvA6aI@b?30JjgUdX61eo5!X zFHZ3^w~Z*0L2-j4`K)^PEtMJq_QH^42jgF3IU>$m+e$8R6@=M*$L(tLA{Lg}D<`c_8ffCD3=1P3{ zRj)%QA}LowL&minKX#0w!UH}LHy}~_dTfkyo|9a;;KWY)K~;=oQ>RN)^766HZYkLA zckV(8=<*IY0&Rc;RLvzZkYD`#I4FZRZ`*Cr(*EO@i+>B}wF3;|JWx2`-@16T+y;!d zifzOR9Ch9~-m|`z}q+oqgNaHw+AJlC(V;90@7Tn}p{h9#G}= zjm4{h3=%?c$2bR6ZLile=1XnFRGZH+ps923DR~EL^Wm!~dHz(~yZxZ5ZL=N{&2Y;b zfticg4nZMSKpcK!PS^!`QXvRV%zMBH8Mu|OZ97J48I zau9>GXgCyyyIe|Npa7%t+^SvkcfvS!el&T;WewkXVH`x*36Ez69C(iCbA^BO^YSNP+tOOuzF%Io^rJVuX zg7_!=g(gkTYAy@9UUR7C70zc{()_8cPS~Pph_ews(&AU9TZ@d~)_*+&mX?KpA7)lL z0^Q9oD5!U?0@A!0>X9`>kiE+o${2+NbpM_Md}qf}Cj}Ic0%El9ySuxurVXj3=)X}{ zR|kWo`gTdA=0B2Xg+(FBL`Pr%4dNBt#Y_4EWYL2qn*PAxrd$2nWIaS4bb%VX1|g5W z)w-@&`3JDQehr`AGJp4aTcRWYy$~e=3)DIP_n_4$EWH?q4B5#KsH&?Y50wCNd`j0T zfbbl2vlf}PLVv@Epr)iegh8aW2g4v4fPU_f09DxFE-W{=5LH+A3NNti=WK-m z-+vAoCt*OOPY~+~;y7}Ho~tJ)3Od=t!F1H)Dviac0y^xVMk%Zp8>flU!tf>XflZXl77QOvRr z>fA;|j#m&$7L%Den6kLKF4N+KFW`WdI5|$mzxDb3j1>SGhtc6UGwFIYx$ZYTu*|YQ z`HLm}Of2qTJ~m=I#O^hxIk}z2B#zvOg$muJC~U z#YjsB=A0q5hg;*GJq%LjHgvzX`rTS|uxsK-Q-(x0C zHiY#5DWQ@J3k%~2sYvXA(RK8%!ZecM8=GzNMfCdu#2ua%uK z{RfoaE1xrzd-XcPu4k2CjZuoV$0q%l_1YEhov^F@F@9Vz9guMs{5VGGnP}^tyr9E~ z;&}0#^!L&b64JHfXX_2T>Xn5DjsihdBM)hU_`=5BsFVN!P0`J!YPC&9e!HVy$qod( zBhu5=&WsETV?u;^4Blvt-wrMYm4YPhCnFgXo(gOOtpm>IPXw(`l0H`ZXn|LlSt1jk zGc;Na5NFF%>gtt$|Nh-sCSuD_@;WKm5{|K;_KJE|*R|z&biUqIr^UD2u4iRsFZUNJ z-||g&sU*Q(xH=RkoT`T{WAs_mZaEaDYcKY_Dl(-+d(s>eN$J?;ef-vnCK`6Dm%;cZ z@EH>_Ob56w9r=~HH;S5_4pkbke?CWlh1@p>;T-`4k%Yg;PKkL3dFVfjG&8yMomen9 z;%*+41Vu`7cT0i3z(^lned_@v{S{;x2h?3R{lOjE<3|W}=O)MH?Wdnxb;-~=5`8>9 z!+Q@8oi5A+0=OKVogEyU9k#hpfa{~rcvYTw7yK-(ORCLpx?~)Lk{#<;Z2qLDt9yUs zGh!WG36nhS+oGg&`5tf`#X>wjGW2_7jQv6dKeF7S#>3a`^cZNUPoeHL^%mnOZZK3f zMpS&6QbNT*j+Ac*RQ^=umG-M;8;IDbEK9J|*3;@OkT-5=`zjdamSlfB{YJsv_e7Xv z=CfPS@R8Sfne@lN3t>6})#kE!MeCKA$3KN2-L?LQ*`N~EYV}OF!#I42?ua&x&WpFs zk4|dXIkXZWmgiV6R(|Z~^K7)(pTGExq_EXeCr15^Q;n?DOMRRjP%;Bv`CRd)Z zDFoqd`);{6#bypDr`3VP&ju$cI5fC#w>NtV*F%5GJ;EXSJv25p!ZkQHzH`^!{x5ea zH}{>3xA3wAgA3T~cNh3zFihR4mteME4-F@j_uZ+0=@cr*%e=9{i{4D)IUk2ACHk(x zees3nSWn}hKk51jh_SITb->ObK0e@j27E-~gd5iD zG^S9)dKDV^uWVo;pMWRC_f#teX;z(K#@TS6o}M0tOVZiteds4(TlRNS7f+LPSBy(h zbDtHcW@hcnWKC>`Vav*>51cbEl1J)HLYdbJEg7}>q~W*&`(qc?r5-Fx)FzL7)F(G2 z)K@>6bEiuEz{sDM1ov$J5R?GNa!-{Z53)aq4KA1`25Nq2;CoxCx@V5sPNzdtOpvnd z>5DGSg;)0j95_yH`d7^_`9ReL!PS?_*T6*53|c{i-OlEw^^Ub)N9Ey~DXy`E^Y!Pc z-hNp$obdmwk(Q(zl<0${YN5n}l5Ip|O%qXcp%6~K6oHx0m0mTKL%falJaz+jHcv19BRN`la z=sexG`ugOhby;rC{MGVQS*$Ij6xm@S#U@>eR6&qhYSM(I9mtoDdfLS)b z;6Ml_E{U*ULzB7`@oxl=Ambk z|?J-g5O*-BEQ1k0hju37X}|2Q!uc8BHcQ1jA~qTPJQzk zS>1Njik^c+|7bJ?iB&_Xzd+2*%^lCzS^-1`)pRX5tRVFZ9|b(6Q` zV*OoQ6mj}{0cbaC9hFYXDI`d2XIkwR^=zCDKAOl#LjJ7v=Rw#-u}-75GR6yikjs~s zzktNQjhBKQV5>HeJwr@`w=b%7_CSf#ApTNFAr<;dG|w+Eh-h|hE)_V)X0_(L$i<-Z zJ7dRgtwC5rcR2)Z9G}gWiG`W&o8uFmkD8gHTt;qPcjOg)Ha9l*KN8y+EhLE_;e+y9 z;lw|KW1?#?F4i({tyARyA4b-s`ch-m01j{6f8TI702xtk_C zc`~B3`WwG1?d>mTztn*?NwnbUOb~JAlb!)|(a5$RKQ4m-@449Q6gOlYd-10f&unN8 zRfg*{#;dT`gGD-D(a=^U>R`mZ1L)Sg3)KTm1g2eg%g0r1N3Vs}-IoDIEdbA}R)bMF zsEh6y5Lj|8(%@S$^213@1hd!+jyy=vYP(QL5%Tdt_4Uw)I_a^yy%8Ojr;&jq=G6#Y z-klk(;`_mJKF~`qS!+sj#Krxp`6g?N;jYJ-V}-^Yg3ol=4gp4Z6?gqfVwU4=`&Y-N z`ug~q1anxGufuaanuEcukL&||H~((s$K_V9S_Bex%vhc0^=r@1uLX$h-v<4FteloE z2YHo>rkZ>h3C)L+l_mx zz#%t+hkOJr=uDA%7u0@|Z+Dckkc#)$mj z`cXV!pH#{F6_s~Cee`Gwgk~L=G57tekL*TH5N;u%oKfI@xz3DlAn;}7Nl2Y^WIsBx zY=V)dKq%%z`wB}b__SM>A-Hq)>xByvTU7;>Vdl>Xd`ocA;6;}UOiGA%3Kfn|k%VMk zX3IhfTp6|9PFL@Or%RJHRwxqV=yO0Q-J^o8J%RjIKXvRj__?X7@W z2>@as*Fom-XlQ8N(mUjF7Gh|tq*<9r&75!khfv0w%hKdN&{|6Q=SfuE%kId1n?w{y zsypM58b)`Lfp(>Uyk?tuc>|v_zyXtc{LnI^Mg5jO;rknf>SVx0qNAZreQF^>Tcy{Q zgbX@0EvI`+Lb}&lXU+$J#R$V8k{xG6Lo3Y^a-@o2^caVdu_zSmkXWOYUf-ifv5}l- zmg56EoAm<8SKn5wf}V>$?(3T5D!Sx6mFx_1CPG8wlsQK2rxtW{R932|VTfW*fkg4X zqV!EwRS6!}NMP~~6!hrHi5pr%=miP!)Y8&@^3g^jNZ1FCg@(5Cuz#qQaTxf`_K55#Gn$EfU>XT6`Xy}mV2coCGa zn$rOPR8S4%)%AlDeC36|(?(6&BESD1%HBFG%Eo*59YEv-1QZDY0TB>sQBr}SyHj$M z?v#)kLZqdnyJ6^VMx{ZzTe^Fwftfjv@BaRNd+&4hIoEam=emZc*IJ+ZzE?&OXR#dD z`1w=Y?S$g$VKp2aWn7SdN1o{YPcX6{RKQQFPtvrDld}|=Ew|OQq*8Z%0{K747R5_u z!*aTx4|O8;3)yb`>}+kB8{QHWJ*}&y#L5OM&fz)Q&I@(c7N;GKR+?gwAy-#sqhuBq zY2oi62Z7}HZXP`Y<8NG`&2!QTVorfyVcnp42OrvZyjshE6FOeG5mHQk|DI5S7It%E z9=tpN3U_?p0c<)l-=IA!Cbsg4$<)_l&Q>F@?Xgtzd>qNf?#u^08FF18aoYuSaM0m^ z{J+OLq7PpfAvr*D9&(sJPw(7Url;BJ>+Abp_@^d^zNH&s0FS3Y9PuWnrmW4)UzbF5 zi1X6@G)1o7g;VqBXlm;6b1w^F0Xa2`siTzQ%0U~dz%As@6e@rrMv`T#-g92*p(n8d z`I|mNNg8U$8`^1Thsp$Q#;%h6lUQV@-XG_9aHmsw1}*i(I8r`-tZ9jIzj6|m_B1LY zj9J05^2uPx%X$a`<;QrQA6wZolyjCN9NB^UN@1%2qt;wHP_Qx(1e=uEG0)l$0I{g0 zN)spR5e98)cl^+``EoC);w-awrnr1_Q?>z?X7x_9`eT`kWIf~@H&GX9RkA4#brWn0 z_&Sl`>6nD){iJ>0_0n3ZzckPceR#yD>gg z-QN$mu}WTe-|`Z2u0c<+atg7{+9HK7!EG**=7NS)%T6-I!cPP+w}oGS>E4ecu0;>L zse|bv3Vg}`@zG96Wh!&DZ+cDkBxO-&j$il7=wN_aN!GEp_};Zofz3bH2X9{zw%GkrS?m0p;-aGKa~ZeBb`5WVOF31(B3D(l}yD% zD!?foq;?eUlzeC|6)q0Oj{i*ymC%lF(#m0Tp{8Urb4iugivCTf z*YM1ujI=%aH!51nH@bKI!uTw*P{e!p&!BD}e(6?X`qhaJ&-E_-HpZP6#Xb&A{slF7 z=W$_YziNt+(o*=*uO7yzCqG1Qt-nc&zCu^O?ciBR+K!vQQ%Hr_@~md?=y z<1H$p*3bEb{wZVL1hk5OCy8pwr)u#@!@Iy?T1PXM^h)h8e0ns=^w;Yj(DIc^OQN9}Q9R+LOR^)M zrRZ6&B#z(`qX7=yCm{iyjaIYzF#-v`H^_pkP%1sJ{IFQL!4_IP-6;IKGw zUo>phWbR$@{BbEUlNc@|cA z&Dw!Um_g}kf}S$e-lC%ak^1(Ng#qDKtkvxW`C#)&M)wXq{$YxpS9{YTRhoV3{Aki2 z%7Qz7{q+{bIQ2m)e+63amf(dNe^l_Z=bS09^d(%N?iPQId-EA#W$ArW<^gItq3cjgli9Y-M#AYNl-s=*I2 zrdVlH6n0V>rW3qnA^gYXYB(NpaV`#}1^EXk`aG9glMIO1AoKs7G>1Yfq6(G<>rZbK zQS&F`qN11tRosfQ=|J}tk|!^}9G8_N%kQW^YD}pdUFW}`vKtB9L6s47Xmg>OA0bZ)Y)I?*Bmz=S&zmZ1YIvV;@KyM2RBj!ipX<0r z`+PbEJm@rFj@fj*O24)HLn zen#s8Klnx2$}?HdxkFj%-769jSO=!lx84NbCp<9r+@3H`Yv8fdjTQvzcBhEi7eV1> zrLyi7VMQJZPfhU*h8eqEk65|K5R6O|Y zG}nD|t3MuhRp(9qlmEVW@xrCV2A9f?u$4=T&$_T-F>d=dUC>bx6-f!{hZhvc1B=z| ztgHZ`#0p>w1Skm|^zPJce_G`B_nWia;ni;^{YB|6=R*SEn~iuEA)x%Z2fkY+DTTq% z#|24dJ1m$}dW`eut@rPfv$DW)x@u}MEKarzEWLves#iC(f%-3h zfU2zb-J^TcGUB;qDOY^Y0iL0vC-;ri%VZ=|f$o@$( za;GZ5@Yzl~omo~yaHD^2^v90~Ki;JuH;CJ%ADNHbE+y_Q^jY}zfaNi~3xddvU;+6v z_D`yu8fAjSPQw02Q7S>?-_XE+N^`7~0DMT}`*6f+h@LqiWN|?0IJ@-svp+Q3YMjlW zR5$XNU5C@o7b%7NW*z}AaP4fYy1zB55*8``Qwgavx=V8&2A z=WDis#ZW3BSiAt>(I{R3NAsUR!WXKU!uIpLh})35>EK#Fb0iDmwHPu4D_eIQ16X-$ z9G2dC{c7bs%^GyuO0m>HLOOh!-xrD~V9vKuN(67)!G;vgWLEi! zsmkV8V%E=oz_(}&CMdJ5#UCA&my%hzqdfejt$V>ZE7ukYclMivNk@LyPhF9aU ziWQw3ZdxdSV02kgVB}67LU{YSG8pc0Irkl%<+aDkQ!0`V1wB!-o4`2Id%Xm6|IPaY zW_7yK!?l29VskJ_fS2Ex$Gd?o9Jnm6$t!MfSRcVII4R++G#puEh(X9&`7{hBps?eh7hT7mlE$ya}hWY)Jw6NX;pL;>?Ic>+-2%k9cg&x)=6d_dNQt7z+Mu~{R* za~kYPo0x*1DJx}cC{1>A6v}bAY4=R?XgPmRuWz%iv9S@Tk?R`j8X5*Bpi^cb|GIkb znF>X&X0zFTm zJHNtQeI zApu_|FE8kaHPD!T_H%ohdGhmWfXFA^uh5FPnEI^>iZ#ZHe2FQQd#}{ktMhoh@y?rq zQ(>#n1_#8X+%EJkbDkFTkRCXMUR`|{ZgZz9@4z+}<fC?kx?J zr-Zh)ILh1qy_V)NP8Yd!3R!#jla6uI`l8H4qbq^sW~c68%5?6prhTKw{bzldsa=bt zJ8!@@r_rX4t`$vd146DA7(@|o*`73h;>1@OKL27VA68OWD${+0bB3^xMAp2wCsCNb zMPWRz-TTIt2rofzg|5&3T4jo3FT$DUh4HSrvnyrjb;u7JIBP!Qqq#&Zjoi%YTeyxW zZaz$fa$RDDU%a2;usAr@C0LExpEquFuq)C+yS=Js1U+NOhswplQ@zjAe&IsDSIY;C zE4aDQL99cgCtTI*4~j=zrv}1(=KV{qIuf$BVj|K@cJ1$_Y0FK9KU|8r&YOhap$6s^ z+kha6AXTr+Uo(k4_?W$7c<*}uz!@+})?4PFF5vf1T?{eyv5vZ-fZhH9(o`}q``aC} z)oJ|l+BIi4HiPzYI8c#amdfXJW3AecY+Rfb6|?3IB(&c=#%OwSy~7XFZ^D5zJ|`4W$=B*VkjRXlzcby*ACO&P|p_t?>xFS;oE1~vZFU5J2E?!zvQ ziMk8JMdHJ^3l3{-#X2X0@qoLey&he3hh5R7UG#t zuf~L;(zXkK9`TxcnzxMGNz%N4tju{@FJy`Kj|(TLOu((-Wd= zscR2&@7ngrU+^S-Y*ZY&e~0l~Od}((f>~fI8IA_>ZlHe67wZ|P6Y#Cd2TTgYKHt7P z`l6M;YoAl}^5ej{#M;`>H+-uUrY)>+?q*n&WmBb#5MNqe$M9Z*N+yn9d(>~J54z!Z zi+z1g%!n>q2xHLrP0gw*r0TKgdK7Yu_%9gk&aWQrQ_g^A4?{wpDgBA{{May=M z9sQcTM}C^hP(o|X$b7v@tg98+*%hY>zAGVuMuA#RrZ`NBdi`O&;1T;g_>AVUsBk%{ z+9z5)Y9qaAR&L#uh8>Poum!G5N!`apjzZn^e69&Lsi7gpSU#$V8ixdVvp62*-xR#l z%#F`rYUT2y>|GVozcmV=MBP)xUo5p(MD^&h#}0>nK&j_khuq`i^zw$$LJxyRawwrx zgAHTu!6p{bjr&@hrpb6pBUt+~281S(vu+`-Sqj=Yw^|@29=+^)+*Ltob!B6T(`~%7#p% zJH*Pt$kf_IJULwC>BT>Jweklqm}`4Nzl>n9YVl3%uvyOWqhUkz8+KIkb(gKfiKkCP zQLeqB;mJ!To$iPD0{vd(A8zX(ROyDNi#tY3)1p+5=6jVmb)tY8)=kyOXbG67Z=Q5P z?$)q{%(`vmyqHhfX3C54Ax=wflwWLhCQF`cZgQ1BPyEj_luv+1*xuMF#`LYQxu&M= z`}J<-8GJ!H2o-}Sp%S_i3%cBE8Ig&4+HiTO+Oh2Bg!m|_nkHOW&@4R_s+gZD*e-`K z{E6pRej3mHi_G<>POSgS@oR05dm=eqIu^)!i2Ya@L*7c*2fw%1s966V14>uxnOQy= zb1wB2ztVe|`9*@p#XLM)q;*>onUYX7VGeiM^j?Q{vGU*>thnN+_~*0^2NmH91$-~O zh#ykXG0siY*w>jTl&;x5bpUlOxiv)YV|wnI?dgNvrg-dTGCku>DzWY0i2)Z1Jip+E z&DNc9t(QEC*VvOK|11(w8an+fY_(V-4_hxgs?ZEktkpSbYLZJ$CVkVdQD-uJLSH`0 z?;OTsRANvq(Rvby|Cp;u&ER7f)U>})`xD_YE@$5}1UIp8J<@kRCSpXSA}^1TML>5-&i@_XLdK+=S#b^qk^M+HgZ<}A8rZ$A z*ew%ev_uGN&U^MNGTgd*pS5es)ZLaTiWI1$3l|K!c{r_?-bd_Wjeq02V7E+9h~k!i zu%*1WM!gQklQ^qeE)JeO^bw`{S(6|_dHXW%rqv_Xs!a-lD>$rwf0Uj1J^4So<@YEt zUY}te?UU2f4VAZr%e5E5yCa$WCS9R}XbwfR&z$v$3iKm;Yo-0q!~Ls6TdRq;sU)*1 z`p{cenXzf_!twE=ce*r~H*8IoFvIj3(QCV2#2b>O#^cd9MIOR5`FbhUW~SL`RxHI! zSfEn|fb@@USF{y%akt!gc3C<@AgA$@Gsn%BvX-MT$0pm&hC^=|3X)9s0Z#>tv11}E z_8+`P!IH183faOR9$VXS&9X@hDW#NKH}T79Zbmv+98pVxUn*E(b?oRV`R3!Z@KAZ$ zaUa?=%2fMmb?$VMLQA`t5{kNn8u$8~516gqB^;PGh6{^1cj*|q$gY{5roK&9Jg5v` z=;rJBOx)-9l81`7#yRI76*h();`O&S5fUY7m1vum2)l^v!yz2pX}yqq!(&D zk?-9v_Bhi7&ROeIdn_q>Rp#rwE)rcUI&8`eW3qL>$&lB(4pUt8Wcq$<@Z>2Edy;Ut zt&sWmVT>{8pef<;S1Q7WU(0GdMyk2Go@WQ9*Q#XwV0qqTXl@DZEC?=9UK>()fzlNH zgVSguNL}>$mJXYT(k>yVCzR)@O=Qpkf5Ks?RzA{Djjohy%Cb5oNcWj(+{)H?MT0F_ z1WDqHvb+Hv^I`R~&s3{6${B;Zz$q)_a=z5Aua}!P`0iN5SGl4)E@O&)>O2^~YBC1&NIL zvYk>;ufgCC&jP3GX#K~P!hUy+z5z^%e%V)jO{EkNk)xY!UDs{z!}RVnw}_$%DdV6P zY1K7SBsd)Q)cnHt%3;psxOqL;^>``wG&Na$&Y^-!?Hx9V)P>Wa;Q$a@;I@yQgbunb z*f#Pm$-zMtAHM zrdc@_p9=oZZmif@x%K21Ad zQkH_GrDZL04&w*wr3F$Y`UeLKb}DW12_c&kdFE9{m9Jj3!_LBaYT`FwOlT4BMtH3S8ui$M5 zfo$8|NRq%tsWHhxXX@HVC#0i;L*g#P4=eix0F&R`P~iPrF;W5B#XUE_4mc${P~O7) z((FE6DiZ})M!LE+sa&&)>lpt}!3`%*^~(;R@xrkxTHo zsJZi0`w4l9PC{X{0pL}qZD@E0BG}*4BMYud;9FTN(EA{Ie}gB)7ylCsgH1o5{z^mZ3Fv|s$Qw5|M_br z8xukISMPP(dn&pFY|DH$C{MlDH_8-+s zJ6>n^2dk1t%m3CsBupIS{BB@kFzfnyPVtUV#$=&b4Q|og(&Jvf%eEyP@uF12X`6mO z$AznmXy^RBB_)aCFg0Q@VJGM`(ZbkBd-wKu#iz`<9aF?b<9-8q@!RNT@t{+Hqh)6e zo_Y7jccowNB8^_8-S+!!dE>G^uqRq%#9E~VjJZ2!XJ`Mr+`-uUDJy&#POb0{3mRKY zxMAj&1+X=J@b&ezwJoLgpsSpD2gF4L?l*G}!wJ}r6UV@MuCb;QjY@DBt2l9Q^B zouW6nIoytJ^ggWK=J~&XEl^PN4cRFVt;G9HiY?7;fECIGZ^_ngBDzwRZPY)Vxh?0+ zZ%C_nZz58^KAEmyp8iC)LrWhS*D>1X@{7ipEsCRewyl`&?1kQ_p^Y`-YUhzBy;=NnX`Y~0t)P9zKVmT((ldrJe-ML-Za`M+Z z=9vl^(p93!a%-?RBK{@CP{Ie7@ieo_klG@tbUeB47Bc(X_a-c=EWYox>l_RaP3cBa zU6Y4zc-VpT0A_Zix*J|QYe^%^PDKP)%T5;HY%zTS0aR*Zvh=>ddT@xxlAFh(b1x2w zaMh>X@ei-A@6Jas>+~2;K*u29uz3A$6>3*S$1xSt59dE3P z9##ESnrqh0S_395W3Q6O^JSfiihP_1H@O8pKKXPaLt_Jj+j^b1xxClkhpc~U)qa1s z@DTC=#)^EPOAEOx@H;G3Q*wL^hx5L_AQ;LOUGj`7*pn0WAez@>hvQZWEFL$~l~XSH zDRhs^jJqg-&Av1gp>!lyu8L#XR)d=1>V(=ytT4cEYJ5Ql$36w0)gK z1auRvcsI&T6zY9*i|{?{PMS`3%xNJ(pB&8J!2OOQXj?b0Ncpb~V)RAc*qz|96zpIt zie?SXEp`kLJ(oW?=mGze{)`RN5v!?5l%?W6b^P7xhm?-P+qkFqSnh$75hgFmxWXk1;eTCi@ zBp@T*Zf*y^pncQ_&qUO@7 zz$O+u85U0YWt@hQJf%nHpxfhJv-Ede+~ytO{%#99-Q^HNf3$l+0H{4=-!ucw?5zmP zV(1tc7$-Y)1osXY&Xy z8NmmOjs!4q_8r{^DeDry52B~LeZ2LENFo_mW*=$ul2fcY&5V1$?P*Z^xVOJD*C#%w z?76BklhM3npUr3*^t36zO95pvUuN6>n!7RO`O9ol%vyP2T`c!r5!}l)t_xdlG}PA6 zaJlOyp>og;5#KEkY*t8T9Cq7M8$s5ZQhD|NB5hE9CG3*1Su;^lh!u z#7u!S#4~7bai{N*;eN?fu6_a%^|ctMy{=Ia$LJjy)wb3_U)YkD&f_5=Ms)AoeP8SN z4Lv~)FKcI=B8m@hT7QyK<#~ixKbTigG^sbTm|PUjb&RxDAF~Z5O(8?QEQ7WdOVqz$ zaF5-+Rk8usuTKdrMm#(_iXw-Fj@$Al=wW= z;~FGG)@*dSuo8?{z%AsJdO`J^;-yTUfd94zjRZn}%`<9&T1RFA}O zT0??U{a$8p<4|wpq1URAePWYBH643<8XW^2r7*+ux!^&jQ))>Qp$d5h%>5f{#eEIJ z=y=0~{{=DK-`wtYf|SpC=Gi}PtP1(vZlt{O>6~)q?J`_z$Q`Esq%zRAH>dc6NiFY$ zySDB`oFmV`TyV4lbTa_Ym=}p+XDmAF*W*gk9oTYhuv$DkEhg|~2ZKF4oz)#wE~|1R zGe58T&euWTVXgsKnLJ|0EIG*jxseXbvUv5J z;B?}RsQQNq1An&m(O)3PTA%8$ zbf+1;e$JR6k%c(7raram1(N zYC|~W(}j9G%=bIbh0U2{u*Ky5e!PSqXMX=T$-)x#P79vRSiaPOs0*EmkU)+`y=-{P zxXTh9Jr8Dj8g zc6-ZFtvX{!x$kX!r3dX(-`UZL7tw(DT%FHk&J36F=PoTm$UD?4x3ez%U{l;zCu_bo zJ(mNIPWnScxRXV!ALedyEqGu2_xrpjJl|^4h?`yS1UQ8(Xs(}Bv8@N6!s9yXno1w9 z4bw?JJ>l=rGC?3C>Qqs&PL{1o%aJ=q3N!_QbbM3NsM)t)o1&j@Ia+dU2q91(mQ9Ur z*9o@pA@Sva%`;6|j%ukLHVB2mjKW7KGXVk;tKko~ zR2&NQeiYpLcYbrAG1Z-6P!`KO-@Qcl5xw9Bqp{@?`QhjLc5L4e9$LxZwH@){X<7NE zMeywV`8GM%aV5?ODK2I+lUBueZ?!e{-pzR>FKk&C--9<@7C0uE}7lCzu;TPgpR-*`Jo%va(RU%7iCoQq&w7bWs6&!I_ zQn})K7(LvyR#@cFWLvPXNv$XBInTPjpl{H&>{%%*YOI<9?dKVY z`C>Lf^Go8&KPQFMw5;|X)*f_Z?acP0FNU;Kvv;DtAMpP`mQ^ju*#sqb49X>#4<`Pt zrvSaE&Ej9ZD6t4)G@KxfUJ?YVRZ_&1yn6i*_Mmtbt528q8>*>>^B&FOP1Y|k9#mR+ zM-p)=T>NaiY=Y%(C6&ZVa$p$!RgrKa(X)09PKTOWwK)QRh)f~gUYMPjtY{IolvcO(&n`I zO6usX%8Ej!0mXA%Y`-BFrvxTrqqR9{()jA=T0^(Kg3GWWuAG+oH`3H~MivKL1@73K zqCYa;OQjgm^88p6`FrAuNXxo^A77obmffW>zTS|f%LXj0St>p)Vs;u=SBF)+&q4bswL21?XL!6dZd88 z3)|ggPRQB$Sw;Kh{Ay=N>GSQmX4mbr%|UBj!@pn?8}u&a$^iaHkTwu)051n3QI#ct zZ8MURlD@vEZ?x|K+<$q!9u2>kHh>~0vVI{i&?5jv7JGIAWd0g+_38{j_peyMXy?P8 zmfT+wjz=+o0gIb`@J;F6Mq*-*6CRX7T`dOFmly56+31%S{UHdKc_d~2jLAdw6|%R; z+b9cj_!jDqy85IrG~Bp^o)mdmA6p-r#eDpYON7;a7Cn8;4ZTrBzT{?O%WV|Z-VknX zZU!=8Zl)^z+$NL-N^%8H4B#;(alm>zVOs_U_dnc9< zHj##ns!n2BJ>i|b@HZBi+Y&ktK>-#PZtkR9I1H;~t<>;{BwTVt{zSGSAS>nm8IDp! z2Dd;Qe0k3gPHQ9ngi=@`XL@@2W9L^PA>`x#w586VP=E}R{>fTL=!OhYE+|1>qbBeq zZEX!`>angV=bPWF9KHc&OvP;?cYTZ`f0ypSQJh3ifT?!(d!KUsDk?b-^%`2hB0^tLU-LPjQIQ$z}e1hcTUhj{4 z?Yg+SI~xKDRFtxBO+r&VUD|MAdQq!8L!%;YVFKLTjwgS9c5*=&2y})xg^pL@B6svf znO@7Ew}+rdgluceqQDe{uot5fi^=l>VS)06Qv5TN4*vnk{j*EIMoPJHg3JFzw&gAA zMjM64cL>eXS}P@@rlcvtLdj~_Q(6ro(rQ{FFq8BDwtSB%E8crvz0kY-DM@16Sgu!l z_LJU*-S75HS7wCX&Fd9vq#VmfA0#G|?eWH0Do=An=RuU^xl7}tL4V+=`-Z^ShuV=*3`&SUu%0!yCU!6e}_C3*r2x|2oj@S zI6ur|`4QOA=1NgG?Bsa$UiY!Zz=E66pe(}=vgb(y_I?B_DK*Wp=L9QxmXD^J}A?GTU$ykq$Gxp>vd^A|3q#vO#= z>;BPOw_@>a$Q3q%i)78^!KmYB82sfp@K^(s&Ohl z?ouW_dXv@9ZJ(=e>v#m9&hkdCze&3?C#Qc%iy!Np(|kURlW$@a&ackFW21exy3aCm zZu6XFJ|f(Gfnu)e9yG}zh9*yDP0=KN{5)99bJxhgDo|N_et!OvxgbY*-%2!F=JN2} z=wePi-{_Al?stcCyWDo>SM{7tzNilHiu26uZPzuxSmw1uIoRCCkqfFk;Z~O=S9a~k zhW2+O#bO-nCcYU~oAxJ`AKp8>_g_!=51)dzozkrm_LWBq z1gDm~VaS0W76B$YB`x}p(8F<`^OeVzsE(Vi@fqXWtT5Q81Jx}3T8p891ole7SlP{@ zCS3shTR2~PTy!e_`9HMc)`Z&3Z^8vPQ|BpZeCoebd3wwpPig(pY^Ta<&uE#Ygr&{_ zt9@K#6o7d(}_6lkUSe6!53v#9h|`o@GMZ=mhIch z+iAS*co@2Kv9pbihCS1sEUC=+!?>~a_)F*fwX^BFxBT{Vx%PU(z8tLpL>WqZ*Yk}A zj@;Xg5Ge7gCXbZv{%^Vxo@iTDp_>~%FJu|vWjZ1%YtZJI@RFZxVT3&TKco|Zhdz0{ zeS673fOKeNXE8Xj&?NkExJt^`?D+rER$FJGZ6z7jJt(hf9tlm}Hu+Nc_PCRL$$ahQ z)!l9R#mwYRpi5Y6Y>e}ay|H6p6N__?T5qXHrBdCLr>nc6%OA;Z&{z)7bbEng9t@{+htMj&(JgUVY6Vh(JIP07%_0ICtVrgx6)mgVZ7uq=!Ne@P+PPvm8 zi*d2JlO~N~)N`jx%Q}viISr0Pl61s}+dU#K@6PMkOtc!(*tz~QsNONnh5yXYhU0+~ z=S0X5^6tc|*T+L^fQ(uBh@?)wGlU$48Y1yH7V`YPv*wr>Sp#;LUS%XprXt^n?Cdvr zHa5Z`rClXdVfXvP#NhKMyj)deno)_RPtJGUUTAk4*Y=a5^C&HasaLwEadI05BU964 zpQkwhL3Bjw&*LMl8@yTnY63zJWcKyDIJ9kMLT$8u)!r|rL)m`zuhW%y%E?$9sCr*{ zL0Q2fss-3;q%kFbXrb9pFa&j%&s(;txvJ+o<58tk$1@e37=y^nyz zg!&q4n5A68bsp6xkscc?)PKQdfR|7ovW(4rg`G;)3yZOZqWJ9B!yBv9zW=6XyqlWJ z*ulm+8g>{S@a(nZm|&jv&<8h0;_v#?3Ote|Ny&kD|op)OP$wwijxg zadA95m)mk2bUVWS=!m|t#$oJ}o}lm8Kq;@UME@dX9p%=*&+{XCk16eSJ2t5J(Vm`qp}&^|6(=zb>Di6)uOP(jsZJt(L?%mE&_B{C+4#uYVsHp6Wd9`YgJis zYd6{V(RKyBv2TPYOV5v}>o?U;HP9lW$(>>vj{4Rwl7apmXdLiPQ3{iYjTsN5a~=pn z@;=fQxaT8N*ibHmulOy3ZS7&r-ca}cBlF8HEXVao$DSM&`m0+;=MndmY8pur9edaf zC6ft#(vNu0lh!2CBVhcwV*u<#d&L75BdvGV$oGhFi*IR@0jd)Hd+KH_k-R@R z7G&5Pg!eh1pAyH5ASENR3ueSy84em!3XNYb1_*y5IG^-FCm<|af6tdm3C^F4>t#n9 zqLCr0JcWPp(%Jm{iqD8vtjqzM6Ok|ew0zfFIQ0yrjM9HWCV8p<)II4EJ`$~6Q+`q* zP|-8hU>h6ATSUyNs%R_vO11J95rLyx?w7^CvE~|`H&ULyXsFFdcSJ!K_S~ploWgPxl+<+jFvA-Ms|XW$vlbSUdafLPIb z=*&gl*Bwke$pR%2wi~{t&;b~dMuxM?VVh>8B@;as?}-evgBzwPJo zqy5U88qbqD&7O(v#F?}LoA=3HdTRW2yKLiOF>gKDh+A%lKC0f02eQsdol>ECOiO`7 zID0LPKQ(sCeo|7F`#XQKsHIj@`CFU1BH>;}V{l({X2W3Jg2h-!pv@EC_iJD-9(i0Y z=i%}W$+hDGPoRxtnCLI_k(>D>LM2L3S(4YzWD(y|D-&yMdJZmUvvS2R>}!yo&I9k8 zV0Pqp&nBW%L1YC{jF(~jCAPqUW`nzTONt=!a<8DZ4?F$T!}{(WnAymJ#3TUq702Ei zfwBs@9EDq*|B2|8A10L^95^=BRV^G|T6D`}(Bm=AWmUW`0m=C{3X(prw13-&dEY4# zrus3xF674DsYyFKRGQbARY2Y51T+;p3(v{v)!DFfbIc{Q7Qd~;hFwZsN zkk-8xRDi$#Qn>$UhK=+9IKX2O99(7Rx|!mKpZ(h+o$6l*gxFZA>()grau-EIBGlXWlRg*)$HWx-O^1r)$7q+w+j9-lTaFahjAiB6Cx}ul?{(-*j zEO6N_+ELH{5P$zSVNS1uLDh9CJKJRF5#ZX|x#IXeOCL4k!HG(09!>W|tbDaVJO=Ci+i+4uN5*I7tt zZSRp1f}vYo>xme@{nF8?XRYhm=FVEHV+ZPTVb_h}KioXZl2cGl@M&VymxhMRhD-OO z=kxS<;R^qs?A(m$FFTJR5n<_EiDGQEHh%{Gfz@PBh4I;`23DB=b)c4%Sf>Y#brxla zwMrb40i9$on&FW7^8p4(B=QE_JBbzpp!q(q&^;d(r(tB%*ST9tgVPo{Zl83u4;0pN7+gY=lLh-i9b8Y*b_9 z00lRb3=$8=S6`oa5{Zpi)mvyMQ8!M#z-A0%zO`OD9r+>9LDgo3LhiF9Pe6yJn6GGW zHXg5VYwThGxK)6_0Mmd$geoTMBBK^NVBoLP-$vYB1F&<0yj~h3LpJ_uy7yE@vK|N; zy?AfD=_0-46Hqx>$CWEBJw)@MWnk0Vi}lAsN=v~7DQdu-Y<5bUtp&Qs(KTZdiJTiI zJ6k$4-uD)8b4QV!zBe18w_!Xnl9lzwt9S$m-$5#I*7iD3H*-Oy#t6U#Ge9K#lps=T zf)qcYmF^!YJWc2(mHrevvii6ZJD@VxFRPeEf*Vhwz^_9Wmx{X!?9>U?&4XMN(Dxx! z1F~B08eJK)CDW}+0o)F_CqNz5;UoX6Z;e-b75rrU&eDmD*!|o)46SRx99d^S3<9~} z$xDfAaeGlVD|pK#%o=@F`+|w^U4uo++>xB&R+S zBPN-b9Z?!Ol?I+Y#p(blM0~!2KI1ASlO$vS1=ZJHD*l`T7L#r*+|>ZBc$Ax3Uz{=dkA!x_CXWNWLe5vn$6= z$fE$~l5d@uaTC)P0gQQH zKrNEo-Igv^vg2HrPA!`o_Yih5Mo?<)o+pu9Iq!gsdU<)US;UckvU3>?MtjCy{#w!c z_<;D17k;NL2k7WQETr^UAeD`nzp#nyEaIEkcjX%=QTjpnd&DDH+2t)PDpO)=Ead9O z6T_|@FrVEMvWKfb$u2qvx9X(Iaj}KwSiO@h`0kJgEnt>XT;Hg?Q9!NPf|iD1{yLl# zrP{a`-SZTe?;szVcW}GGNvwXc@lZhsX7`zmN^q_pK(;Wi(WU7lK6|>#LxW?3*RpCi z5P3}SQ{z}PV}>E4mp08le}W+fynX(ssk8!F@v=6X=#%%gFekN|wC_%)bVMAW3jxkP zsAMY=L63aPL~_^)Gu#ApND$isMui|%W>?;&V{Rgy_BBE!?ICRA@93c1MLsK*g0a6= zvFTc3sYd#nyckAnp~B9MPWIAn{agxL1Ho6jEco%ogtzxfu^HB7rCHPoU!b`SE?+PE zmz8luKjWGa!?n@Ry6KOGKJ`v>?Izb9PI+@%1TOffJ@UL5Lv5FT8^7rt&Gl%h;=rO& zCEHp5qpI$Vka3WwnRDM^D9cf&yb6h>YM3BNOt>5Cyi|2pv37q5{jLk;>x+uV|1D8p zdL|$f)s@us!hF&8%P4H}AxMlw%IGwHneXr7&&Z}V%fC*b-LLEyS&dLYMX~R{`9zo; z*fFkEKLIh)JB+TNXCBK9+|(9_o4cFNx~FJeYav2(togWy3~x&Pj~nZ;22G+Qcr>$e zRiBDG6}e%|RyZ+nRz9lINz6)k+$2l(|9IrJnHb0`RwpjTzJ4kcxV z9X>)ty%RL>i`z9t+sP)U>zoj~*&53USqNq$E}n!|2(ct((hL+85VQHvuXm_gyX2Z7)`fbZDf)%FD z0GjU`Ejlwv4#qt%w)PAvNqLOo^Z#t| zi@aGPeRDMX58*w;uN`wKoqU3Yg(OH>!g5=OGX{-nO)`F26qX4#g(5am6WDb{(bww; z8EDrdS-X`E6qhxF_x_N;h|qSr2>z1S_VeoL$?GAJtEYlae^TIg7v&xjXAMV7^G2;# ziICH453c5`O73<=Zgp6m4ULJ1iE1|_7rp(cICa-?&ekd;11t(7^Dyvg3etc><1O^- zFR)}#%yMM$=d2qupySchF8bou+_ zLVSM)Aq9tVTk`T+mvj_u_xS<`4=)Wyu-H!q;k@LO`5S#s{B zB@sUPF z*_fc({v*sW5bRM2g(+2{d-eBv{R4l_YfSy`F2U04Htcmatad|RS6o3?HISg}tDOX0Be$7%szYyO$OyQ`24&rE zSN*_iRZ&F{l7*(Fiq+0=G)CS-sGD$m?Ay*~%}rM_hWsWYd5#7LRfoQ2|Gme24?H94~J-j?=Zg?`}Fg|>*;Mw|6y<9FAX=Y(| zkBB@dCrQkuf*iP8dJP;UDAMEi*LF}*S5q^27FpA|y}Gl#pVm0Eh2PJvxiOF@5Jz9+ zM%n$D?EZdd7~Qc?eAij?vnhjL&`?posE31tT{c%0MoES){eaMECvT~GXLUj)+bG9f zVSHy@iU>eaT9DAjB>P*OJ8SKxdTKy!PL{YC&lyxRp}Rlq#OfU4jfgfxiF6C z6!o(1vs;{w9|=7QitLr&33-AoZzXo_-(azuz}GH44N>3G=jW~=l$4uWW+XIkH&Q5< zi`@I*8PL0cAiPO4b_dLL&{I;5FtJd>z_7qhB_6p>r1^Ixa{haDv%f9c-^a6>QvZDM zOFxUP_^Fh#K~_ud<83nf`X0N=d*+56{eSHWd-f*b5#Perm7&2pwwWWD?~ zTE_5bjOghe!dVm#67AjQ#*-8hZe*%;MtX7BsPISLD=}hTx8dEZRfp*F*>cL}npgkM z3*t^G!{+k2D%CeI#T4RX;RW9t81X0nniB>e$C=a{Ha>Z*f&86sNo^l5l>Ezsv=cNK&l|UNmuE;N{66=fOJuM2kC-<^b(K`(tAgG zM)(q#!QlnAR=I zYdhqhLiha+=USVo7vLf_-g#;H4c+&2$i`RW#-z?i~<*_`=n;mbt zZ-v<$ssE@7*e448LPvS$JEV_ft(R6X`{AlaAfQz~W%KT1O}m?u#r1J1?jT{-?J}8X z$`#=h=IgnK0uK@m>8jM`@jj&W)JyX%;R*vjD!k&!7OV{-8 zw2~I$s1T8tk<>_vnK+xg=xf&~+BLr`}1X6sRk-ZX~9>G`NnP#j&4xUiWxG-)bLHJMXeT( z{H$jQd)cNyBH_dnlYP^y(>nOowkTTT@il8Qg`Cec&r^47-qPGq_!ye-HiIwSLe*bT zL{BoBqcod5MIz~hw)pAO{D-l8%IxpwHM3Ice(u+VZU z9s=Pa8i_GECRc}pk(Xt^J=J}btj|b|*%&eu-7@yDWIUJn^#-NVb{=yH14|;VN{uPN zcx^}U>1q@}K!0x-KE`fgF*f{9ju=()4@hpl6W$f5z?6CPN5$0s7brgpv|URJt=$KR zd_Z?ddcESvq*fX9buM{R6u!M}(x z^X&Ip;q$#xUx$yk!n>SbVAJMDNB1y{Zx+x~5IwG#GC66C ztQ&o4iKKQKNdfa+SJ$q29S$3uBVJmZpI=x|Mrv@!H)~W((5X_0tbamKNjdem1Asif z?KmgqsE2GvH-E|Hsr^e(vy`H)p~3Xtz;p~0cMaM`iAN@xpFV4*#cx#{{W*M%en*KP z+JG{^b`T|DwjqJ-wBqB`3T)uA_>v5hszQFhR34u~;O$z^P8d-7nevyvYWfgBq4z-a z((vT#9F$p)Cd&^NQYx)LYs9z595eIh=QRYytK5`GrPA(vJmtA>iWu-wJy3}tm1cfRKor`lA^Tec#M3) z>rhC03s<#NOfm16Xf*dQu*|x~B&TE%{3R zNvo2jC-a5IlQ5M`^R1CXG%)sT;K-BCKypOg9e5m;E|iYnW&yBAbuCQ9$u<_*)ZbE+t6?)*t*P3N zBn@_rbm*e(cvr~X@^=y}AXc0ezOAO?jzT(oXVVV4FO=aVerp@a1(pPsCSmHX=rDDcIM4wM};WOjX?a%ng?n%?DzPO&TWVdE8{g?H_V2w&ylaI(OE@nVGKhZ5$oDv|h<3=eAUd2(GYS0H0ZnUOWEs z=3)Gq@1&<8%3CXR1vkGH9o?bqUGn32Lc7v4eN;fa{kd=sn;I>D1>UKz^A z1>&(Rk2S^uvyXo0@ViW*=khDf<8!zn`h9PM>|(D43#j0%zwyzX*qofF3ndeG{NOK( zbrM|TeijfnVSFNvq(WY;jbp+hL@@+8S=0m9yi|Tqj#~@t4xaNEvQgYsdR;coRxlKw zAjexUKIh~vn8OZ<#HtY1xv#n-vOTT4Zg6uNcR82``8gtv^c+jFH1oL4QhyZRi7jjy z2$80IMZ%{tu!q6RJA4vUxhg{$zJ#(b^a{U}CX?PRKcG{@)mJ8Eb1Pc%)!N!1ud4c( zPDsP^=dZctYJ4;GPW+npc&S;KlCX6x969*UOr}ch?Fry|Z{M@Kbj zLtBCYD_IPvPgXnY^Z-|ceETa^F_bRwdVSiSB+Rw35H63studi;n0Z)$t2^N*dqeYV z!=L@h4qm1x5-)Qm@dgK{l^Nz%F*)Jg-8@^itw zwZ$*vVyBoWsrKcm1!RID$8e8n8&WN8ZEY>BSfA$RW+0t|dH`4=aTFxW*%;i81B9XN z+0EAy?c49a5qYuF_ob+Ds0N|S1E1<1I1gZ(RaW)07Wr9qH?Oy8|w4j9f%GZD;{jOQ2<--Q9G5!p4nJE&LuQ(lcVx z*2olZJj4E>4cbs%0Ve$r_S)mcaT`QJQ5f|dWMc+}^lh}tRiS`z5YxRKgSo$;f`adl znk?vi!YBwI83Io&%A2(iR2xC~AFNQgDh~RZ$zJzlP{eU@LClXh;gLxQWhe=tolq-U z!Gd}LUbD~{hvMY`$16) zj?IWjV{xDTZz932*=x8n^HFu-0o6*tTUcKu2tm(h((vL5R_Nj-YCGnBpMDML>9;}N zIO1-xUw@8;X~*LS+&CLTpS1c?G!pk6d>2E|r+0$SR|b1X0L2sdVZl(5E5(<4FiB(4Ww zefs+PZgcVQ@NjVr{F{UpP~4VTPXdIE8TnCh2vdS%-^tN#6szVfa)Yg@Y4$kSmI)4$ zN)07r=jZ1qN?&YqYp7<~Ek^e$4M?V zQ>^uDSrX7CD6Z7{z@>VW|H$5Pdy;qB>v-dn@BFq!v{y*}Uqd%7s}5(s`uV}$^OEaoDZ zAE_jLSd%2rjOK{NZ5KVSqlHIZeD8#%S(Wf1g6nQkhb=J7!`G{-+*1myEBbe3-Iy5c zqo;cA#oa<5fazHt!TJRe*;G5dD(IfBdOx+eGh6PT9-o$F5=Pq;MIm(&~^6x;Q z^?cW(A|k{(O)I0)#Hlk?mhrXo{GJe)@ml|SV1&)OHbJn{>2hX-_&M`jBsuR9<#mpR zkW!x7Ohks; z@926+)*A+2-}6|rf|>-(`+*NC1tV`5U@$~Z&W9<(9^hi6ATkxkEw6eX5?Q53<2&B` z0{`HHD{lmf(bm@a%q5I{h)Xxa@|QVWmQ(zQDY;rXMJ~g(TYR~ir`t=m?|2WeI6?Q= z*o4-r_$}7A&3*^j#M|2L}h|w1x=obG#x*&kYF)Neg*w4)Cs#Z%$4; zC>1}`3$+btOSRy7_40=gQ2XvzA?l@r+%5px2zi;u*ejzDAGq739@1qcWr6)9l-l%G zK-MF9e&ngx`%5L4z;e* z_namWuP$hc3ykIN(Na=DGa&&=oTpVuXO~IMwv!H5Cb~-qIL!2-`mn2mxxwCv9;i&; zEW0;)_nV*0riA*0`Utu2XWfEsgcTJR-{18-9-mg9^OR^toy~fi$G8=aQ2}NMCm9$d z3A%J_0Rp21f`f~z-_??|IQyM1^uc8SG7C_B5oRvGLl#Iv5Q?e~-hG-Xeu6?Q##)%h z-@4idOHZ4U$C{sqUc3-NZ2_L7R#jbj>@{#a0nj(|QfN(C?;FHtQhymNJK(`G8Kk&9`@o|L7AesEq@lbWib829I&OP#^8?OHfE+L zV56&R3rg}lYfF#YqUOCIh<*SPp@QNstk6+k?8Kc2_Yv;bJrDd-8zAIe8V0CWZbOSUM_XzOY)SLf>1HI11 z<=}es;I}PGiqO(P{439q z5y?aX5s!@K`z+m$-s3LCE#?c}m8V!xD~T7z9%KVmwrn`5jAS+@MXhyqY%8O>_l=EA z+y@QCbmio9HDjzMc=rf$6sHON8|Jxlbf_OJ$)E;C8kP(9)Lu%Q`y6mI`&D8n_!+nQ zEB4e_RdyMdN;#|g=gBvoD>AJ4-|Dz#Stb>(wkO(8-kcDgD?yw6#J8xfsN_}5kmnr> zqHv?<#^3LQPD$%4wP3&mkd{=B^qckavffWVnW#VKdhW=zf}dZnfR~q7VekRV{lc~D zDk=|s5u`6HmIizMKcoTLV^f`Kr^M3aSE4j<6~#1XveY+4u956Kk*J(+Art`OvZ-}D zR!gN+{h4kC+l<*Khu~YWh-V&V^+N8AKggFmI6XhVR4Yr)e>RlNmfM>e6=v(66`oFe zza(1bFoYm`Ph8+Z{bnCsHszPnGh4*RUrR|e137Az zKEt|>9=Y=077&O_MMz^Sa^7p|Cdj>*e}WdklRuRF^3kbJaS z->=T*OUyh(e{+%uzA^R!y%yN41z&)ZpnCO9$n zsl}caO5@zgYmw9vMU(c}jl2``5>qa4R6w_bz1~=b5KRyuZ zUqvqZEO@p3));euK$&7zM*2ieh9uKCBb}+Q<$RB=?q#b0kDm!Y?|uHnrY&nX?NJSL zvoP2vlbg9Cl`*pZW~2s?hKH%oChieIPun}&FsQYJD(B%X;6P4e(1gUaf+Ia5Sa(4u zjT2VwyOlYC`Hbmr&wRbdeNk>wjnA@Od2=zJLYXKvJ>&h>LV1iX+TX<@+$D$nwIs`z z1*1D|0j7nDGURAIQ*oGBq&iudbJ*qnYmY~1uVRDix&hGm>~p3^lv#S3!G}k9abJT+ zHH>x#<_eP4y|Z4G5x&~T-4jX&oVg1-9_=3R?`yMy)s&V+PlCyr}pDwEcjK+q}6cA*x<|?J={YF8!JNv5zmvcC# zK4AHCPYo|xGfF=Z6gKNs(`d?g}ZRfTtkS5iJF;skG@BGMLSzZ7hMoxeJ6C7##%md*5UGbpy7HgzMiUZTI zUO*TeII{C5IcIxjcb6KN+oq5+&PjrnCBT_aT^PQb#7FNOo^z6bUGi$p%A6-1R96@j z3VD!=7(cQ{RN#4^IzsZd(_oaqlYJ#10E{4D@6AR3IbeuiXG-wr5Ge!d9cgqLqFU z*u0UGt#-MhwOIgRbsw70 zA{U2zXikMx2i@{cByH1Il7M35y)JlzI-1J0ks?kx+RdeMSmFAJ!Jso<9FNuG{pU9^ z6-=S2&gW+Ff0L1^T5eK_gFS&ykb_`z{?#@9R|Oo3&x)yAL-U@oJZSFn_MI^xcPkzX-kMQBcwaP@cjbF zhW@Wwxl+LP09a@dhqHmrL^JxB1%2!4?Pl;Owf3GBE`Vjd_i6AWZ^gSfz-{Cn`FT*) z!+mbgX5!mZtW@NO6|ynThte;P=VOb8r@=U}Pq+w?1YC5M_wbBSx7*2}66aP+%^Ca@ z5W^T4aA|vo+}!-(H96I_&p{H~$+bq|AD7#I?mWPQ`a-rb@pXBc#W=x2Kx5n6^2QMZ ztUh2R{%>D2jPWm5)c4GPyP_IuY8%rC{g96gV()=$+Nq7G(GTly{}@0~1mv)sD5=?6-_~Q^PlE&0#{?!Gl)71;t@4yEB#=5~t{`5`H3r0ma1Vb} zVH<3;okeoA{_IwQzZw`jx5gUYo*@H4D}is_GcQ9im=#h{BdqNq;2Ht(vrAVv(EZ;m zp;lz537ZIs?J(AtjEMX7nRdHNPcz;G4aBs2lW>+;o(bEuBUjeu3jhKM_9*VF=N$oE`&?iGH$ zt3gk$k->ynV8S?cKklBz#N&(xJ-m-ELEK4FSEj6h`6N+$LUBys>^Ft`9rnB=R<9kBhB0SSu`%p;(AbM`cPHN(oe z$%uUSh~dxT1tNDLxF{!h{S{K1(cwEG!JPpdlJ}V)`77c^EO8n7j)xmMga?e}K;i;c1-$^Tw>~ zdq5FGiBX-)uKn#}?$lzo^~%a~D#}IidK9}Z{l*>Oy9sWk!@X50JsYn!Tm9^nlDolc zJX`*7bc&UGG}XHPZDkQBK$Cg`4UWGpW~8w|dTwRug6^OK32^jr!XEhPiQ^mXZTpLh z#!HJXW_583N~EcSg9D~UyNjRAxVc;7KsS3Rz_lv3{ZAu#{@$&VsL!81NwmN>M}MRe zi;j~s&)U8Y{&I#wT~#q=Spy^pkY17*?N8EnB1;lYN#CNMwLN*( z^=E=J3vlWsJ-gPrG~LBP&<=Ap+^AS<*+T9BHaE`HsAp*=DL zvpm<8Wm8QrR;hb-_<)c@?5C`=TMVY)g4KmGVr1|fe=1#7%ok4Z9E@@DLVW1{^4oz> zvU^dHAeb;5XvXqMYuBw3{J@Unx8coy<5raYG^8`_nIW%qO%2Dzir+OQ~}O#sWwLhbVq2 zmpSPL_+veyb+D8oXsXNy7nv;3`e?<_VTUErRaDlU44CNLMPgV>=uUVP0}2~^!zt@ zV=l#-qF6(AWRk6Z+l5!KfPA^a&`D%+-e>S^_C@!0w(J22dUt|=Mo5@15yh0pZs(Te zNJjIqxIx2IfPqx@Rd4pyD`P&ORvXCw-AyShEKEsBsjc;D384YTu6Cv43SdOn_t=&I zp%WTV;lMlPGKV7%EKlfOBZ;K-90B^OgD%vvk?b4DVGlZ2WG}EG^Cgu7lvm$g6Mpiw zIYP`~@RQO0O5XLk%z@5^`&E#<^7H4-2XCAFq?j z^S%7b2w2QP3p z>KyyQAQplhN`LFIS9%7zZ}%|LLke)89Zpj*qqj4&8UFCG2DvXKM_`_ZW7n_-%#-{4R( zm1Q4{vIsYD(9HnE_nlZpeCSU`gx(;!YG3>dc75HF_K)=rwbD!Cdl%QXV`f>&uVTVM zn z7m0`l!@^v+Xk|-^ii&QVtP^mtLGebzV@&F1kMhab*`{ciFwW;3aX8ojC0T>zAC2;W_I?-h9;GaXJKN{44)EMc31)> z?bhj%-Gd&m5&lf$Y*djI`M4lX94G7l(EMhydz$#iJ0F=j3qQq4EkN8#KkqC8Z80c& zhgZN{YdZRY*N^;R4b70jEv;km>RJ(=h@TR18g@td!`Zj>cyZCi@}$spq{2OPU;`Ey z6WLPXm3evVob}WNMisrP--5K-J9jDX_(%rFetf7FscoG3vXY|M{+z7QD@~wb)Z>ge z*5ytQWLq&JHP&%o@#&18-Yc(l9VCro(qTrO>FgPj93geRLmb9UJ_iWHy9D7Z~i{wS4MNEYe1KXQbsx;$8 z^XBTJ+ohZ-3q50z0HZq>6Dm{VUqTb#38G^fOCnls+WCPIwg`FFmSqH<@w**OU<+WglqM6=w^nqIMI zHO$apM1^~$Hm7MaJHOV2!YWMF;}1zmTvWw>daCU@(2q!Td*b)x0Df`_MUy zkI8Bx5g#v2H=nVJx;sP~W2kyJ@)~92!s0?S7=^G4cQ1{9=^FK%-J87`WlxuQ;Ssx# zrV84fm1(P4o;lHeCFoU+_yF0`RTa^JAm~9)1>l!RpwRbF0#YS7S!+1v#4k!P?f>Vp z-r2p6bKro4g-(%S0A<;(E4scfjYQV=o1l6%lH+FfSZT<^_!sm}(VO>M^qoeHBvWoP z#Sj@?DEuj(7TL~at~rK1K8_{o7K(Gq11r}6P_@-9L={XQ4XX^66Bh{FpTY!4Z0VNJ z!R-!v&Tw0s0OSCU=?`T7zczDktQU9V;wKq$aX5gpzv`PGqm0Ehk>DdZxhdB5&KboK`iK+Qs z$n${2Nem2*DH)zjX+8$-5%O#wJjvCyQ)_JSm+f}7l{cH&=-5WAglhl~KTeuZj zgkTOi-LBQ>nY%8Yau;aB;11aVt&ITTzD`HR9c>7VA@0TLA6Mj+mY zn9#o~2bdHRnahM!lvIsIDyMrYXnW=0#LU!m1|Lg!q%XWnaT<03hp%R0n+Z?_h2b1w zQv*|yxWyWGYI^(%fiVFst;RcWEiLUat#P}~)8pQk7B5q964{(upgW{PGJEP z>`{P7uuACd_?*36Kn3b zZER%|_Q!Ai29U!4U{`K*)}ZmI$SDOv%fLh;-zFuOo4r+fd2eq|z-fI1pld)i#BhN= zb~cbBXOwFLSX+qgW-5^WPHmpM!DZT$(e0E42IxlJJro_Etw?a=LyMt2kQT+&O{mYs zIsuqVlI@QR{}pTyt~ruDckZ0)laQG`x8k!ha^h@fUO*%NNmmR&J(CDHg8I%oLXt#) zfLV)B5dJ#;d?|H_!w-H?Zf9T<1D747A<5G61PBAS)Utk9iozLgFbMdkW}D)vq~=FC zY!V!EH1w6OuRn?sVvkx|P7A4Ah}2%3u6#bYN-B-*A@#)FH+r04V1^7Qx@zU=GX)E` zNLkI3Py1QSxH|-eiB4!H=AE1fRxT`nRc+CDyA7dfema97!z;BTp(l4)nBuTYzqjg# zpP&B6&DIV3D#HWrwmaZq`|A{+kdw2wu(Q?r!rK&?-%gJj-gbW8|Kkj{k;7{Ngf78k zaHwdYq1gb^=^GnJ8!0J5GCSGRmJnx1oIO0SZ)|Kx<}&mrh2$O7xPr*e&i+zS@#RYl zhEyN=&HJZu*vkoUj+3~oU^zKQ3+s$#Na^n>`@0bS0Rz;uFHaDdT3Xmx*x+b@A*j`` zyq2FYvg+&C;0RoN9m{`GR+fF*_nQ|1Oyln8mOeF_VoV?lq?5qxr{4w6KQZ|JiWmiy z)wP4`=yAItU`2oj=&rqA!!I6uBRJ+4ht4)B?iiTkO*NPjidQi3hVQ~-tapF8u5}qx z$6N}wczH2p7}5hS9C+Pq+pu%Dci6S}Szo6PZIJ_;7w*+czX`PMt4~f&-o6!#lnus9 z{nx{4;#z#~WNFEP)O%Bc<4-ycNMVYvOlv>L5}7&VsKhe<0k;^^Zyq(YoHV_`R!`_C zM7C^*B5)TDc_Z)U&(kpwRm8#BJKEZQVJoIdx=^R-#MT>bs7!Zx?385zd&h=TmCk8c z14N7z=DqOA6o;I*x4jg|4-O7oT&RctK&PbPFRx++8fik`H+V!(Upu_|Cx+2SN$BY z%ubvItiIY7Ap7kgE9EZmxqJnyPO9`5Y>GZO03&QAC&P%IzUu~6tms8P-JycGPX``K zXAoWl5}UTbM4l0K<#4Et!`J{3uPdf9xmlUUrz@T}*FayNOc~g7=tkh)HiX2=?%w4q za7upL-}IlaDvhN6yV=kEO_1)`5-x&I3!7h3>~aRFZ{931tjBM}*RP-32cMl@P}uue z?L$@lnQg3ZG};T|Zg>+ms*?JMCv9bY;2MZ=qSIn!{9 zxT>_8cLL`Eu-f1Z>ofaK|GEmhaBQh$?Ffm5wRt4}bSDfuUXOh`Yl1fbfKT8R79w6t z($P3Q)rB}>dF3^-VP7#pi|XFk?t#%#P-MBDHlk-!%5ts{uRCxlI)t|$A?Z4d`T3D> zr_#LS#nYko=K3TN04!Tx4uuK(mF8e?)~oxw_T@h9{u+vZ-;7l0q=XH&8#;AmqCeL< zQ=gRavalfN5#BcE-d(&{RFuV~-3itp@G_G|uD7wXvd+eprzx3VDZjr7G?UoQ)ROuE zE~C>Go<4X%@ua)+KBd-eGIFv2Ys@Y55?ElC9Lkaa1mOcl^Ar$>#8fpkdpH7bSN9`z- z_u(&&nnt;&NpIoq?o^ZKFZar+pFSYoj<-Ws0_ToBIHa;C2NqT* zcjoUkE@9gav%e2^(o%KvbH9T*AWGsYa1}u6Ok2CcKoJnZabL*N`FnQUqaHeRt~tDg z^+MPJLf*;wGNQH`}5F0wy!#(@S3D8)5hwbj1&aEpVY*KktU0l6I;wqVFge+ z+Xp0V8B?5VK=|$?Z736w{D8O{5r5yb+mXyKGTM7Ty060}Ecq8~k<|yFzLse0N z`z7bS@&1wXo3d|M*S4wI07bCrnYk@uyxo9s;Ppa0e?EsW)}te`^LnCTP2pT~C&Cr; zm5BCZnkS&%b4&GG!LDQ`sn3D{Yu8-85qU`424lw*4x6Nr}VfPUbV*g?ESJ*p|Ruv<=yR%H(vM zL5>GKc+qNXZk@l5?9N2*-0?1FpqFvjJ;Va`7p2ZL-16GW8aZHHn@u_SO7qiEhB?s7 zW3y|WX6r_OHoRaLu=Q=ZD>sQK2p1@isk_#=l5rQw&_U26CkMJG7r&#+Zr99_w6nJD zzlN>SL59Y47&4F%;hueO$49>%_UopfK&=qxn$%8>=_SPq?UVTeB|O9qz+A2{dG0!* ztofl!w#*Z8txw8YF)z*WrR}3T!0aI?y}oGN{r4mIL#2UO+A=QE4~)MjyiX963Z%MY zmOvjddFdXyj8@QPCfPo@40zagoYQq#mdLE#wjW1 zd*OXP23Qc1-+C<6n&6=>FVH6VT^?B9B7&Pdqg#jyU~a`&1M`fAZw*{EN`bRNKiKfQ z;TU9ozOt3?H_41hK8f%MYN~1r_$s{EMjMyDbeo?^FnGO9WY)^R^)^K)UZ3Bw$o*q^ zoA-Q_wBwQe7t`iHvWMn8asnXJ1&B;Q_RtMw34cBLzHDmp+So}9AT|LyA*>0u^AaXW zsm-FG*hG6D)HCz&^5)ttwY9bJpUNvT50q!rV1~xQ!i!v2o9hxw68Jj?H>DY0^IHm` zE+%jPTxqIe`tkaSYzK&cPGh^(Ts$@P^e_C3AeI#7m?P96#l1vCr~n|1o1O|83GboL6a`<4ANB}Z&t-)bScqG z$IZOfqA0)beW5Gx&dSS!EW^~V8?zo|c+C0O1a)_JgfG0-F00u=9T((z!keAt4>6;e z?N6AFH^fL5mKHieNc8acubfs_r_G59kE5OU&CM*v-5I?aLwRh}ob!h^a?Gt7HvPno z{}C(fF@3uX@10&92;2R>VR0UDvu~YBbGIMndF#fgClKnD z#)jbmmx9jg@R$2m4O1Vi#JfRwIvv0)rjOQI)V`jEDSP!-uq51An}!T44IMX3<3m3{ zKMG9Z4gF!2qpYi9D^qjZ>r)OhDNGu@JQE(BcU}=Mp%wtQDNevsSY>4^^+P;Z$(@17 zDFQWE01y~=DbWacwbRheOkf{8K5?=7cYyMaUVhC?Oc{b((8fs#=sqO+?Ym5mkMgY! z4$~#=S!rIg(Ra0&Ru}6saP_=noDQEGfdL5bdjR1z@+$MVW@6;J40EHc`mIW^d`SX` zgig9HRcp?LP?k6xOu@do+_CMZqjTGFt?aE!N;*EyM|t|b+qJGlO@}<5?HS)fN5pn! zXQ}a6jyzzJfW;4*l3d5u*^OCFR}_QiCfS{$^k^zd*WW z=snaYO~;&BSY7)V_z36tS&8sCLpS>4fV}J6w(b7X@1!qqu$$S{RPRq-jw_u!DW-EP zo~Sxl*RM8gaxbC#(7!ksESdegqreF`?&$gH?wd-2$Z%M``XhnQhwWp0ojki7 zBcAY^*(u(@2Kjrz`az)clLy?;{G-m80X^xESi%CCR>wjG`w$d6Zy6rnUSKU2m?nn# zpQ?Ld$3LjRee^0F7Hd#|A>LC$m*qNJs9jqZ7N%=vVcmOjd>4ZT>Y=b14xM)(W1VSpEY^Y%a~!hEhEGBunCSTKMpup`Q2m7p@4HpXvsFIS}8SA@C1At4c$NS{g(H~JvSD+WtwS3Hw=$n$H?}3 zkV=Na79ZF|`bqM7{a%?Q5t^Lp6)o%APID+KHY`c;#bE-s1|A>e_@YzhQQTD{v1`1Y zu_aH)j7w){b#qg9;6(&(0x1;K?vrcBwNnjc8cQ^}Gy+?LLN+I}&$&C9w+Dh$orklV zGKX}T^hD?FHY$F)UFena7A3|h^!gz6_ZH;}@&i46E8lxx=p7!_h;*jG3q(VS3pJg^dl$F557l#Ux`$|^) zo`kM;_N@l|p(xq1q2V?4yytfHuZ!MhvH#R!$Ox~jlIM=P`RGGsxcPm0Cov9|M9wdV zduoM8Ngq#yuAOtERq{g}C1Xhy{C^B*ORA1>fROPan|+AhmGKQG+VHDK=RUQ^Y31AH z9`*LvV9nEnzs(edixI6jq0X3d$7T+pR}I-S$3x8CM9<(KUpX+KunuOId$mArGL*TcKrjOSRwnF>c6>(=jc^U{H<$~nbOk3JXl8SA*Md>QVFP9{rwMz%bCkJPw_wPxh3zrVwbzJ-;=w0rW)1I)lw ztaeGIeuA<~>w{X|eG|=V)`D3IW44>k3bhl5Ge>dcQy3{V{b%Ui4Fu)!c?HybM^)DV z%k-$5v+Bb2X&kGDVihB?oB4+8LV>w>W}?%iZE}Ud$wR-~@Ouvn=(nGY*Kvq3k2?<2 zz!$X&IdWn8#@8o??=F7g;L1;6*7fvkTjq#`OhMu+D-lM}yG;lJrn8UTkgc6`UVw;A zHGfzsLPY(Br|I_0TS2v)@#3wSu1WWnAmJxNc6VKk^>XrnK2jhLCN?)C*Nz1xNQbMy zwcIOrZ;{upetNy2(j1V^a(k}!FJ}zqmc={lsTnkJ1-z?U&CM(jHrbnX>DUCkt8NLc z*iRdmtDLqz`t3`6m@Wy_B2bmmeobNox0ot>__DpNX+m+iLr;W2#(3xF@TXM7P9qBz z<+{vRi$+mv-b%b?-^cyP<#+sU*ANd}(Iob<(~ojB7(bSl{hIi~aXyXMyYTkxNFBj1 zAIznhmNp~5l^X3Db5nQjT$~k3MqJ8NfJu!P`RbX15t7p`HPt3p&?x?3v{uFSdZ1zR zVxdJ0PUhPgpf9W=?&2~;HzE++)@WE6sCCKFDG3av zFk>dL2`A^n%vu9tgp=Atdv?wC+lVXLazDq|PCmL~jz)&n)>-^DatLlUc=QL}X6Kjs zd5<-*%c#hBHOnu7nmaW414P|0IX1?8jFRP&0f9e%yRm@jk;D2-ZP+N72Zts*j!8Dt zYDa4@%<3-_5^76jiOP^~YrauKo?H468w>H_%Z%zY$+BM_YUJnT<_a7iU09m35K_GV z!kIMq1gW{aHucYCEnlR~166ycvYn^cUWci`LK zURgOH+v-xgyGtH@7nedF<>`kXb0jF|eL&Hk6CZoMLGx>1YMDb6er5dH?(Oj(X$2T~ zx6Y%NYm0J`_Pe$hZBBl!b6X4I!ZZe;2y_6g)Ca3H`Wc(gA2QjTUU zYHIw@PE2JtABDyqj2-7lw{~p9%Qa{bJ=2eIgfpAMkVHD z=fe&rip|-YP`XSCG4u$=nO!(jP|^$cAshH2=FRdE;3uJyD+}DDfgQ(UQ0(an{u)5x zaDnBW9@Q9frL=%vyO4v$O($kdGPK%8_0^G=l;wq4_%B0CV=x7_}g3bezx zLS<=q-FT6|@D=g^QoDA2_L0KLqKhUQ6Vp=39u*vm#Ih5gs7CUs&|f*kS>A0-Nm+K8 zk5{wOaMt!171s$CQ@i-Xq1(w`p~KK?b*sz6(@P%dknZu_Bbd|g9 z`j}Z5LdpJ;XJikd*mDQi{u1IAN*39CYurr!y|YGfe5LcC;*;;);!6~Sb6r?-n?};( z0o0B!C3lqpZX#0L<-0tV2TeNeaz{Ojbvf*2rqfbJmlZf|bc345j!qgq9aTQVp8DpY z&)BW66>t2U2e(9#yjh{9gg^*!)-=g6mGXmRMZVDb1eK6S3FB-a`j&*yQoOj(PP)=^ z)BvA1NV?!VP9Jm&Z#3s}Q0mN}JJS@i``es34p&7br3qJQzcCfsQ4}B2xI!Wl- z*reN!+ZweFaZi7}H{L>lO1R5a%Zm2f`wr>*)t{#&YKt744J^>&=mR z>9R9dET;y71gxR=ZBVpffw{4g1ae?wq9_F-Tn##!E&jye)~6fqiD_hPsz5MLPp>#K zu~J?bDP14696GkuIrg~xsJCNQp6=nP&d9j z_qcF{rQSf{TMGnPDlLbCY?l;z;W9m2Oz6T)Ik8Br%oP(OVkhZG$^C?Z6VndYy&j{# z)iDtnMn`*L1>2pW6{4*!XeGa2Y%JmK9P;x|u{B4m2+#7lQn429+FJb>O#lEoO)f>zvzPTj}zNqL*5=U5V5P`S$ zCFf;cbEwtc`@5l+ezQB5$oudM<+2PT@x=>rfQl>fa&la3n2)uf;WG2?LnZA)t~ZzF z7ENm8(+Hp@Y!^t$;VZs%Hi`8)u=ak|7xB#U!t72)#$L2hA^7!LLV=dvG42RxUfEvZ zre)LP7t!)xIq1e!j;Fs-{bDGqx3w?FmS3g3XPe9vw$3mo@daM{YXp`Kv#WleZ3neF zN?OZTEyvetC)WR@quc3kOqRjxi&+Ddw^gXs-2bPyGmnSr|M&PLvddn|zV9Xs!!R@VGkt%*`*_^@xc71YyXPMd z!e9q^b^EvPL^YwZUC*_h>%o?e=+6jQ&M-W2(3w94eDog;o2lpXrE`gfQq-L$D zG2O*cgv*f1MDm=mG2sW`dM z;x9-ot_x^=#IgQY5j`m=3u^5`iO8~VRkQi zeYA3L@fC;@ZUKWR4nLgl0`4_&n@W!d%vqWQ^+xOU9)MF@aX>{=^w{<$Pklu%~OuT(UO{Gf%eL)EG~} z+#|%{{BG*7ekFdF56xA}A8zn~FHu6|BNxY#hhvCmzFQG}xzWrdKu!R6?=_$;+W*wR zAV!3=xVXsEMy|J(0?J_WzdLbf0BLENsyPAyg(in?oqP_JVTwe=$I7HJ}WsC9S2 zf*etOb-+pEj@CSi_bTIz^JjZm?eWw?-Eihay3g5KnRaK_o&7&>KIpf^@_tyO8Eu=0 zBMrv+Db-OBL)+W zJa2a$O7J)H`#{1N*jqlqi#Lr?g*r<&Ktf2dNk7S??y}?wRnh zdt^8!z=tIX27PC@!q&A5&V7>-x252b7V^EUP;ueJ{yFNj=+7+>@E@^yfG$q_wIn^j zlgoQ~y^eAU#E&KB4%Cjp0S|0W;Wf+uxpu zskQ+rsFzfC4>dlR3^yeHz_yf#)X!it_5!gO|=6H+mH3(cQtJ3@I zqGH$Lkutv(%Xb-oD>BxZU7%{4$s+0)fbIk{m^hkB**iAIdX zL+63mJN_#1ltS21N*%8cczT}IUhwSPI5}gVf^mj)JUZ4sh9JlgIen&V_zrG>W>E#v zZv+*A;ZL5J)L`BGpT;`OqdQkmU|&63v-y50KM;sTS~Iai255}qggh3ov;7dLo3R$s z=j!Di%|{@W>QQ=%>GEZ&PfGjHrATt&1m)yv4>Ker=mIHhjz5H~MHH1GcKOy7(*ZM^ zqb1h%^Wp-~NJpxmACH7~4(q zkowJ_6ta>u*l2a~%in>Gb;Zei0lw#i_$~Vu7>6p1!NXY3Q#eKUDqpxJ%?Vy0@`J|z zoL7!fuzrJlNbfIr#4f}xlB{v*`X#W^kYUw4C-_x08!i<^O3feQAD<3xH=pB}%bJt< zrv;~yf7`#p7+B{b)!1zU{jWz3D93PxSIZwzF%~;u{XDEt>mg;UOdzv6Lv(dfTJ{Wr zv8pVG%_!iW@?FrVHXNq`j4T;Z8qHwD)Xal7<|W*$tKlHWsC3d39W!fRgt=g&g;an( zTRDwoiP`3;=B*|O%41zcu46oN!sh1R?In)j)~M|AcI^Zty2Dz_ zPdg~UM@sbBpBwmK4={@&g^X%>qvgrRwfZmwH#kd|Q<;i%;%k^U1n^1h*3rom?F3n9 za1SB22oWyQPJ^NW1_5txGI}dOJM5&g0^YC_?XRGM98YmyUdZvSs|LLkXTp0RaNDv_ zBNgV<*#_Z@ef7eNa*Pm0pq+mzmOMU>O1`!4A(gD#oiJYq;E#NbSO?iBk$Z0m4B0K+ zNoFjN6Tm-b%1R3jqpjzK%4~Mgh{Gn01jgyWJd6`~C)lw6?n*%SmjGMPTpHBh`P;)g zulYO5iSCSDCYCE7&`4)*&Fy31Qo7yYY6fA+!8DBLffxvT6%w=muKm7yCNKDxMYhd} zhO^M)B3)ulD1e)1BsJGd^D2V%q@Jzt!3fQ(G1g_!*`{|Q8`QIh8j7fjIz@YeS34J} zGRV+mu$1;&V)rZ6=3U#6UlOtm&Oy^}KJcr9VLB7!?0?!K{R=GoZ&o`0O$Y^c`yZrI zYNXEmf6ttc&`XN2p^|7o)Um}s z0rI=O&QX&5{>80-4+K?+&-(Vvk7c(&OeJ#M{Jhe}#%lAQtZ!c|!^x`D-60*E{sG}j zlg0S-TiF7ijERfRoBE^ngFntW{l#=3BbnV2kwjlHO>k!#s@Ssv&SG=GfhVI?R+8-~ z$UakcJo&MkD(o9eM<1V?j(nO#!9it(gB@>C?#qz>wy-J2?la(Y%2nF@pG{ehE$Pjc zP_*do0T&{p50jOy>AWI=fq`b$J~^wb$i3zs*knMzR>2bO@%*2JyHgA-g1z$YRq( zy!6>^g{3ZvM$DO?xW7a7_9l2bZG}-Z0v4xw=lf@JDf3;0fT}h%Sr}Nji&V~`nEiNT z{0|`WKK1#s4gS>D^P!&g7*en?*WYhwhnB45y{lQrcw?n+*OE_Dt{};hQj}SLIdH8; zpSOPT(SrFpv1+ZXONCTs03;YIE$jP6B>a`i$!h(C>WbBXfOWvzZVg<-6>tE~LH7DG zrK~GAKjy?v?PR^NscEhjV*#*!ah$wpCX}YI)u#k*EfZ{wi&3NNTQ7zsy9%qvQwmFw zRKNgiM2Lew6Dfu#2U$ZM()aBMexLrT{H#Yuyz36gsfA$n;m^nHl$Qy?PE$-jP;m)J zpXAQL?)dgtYQiv*@{1GcI#98G`!+vrdbHa&J^Lyo!HB`cWbku9nWy`>B0z^<#4YW| z&3pQk%|%E-L;o7M^<81Dw}N@i@!k+o`WEZR2D`{~R6QsL9w$%PLG>d&z zzyzt+qR15=Wg^b}X&e>W_%^Td>>C1foBox%RY~?-u@bgZFtEY5C2FBaJa5|Vv1_9K zlmuqA2ri>qD0CW|nCrX!QgC_H+huMu!aKl{%XkRQWN|ytu?4!4??Y@|%NJp-|FfYk z=LvpnmZd1O*7sE`F*qCaykn5#KSI70h%=;irom@`^-=@=A)ue@J0t_3w?vUPu-v~0 zYmol(*wa1E29w^SiM`W@{55T64b^V1#ZKH^joYc%%*pi4dQC1UD3Emez**SYWwu|~ zqdWTvWIq;vHZ}y;KWqMIY-p4%$(h~N=_DTBuKH}IRWbW@K+o5})S-JeXRq0{^A)>v z_K!v>zBs784J2Rn4xRnJDlP@77G(}EI`~pFxQtC8OX@D)iRaE)+^GFAQQ}$QIL$&` zlc4DR8jd-&t2RrKnN1}J#Q9HXxYf*TJARpZD5v(S@D)))`;3i6L6ER@SD;zwQ0c|m z>k(U?aG1*wCnyhNSle`x^4Q6VIIEVaS$(_hT$G*JQp#;kvW#@cV2(n(WP{$H_&*8iehBgRS&Crn#^a=dF>= zACI42G1&`4t(M}_ZH_$}5L?!*zWo55LYu7>A4a1PZNxsPQT7HF>d4ECP5rX z+F^dfSwH)Nsx!CBX*16bPah%u-s@yee?vv+^~BO_a9XD2X- zh={{Pm?c|n{17aIlG$*C*euT8@IXpBSy)E~K{d5%38@pf)%%=v73 zVl>%rK>HB!Yv(6os98CE(Rb^sEk-g-r3ztUw@66|Obog{nThVbkj|mX{D%N(#S+1D zpZG4dk@1o1@ybf0jXd8Cd{h7h3`WP4i)yO+kK=n9gr9_tlIsL|HTR2g8(ZmbLO4aY zRC#cRUV)#VM2Q^4*>-hSH6m4ai80GyWqz72OZvkNf1Zq$o8T>^&!NS0=FEuT=G_oXBjh_hS24l8gH-OGyngE&fm-Z()jEB95;OXN)I)a=5`Gc4nr zM^`54?rd6^4%KzM_B%$E!JG2#mR|5xzDm5JGSm3s!F|;o;{CTf`&iX){#h`(Jr5gm zj+dYZ{;l|C>n$Bh)eq`;3Kk5i0*@}IXPSD*ok?-^nXN;=@!liF%W1WAJsDR~+@Dem zdd5lLXhn;++P;@$f3n)!e?9YdGUBKE+~o7cG`ZiofudpCsE{4wdmB(YD=sX*{`Wk* zRLy}q4~m>8?ZVoEKLltuN@dnmb>s1v7MUXq=Ve=NgAwsR9ms6eBZO6FCo??wH<_Z`O>5^er0dY>Nl1IDmYb+x4Nb^bwN z6YVDRMuA}qAK7^F)i?{8@VxT)&tfCu9QmaTL9?2$#a7* zB`*kC>_@cE=B7mrnfnoX5)u*s?r1cdVrp#cF`r;o<7BGjO;9GFFH-a~S5+yq!KIB_ z)|dqP{e+i99XRfE{1gvu2|r2swOGt+!y&Zvsk;Rl-Woa|EI8{Eb3X5Mu}Yi!O@5*L zLBrLp42D=no#WqTTnP#nL38-z#ZA_sYm<7GR6gF(q5x9xjv@)stW;u@ursXg3bdnq zclGr20s;bF!s&djmHyNnUfS0pI9&yuMom2XdQ7xCN&59bV|NXZRW80e=*sfNCG2B1 zfK#7kPEHP3zm##rgczjj8XHsE(4n2gd++-WOXY$?pXnywi5d^pFkhp$_41D;nvsPn zo6DFiRC1*E`@Ug|Zh2cNuWYvTu~`*hRB{W}VMbW9*pMbAvjik58Yz;n+<_FQII2}B>HGMTN@#FoEsgk-9QSH0^?Ac|~Z_hHW@t5=_5#WSfE!e`! z@c6`f;2`H{($6hnOm?fX$rVh}w?uiz{QfY}&)lQo zI4`Ezb*h5pkbmCIBCCDDt+hSNG1&>7zwE@rnVIt7Z+L;2eK5kphqFl*m&PeccpCQLV{1u%C7cED=KUU%r85K!7Zo6u!gI-rN%n3dY zdkDKasszpJu!?fw4XD>6aOT8|hQqC{e4}0< zpGqB7r(B2+alF%LV3FA($QbThU(mL0_<9C)p5&ThU_5JX=l{+?G{7R9l0zdczS_lM z(qDJ&(sZgPT<_$kWv%kib#}UbSf|5`yejKbwsAz+83ySZpK;kH5s!3DLRmv@KWcxW z-)e!$LkgpSu9>iB+jRz42` zJ(jf@hd$jdj|-zzC$MXpY_Q_v*9Xe41|l}C?I-jUB+^Syt{#(vFfwz?-nraBlW_oa z$^p4d%Ud@EK8`eIJBPe)<Xus(Q2D**- zx$;35rYjPqS%tOn&lUaKJBB)p7ciec@`uxO$mq;rtNRSUB!{QnJByaAT&hr`9ZwSB z>lAGy@05bTyoR^GzrTS&|6E6$Lex>gxcQTD%RuZl)Q@kIUBlY^lGfn@tn3@h#%U zj&Bbqi$kE?vss$bfZ6=%%goQO70p}MbkH<-=ere11p8<;^v60*ELjFy@+Z=*sPI;I zoT7D>tYowEg}ZW~RU4{Bpe|Vo0_0o`mOuWD56Ru9M{{FEKxE>$$f#O71V51zG&3ct zf#+BDI<-WKUobdAO`*?5jMxZb+n|U@-1*yECr_TN18I}R zx9;E3>_Q;=xr>{0-M3AJ{X9datiQdhHwtHKb3W3hCLrF)44(_(gl@JP$QzYJbI!5( z^oTsqC+dGuS3m5h_&u*NSG=bvE@F=i98doB>ujm&`_0%Pm*eVdub$i}{EF5w&Am_? zBM|0Pd{nsn(yO!5M=m(#SzUbC*(>AvF|}JA-^_JY9QQsn7Hv@{+$T2b8QdTy{<|2X zd|)WLg)kHpvTQFODoC?X2{PP0sFv(xdKOCCe=jpLG^pL2BHtu=jXJ`&s_tbyBlC zytPUD=@KX(f(=%xefr3yH0icOFYTx0?Xyp#I_=EZZhbO+ldDNT)hXJ8ERSxGl`83| zf9`F1WvkW*ewx4Oqwf(M`pwJ<$qU`>v%aUk7&Xdx1r+r;z2n_xH$knKPvm0UFK*?( z>3LXwM}m)!?_s&QpQq=iaTjUG{O0B+k!WExZdV)XmA0BDhqb1V2ZIz``*VvfeyNETMNloP;I*Hr1%~|7e*Ur6I)v>^x*?f{VvC@dK@Xaxu z{?adNceiZ&s?rOGY%AreQhTo{;g#I1piI3$^(r9__1wOKxt~s(zki?VxwX-SIzxHB zYRGkNzG*06W`%MQDpzktLY(KkK+5^F!e2b*^%4$cJ4#QBOs%a2x*5xOqL=}e`-?6r zKBP&K_Ztsw=gEpc-?w>LE{AIJqVitlGE{KaUY0lq_mL~e>L`)#?dtj|D4FeA>SLwp zAmT4(la_@=&n_Ah9@w;Y=w9P6-&5eLKaY=uhxTM)SlTa_1rAq)UaC}Jy;yFuUj;p) zQ8&VM(|JzYsx_W?BhlAKc fxdcyCTO*CIEdAKZfxQPZi7x9!o{OhWonqD3(>6PG z>a60aQ~$ib@DKBe32T5R^K#nHO!wib8Z;k~xj5^hY0P|B2fK9g@*H#hueaWFzf-5! zy8grIKCdrMr%vVf>uYO13AWp$1vUCxgs(z@CyEVXRXKL3-Q1k5=D9*oSC+eU#a{Pg zmo$&aZz5N2uo#_p{&)FE6rgMa?jfXVCKN{RgN7|rpoj>re!>;EMD@Hnj6&l|zQ zw`YQ;YQFldKU)ZU3fqgQ#!O&wsud;$s!gDgingHPrYSq>rWcf&a1X6~Fzt9a?>B-w zcM1VHDc?~e&5;C`K_U!0I<9~*b+udi45m{=_6St+)YaH65yk1w0M{v=A@PSudRera zYLQeCSCu$%*XHi$0%D1g?)paKF=~0Oz500sU49HO+0)$d<)w9BrIES*pzbF+G6sbX zFKj~?#xmP}@h&ed=iwnWmKHtxp&@ejP9@YY1kP=u7<4#weieDtBO9@9jk79dm}u;e z7bmG29Cna0YSoD)X%RWJ*RL4rhYngU!y03)c>x!Bhzb9krsFws$&g zgP+XZiGOWWc%9EZHvGFt9W|``!@^5PE9dG1+7=N*eMQXINHczm!JEK{UK6q@8`&uu1Y!> zN1i;u`y6~N_iyJgb+bB^KmCDN~n}@ z+PXc%>R@8y1Z{yNWyl7h*Ym9@m|HzF`25>0u%KtE%+A5cn<=6~&V7TVsO_yrWZbE$wjxKBuE*nt+ zu)UX!kV{IKxawYDh`mP%2D5~O|DoI^*F9m&Ub(f)IVvk=%Mo%8P~eY`h0}hy0K+?X z`vjr$K79gyd#1Y88l)IuHqgnpE;fz5WGyz8qd$@C7helh4T?txvNd#V#t{02VdG)L zqkVjS8$Nyf(9UuYEoY=KxQMM2a^|ha0`|cjMDOCt@s7 z3_Zu~04gW82ZSFq0FDC+;VXzdFd7^vg@Z4<4f=6JnS|#)8hbqo_*+5QZ~-eXo=pU3 zk5qZ}3Bm;`3hnQh#$z@@uN|ceQReeaq*u7n@}za2>${zHr+rlO?(Noq-rbN&xVjXp z$>XNraKV>O;eMhHl!IB8G%6-kguD@U&M%G%*(rvvEGGBq;N?DdnsuC*xKB~Ul zp?+DaFc=>jgd`UXE+5Lm0dRGdl zZg;Eav^(o~_D@9C+~k_*>8?L7_`c<(<(u{F?yLIF;+1+L8K%#5PI7mp3}jVMKpj~N zRMdXwfjidUY{yN=gttJs)*nBg)+6!tYI)0TANeh#V9cS@kT|yXt1F?Uw{ts7$KY;8 zzQaR z_%xWu>7wO$YL@%uOazJmZmtW7)i8~NX$4Q?0g=RfMgOhN*dYCc7+NYRe(b^3M2cFqEW?#^yHp)Q7bwSp9ApFp1O{-Cv6je_IK&Xr;YB3v$BFf>ldtxUvt zwm+vUN0VK8Y{M$6!~w7E^Cp52=fqPF71P*2z{x*=iz|Eeau;)F*H+DVLV+V%^cMTGF&-Y9h;p?Ki^zS?ZsN`s` zSK0?ir>Is2KQSNr*ID!OTh%1-k7@c{UFGsglIq_j|Hehz9k)KD5Poa1SCeD4g>GIw zT^c8zVp5+91~yQl3tKl=;DuprUhD;7$HJ?`X8JC966AwDE=OB4er1hqy4c$>AV`|S zug%rfYTgj)^PsRTL;x7xvQl?8>Tx(qy00u2+*{g2;lr1=TfYgW>z6L#< z><7pxBk^&9jH5o)mLti*T#uH8gN#~8>A{g}*tL%rm@t*1Gb}l-ACRhcH9--xTde zmPRE+yaTS|#&%O3p0cE2E_iSGu^UO>FZrl~8^ld>z+5Z3wwB$mh4#NK3j3gVB}vZD z?34v;DS6mLov_gYw#s*vjn z+R|0jvohU6ChLuf@8iX$E;}E~2h4WA0;%z)zex>x1=RUyV`*cw5c~H9a5SoPAw%$8 z%MacZndI;T?N!d#@N&`6L zWW&5rd6iI(R-xoTs59K)2;c&c5pUW8hm%znA_CE?g(Ha=+KdVux|Kfy3OiVZ1F2+i z0gci}-mGgdi8!iC6I5L%u#6~E-rX~y58MPWjuO%YQTWuu4$4R#LWQl!%?w{ zwP6eE{xyi@OzWt=;hJ%LlEJ*3^3k(7M}PKt#rKDn_MU6kIQM-;#1U~qU$q7io_baF zevYeUd7g34CTal5ZF#GnE%Q=M)Af8W3>+;l%0)gO3R5nutJ0Uf{;!zSXpc{+NG2p) zv=oBsCB^$JcD?ArD;D$&b>PXJcj3x$%C(nc+gW3p7iNsA)l1si*qk%iGo;WJ0bu>7;2;Dm0`1LTT`Z8v|* z(=Vphe;jxSyvgQroxR%d#me{O5>lrIn$?FUQra-x6EOMPsZjUQ@Q^XNv`;P>j8Vtl z2iHh6@jq7r54yO4bb+xN>lXegm|jfjIcK1!?g}T!(j#~PkZalC8rX4hP@)uAX^D7~ z3A2Ya#Bd*6j2W9jkgTyE@E*SD!CL%WULDs^5>$=0n4qn==!^S$#h2CRljVWCmZb?V z_wJonij?R9l?rgReufLkvijXhX{(0Rk3Qm+Fr6=07;|egBuzWQ_`QFe9syF{>`A%9 z=o?`S&-lVQ)4qI5jA?fk{6sr1sFMXpJz|}j5C2=ft+79LNNnC3W3Qs_fv3WcKkvgM zL~w=uE#*_t_mK|J#3)_IZJ7cgG-MnRoPh-skS!+d`*QEqzxP$ie-TyW@7S)r zM_-htE(wB*i$fWjqKlNc16>#nyN>+Vq0ku&4UgL zLzPOnRUMo{Sbhy1yoQXL;DR6t0xW75FrBlh{M#FObU?uTu<;;&0s`0O=fOEP7a zp7;(=_`6BCL_5NaEw1^ZV=jy@CtP@-qNs28CgPTxj91D*zOO;91W01gDkRi67g?Fw zt&SaY(;<>=m*M=4;DA39h+=9_Nx>JHOt3%Myr99=;B&4{0~I19QSjyhMH~OIV;--4 z|1kf7*y00uGeW9n1fW`_G={9d=xxRmp<9D1qt)1sd#!s?`Egz}XOTaTZt|x4yyv~% zm2Pr5NOeC(&to-BS1^3<01c~O^Is4RIa-W9TnMsf9WAyu6*7J-rW?mIu{NoojU`lrV;hs1%Ymx!hq`VjglsCzCXbnz)#uJ*9H1v zIFJ+WPpBUX0^KCR@Zex1|1Kd`S3LsH0V@dZ?g9u@%tZnOC_iF#u~2*p2)NrH)`W$$ zlN)q_{-Z5Q)NSZjUGB&!nbI$xi|X|U0jT4N+Hu%vugvnxrh`T4twnXd2?h69%M=ll zkFC2rS$}KT9lFw^3xaDNwN_jF!VSE9*?4T%Lgu@aXz3u@{K-NiXZ3aPVx|S~M@ZQU zO&EQzsb9{qW+WypLAgs$oh4H6j?_qQ;r<1g=L2`}BMH|`i-p!V+c?zSn+?jM>H#cQUD3KIz>&yvT59??)$Wy2+>!+T42I+U|jVJAN9;O zDth<<3oE{v~k4Wb1s=W!$I2TogdfbPQPVd>!^#9JigU~6y%=ZM)b$)g zbfOioCR(dUS^En9`$w%#T-#YCLjY`j8s-&0biU5bCZc;Wy6lcwxAF@H?QnfVmW9vz zfdRV#U&z~9!PxU#xps54!&A*=cZTM2TzSXD$~@F}K5>;MDR)lE;C)Tw9uz8q{EZ6) z(><{)R-31DCw!!%Go#YXXFqkZTlniy04|A=S>3PAUSZDkBc2Rzv>MD0HV`yE5y@R6 zYPUd~)XnmclRr)6O~u!)kQCFW`>^dHk`#n^odcH0A59vkj3v+Izy$U$8Q?2ZVkTG&Q6QL!C? zxUi`$KgMi$M13Hf1vb0-x%ePt?@PFVVM_cpwX^i=vhT4+n|p#AAtutr

?FCZfTi`YoHc#!--3lK`3Bv^tfI)n%Bd|tH*I|cZEsgF~h$61r6^om(n;Ta+ z-GW=P@yD-n1}UEGzqO2XWKAE!PVLN6b=tLr16b!3KLxF{7yGRye|L1S`$KSOwyTr4 zcJ8rhap8|mABXUqu3vgxDZP*zIj}oJnqoe0Q}pg$6a0=}eVBV{>9<3~)uo%m_}^c& zb93I-P8fB57FVrwR*uqls@)}4dUyJyj#e0y-z^~e-yi?Kn_XaPF1xRoCjl8_VVbWY zW(uy2nzB33IZIE;daRy$BVz6#Z{}~zQ?%&zO?DWfy%E=Vm>XjzDB$+?dw0y$G#MB| zJDSs(Qzy+a<1D8C`I#`-`q;OK+Kz*1<}N?K(Y9XG-p^#X^-Sw#>sw^R#+L)M+IIa= zP5V|eRp6r3;3*S{i>DS)+kHVI{%gxISB0H6)3g)E$AAnL<9JtpXgtKjMLvnQ+I7leKBh!k_(V%F4A3_S{o@Jl-*=4DFR^Te_(<3k) zuHD8bcOIzSu`M-yKQQ$aqxeZZGLs?UkyZ#Z8tL8&a|LZz8~-kzN_wU}YWM8QxC~n5 zF8|#SC0V{#sqiC_lA>aXp)$qa;6roKDF!Qu1|o5+&3!cBs=nf9ZbMiN_+nF{$vuT8{?T8ORzzIw#= zA~Qnp)qEqKB+;HF7^ntPq|I@rYT0|c6aOVRY0$Cq3I!#nmnJ zAbeTGIqihwYZtrP6O{+TVLER$6i;Cl6E_sUFr1vJn=Lrc_RVIdW$V#AqdI5MJTFh1 z4_#+2o&|X_2Ebe2#?bAqx8N8pWM*nKk;4o~BkobF27R&uwXwHTz>Qj@-sNE5{QK)W zU2Frq8Ry9oUdjTZuO(eJnxmtLl&^YigDEw{jSRrNF~{pZeqifD^Blp$$eQW-9Lsur zY4)RnB`aJLYB`Wyi9$MU(w}Y81ZXv(YoT94^V^mM=T>rn#J6eB3WeUwcM2Ft&*d}W4XU+wrB7H(cvj%6(Ih^lHS>&t+c?+Vxi6}T6|=A z2U5ipeCbBMOns+qI2<2uzgQY+zxQy5(p}C)mg=d^b>^z=o#}QDJJ{l_+iGH?;A$7Rr6Xr)N;y|F5VIutFtAL8#b&Z_=K}M9fneE^c}R*VcHm zbM!J>mtP=a?{~8AYC%v0ll3t9j^qxU)l~Sr!gJfH?7pt%8xyu+o6O@Vh@eKtm*W@* zO<~(5bNgZ2{!3W3g?bzsH1E|ncQCh$rUfFx82sA{&^{{L^e%v9`9Ab z%WPZK!|`X!i?pDf&7Tk|k*+om_c~l_#<2x$wsi4Rw|2V1gT6cC_&w3?kI1Ue@RuVRB~bOcxFc$ET)?&*Th5`49Au(esVxder$--u_P*c zz&K6IIQyvQduk^-KbP*LfRgO)seZP}MGcsn#hI9?4ihhb;Vd<&RgGL9HrlQii2X~O z_F4_8Y6|5LWq&C4^p#In<-v}&wcVp@#@Z5IC%gBl4v5j-xK-F;Lhy%@h0=mD+tuPu zEd|~5m&k3PTgO+Jt2DcEk+H4syK{igP(cal)R)fwOT zJI&J&G8lqi5@byG0S`*CR>X z?ZUe2d}0iFM0z!Cukzzq%gZE<*P9%(GG3XoQOux{iL^w%PV0P#%)UkJWEzcXQWhSl zh345;9#u+DfvE)6#Nqj8))k3Hb2ltr9Xz=|`dXpAC|00Kpu&@)8~Wy=lEeoIUP4o! zXz|BJhcH)1NI}n(%SmE}|AL6Evgug^s^#1l+T1eSBR_{P2l7Rw) z)_}J$q|G_>>})!JpwUfHopc(z^3m_E^naS7$xUBRXvfmwGr;FZ#;5c>*Rg!hFs(1d zi=s?+QFACQSFP%n1)K zGcx1R84wB30$p0=WW7deg}k+UWc{Y8GK!?3WSng8bw&nxglCV~iR2mWxg<-r%@t*Y zOqGxSjvv~)TDcxtJ>fN9B=-x5I^6cOX0-a@j@xPx`vI${%>etbxpm}z7WB9P1zGqA zrM1N~j#0J;Q&8WDIR@cx(8<95_EB0MZWqvkTmpOYBKVOr?Sqoq9#5Yz7U%5O=c>J+ zo5oDAG7-SUQzo3Dv{^&?-zFTRlCd8K-Nzwm&5VQnmX57TFGFTZs8z%N05R<8U^D># z`?d$LVw+r2*6-5?6XXe+dtJ-<7oI!K$gI_Dc!Xib#&q@VBaK6waCF#YRmh0S)QS(3 z9`H}bI%*HAxJ|+Ak5(?*qo3K76DJX?@l!fV1f9W;(H#!Mxm_{|*lxs!dU2X`r3}d3 zt}%A#4_@h2-5`F034h7|9(*BWDZRYk^@6ithK-)?WiM+mYe@ zQj>fqo6MVU0;4~1fuS6$nUC0Haq4T=+}TcEc_!)0v)zdZjO&+Ld{48hdxaw}g&GQD zemxO7X1X`=@g_4O2XncJ;8xc!&9C6K1kYA4NxOiH);P70B}FKivfcE#@_LS#U+8FM zajZCwwiOhxf~hbr2Nfs;bWXHdZ@Z{+D8tv%7dhib%tIb1OTe_t|NN0_m5+Cs`WkMq zKl9tALku1)GKvVHR=X?q{7;a&%7z5Fq1?9J1XYWUrf&oVAH`ZeG17?N8}H-BkCmo1 z=?c_*_PYph6R+|vaxF?}=pB|wdsCrV_oncnKDQx|l)?@@(h@vQ#_Fj34L|Am+z*?yigW$qe+wzjIZdF_?v6%Pd&tl zrZcNv8{ZDuqQLGEmT6({*5(tsLvmo4$i^%}ir3P~`SR^sP>_Y5SqI|D~`xH}lMZ4}dX zBn^bV+rsR@UcFXmF`F`+*p^=|EoYV$Bd82gmn`HU9~C^@3f;{mV|Q}NxSibEjzvWr zWXT;#U751kTd}Ywt$+~tJJ8@|YsSuO3w<%si`JEgJC1G%Y_Z0YSfV}Je4a;qj{EDJ zn};K@C?S^FYr=*EZOECR@66Y{2l5zy@Jh6wAH9x?w-Lk%TyR&VY;c!5k`&cwS53>+ zI;3qg4jEbl0Q_Yk51<^5yC5IziJ)Zu>xBmJu)2F!y{nHJ=Xrx;=3Ab`)!Si%*Lm>N zsr)9E9me%W_XV>j^TJ zeU{&V9^h8}Cf&~+_vo>9>q@TsUfl1>Vr{MhwG&O*f*$|eF*nn4lY*H2h~l8<9s8j- zzWQkkxQqG(<|K?f9`nIwzjv9MZE6z8J=&N&F*LgQNMU<^x3|g4p_<&+u7k*GY*)X) znF8aH-^&WJEaWqkKu#gh>gU%x0-~Te&{b-}sN9|Lvf{m+1N%at1%{)+* z6w}29^k(?)YtP)ay*Aoh%AOry_E6tKp7fM!0pn6iivHxQKJ)O*F``biKxEJ?#2i$% zIsWSP>5JFfCFmvKq|JQ!$Mh%JufV(7oGXV+@i^7V2N(} z{gq-9%S)%7YxgvpBF)bJvOf&c)2IAIWhjRaM`$8J;A95_@M!#y4(oN)1uQM$Ww_L8&ZeF`m-oTo+)JG6XNx0hT^cXEx zoeGX>h&!Y27V{6&N7$>e7R6@iE@hmh15Q*$O7yM|uDn;}eO;f`i6VfSWhQN$)( z@R%U<@D5YvTif{!Slfp$&)J1f*dveIP>}sZDCKV+gEYa6y)JB%eg~$kI!tl+ju*8! z4|kxegxG}DK<5N)$<3fPya&{Oz?!j!S7MBQ^orOI!k+Y54O!s!X34np$;u}CuxTWN zhNB5)<%7FDbdnVO3lqd9r!691Bqk`np1f-%{3a2lAwT79dxmKO&zaJX)&ZP@5>5yi zxX~@!qTOq`p#z>%HeTW>uEq;bi_WQ}>YYvZ@6qOaTw?-1Yxqt?g`g&pTv7?x29hNK zoIbZIRMMXypW1^ebQFln`Ig#g$MI5Z;vFctR*O7vS$ci{;|s*Np(~H;SFDUm(sn7` zS>`op+>2IxoRrLvz3#3kS3$OaDyG$lnbyPuQYR#=y`n?gCwOI~ z|CNAE{G$w4n}166IN$g$qZzvgbW5(L2E_-ZxCXhEhbWXSti8)sE-KkQ`mKovIGD=q zKT&8$g{0CO`$u(4Yr6&g|3nbOxG7Q`#5B{n(%LM-h~F}F77Ujd>{`2O3NaRh~s8@kJBN2J(#^V#M|w#Pty>r7BnlOz52 za|1DnJi;aM1q*DNKTX6QIQkaZ9+7%qu{3?!!Q=14gu##((FzTC*t1XG^0qOf8xN^3{>O39Fk}iU?bQJ)$#nc=_JWZ1A2p^));8%@4|9lwOMyD|2Ss+3 z%)iB?2K1W^9$Z1q@8@O>jzjRuaHi|+c#qK{2szxJ_>3{cEJ81i>DB3?75W51!^+V+qoP{&Iqw!G}1!#D&z zF3}D;^Qe~b^HD9zwRj5Z!i0NqqfE8wf8-N%{DVP9oxsZn0QYr(qso@Tj;zIs&1eeY zuPjo@_R)6+RTojzW|Uf!I~~SoZjUIEnBg-XPp2suBGsDCmzhiGL`g1} zwBOq|RI{J#=j3O8CfD!i(7ZftrHUGoGl8f}wISu=$fdGGsA-@B5o1h9H97uafqats zk3rC|)9p`$-rFwau;9|Ssi5@?o*?`1$yaQW7NxyESt<(=)C4JhbJ8j*HK>ES;Evf( zBgEYsXWLe#kpyXLzSpn;$IcRkkfk3MRWtsyQlk9e6g#A+Y+Z)3$c_qpAniC70Q$Z^ zDOiQ`9~LXOxI=2X|mE;kDi6LuOis8{{}9i*4Pu3)>7b zfw&met!(x|m+|p54%vb{f1xo6aJgQAT|oV0UJlk_zpV1mu|qEG+fzcyVhQPre`tz| z*kiGS1goa|6UAvhOqVgi6^oz+Hsw0>ko&?OHD>*<%h<@?1ZV;^Su}YWYP+$qgE->j zD$2)fKq^A^pcz?vkiNYXP6A4HnmZ8El81BiYu#54<@uYHI6n)?t^yDvTt35QmW@ho(Iv}alSuac~NGW=w;%73G^#3q-%qcJqf8~e;nk6 zAZ=rVhjAUdQPAL}M8-~U9%C`_zjR2ahdVDu(`mS*s(I3(*LTV`&RYv@z`U zg4E*m{iwsM&AUO#{SI#Me>@dl6J^o}be-{RmD7ChMgh2cpxXdAAecDCZ{h^x?h%D60_ACI9&Dqy__bgMX;Qi9dx^p zP+~^XC!|V^Jh>MRSRTA*DCQ$Fu(_vMn{Oa;F3ta`D2?&MOIzL4RmJ$UXiwUHmR&vF zc2LwnB2%UevVUqhlkYL6Ctb2~Jbd|j)9k|FKq z2RQH8EXTg80N82UJ>agvEG%pg8FhPzf888~K3%qJ*4HdG6#v>9M%$l)w;xJPZtRP8 zJgWJQUk4x@hwTNa*Pz`)6zx^Tf-3i02Q7?YvMx_gbhWMz-Nazy6dco<%y)I}W$ zO_edL(&$9}ywAuL*GWIoVP~jfPcF6d-IqUX9(rtd1cT$8`Nc6A5*d@DF?MY9Kj640_E;fG@O9L*u-0 z#i!C!$;kHt3ZJqN1IV4Cy^@shV~_sX{yoEpYZruADDKj`Z>ulaw3q0mLfx{UFD;I3 zyKc`O+eeI31(Ib8`BG#pOHhBZq0e`IvhZg|w0hGsY!-6O)-cGiNKEJ0`!TOmhM2>p zv5(bz>-{H?VBOV9CHlfCH%EM=Q#4;LG|P`${k^aD#jBBKriT)*O5y1q5vI{hEX$LGSAjP3&8G^U;wGy>?W<+Pyg9dW=xCy$Ob1CzkaEOyorwuKZ6_ZESz%A=pgCZ0MoS%fIqjyq89AH|4o5UPyUb z_i~YJZCm@Bt1da;?rV>zZP3f%x&#Ayr+$@qk$xs#55SUsWQE`yxE@Q0e{|YTlxK%@}eG} zuC;7nOqq%4bBMN(bUV6dgxL?)MQ&A0C7w8@s{ib4O8EE~b1wPeaz5DM??(xK`!+=} z^o^%~znJMfyI=XnG-WmMdHZ7_xtC94b8Ej6^iolaX5?rTNs-H5r-t$6H5E4A_ig_}~A(#Bw(ZPQO4w@8VLiL@3B@rbTMceW$O zY939v5en(b`p2wYL~w06bOv;MBQcJ=y*=1x%jXtJ5n%=@vK=};E3EhljM|fA$XD(S zMUoGD8;ZEf?9b`D)F5H;OFu&XB&z@;_ zA6#e@#M~K9eXn&X%t7B|NgupZ|KxompBfjJDv>*YHD2u+03zppJKvuuBGgDZ z+86;?)fFcxP`Y&^RML)|@Z?xZhET+!v@pEv6_@PB^7ZnDtmF%VoPM`%4h%SD3mXjQ zIAvpEpt<*Ac}u0xfRE;JDmjD?S6ON4sbDOFerO-jGht63R6?s#rItKh;C@KY0P7Y% zWU!{&c#BkR8@*T%M`9KyY4|MU*O~~E2r8!4er$7|jI5apv8P9Q{`Yci>p@w#9huQe zUAL!Wn*|ZxbL@7Fwr#fcG!~gT`WcHijCYlRN9F5*$K||CSO-Qhs@su_g9R)@cp(tV zur2ls+B$%>E!53{?k~&*QFVs{hGZCD=8Qw!tjaR0mfdyQLP|l?9_zel6~{3PdU+~1 zUD?1<8#s{S^dJrVTJrvWDp=wEB2)syd-yg^O+o4m(hO!#QAx;Zz z7er?)n3UuNZtb$n6jTMa>0+5q(hSH1>N2#CFF>FMADbwG!a4C;hrDAP*7{|m&G9=_<1V)Dme zo9`lWYy}29w~YR$7h}`o;6aaY!Xm^Bd$d##IDvC_to9oS>kZRy9}>R1sj=CmS`*}{3}F*rc_1@BP0ma`PEtDz4T5-0sE^)R@= z5va$v6I$BQ-&k04;~k=@J9{^9jVTVl?fomuAnrAqx;6M7T&R0i`gRX6PTt-bhJxt7 zwf4nHe8g>qvP2V$+Zed+Ze&czSXt;ZM#!V#RZuQ`Wysyi@+qKJW;lHXvt(c&#$J&& znOD+&@`a3pfhK)!*EqR~!|BsTvvVO*j^UKik`jW4!KIO*{o=uqcp+nKz2|EhXp?wy zNLH-t(m#%wZ~^AYybJ~ejeB(S$HHT`LUuHB?2kqVNoftiK+`Q^A$G+5r6^oE=ct_U zq5ho?S8UcHDb{bs(BuOwRwX%s>$8ZT=)-|zK7EW%2Il&5GR9RopDV>gQncvEWtc zwQROe+#zN%L&m00;nn^=Cu_~TD_I{ce1=Jg;tJOR z0bNYDvXYtp1^fi@_Ex2U5ew;bF^o3|qdmwSpysQ~uhiyy3`GJ>p~+v}Wo>x$^)>T# zxE@C_Pu_pRCX6^sylU7Na7|>c&3fOkKNc6Lyka4yY{C|Bnt*c(m)7+NL5ns?-<=k} zQv>!Nv$ldRP%nu}#1h6$<@G$Dz-J9M(>2Vlx6%%VOh$0Z&yOxly~F9@?zZ01N%61K zMizo*GC+eFGTHrf`^0ro3UwEWymE%7;0-f{Xn2E%_s#{oA~^@-|D?X((%V;e*3e|AejOkmEC*7GASOZ;9Jq8aE(2!&5P}6VGv8sz6jQim z0ZV5Nl%<&a7Go$I0IWa>)|!7tXR8XY+dlTH3mpppj;e(!tym@ZI&vCzjoc)p^l1<7 zc?NIJTEU*GckcXn2&+jD8ElV0j3NJDAGC0Y|9FI{U06M{eD`>oUlL1+5E5G?X331q zi=JlCj`l{V?l5)y1z3z@WA*K@Otp|J*#2Ty{WHXrBt2;UUFS3|lQ!7Zr+v1e7fL^8 zZYl3JP?$6k7Q75D6PPW1j=W55+%_LRH$z^tnfc6I97apYHJabs)eGKt;z6#tm z6OpaWf*84-iP2{&k%3*2-AgVZJ?_5ecS&}hKB{2@u{&~deXtavPfn$HaZJ}hiKkR% z`lDfv9s}hHUWtm!Wn4O3tl5g6W|^uei0PGA)*x33!?saNXl7&mx*cN!wGeO!Gc0c1 z{MLnL_M|qHO+(wMh19=!%_Z|&v|Vu033*C=w^$HMZIWF$Y?7rB*6l<8@DdOHC?WTL zGqKZx+1%aEFP=-osjL#WBTQRdLcPH5^^nST@bXMYejhU2#OjS5a%%rakj(eR_p${( z;~aU2W7O+El_{0?^gU7_Md7xjSn;@+xsOuIGR9Tqx*R=Ok1;XUXLhuZ#VKvk+dSjt z%BD5%oG8@4+io@RgkgXRGQHOu=u`7eMo-(Vp`o^d6iu+f3{XnONmcu_x+)!#{zXyZ zMSTF&yAlmB`^O+lZxF6LU@t>Nt|9e+lu?*aR*ZbRYX(LordmtvF6XSoI_?#IJ+$iB|LbA7-507W8;R}|j{J97Zq5jE z_ockE!^j%z@AF~(_{ER9*95@na@yo({%ylb@n`B#go}3AK)WHen!xD;bYsr3gzR$G zG3QuRb3u%uP`XSU3tFPQ`>>+@bHwFL*x%mWm(^Q_EpdP=K^nzveSB%a$qbfSG$4}E zY;SlNauULA9=E||Vp`lI_T0<#!4+2^YdcIG8 z-CDnG^|qxt%np+Y2zgC>r7XkPJm4}R$)&KB_VXUgHboJUb&wZ@Um3bDV=3KzWv@mP z?9v&DUF9jh@=QOtJiSx)`aq6@O3x)`T+IGAjTI*0dtiALko=O_5~0h*?RWlP;}&oE z3YB~=j>q!RX;!h~bT`n^Pj-dIvDW2C!IM98IQl`5Q)%6o#QU@TAa`Cb#6bU?Sl$~e zPvf8?re4~XY=I&F;!spjpGO0Ow5=4j3=Q6vVl0K(@6SQ0_E2g#ilMem?ZVO8K_?w3 zMlp^`wP375gNLCJ40rkvm2s3oIrs`aUa}y%%-iuMLXVa#XiG0FT2PE73;Ke)9R+E@ z$U@PI87ElgHyoZUZhIV1QPeHQG5mh`#P%D~Ad|cS=u;N_jCY6XJ3r3w_^2k2b3K@a z;9nOL()3;N)}F08XY3PW72i%?v5xfAu;xjh;t;hzu>A8A$!ZZA{7$$u|8D=x1B3Po zaOW5-Ps*0#CSlrCIgn5r-|f=iONhb!W5d&wFKZ?7>azYj$H&Kwlfh`AkR#+RKoqan z?;nsIa3sOLP70ZPr6A+Vy0y*VRVqY9^&aW#n7tF9C@rA(qz`-o;JG$S8~P}VJaT|i zy1BvrotS@3T=Wax?@yKnJ?mKbTirqr+Ep<5LNH|-bzvt)q!=$V=j%$1r)U4jr&h>* z4pv`0{Q=i3ihX54OT0g+n)Uy@0kW$R^>=Zj@0W4iczF2#j4c+}S;Z9Y$p@nuo!h3n z!ESr`=SvcwpvRfCm9?Wm-2t}Sc5l$NO{&EB3*Jm1byYJ&Ll{rH*lQpM=ZL^nSDt36)FTzGl|J4@B=R ze|ajD_R3)3!Os`B;pt9~ofFRafHTt~bxN;}fiu8=t9M8NKd5|oc*N}z|J3E+`u7xV z=E##N0+IDJA8mJ@4AbhLk5=Tn zt4}UM)pS4$;z$iW$JpK=6xEg?tw6XD__EwHK1%$6mehL()UOcLx`#1T%uYGcuh16e zOZ0R2?YBQ6cjIsOV>i8djU3CpE9`Zz)9gUcF~-GqtnU@0CcjuMc_sEMDoiEYMh3I* zUK0>{`GikWjIey!@5zmoUoVm_8asZsyKM2u_uz|4gyq>JbbtSC^tIB_8z$VsIj@GtF)BK(SYsS?-?f77l0?YquM!8Mm9LeH#EQXYT?J|Lc%H?kO3% zb=?&xc|AC$dbg=7_KdcY%;67pR`ao}N0>Ea$$O!v4qxCsFT!qx5FQHDgx%e0Cl#@I zAh|H%j>YYgsTCPxA771LCawdB@yC?I7p1lEAbT$`wEyl%CNM1Xs^;vDLQ9K!b>;C^ z91lfGmVR;YPvjaQx6&#cE40bRI%EFT5Q^!ktBL0!rey4-AEZSbzf+zs`IH*ct`LxG zls6I14%mFFkoD{)D(qHxvwpQcNron_h4Hw>?GlrXJ`Nam=gPib^&EHoE8Y^aqFo_~C66s&ZS znf2PT<vRl7;L>Cts{iIM3+Nc^rE$fW#3{>==*)iKYLe zzAL>!Ke=gwD}q%%!q7O^+jH)$N!$LXsBQkdfim+c-_?c1mzP6yrR0yzt!G?L=yaBE znXl1w@%EMNGszwG2yRMJ;bIa|zY&6LuyZ}iWiIwcdojokBoazT6a^LK6;&fIw%+|{ z6+&_vTDg`ZWT22hh_Y>AXn@r;#7LNHms?s&3%#0B(qXjt)_LV6N8;?g%Af%uJv+WU zcxfPOeBf+v!1txG-OgcV7JQUa+ZEpZiQI@m-9zlY3xQmbS8eTPc9L^MSQ2boc)^a< z3}eE|g(30XGsWwy%7lW|4uZI%ZtX{}K&NMfpr9?GH{rIN2vFORkDyb`Ai^RkQ8}m0a{ST&vCGD#S(EjzopNXtF z4K8Qb`ll=eGxNS#ge%Fb#CDxRD2;Zdo;Y##ByIq=ELz~K7Pq|5yPen@cIQ1aQCUg< zTDI6LW}%n46StXbx$ZNFFOnM@5>DR_Yf;(z+N)B-Th*=Zn$hENR(+>uz06!z?^;U= z%z+=foplAHt{kIFj-J?cx3h$zw(pDHkNN9*2!~243@BDuJA}(IE`)LNBUUZ8!bQS- zvCzm-mglzBZ|Dm72-%u(T!8P-cgoA~HypwXrT6-;4c~aw{hK+j-~FS(!N11^T=`{v z_2LQ05#+;5&Bw0~=L^q#yQ|}66mj-&^|5+CUL`LiI_=}t4w%M`s#2+Xzp97ciBZ8L zbqLd>rU|{H6B9QoLk=U(HiQ}`Sm0MlTp3JHb=l;RUrRA1VVzgyCFV-8my&nf z+o}t>Hr@Ic*4A#ES@BT~Tm3GUsznI?x$CP(+j?3aE&ekJvMocQG_^{Ajp zp$q5Vm|x@!NSsjK)4w<^j$DNAd&Uw@qI!P03OT(yD^c#?@cm-&(S1!ipI^{T(^tgo zHcRUjx7uIvepKCa`Y_FoWP~T(skH1;d=#lvmbf=+O?nbTjAU=*PFdM|_x*aOj8IPo zbF97&3AItRf^*yvZC<9&TEzM7d|}S>8c#UO>U(PSp_@l5arV-*jKv+j&&^dL$I45e z??80q_e{j@{J|9x$nQRwS=S@`{j81Djik{)sQcEstX=i>!SoX_`~1Uk@Q9n|^scG1 zI@ZJMYtbFt3~g=(niftPte$$ekaZAlS15^*GxRj~@scSfjYBqH_02&6niak?uinkK zmSf9CY>-R$z9(KT7hSU>XRqD-p$;SEs%ei?IU~ReJ7jOHk=kP7$p@o;{dJQHb8tQ*n zTlH<295r6kSc@wC^YhaWZ9-h@!bg?u&c!m;{R&%Y#H28_AAe;4d3vv?lGCud#FW9S zA+jiX>;9Xn@e!NRD=M8QHI$!5MAEzK{>m*+GG2pAzmj8YLRrb6>aMI^Utzsbty%1S zC@t_c+}!Cuz)yLmUvv_!b5t<26#r`C}K)PmO!yGNZ&j&%b7P*N9)8?beb}AHOzt zZS^I`*V#5U#sOKq3)lpye%KAfY<#R1;S(Yf^gZg-5yURnj|JUYT)iFb5yva)P@oV7 z3w-ELZTf#u(`R7fR0+BR9~3prkX+jG%0_*Yoyv!t$vXf9v37`+hcN~T{c$t>@s2U& zLk5>!@=W%|DeeFHo(a8i+$cF|EJ|!J$$zWQ9Nzy8%l|AKVXSslSS36qwbT!9F*G1q zW3t9}=h27_WMAhy*s(9;)FU$lc3yDmeIB$bfGw32@U-3w z=Jr{an9~xUUI2}GhIn? z-(AR(Cf0|~fR0M+_U)2tL{gF&*kuk&X*SPKkrJ57xKKA@ciNR1se9JewBSlg?|FFr z|@^xSjFaJ@d7iz3rw%*O-MQV!7u0v0XKJu2{IW?j>hZJPj^DWJe&N_-=Px8%p zQFJ`E#0+al*mU%wEDcVC54oTE0Xz92uz!W%$X^_|j2xh42oE`-^&qo0-dc@mhKY5z^+a{W8g}!lGJ~NN*C4fXHtO(5zG~EtxnsbjF=tV0 z<&@&&c(j+H|8Mqz{m1nDOTG6|=!5`?IYLh{3@@?zr3*2$4R%?PUcXhF3haZStgFW#(P3Y5p1+)UR z_Yw#ehV5Te^cR;)(|z6^5m)wUYHLZj@qBsWV<&sF3uv>~6i5!7VB-G%Sxt%59SLHh zNW{7o=<0{aj3H2Yv2wBSM=ZN~Y7^DHFK%_kRU~{Ym!A}ajrElrI2n0Jv+nTW$Y0y*j?!Ns{KfBWH-0Ei z&0wM^zR7IH`BXExr%H`^zx3SC29_C#(q`T7C66Yxu>)29#`7j!>g1{=M^P&X9A(Sn z8y83F9-3Iri}Xh|IIP9T1yx?vYgbUs&Fp!g0dG3G+H-TwJ;uFWIYD5;cqu-+Sf**_G{8T~|mBWsefL8`{VDUa(< zuIyuMHn+xCpKd)L+pam>QRUHBe`glP)y3Cw9b1#-Zxr!b;b}4yQ}59RYcqgqj6tvL zRaixu`&pCHmwgt`ALp@AW_GapRjCjfvz4Ww4@#LAS4{H5euVRAiG=wsy93_j_I_E;4;#JN-Ofp@o zEn9-2>mR`Ohr`_4@0D7PfkrfXfAtH~=_iCt9%Sda@_n}Iswq8NB{V$MCN|_!9xg*< z;@W+d~3{;B%zsoUpQ!JLl@Z~VF0m9;sn7+mgD ziZnTbAgEm_=o1^#l57QI4=eG*Zev{5e5c&DfW8YVNWa2))*3^ZoO*K|QHM2mE_`8`z zASUXDPIn(#aSsX9)D_I}ILrU9M)Nk4YGLtA?cwU=WK>MsmyEM@>A4{Mf7E)x=J7E@ zF6S3&79_UGGTl=vl99XftFMN*WPRz38)KXkgOl{iJD%WEZZ@hiN2W-pY<`kIIxNfr zuh+_NxCkNcnsJc^cIYzZl29Af&h%?Fll2p-uJf-D3Fa|}u*llA&{R@ck| zSUMh0)V=;zG<~>JEv`8dncW*0N8kC`d^aG_d*K zuD@t#n0s~Yb@z_$+<5w2Uaw0&ms;ppJtX#M@(l&LloU0LzB+FtGR}DT+ncv9X5UJ^=s5FJF|-g_9Q%NV{Gcas?& zE5j^ZO4r2qGiv>dL_;#n87+%IF~h*l3B(-#uEn8gCiKm)&-h5pk=To9W#tx8#U#a@ zdwEajbu6}FXg`x?$W=$tp$x4H&&56=Oig0e@Mo?rSLZy}*{i=ZdYn{Lj_J|88lV>` zq?i#Ip!|4YcLhd2&C9);sMp_r<>g}0Ko)Zlp@6>)>?Xdn|NM{jdy);w9!vI3oRjXZ zLh?&kthjP)3S1BOEkTd)_|~yln|27)Glbron>aU|6b%cNORZUKptF%k`<%{>bjZ4e zC^+SnF1=k@fRB>=Q?HI!n7*j>b^B@LAyZG$h8xh`u*Y|sCU5Mne=3@}fNgxSXTR}R z58drxaNLc@a#xfy&hcY3Sg^X6Cm(tx8p`WHqX~2; z4Eab;4yDhvKEytpit=c&`kEkDY19kPm`Ua8y4G*~+#5&GH&SYn<~}`L_>h+yqA^l- zUh&U}OWZz0x%16jD(4HIWY;x$g`Pce7b{UpGm+H`8l)dBD$(wS-N)46vn`rrxQ>2P3)FUl&>D2K6GE0{tzTCIJBp^(&~7tsk2?*;4Q@?N)C~i zOWhSRUaK)epH6u5U~X04&w$P&s_kJ8FEh>NB~l`DX1;wp;OKqqD_3`8CL=V^?4Vot zjP@aZe@Ta~oe>5VCX1C%+X{r1ev|1o$lQd+SzQ(}->FECmb7<5GgFQb_WqUHTBVcN zKNyMD5VgoVp}%x|>)-cU?hC41~Dmjv!uarcPsZ&&arlSr)wCJpJ|8kp2#mU+!H4cvF9zzJ|lK)6D6 zk@k@zUbmy%PPDSZO5b$6{gwiIH0W8b$SlKr6Ne~{+L#fIS~DN221D*@lR5$dGV zwj<(#x`+6&s1#BBctWSq+{U|VqVljPvHo<+?8xJgi3H@7{)QyVaPq;#TQa2@B%&&6 zRj)h=$ysq|{N1y>bR-KQYy}CX~hz_{pbGI73GX>eJd=1Fj!0lOe@~Ig1r%*~rrJ`;3xHi!}E*+LY z=S-$Ro0)0IUYIU_z}$xSYI32W%8u$1>x~E3xBTjA+${^HYd!c}FWI<8y<+-~om3Pk zI#y-XRb^=DWjOHyH0_8LR8OrBvGx?es);kn1o4ZNP=E1HE(#~tZDaPbh4+W_eZjuC zKKt?To9jnoN0TheUdmQ4Oe~=0t_Hu!kS&n%*}I=_q$_xm!}}^~Zldk+-hePtcJ^8M zZ0SAwy$?QCGs{)aPU4j!uuYS}H=!4!X1U_I63g~U3oaF_jmggKwIu$1)r9IM!WLhT z@0&ocwxM)>M`RHUpZ_UvzWyf9lO({aU!EU= zcAn%W1|095nC?alxR=A zb}F{y+zl^YCuGt0^hgqHL~G~g?`L10R?pf^(HQ>q?J9)4h-C zkn!898r{g(ksYy~442(YuJxH!<#1Y$@T#6HVBLvx4%{#dB$k!eEakcQwt1GG5^4NB15Th^*9n4)nFQAFXC_ zsU3)pM`w^d*g@o}ufmPk!+H%#+X)MW=LR z9N6g0mqGXa)OZM{@hgI-6Vj@kACWbmRflD5YvA+BZ!eoN!0h4R1lZ5-JJMj< zY~WxExp-zBC_~=WJL#(S-9GR*QK4|m+@{@(6S%u^FLOz|op-n=)>*tN&SaZeD-98E z+ln(OM`eBsB1e#P1@Kx$qVBfCW#KuIz1qVbStTMTjh~N8_s8LC zUK!2H`1zvr3T#{PqT#A$UMBNp+oSh(x4>8)7#S#_nNc$_U#;_vVv7aC+3PCBmhXU{ zY{+NKs0eZ7hoIh8ScTap;TFm&dAe7WrBQm2H#Kd@&btFn?l$l`rhzz|D7fT}rG3@k zFSRcegmb!lY+>)|;J0bS+r{EIW~wsgWJoLEgxk-Bxp$#RQ@s7VK)nDQTq+LC3+piw zg{u%*`l!N@zb?p>fOclq!7hs#nrN0wB|WMg7g}iLa}qL>%@C7W0(%WcGzKTVlX%{s zjPdm;{?G)3Euc${q8y*4?pENt=Z;qqwUYeks05xDgkE5Xv?l zcXhaIM$8@;zUOy{j!s5ol7QrCEC}3n+zs=P^n-Rg81SH#v-DXP9(6M>IFH0Sv0F-_g&dJVh`_STP8aFFZLIo>pZ&T%%L7tc&N$O3QTKN=9gMq`d6q~@FQ7#8Wm0B2s1h(A7OXk@ZmTsG?g&_&__A1M z`}NZA;VF0(l->#LlgH>U>7qQR2;c}tSD=|)>Y1E+CpqXGP_ZA>B zJm_=8Bj7LZ`BVdx%mXAQS6CzL@SuSYVGVV+>C>*zg9&t7oM94s__5^#%mtW5FLK^` zLoj?myB`=nfrrqjzMgefs|8c~>P1dCccp|F#eR}LJZ)RGX53Av`OLZaE8TldUj~B4 z?xsPxVbhf3;tRKr{Jp;MG7kvI1)-+5SP!i_vYv0srKu)8k}<ilumiocjes?yv6; z&D?LR;b+0N>MdwV6Wx3>Qyv}{mr%TVgzgU;aHt|*V43iXZ!4EOBVC7N@<*+vLHqlH zOWX5#=g3KWcGs~KwsNP*d0uHI*^x@gt|5b74&!oEv=LfR5!_TtO3OY$)qcP< z;p=@kyLcwYop%R+r#@u0jeCIQV3hLkpXu)YtepzW2YXYS`BS@z$^tDA&l+c~5i`A^ z)2<^)nj?8b6Zx@^%)I;emWP`%5pbMff9a4_L#sL5FSR+wyPrk>YAS!_Os z9%};DtirA?j%!jNf58(JHc#8ndsay$kw2X9?PgAPPOmHnR%|Y|AxRy2U2Cj!$U^_E zdFK%pFKp=oZb$`q9mQ5_AkLH`QS3rcZv)#99bN8I<9xIfgUve-ta&?p(g!lNVl{BNpK}Fz-8Zl&RsD!OThvpcsPQQ`XYIN!N=(C%CthrXP#?H5@!SV`osf>Z6Nw%jf9f6 zZ_q0e-ov27+rR_wA2=}wY<`tfJ~KS8o--Bq zwXD~yyul2)XPsm`{8rEgXnI-&i`S`81(2c@AVzkT=Z{&kcscHFfFl+~G*e%LiifV5 zhsk_C&{}0B@*P(#apVtd!SJX?-5_IYJpw?C1#2pD+T9RCPxt;o3JlRP^^6s-GfocH zX2Ai|q@t!YZ_shch4>bIb-ChusBnJeQW>|X3Do%cp4YoQKi1n_=H-vie!M3WJP*MF zo&KZGkkE2cy!u=6*bWe#%l=T4(q@t3*5|r%u!~@C!Q%Vi?$-V~p{-zVoZh7X)MKW- z?bkHGnK5k;E@5({WCKq!5aCBL7D`UYwPBtTf9=v_;isefW@$%gVM%rgXq?LmOm}bL zPZ$Ori#@YUNDs-n4JI=5h%krl$A*!y z_;)CXG3Y+I%y)UI2xbF2W6+^~GeAG^o$&7(*bYc5pQq*pH2KzF2c}}4oKd*>cnaU? zIbh}m&Rl}Uz*01xBFJwZxcj^CHc_mJk@BSDaR`j|D#~JqP&pg0*?zeTy3yMMPWDGz zwt#~z(vzKW8%d5X73;;qS?!RY4K^v^^~zNZeUd3IvDlr}=MI-cR${ ze0(gxcg$ajxaz+(=C=~L^6vZS)s^b+K^)HVvnlSH&{c8P{Ad_?e(lP{DR4rXzVemT z45sfcCm^gAh}8@t-|rgF4rcfgO=w96RxlL<+XI&V-DjG$cKcZ%3yA5(_lfBJ$~}bP z)bq~I2sfL(cm>LwYK;kCT~%k905pID|m7>#40MFWi+A^R??P zZrWQ6x%VdIcK&xR!|KGF?x?0Z+GBN6sM847<3+B>$q`c@F0ei^P?{g?Zf;$+%F8=YpGNzD_XcN(R2 z%U{pU%ny{jFUH}GR68WUS1Ha5Eo{ndNa+lPt6tWz7q4Ptg*uP=7I{{kGfw&Vv@IKw zGt|&L(K=^rxF5ehW}+<#(jBe0B1GlJ875(3hR+bkm$5(v@c$o%~)8f}LN&zo)YUVmSPsW0PUuuMFBi7T8abw-H%3xq&vpCsxeA2c6T>M3+ z;+t3eH*?%4WPy`!c-qM9vUW+v{DT2 zo0mVp1loUC&58t1>ly%mNAY7;GkHTZp~^~zUh0URh`6C*7F$)2iC>NY8QtxS@+L12M8-H+S#wZE_-` z=mcT`ujk|>V!47G(Myq&pL$O+x-67QlQSl#il6A-i^zl_csjz!VMC8JtD~!$r=k6T zXL+#n7S1GRAqJ$2U!6sl­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™{_YZ1Zz-a7*TR22EgT$CccRL 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 z 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 aKVbi}-(7bI%g-R-B`>WaRV85>`u_mr;1qQL literal 0 HcmV?d00001 diff --git a/Wrappers/java/doc/images/select-simple-viewer.png b/Wrappers/java/doc/images/select-simple-viewer.png new file mode 100644 index 0000000000000000000000000000000000000000..8c317082ca12a2d7da377923454ec1caca6b6e68 GIT binary patch literal 79278 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 D_0DYq literal 0 HcmV?d00001 diff --git a/Wrappers/java/doc/images/select-workspace.png b/Wrappers/java/doc/images/select-workspace.png new file mode 100644 index 0000000000000000000000000000000000000000..56656238fd049648154387dee9543967a7302bf6 GIT binary patch literal 78517 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 Gum1z}6Cnct literal 0 HcmV?d00001 diff --git a/Wrappers/java/doc/images/simple-read.png b/Wrappers/java/doc/images/simple-read.png new file mode 100644 index 0000000000000000000000000000000000000000..ad1ab1b2a2e7817086db19f54b61a0f7b5187f62 GIT binary patch literal 60212 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

HEh0bX_1C1JwG;2C>x(3s)v*kn#(o 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 UY*4I+4FHs;uVbuTt_6MdfA^U!{Qv*} literal 0 HcmV?d00001 diff --git a/Wrappers/java/doc/images/simple-viewer.png b/Wrappers/java/doc/images/simple-viewer.png new file mode 100644 index 0000000000000000000000000000000000000000..74565afd981fb88d63611eb6376cb35c512cb53b GIT binary patch literal 116049 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

Q}+a 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 uDoEB|)qXTN&kbuR263-n{gFyRQARI literal 0 HcmV?d00001 diff --git a/Wrappers/java/doc/images/start-import.png b/Wrappers/java/doc/images/start-import.png new file mode 100644 index 0000000000000000000000000000000000000000..80e80080fd04d0b725a506d4dbfe73cdf505c8c5 GIT binary patch literal 84408 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≦RgoMZjH-zA zhe$p^(_7#8LI;JE7YPo-B}g$B)tFh`*QYAA0__Vr9dTBBJ9aXC+%0D8&c(|(19SEn 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

!@v(xt22LjCEGA1Y*1g|*{ukjsm+u4l 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 literal 0 HcmV?d00001 diff --git a/Wrappers/java/doc/images/switch-workspace.png b/Wrappers/java/doc/images/switch-workspace.png new file mode 100644 index 0000000000000000000000000000000000000000..b6bf58e722e5e5ab4c7aea83966cd56a2dcd1fdc GIT binary patch literal 76069 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%0DL{q5IHRlQyr+{J?=}xxd7fmHh|vneNf)~fk1R^ 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 literal 0 HcmV?d00001 diff --git a/Wrappers/java/doc/images/welcome.png b/Wrappers/java/doc/images/welcome.png new file mode 100644 index 0000000000000000000000000000000000000000..deccef5112012e2c92579ced635a347417b49b20 GIT binary patch literal 84007 zcmWhz1ymGW8=hs6kXWQUrBe|^a+Q?sZbZ7IrIwNor9n!%LAtx7`RMLu>1NrV|D3sV z?>%=mW@dMu_lYoNMQNOuo**w4=1Kk)7pm zN-EkB+_v_3JQPb||;z=9W9mc)n^RRo;c3kc5^Q3fgf0Vg&#f-cwM?Pl4 z@0F1I<;Yu_lSc@0eH3}4*(i5P)8W_Cz}mkAsUUViZlohA;fzMgNO4 z5Ebd2mt-c*q!kcp^X^Y_K%OU^cJ!LvTo|<=oL!I&2WIYpKRy{Rc`?}WaBue5>`~8)J%i}#UDeG>9{Q!6M<3UpU@C#O* zZ_X0ALipf z-7lqRPu6V4Q%?1GO1)q2B$P`31~&v%v_GuW9-inoen*@q*ffEf7;P5ta+;jP-E-3$j)05~xr=!q(;+L(*PYE;VjjEy z9%i{){f>`sDq60d^4_m_9bVn6G~BNAVx1T?oUYtmoTLlgtjsH6YJ#+Hx;)u-qase) zuLNcD&nwyxomX;m^maF`hcy%~SC%A+P2J=!$UhMXVli*=tlFuQG*0GSEwzh68r?Gj zvH7mv;Fug12NIY5TRYJPzYXeeihZHk)mGo*WgD&4R=4f+lB6*9q;C!1@0LrnD&x=f z+pkxi5AeF7Djga_^A$cVLKAHwqrp2N@D6BGib30Gg*=}@4y4@gvU55{wBdXLJxT0o z4gbQ8OQtb0@AoeGHu7{CBIX_ANh7_@&?&u!cy*V&j;(Wx?wRR%6Bx5{x0Z8ASCl{L^FDWlU!+MC?0y$!YkX*ykVHZ4N~ANxNUE^C2>MR{Vxus&#sx`Q@_j zov8dnkF=bKt<2BR=6CkyrUu8OrTgeq?c*2DI2z@TkGnb=aYVwZ$B!rxpL=7`?noam z3uqAP%V+Hm5AA6}?rCcX(2841VNrcep+7I-1s8cjqVNt zdWTBvGK^d521rJr2*35ZMbop}EB6%Lm;(oa!fJ+FuQ%S#8H)q2n6KL7Fz|IrNJj}P~4wZ_X* zIDsEd12Vv z#rc;Lge3zKqpQ5o4_@dV8P0F%m1fawO&R#78mZF`kN4n257l+f;(ELHn&WNdwK>f% zN{_7#7bm7>Cgvtr##`#LtMb~a8lO8wt5AN@xyjf@B3UhEoG+Pz2?0-bMbj+K%qE=w#oNgd~hdrhHb^M_tzF22-={1 z5is$EHuX{(zfF0GAd=O;aEQj~t_xRb0FJp351T%&7w};U(K5YxKG!rMn6SNH4?(D@ zqyq~ai}^7Cq3vey%i;``Y;&5;0!4iRw*~(UjYR zmZFN*+snz|3r!AB^Q(W1d5k6O*hErsgI}uk((OYwoISzeVx_2EE5=ha(Poh9)Ax*z zue@K>b8npg_?;0eo?T(mb^}a-RysnNyx>3njvRzxAvqE( z0iGyf{>oD%J#Rjy(1mDGL#u}@zTFp78FuaSeQ1^W*wh{PHZYuf>nxC#K-t?jsef0w zg+IyEsYwAhX>jMAZn}o1G|^YvQS0XajvUv877W7G&giSvde_h92{Wg+c`r22p?`X} zyWKmdcJduiDKlu>NPL|HaV4gLooVsRHb$XKMDiY8tPZcYd+!Lwg5vn9T&NW5QtmB_`QuAJ^80aYM&*nAe3vf(cA}<#vEM17AfQ9>d0Of}R~Gb=aov5vTw_U& zJXcRw`q7de-fRhl*E$q(Do+ym)VrQ<)zI;QU>@!743%1J$^CU0M^Y>*6rr=XPASIB zXD_-xE3trD)`Pg^cX_zT+O$v0Y{DdPc7D=xr#OE4t?06jYPNB1Vk!_RknF;W=@@X= zB`_KklJ7F-*~c0!hCtPEJl|9CUQf$;a-%)E4zA)9%+x4!%;+48a_-(ZCFdBO-p-%Z zOlYsMoUZ0><2M^+C$JC|v!3LQiO#$lXh?y?q@Rr^lR=`NT!i0!-C@}LDk6He&&(_) z$oi4okSW6FHGyn5kht zDRGnBZnNgF8&?M0!|9LRwdLWKG^f&2&*Pd=n(w7n{)3;g&+1Jva-+GYzSCW*C)bqN zd$)P##AocWniLeXGe9FW%n=V+CnA-2~|#X*SsgCX1T9VMtr<{i4?>rd-4w4_qLF_2llHjbAc zRn(c_uN&mncETRQ-s73X@={_*D!-kP{GcNIuz7|mI`|roW|$UJ&a_IvMVyE58a;rz zVyw*LH&^}gdds>3tUdBg6iWetBDT>q=y#@bEf_O1H1U!qZx znEEfgEP*JREoaE`I`vpIPDI-dqP3VK@Wk9S=f=9$=&kVNorDfg|=cE(T5{4Yxc8cbi7;wJx1#lL0P_GDZ4+5@15SnIfSG((iJ|*id9TGE(X}E}$0AfzA_nQL%ZL2si{tg# z^$y*APZ@^KBa6*@9FgT^1FGXP8$AlWH0!j~$t#>N-6p?~xT{xlNOWq?wSQOa(u&kV z-_CE>NU2-i&&`;=MUizv6v(T))zEIkSkWpS`>eyTS8&f@gIMba|d+3g3T~CTN(NcWI1h zn3;A-xAe}ut1LO&R8&S*kKSjx&mcGYwm5q;wO_ECUd0Gfh#lE_w^yIFj`kf&{HI}C zPC#Mj-JEk4b=~KVdz69b={{+@d0IiBR~WWN+fW4{6MBcD_?1-h2A#%4j5;NK;g6CE zGg!x5^K}d%$K-f7lR)LakRIl`lR3W7{c-zLngtv;n1Pqu(L%)jn&KypUfr~MIsQ(3 zTbhNMsQea#+YpX4R)dkqT2#}7V{!1J+oc25>oxQ`T>GWBb0K7Nfp&pub;q#()(nDE z=#;wp!2D)jtNC`VV7>RxxL)t1_I{6uI;+AbkO%OwTW6NcVwX-K^ToZ?#_EJ# zP{wXk2_|`LAOa0N$Grygpiv#p(XA;FahM8yJg554?Y=ssAYRc1Q!eXMzNt7(GgkU# zf$2Il_kOpP{%UnH8nJJ0e`0Nah#FOP{Q6Ljc6-qnI3Pz=kawn1CD+S7Hvw40)%3s$ zKT~qWh(V+y#)*dM{Fv+Ou)r+XqD($4kOgGC=k3a z5NIWON2W6J$+!po>ZISv?CRt^%_LJBL2(>u4ITiqY=QJSFqU5P8KcQq3kdtBEn4_n zyLZ^LPP@4$D6FAKH8(G;^9vD`4B5Cp9LW-w_8!m($?N@WqG4qtp8G%wOk*40Os&4N zWFA8Q58v&U9@npDJwou277en7%Xo@+UWtyu^cL?BZ%O$P7$tZj;2qxsRc=U}DzA-@!5nE_+A+)I+COs!elKw82iYM3n;ysva17A%1#mtraEs{N`17~j$U z7xJsNQ-bp|Qbr21U^zQiDA^Hxvr+^OOnEN_s!3|=)QyZI0N!|fMUMcd?DKR{JSPtZ zMeckP494(DB?D#AP5JRic~k|)I^R&rU+VWl4x*L&6xJqOxbC#vH4`+bi8|rAh4~L z)+rFSCPTpP)@f3FAGPw^@3Z$G{615!HQ%IkxZ8*7Y(5W89y0FGSKlM2AtT7m3JwTj zKyc^dqB=jot>DO&3O9VC$LhDDRtx0?GEC4qf)5Gn2_c?94ENpzI>J9zjPy^lPN;e_ zt|I0S1T9{G3GLO%RkMh%+bi$ZP5v$}8FFALCkT`^Nl&MV^tg<>Rbo;*k5kOs4i}YUwmo@hYwb@UlhaOIVr$82=EMMBfy4Areu4VZ-@61RkZdT zAX7F-GIV*}?^Ad4%YE(t9ehCDiP#-s$v~>_%Z@+Yx zPqlrr)*H8sAhmlF$Z1l^h;#iVPej8?Zel9qt$?b=X#4@ll-~nz@7c#_E~V=wJXe>9 zPk3Xl^2t*)Z&** z{IJ{WuY&mhp(>jGV85$jzbh5`FqZByn5MlEQE}EE6?@p$&`$yRzRrfv>P~+wlY2ZE z$*E(bFr$m_IwO(JsAFM%H2A#^BXYJ#P;zV3n;XOCr)a}%hZWhYZSu4_``NYl`iOOSMo|W&XSni--HMhWB|Itl`mreMG7n)xX9i0GfmOmjyo4+8f)2rZztt z_f=vKSb0>MpclGe!>cU2WvM^S^|d7h36gGd{rCB`1`2itQDsy(oK#U|%5&*a>OcThANq(8Lj~)r@6+g$ZcEwH){aYd#oyA%Ze;^`o{GOuOqxjQg zCi{~)LC*pgTdZ8*C39*Oh58LdFilqoDsJN?juqxbe94JDGF5!>>3;V8H|ifY2n}*w zZ3NaDDAfc|t&RE&K%mgeShznr>>EA4GS8=eM=YTGAk(B3_Z9c+zm*`=9%b0!TRsyy z{{>o5x(1T27;l6exCXj_!ZaBfFkU#?qd%;lz)=X{7P0!}REy|gDDiH#<-p+SkHwk( zO~CvpiN)NG67NWwKA**>-s(-+4662nl(V4>vi2{dJ&eu;ZTx;aHr&I8=Pyf;M5+ji zNR8>Q)${P0MnZ!tF*3l2WhW+-Dh>^39yu`L1vnpmpq*{1r!dvDq0y`8(DF z*2RjM@)Nn!LAXqYN%IQ$0uB|p{wRw~wfw_`Vu8=xg`W%4rB7i*)siPd z=02GyE@j6v#8y6Ry7^&O?uIozzDWkHgS?B;F(m#IC>eZ>{zm}$87{up9N2LXP>HL( zhM(^H#?0-uSEV=8?R^ReMGDK}RSH)-|EBWo?5uD{lpR#_aFwu0nD2^P`S}X1)o)x@ zHpybonA>1uB@wk(I=<;1GfAgcW`SV7p z#$IkUt_x;~RghGg2bz3zq!1s<<1|EG>{iqkw#DrbdiTJlj6_l$Abl^u$mR3Bn6gdk zzY2cCq9HgP8&+R{e>+tmZFp6Z=MOSKKY<5O>^D0*p3*tu4@SzpBld+ujLG z#he01DC!XCG%~-q*jhZVs->s$tLOG#ts#;TZlB0UEJ|GunB4h9(M{+G<2~>Wv8< z^1&ho`!F0C@^nmIK9n9~fbzO>2w$~WT-H-UhgysHb;7PHJjLo}tH#E*@5&?UVnTP8 zfi0#By91n?@R`+Is*CsijsfXe8TP{vgMYE*I6lsNj)@9_d#asJ;b65Zd72Ds(gcF9 zat>4#vg11i(bqxeHX_u${xHJ#RJD$Xw7fHT&#$#BK&`|PD;MUxa&}n^>^q%^(CkL)QNhUXsZzV@>rZ}aIU%Mkw7FNhxjbqHLd?-KD zI0&Bd{8if~5fx*f+px-H&>(cTLCk3F5`+`&7|f||jhT=f$Vi+D+OCtyV=#4*QjlGO z%dycd6*=aVD19NHtR3NV<-EeNi;6mqilU0bp^CanSGY3x^}`-u9>=Bt)n+TAZz`t*PVZtM33$eZxSRl0G;dauB)P6W3a8bbFi{ zH2bC2uN3fKPuPFVDQe847*~Ejrjd8myWGE%(AKVgVgrghr66ci(_TIJ1={YI@6BE( z))nTdl+VV#_znDErRpv4&2f_-Tsl6>ePU_eG z=E>0PQP8=J&Z&s*%uRfwtf_~>HEi|}fAff}DQS;5=CX*uP zJ^aQO4_Eq{Mi^BG@>kanYcBsyr6+r}9dMx+ghLv1zxonfX~wK^ak2z%6sz&#CPbFE z#y+55ABj}DuXc(&K;X-MmaG2a4-o1VztB1N)6*41$jy;h4aJdAgUv~2x)(&|`pBXt zh4P16_lHxL*KS8EVhuJlRbH#O3j~eCo-wWHsL3I`{xq;RbHWWa|J70X=%IVPw_D_) zwe4U6D8{R@jU+&|ZZ~x|(qtjm`Ih}5LyzzCL(YkuzuWZ-k*3*CQOZdA+x~J7Dwa8tTq(C= zgNR}@+EIU~paTQB;1>@xY@imRKa&;3vFHE>CRw`eli;ob$1 z*k}t0{x2Or}16s%N*Z`OJVJ`L}0 zIf}yugt7NM$^>yEr6rlBtjqkCcIubg>YKF2+nV%aA3JeH%%T<(- ze4`=O29Xz?y0hJUm8es=JfeB>N*+5sEm-tzL?(VZ?~FsyMv6hOhI-~a5Z@2^IFgJ_djhtQxpz=-Zz25Q15b~sty99 z{U{CP8pWyYusb5{aP7%gayn+LY8-aq7R6x;2SF0GAi`H$@-t0wwHaTcn4>9};6bcP z0_)hXOEU@wiHd51wGrqMCE$`0gpE8%+4g08vbedX^~*vxNzRN0_SkdDx9buH!ppJ$ z-hH)BJ3Q2*IGE+1stxRGQuKhKrMmIWbfUR{=V_q|pu;(^t))@(M{?K|#jL{|3wFo% zm!N}V-TJobk`gN7tg^fp)LFIJMS11^f1(b!3>q&7%wqH#-L3}C%!bbx`cavqDMg$v z_rlDEog9yP!Zw+eG6Y-?dW!yIR_ez5E#d_~YQ)+dGkVSKcy<+0(N6d5?B5hC?8Nxp zt8q$pABQPsUj0*m{&-$0+UdvkM+qELX!mtINl{xFHZxGh85`f3r9cMiEIBx?Q_v}6Kl*!l}~R`-Eo z^x#U&gG}s>3?Fp*pDaCo69(?9fiLvxocP+A?seb{M#y|l9W+Z>YU2ydtuJ7n8oU1S z>+JNvX1BP@kcAa5$1&0DTZs4>jeyHmM|KW6ght3^Yc4zIl7UL}`{Ve}P4qA`bX=N6 zzuUd1K=@h!gfHp#WN&M2{Ku-q8OtvQfz%tc}R!$kb&!Nue z8CZLtqMQ25Im=31FTagQtz&;+#!yK!yCg3iC48ZQ6{ZW8xw(O!*$jmH&D)PJV?QHN z=5+fhMeGx{7P31<8R}=i%kOW8NkNKz^- zmc%+#rO>Y&6^GfnYYHQF6O?;7OS{gM*YXvx56FLbQG8Fb#g8I$HHJn@+3h@f0_g(Z z687%aJd`q36iu43xFvBomwQh?Env+AkEIxS*4_6O;9OWFiizbALb9KQk-M%VBJL5L z#z!KY&u^#9#wx(}fWO8u@Y(gm|C7 zcmUD!w6DZRuvqjL02M?9YL)}by-~>%iN+JmwUGzNkZne%1}^aK2QXD|kCH!Wev8Mw zrYm`x2B>9+54`Lt9e?5Ag^{-q&373yUY)pmtiO3oex(Q{lq`FRdrmi($yWO3J3tW) zj{c#<3mkz0PJty1m{A-Bh#qfsze)SY#`&8-vA{5L)#GCCqz%J8FCu=RcwEa4!18%X zhQGhi^xLTKm5Si#B5H+(zdp{O? z5BYij-fL5eQFl9#fQYqs(vOLn;R-}rT&?~-t2-u!zz7@+sUX2j36 z7b`-ut;S#|GwgH(^;956XsO~ISj98ixONZMGCmHVt4#En)e?i z7V|?Nf)TQeJtQvnOZc2&$V{wG_>N#`550__ z;T}29OvN4P%Jq9o_w8~k+Zd1>1UkJn1`3M}pAo-y>J=q!yd;K?2-hS+XN_#`gKymFcFaop=QcYQgf0M}%y+K}X3nHAycxbyiIjmBI*r@|}%?IvqMUr*(sO^I;pZ`I1=-tGA16x=W>fqA= zhU-!h(IMhY)2Ntg#{Rcv$xcgzJR?7ox8;YO`b~gDEO3?tmF#dq5B;cR7Z)~E*e=pM z)FVHv9*mo3{Zt&&*T_;>>m>ux7Y1VG<01iJounob~UYu#F%gZYxdsokA z)b?$AqMyd=;XDr<0-+N2CZ!bcMx_*f{h^0a)MX1p!25FGr@=lU|m*ldxR@s=V>?1H}>ODsXq!>NujCE zeNTPPQ}9R_{Am=+WH&hUBC7IYr1C;_&hx`j3%Q#iL}&#^Xa!4X1+w_!p3_vc(%alH zJT*?U=U}!gTFwMr)+(Q2cl!c6<7qtxUk~ zsPMhANqowEdZ0tNHnlq#^A?_*ekbp{Z?ccEyKm0{BkKz`<={(QNM6v4Y0It+)-u_l*$qZG?VS=3pihT+hd=WUUp6( zm60|@_eL7XRCs@Uo><9qJx%5a-ml;Vl##colt^$8`r0VqWRIFPZt)ky1L#1qG>{h4 z?YOO_NkosHdv7iO7>SJyOcuU^##1VG0Llu&63(z|sMhChD; zrrLY0|ITMWm2pXGA~#tNnZX?>R8qk>z}14f2yCYGBT>_<8Tl?CXi60LyF)!m1Es_Q z8}A5^$&jH(aGnv8D1dHNJ%ZSMbJ348U>a^rqdyRqP)7>e*Uj1O*~=d!Lg<~pc;nXn zvG)1Yb87rEpiDex*8>230F|FxOu38zPz06>8ca48Bw53ZCZm0hEy{Z=rF`)$E-E{E z^Q>>U0ndqy5U)rz2G}WZhTXdz!djex1JewyAOjN5J<*^wU}gF-jBE%5`Uxq8M%#x5 zW4{^%cz6Jl@+%T5XQ$|}Cu*0C?e9R@{VK&^gSeG6t<_m?NrGh_uRa_@Lr@&eqVOM4 zv0I3|?A%7wTpp2QeYa z=4a}QtzY5LE~k%En&2}|JWjyveeGSP{Ot71D(MI$Qoim!^JQ+`ixF@KKpQLqM229t zH}~oo+OhL#&&H=|CXy$W73u$N+Njmo1`?sC3!K$o%zGy_h~%`ixD3p+RZR5_Ot?z^ zYNY;_DnYqYnnqHui14X@rd$2S06uN8xw4%--yiLbqvVdNAEPo$N94NpnI#s*=rW1e zk|DFqkH9*8OQfU5R1aCMOXA~*na>ct0%6m%vt&dHGu2p(Q`_5>M$5l8ci1zp32a`G%W>P=^oL(AUajn8|1zGy zBMP}!VxNd-{&Yjx{NDPTH1@S|%CwQ`c}3B61<$Q!0NW2cXceZMc*1q%AW^j^fh-GE z@ld^I*Vqsz_i zlP+VU2EPp0n%$3=TfI&)L>{i;^X(3+Pl#s`NzC!Iqf;CmLM7^QJ3u#C$e|WP>2*;i z$CzjSoaCg|&`{f$=tkw7j5v8EHbDFB;G_S)EoScHxo-o8o;`-1Q-+?ynx2y?p8r&w z`c#}oReUE@o|ow8q?Zu%Y@H?ey1p)1k(-r5~fW~n*aOv=MzdbA$ z`6I*iI#rrrF}z8M*v|K&9ow+c=3!gto{O+dM3wM>{cnE8T#e5VF6E`jgWHKvr2{e> zvDI;l_kT8a`?>IufLSS1*!6lU#TiJH+uTa2W>(sDe4HX1987b*pBv;AJhc#&R>Da8 zm{MCCohjgRdCQs{0+xQ~w4M|5E@e-sQIwxqLDzEMJef^oKrcUjmc^<}|K} zI9@)WivB~VW)a*FQ@&<-4P5b*R+n1Wk#85pjQK#sK3C{$0#DVZx^Fh`(q+vB7X5H7$BWuq_r$s}7)*Bn67=>)2zT(5#~e z$YCu~fCUhX>-HDtbj>|z?Z?rN+x$-N1}XpzY6HUi`&<`m++evJWa`U9JT{>IfK%Zq9Nn|&W)#14CtZ+Skj(czKC_O~Ej;~iq z7^Ce~xkO#+f;x!CVp7d)eI;c#^@bMy5>J49X(VaGui-@pbC<8gl~|D<|1-c7F=++Q z+tqykf(1KbUaJ@MAL}DRUNUPTtK~^v8kV)Rzfs*=jV%SyHgb!=-T}Jw`si-mwm0f} z>#DyKn4}vg3^mO;%W4wUby0hX1lh_mWy1Vf%Km=5NzxKx8;O0gk29cngMCi&HkEwo z*_Qu-rPNWjMFHd;5V_x7;BA*D@aoGI2pFZyP#dq1F8)@jn^#)M@a^J1bV>&8c_c`S zy?Pk#KdPp#7efU3ToYV>$f3N*e(G;DOy4sU>}~y)ulg8SV4Be{@CTGtl6EQRUip;; z7LsLyRQp)stfG1^2ZqXk*K$OGdP_j{nLotZ0q@@eShR-@%YZtUfu(+Rm%i>V3!rN| zQ9Fgv&^kIP`PV6scM5!+$AyZ3Y%v3=&}hH9NtP*&070UI0N(p&+@1y`0_s*L0G4%) z@&S5jbzUH@^z2O+puLgP!2>?U$A&TM?u7jUIZC&V%8;UU{6otUOf3%2$K(foXyX)y zcY>#qH~10-u%S`BKmDH%Q-fPh5-2u+-!!A6(b{Gm`1v{2I@C@ycdZ#1em4Fpnc$$2 z;Gp1|HHFVn9~?OvI!)k??#MhWu~B=b?!z`6TV(YEy|B!xtjwxpsI+XPW)|}ugjN@P z&@6yg*j#IFpm!)p3X4{>L}b9Px`1c*bguFh^)p7!l${(HqOYL}Ha813HCGrmU-uNM zkZ`q$3cSnxt7aDR53kC`au=R%JPTiLzByW{cE8E+@w$dDHoGHNe9*7qViC&1Y~ zg#$53l79OWuBrfHtquIGc;8`oD?2aZQ{g)z!aZu_z~Ul0t~yDe_;jyyWN*KGFSC3} zC)ve;^K;cVTw+vT>igf{`(Nf)<~zmVC)2&UcMIsOGX0b6EiXM5|K8*5w3ttOUKCgF zXcQ=v#H4A`@Ro^MbBNmNJC8SfZFd^EgV&v{K3wSW0yXlQj}<2d4)Uvu-dUEL^NaVR zzRrgftE;Yv2XU>FL$RCP<$m~)pk_Q7Td};i*kk*?{DsA+fq)krC7=8`DaYKH47N>kYSxo^saWtmp2D#yDNVQ#ITIr9-oer&_p;y`-9CNoYq;>=Nh1ef zkHYFqtP9A6rjx#499DtS%Lw8rpyybXCtJ*cw`R`d5=zAl;!Cca2S##kfa3dp)wh7? zTi|i-;y=KXI%W(^wC2)et64C(#Y1lU&O>TSfQ=oc3(}rIqod#C)vj9MF8j40snf8MFH#gKyI>uEuH22tfxWnfI+~n(`ShB8EV-|>!3xP12`z_ zY+AXxVX-);y+^**5d}Yg7Cvyt#L7{5Bfi?BkK01?dKppt**M{BB?SvRd_rq`u{v%f zZfik5odjIY$M14v{JFM-Mh>^0qQ+T$iQ=Kbg~XpUkSJA{IJvRtwBnyQ@tMA%gijQ! z|D?fNi@-|;NwLE+?_S%&tv|h)FPbsZrn-;5%yTrrxZ)N8u0Mqu*PLF=MP0DAnMp&%xjYEwO+%jaXG40P+=TVAdZ{J9QCS-3_c~XBP zakM*kMj=OfX=(C~4)2iKeQCkDXN8mhEDBh;_&IZx7z7I4Xd>=P57GT&qt6FcPxn*X z3fFO&G-6lz$q<{8h<#iBopwMaceq-Qmok!p2T!V@Dh)q9z|Kt&hBDY|+vZuGa zWH1eljBT{B^Os}cvN4q)_L3HxVg%z3w2@DHJ5)P9c_>EOPLQ%&;V%~^IM%8-7=54y zf4^?wop8s(LQM_mijNAX3q0k@|9+hGBPZu6uxw{{xG41A#qGwW>_1`X>b>DK*mjR` z=Emg}1+Y_L;I})dk~5axUg`QkJ6Gou(s%ulN5ZyXpSH@`5xvT+znn_Exu_SGhUIp= z(rk0nX7ElF$LVR~utc-0@%wR8BFY*uPw>$bqaRPT*NJZc$#$-Dc*X^Zp?kFNS{WzB zO(Hk?!%z|phn{bP>D@$lUO!u6MzQwy{BQe>|MEz%<&55Q_zYEE+U@+sJz>YHRagu3 z%ng-H@*q0RH`$lm;V9Jq-t=v7Fq~1EJ(03p`+K47o&R6+hkuF3ta@&BIaWvRZBA<7 zj^|RR&Jn94zsv``1!7}>%$%?uh+N!Vx3036XNV$$EfkR>49tEPcB;v&Z$LB&B(jGf9V}qvn|B z^01?F=)V-oYd(2Sw$z1|h@Ie0QXZ0h(ab74VK2~*iS#mI${(LT#zlAdVvU&+^4fr+ z9{0+YT3@U(>JNZxxx(1B{O=PY&de!*-(k>bRamyTqXqVq?k)Vsd^Q=Hyn%exLg823`rz&Sb~- z)it5v-kMyE)jpLzR6B{{-3XQ$4F!6=Eq$N>UDeMP`DOX4fxLiw!P2M37qCB>n`A6> zlZYV2o02Ad+RcYRlsBeKV?$YfA2qk--tAX}$R$$K4v%2PbIIZ{{udYXqvPg)N+wO2vZdol5N^rZ^mRiZZF3yrxv^8u_ona~#BJFPc{2e?Jg4N92mVnEhU4#+9%B zAJddrZCS}QauSGzyb^+)pm@QAzqPm-eMtsovH6A9(=~GYU%pq(YpVg3jyAFas#5O` zhYCbFK<`YUQUsqN(2vNe8!ZiF?AmKM9qQ*lPB%u>&(U<4by8!#(Q}bY2c7av`tS4M zkfR?R!dwYx9AL!(cBV1tQ(sC9PU%Atnt3?1i?kf5iIYh<$q89x)KdO97>jG5LRMNS z1dJgJDy(pji4IoC?JayfV1Wwqaa+TyE2C#~#V&n-XmyGgG6LuZhyKYXS{)-O>Im+D zXv;^M1wj=8@jpi(`DI|MvQGUblLFa|MmvB8+w@Z<_M6-b(-O$(tvj{0v8-jp(9}UG z;RFfzt9lgHt5@(X0#R*2uZB>dbS%AgZX*BxKuN+)A z<+Fwr$=TGk6;!)}VmCjeii({{eQ|Av7W(Ou=w@!U#Xr4nbH;(OeDna`@Vpx3azp9D zR*s$I=}{GVcdafuRZ3Uc48n1hO-pn_e!o&`wXa;9N_e(elSTnj5|)IEgufOE8!7*a zi~fbP{`)%!XN=R2VD7?fFiZ#T;JS`-4I1&mn+aOXco9r26$+Oe>03IY^UdGF-A7y; z2Gv&1KNxmjtXRJVR(|3DI3(As>-R6JxEN~MNJT$Vgg_P4aiFx6*hM)2f-4<%fzyFO zz4jFiCJ5>VhTD4;JGLuEEA;Q#$Y5`+fOuH~GMKDf+gt0>`L}k6mXS1L?5VDNF&%LhLwDrSu#C zU5XHWHf3lf+JBT2I7(cDlyRU5_`1h0x!oiT9VIer`@ia#sc}@D&D@eEOq_!2ZeM$O zlOOr>KK*8YdP@O&t0X}VSO|Q9^q2l@_>jsY6(==;(m@Rc{_kj+g_+w{MKWZ#^-U@x zJE;CJNtZC|A7hi*`m2T`{g+54jdT>%#-7daeeCB1QgoBIM_=Bjs^_R1|IbpT0t%bA zBYgYBXlPkc`CA|t{;ay3s=Df;j6O^|D<;VJOr5=5|9x~hPWmD38QsnMPl#u(p_~SM zjUDxc?Nqd1zzZkL+~5lY(Twltt8&-!UX)}fICQaN&E{HLtEJqlEBF*A%FOcHQc$M; zkEFAVYw~^j@VyO3Hz>_0DFvjPQA&t(Np}kd9UF}xB_av}qdS!lX(U9HE@_aK?%JOF z_kUjV1~xv|b)Dz=J&sex6Z=}f$iI0LUc+NymR;h}&bMq4{GlUT%sc)AnP$-^XwB_^ zkGfGevj^!W+j$DksAGKQ#2d_24XeA~Km3-&kT%@Go@dClV1q))!f)=~nUlZ4S6R(_ zLn&v>{)er0U#ISBkBEnogQ(VRW{2wj4(`1f+~459>}JpPlrs<1a%)8*%6D{SVLR|z zFp%Zu=k6oaka`9d`{z+>+vKzBgLNDSJ-`BWwud32uMA+Jwxj}1k8}s8bFsv}f=|WW zmO3MyLPSa~Kw#$Rw>a7nGPO>2FSY zwaEn&0$^Ud*W2rY&Ci!kBm~XJj-uwN{(6O4rwBoXVAKB94Yw}aik+W!S^m23UP}|) zGa`ul_xW&SZe2S|{!u)@9mpRmuRrhae%8SubILMX?}l5;k%P_no_R2D%?*SiZ_Fl7 zJa+#`f=Qva;JF_05JDueFAN-iI6o`$3(yU>qvvkxBW$ukV7VBpu) zdid$fgTcat5tdH*VUs$m*ch)L_CkKj?)OzL@_&D|FO@7Rx;F!K!xR@^ev=g_T7K1- z>66yA_GN~N?Ay;>z_0o1&XdHhRqw{&S}W$)Au*mK3wn`dTiGD>K+uh-Sz_Z4lM96` zdh(F~KPb1R{a?ZW)5rg1Q>kaAt&Zw_Y6KT}a1mp;Os2*EynLe(O zq7T4``bxS1{T9Qvf%d6lUq+~&x{y^0;kRpu!`#Yq^a2|@=}TTb(gJ%bjucGz>|5+p zBr!F(IeWN!C1zZ`C8VMfqZNAmD2kxP4B2dhUSPp^%NZ94soTFl5zVIEmUyUt9bj;x zt#%?f6bNL-wP&+4HmL4zBTO2P9?O$a9hYx8SR$Y`9K5ra*RrB^gnnx4Rb zJ3w+Iw>lW0;S>;C?f(xwFS7o8hv z9aMeX63p5X%v=&g{V|s6H5Qu%`X~@uqc7*$RJN`%L~<|NLLvKjotAAulysuOqJ^!u ztpC~|)o<*0$zi3f_{d>jXgxTlQCw2qAU^`wwcx<(C+)Jf#foIGrU3u$+Q`*7ONuIB zloZx)hbCi$(@62B-7jT_>A02^dl?ygCB5sJno5f1(tGy$eJAWgBtC+%JshfwkJd2D z?Wg2`E#8G$-+?3FK)=WqHox^6RBv+12kE`a2ex!W4C`PJbfOW=tY#{ZI7?a+;1Adc z17Pc;IlIH+Bz|Y3iiDf2J~^@jZtg(3E^e#$C$sgD)1U2Mgt-w-eQ8 z*6ISL>|7q*+j&!HzJ%w6ZwID(xb${N7~HYKpQ{@Gd?SLlWA0U1!>kcTdePQay!2=^ z1deQV?^=*P-fu|QsMcbt zO05b`3VU^*+-MrN-*75_T`@jKG-i+jZ7+Q(9)-FCz61iN@>%qJTT=R8E>3XLDD1Ur-0hZ| zLFy{p(Y?om*txtx1>AMH>F0^e^R@{VfmqM`e5A4hWw^v2TR8n98{oI+ms*H*O9*zE zvHbkRUhJmt(_~{Y^rQ;%Tzhm*Yc#ez19Mm;zLTPb*9jaun2}s=>_Pmf=+GS80eo@t z`orEqdpUM8XUy}hSM6&#EgA5$W6!*YXvJV#US)hg49oEv|=5ZD!zDqQqE0Ia# zG`JF~=^t|uEp*!&{RltoaM8hkThheo z7$Ndr9C-qh&ZkExAXyOog3vr{Ym)geNq!smr^AR1iy{pjlEXaLSH;pE=%5gU%b@J* zAdQ;RHP@3RuTZ>HDU$p+e3q=ZE|y#&pcAeln{+5DPVfmJ&Dt@#7U*6NoAA9dwlyv=0s?yuM2?4p{fcQ%$j6vZGJ`g0scat^$Ta9z+S2Sw6hW z%;n5TX-HpH{+7RTuktQ(q8%VG&btK#AM3-o2#RSYMQ|GIHq0kFr53Xwfp_yxhJ;5w zXrA;5+jH$6<-!yR%*c22ThYp9zffR&<1@rsk?P(+)i449~I+icK-WI zv};2|`d(iN#nEUk1o>i&K~wH{R^vw!5accT+1uqu_-X1nPv9YJEaCfkE{M;OL1J0y zWnW=e%BhF=UfnMa*HKp-$Z>9~!yhU`EpZ;b`f9H03E-JBQlKyI=(ilFy-vTJED7R0 zei@r;6}l+Mm1Nwq`;!Q^80PN%?Ij8F1gbqAzG85Gg4_rR4On@bim(wRK_*!Wm7^%>>Yzi90x9WKadwc~ z?8ZDyITDZ*NM9?VNigLHKhkPHN|X6$SDfL6pe5|FAk+?~L&R(KHAwejIqm1|-{Gx- zS=xe7vzu9in2^v@_UgBHoYL<5RW8@1@f$ZA88-JD7`fiB@}jc_2800la51DVa>Ds5 zm(jEMR8t!mmBV|#uUxt|TqmB@z3~afKjdqysOU$KEV-ykA2RoB7B++Thv zB%Kj*w-(>;tv~xp5c>*4s!x36Wf2?tUC~O`o!oiVWmW4Xq@koWAwIJZFf7!9kIq9c zLPQyXVL>N7*K6&2%dslvIn^8#wHL~_J^P9yG-j6ye(yuK;K+DDd)juiyynLMr>CmB1zL;036*;6sTx!HDxY>^CTYo}Iv?;e0@S`Rp@$LR4QBnOuuT2N zX<+z^SbF^<{d9;|^zyFt*k)r= zn)k6pj9^51PEx^c-byfQkjfw}~I6$8CM9e`?2)Iu&js9c6m>dN$(Uc2!^Zzsy zl~7nn=7*jTr$c-1FmFpYO}NDa`yfj*1sh`2HNAA(bO(CK$aaW^7+);ospHBa=NDQE zeZcd?3@M2nje2*+AjjXccJ_d4sM`0(!iI6zY0oYd;RM{!i|)rw&$drHY6G!94_@W3 zhF<+)Y4qF)Kl7GT3o}!*CnyU3(i6McwyoLF*jRs$Z%XJx+o1==v>x;E$Y%?y$^GyCY)0;e`=%{0_ zUg3PM9=~q4T^xC>F7jd5 z?bB2H%{ITvg{X0#^?IPVJ~S<)XFl*f10*5ypBPPWVeQrTR^?uwJ%whw!48jaryk6I zKKpwaI^wmbK2b=;Hj89iFS4^SG6_DAL_gs>RiGI!nb0G)JiVlua1aG0HD04 zUNT1CLKGoxlzEMXHc7ll!WH0Ly>_2cD1Pwy8R3);e&Vwjs=w`fFP(8!nGB&@gXCWh z65bBm9lX2j5?zGg=ZyW5+!RXlImoh9TjP`w?-Nj8M*3WB?>Eg=S6_6Exo%+jGCu)1 zQe^8Hn5B@BO{6aabe_K!@Bxz#cWr^5 zTkn5VK3Pf`VN?7xaeKuH1b7d$4wgBqa`tRUROS>~OVTbWQk<;oLOHt1bV4qu9?0cm zzmh^aExwR=Rop*eUnF|UBfbf-cie<<=2ARO^MFa=2c!vA{Ei&jGKWU94JSQPF0 zqfB@yM8;41rl|Om6^=~Bj-5Vz6mM`%C4CCak^xHstKW*xjSCdK85eKE{G#%O%9!Lu zXJO6lubJ2x4xSdHegWsUVnmDpKM7jGw1iV5vqtQ6!_^Pq z4+KIZ|KJ&!b-4q!?f{h!ifWRwg@kS9ZO=X;M{+@JT7)P&wDJ3SP~NEa7kQglnvW^k zPd~LQ3C8L_?Q=G?M+tvzvg+K*9x6Mv(Xfal1+Pef%ae*yMm!qk?*t<4J3wibj^>2L z@I{lAa?qokMBd03;Bb&k1YofN_|}skJQ=@PtodfpCGC0a*yGgVV&02QF8v#>(dz=L zk}LH~ZE_>@$BzE#(9-qmo(p@Rd<5XJ2WFooCd&Gs@~H2NiRF(E7ub(p^yJPhH?DH` zlI+K87Ne$#woalqEUa_XKF9)fuoxXgU$7)Z7-oKu$eC})n+Rbzy?}wMAYhc`H_UDD0+M&}IF~_@kVm(KEbi_%uwVze4u~bi(8o zrNk6Lo}AGR`jXttoUKgcuNPkC1bT+XfP~FKOU3_wVKbd^mL0iJ<_zSn&HSX(vgXgVY{77v8WEJrhVtgICcX7(2@}T%8LMo!hlz3{FsGrChPZFJl)jw*$Ra<5 zCe5*a2?!t8D4u10x=AAF6Jg~@F4W5s_=hFKA@P^NM~6hEONI3}a(l5Y{}Kdr+1+H9 z__*AkM`u=2(1UFySK{9LOA%6UMOEL9^F2I-;f=LLk|6tUYb9SMa)L#x&@P*lFh`ac)`!Pj`)DlAfh3YRn4A((zw{4>$XN|;VvHP0S+ zTXOlT^g${+IauO?VEWS^a4!`dkHU(2M~`6AHhxS_OHB}@Yc$+x|UEHTx3 ziiIIRPjj5se=CF>lC-L7XlhR?L)mbQ5;utO;#~HYd?RBIW+uLys%$ySH0Qu&Y`yN8 z@0+H!mt!~Ej}{hW*09(IXPyi%arMJz$ zm%r!=ezuY*kIS9{bY5vM+-2_t+~?#~NDklqYIl<-+A~F!I$xh347LefE%u&eU;k2e z!k#AUvpYv265e&wFcTl-Af7kff{ zXQBE0((H~E>ZK>YL2K~ha_E{%X+LZA9WA$Mj$^s5C++jSIr7;g?}C#n_O4YEu8Mdt zBJV1r0GDoC{_Gl0aBu)${9e*pnmb6>^p$@D@5;8+~tgvSzcht3@GO3HhnJNv0Jq$O6f{9_3x*OCrJ9;|3fNd^f3J~pBrYX#rc z&sLvw&=Ygnz?ultYTCc%PEnCgwFN1A;6gP@vEY3f?(-aKyO>@4AuOvgTs>Oh*~xI9 zy`%Q`tpfSXe-IO{E|^!9Ie~4A@p~+1ZR9<~Tzh(k99q8K62kzn-H6qWWOI?lxy#b* z=%m=*qX|>`TVj?!L^|D@AFDR}1uAE>nqngRW;NXC%*!ylinG+2uN5Jo7~=y#T!iO6 zY=G*(<49CPjtG zhg?4D{%@ODvz3&j!FKn16x&$$3UFRCJ0Uh1YbaD;IMN)u25H;{Lrc*lOZKTN;b@VgRgTKMe+8V&sEtoK4b+mdqS8sEJRj2kp`XTXkiygX z(JQMaD6%u|b<8u>cYT8y%5sg;#9*n? zbNs#GNe`^Q(2#0G`}1VNi6PexZ>_%?;K2S&|3^jT1PJCyyAbd!+U&Wap3D#9pXWTS zAue#QAp^46A7%pGksMT!HbZ1_%~r$rHCs$6b6dmz0CKGu?Eth_j3wcKI64^pkVeH$ zjrD-g~%*LD(4Q4o!8XSvJOk!yZOZ(sm0&mt( zu|TxEJcg(0Vd@>b{-ft-p9#fjsg+1F6(5^SoM8ex<<7BhP1OJKO8_Ru03?Kh>L z)3AGsCYW{R;q_Mokq^8cTD^E^`CRoje{!lu{s495DKa|Rd^c(EmI7t$lrjj=bKg(S z_kw;Px+nXDXRM7Q{Z%MI8P4l5;epwsW}7k@gB=2+X;^AKGBVOOR6}cCIHhU~Wb#*q zOzVL%9HyJr$Ir`Ew*}+?IMZKqyMoOM8hn;>73{yneGD&d+2;5YB5vm(Yw38*5bGPclwnUv2K~(WUX!8gQ^Hwqw)u_ zm*)2oOrW93;>F$_ZBZxby9y&xtI4~(iRIacYJ2Y%E=&%_0?Ll%q^fMthszo*UPV6T! zl-SFOH{(4A%Er4g$D@0!=NqjRo*{PXo75?HwaXK*-A($cCxNj^rXqmtKC3t|3q_E$ zx7NGVzF=jgLrY+;6h!JA$niJyH^>aG<{d5WSj_YsHL-dgTVj9kWskLOxMN_N+s-Pegp1*(i`rxE6Tzs1 zA6cWd`c)q&X>rmgR>Ygx30$Meeta}qk?hdgktJt#D(y}}&JkXaS5$X039X69B@?(; z)CYJSqc~0Ppod=PTXf|64ZGCI=&h2_Gj+HcPc2h|jWHJVD_MT;0GgU(?uvGDp-M%2 z^_&2(^S?3vG#y{34olES^rRT2O~3~kQKY^dahc93E0fcFp{_pIXU>zEUA5I^7)&+F zq1?cJ_L;`3n^8=1U*G66#NeXzRPFs?oa9=Hb?OZ);!Klatn*O_9Z`REX`Ma7ID2R!gdot8p+^u7~s zR$W5$z=1XbEnFhX&LfJq%|{@to2*SrmW%gTsy^EF#>0GjFe}u`;xDmn9+79-6TpV^ zy9=5(B;a~iQoHj2DN6skXobemG^4bn>oxwSwvMtCbYladunw7ce#w2!K^g zAds;IA<@Vk$>j0vW;@gLe)r85u3Cx;M641OwCLb!(h&{ZIyFx(rqs6_fxl(q8{IQw z_d^SFcuv&&q#<>| zi9fA<4AV0|P>E6`eTyBT<*;Zb`UXuTH0oHQyos8oQsZvV0PD|JcIbXpY1rbcKgaNP z{gbc>=prvyH#uxkAWNLdl5^d{t=#~6bV<@lMIeG?u?|2Q;EWU80UD>e8IPg^g4tMR z`H!yreW&fv8p>QZ4LUZB{8twt5=6x*j<2bCVRiYhFUe-vBe*Ee=qvieNzm>)Bz*G- zS@b09@vSf{5}Yj&a$_iOi?F>QFyR|(Tc#Yx#m;To!WM<}C4h|S@_N{t2)>(&YN9^g zOHzF&bZO~UtgziCgCEe<&z1Uf8h+3J>vdgP{~cn>??K&fjgu_F=GkgLSCklksYYBG zf4^2LJg&pJOjxR{Lf{jRtoZwe{xulf4AXyG^p9e3I)Sb0i>P}7rMGLJQ|EW7??t|v zxsK(<7~siq*$l>3uh+%Y3Y9i9>96&ISJ;tIe6oa}RO!7pewM_6#!<}<5G%uWC$e*o zP_zhz7d}jbr#K>fSB>D3g>Qj24!OIIC_qh76Zwa+X(Niy!=G8TZx$HKGo)H`1)@_c zhxDAz#hm^cKC;j0hdSBkh}8Dcnl2~Ydl_xq)K!q>l`3JsM69W+6e4l0BD74Rx|8!k zj;SG%x}LzskP`KWgV0G7vbmSQNoxZrJ&4RmzUb!o3mJIw_WYsD7kMejV;e#|wdm;D zAwSshV%O1cZSQ>-I<#~1-Q)-eg1kM66ri6%zY_5#=|jK&!w_PO1hKPVet&dNoz^er zUtyh%6~;@!ub-U3Me1j_$f=NZ9OO94H_4>}5%W zED*1dHw*3d5!)p+ORi1D**%&4u=4e&FX+QGuG6GC5Zjn})U)$J;@NidbF;Ms)(?_F@%+mpMrQQlKeW29n)YJ$?Ey zx8xVTfO*hL=iOeX*nc;7EERl1Qcgtl8Be|HZnB7r22V3$V+%$9aq()uSol+xKoOuP z0e3#tf;zdp(ycMt?Hy6pOvch{vL?!_*ir0we9$|l-){f-a$P%9-uK#Guns7f@!#J# zxWP{ZB^`c~tuW=lQ}W%}Zw_9QYoIJ~jG)?MrTsP?;0iHWc=Z02g=gS;z^6PUbDI9~ z&`z$R)K_NYW5RS$lCbqJ@|gSeAnH)oEx`0lkTV1p3Fxwn%OVP3+eDk%qK9tb>X(`) z+7N{ooUC<;iXI#%vW_ESO#2*HManmm4sXRisz_67<##0!=6n%MI=)nd`UQ!SMo{HA z3#Vgz(Dqsk&mguuDIWOfFB&7(_rL+@gt8nnwWH_2Mgqg9oEL%B-?s$oZt+dSOj;=M z&uk;Gm>S{d-w203)Axg@LX4)-l=)=0p7If352zq0^7?}*4XgBVWBCC1Oa02n=9pK+ zcKj_b_c5^5Kw35)yg^fAhN(7fK33Sl@((TY!&gV|kQ+xunbZuAslY0du(!#d)<~xz zd(bTq1?QU)n6o&N4sZzsC%+E?GQ7i)4S`(d_QzTf2#6Zs1JeZU!9X)yriC5I=+W)W z$z!-dlw4SUm?wSgiJv#goK$Y?fu<8wi@G5=NgNPX5Z1p(VTiBPv&4=3F-wo^fhKn% z6st;6Oxt0vW{kD5Khfk@P|_|ktBAj?2sGW z4FujP4?b`f6Ap0)!iEhvlM_nd$WQH^FzYOxL1lsfHJ^$%Ef=^Xg}?#)3(-IcoBz=Fb(YCby5JZ*J%PcC%L=sT-DecQt58*Sw`#h^jB%ZJ~>VH+V?{CL(0{m9rdd z9MnxrnRFNNMc+rIItUT6?WJQHWEa6-@H77PZ}b8)fgcniSlEHa7e{|W5-3@{j^G`` zk09h!x(rlIa=*iDi~@RD6v9%%CCXAU9nAN9@ii@S#QxzKHFolQm-|G=rFy-lD%DYX zNM6S{RYGhw6iv$Ckt9R+{8rv?>oLk$%B4n;w_ZXYo=0)foUtYZvPT%V*05+h$u@U( z!uEAK?b8Ay%S@57C5(br}s1m*Y%eIi-1WY&7LLLUp&fc}Dw6^)jXVjyAZ z1OdhXgj@%oe5kR$<|}h)NkPTux|VMh`gl;qGitYQYHo@L`dV&`-fj82$rYJtRhAjz zDgnW#~^U<(CJxmLqH~UGMaTI4DrN)4utK-%vi! zlpo=8rC@Pu?oS`P2kuOFOlC0$>`Yr|W=}U zdy!I>B~NA~AMAI_Z)>r3`YP?${5SX0-&~)4?}a$>i&SrzRy&M`-Dr8Iv|z$2x_lU(m-(SH& zNaD^fe*bF(7+!^bXG7Wpzq6!Aov@FS3HgGwiB+%n3YLN|cd~Q#vyQ5i(^BNxduQ== zLtLF!{^pj5DLZL@lKz~f(&BJaGHV>}a>U2|BvWqKuIF<5oXhHaLevjc)t;=++)vIr zfDhuek&>Wt?h&+LlK7KK%?R+Roh$_+>E(Ae4+E8ko}j^y6mI>Wf**bb3Z16f3Zj+J zm)|6kAebY)bloW(_A4a;vdIqr0Yw>iz~nNHm+gB?>6Pg=^&i;=*nYNa8}vcJlUqv1 zM>H|=z4_RZ!3U~W01G-Mnzh1(Ccik`^F4`yL6bn{K>iAEcNRy$L>)g%(x^?8_h%u@5$3{0V*K{J1#6cqYT%BSO zy`pZbpN~&rZTX6=T`)2`+#A(*C*O9n+jSO=al>yPd~_4;FhFj6?Y5P@&A|K51VMsc zjvlq^gM$cyx6-iHvED68D2L9L3dTyd_1bT1HJ7&{3G$T9V> zzV|#9%Jf!(>GF=D0$;AU+49>EW;aznWF6i7FV`3VBivzu^=%%5vYEcEw(?j@d?Rxk zqa5GRRN#c!hAVYK4`$V7*ckGId{H<85v3W8?-kQ1j|sU$dKu;qZ@*81riHhA{9pjc z!9MGMz^Ar%QhGL2tjZ;r-$ZI0YV=sF>VxZ3`CA5p8G7-&gT&PY^hxp8z(6~LE0azH zzBPJ!<9OPs}n>BTs;jdiu4AcxAIXpXn=5~ALCb7~F?{YXms z;#%cK=xk>3FX}U{${Yka(iX?$8Vxh1VgW&=c~x!4WIGRj62k zff4C``0E}f{nr3@C2!@=Jf~0DS!q?tDZkSyN{K*zsL^{-Evhst||lN8bh@?H5Co?vCW@R9+T~Vc0*6SGo)jF zWio6xpkdM4&9z?Bk&}Yn``H0a;^+!YMv(-B{);Sr;-~UfT*e)^xVzbBXS0Lcj^#*Y zE@I!*d$aoWUa09#*eY?N!97`{n#Bm4j*`+_PH(EvM?Gl*v%-Br>3*yBD!Dd~4W4G%};z z(Sl2Xg|$3QCB-Wy!+%Xtx4vfoF&O)jsCIlu?tC#k#c@7SwGTPHWrx4f(%+lNr11RT zd5Il&l&h*};@7=5e#CUds1v)rZ%EoBr{Xwda!H!ya6zg6j@?t=<>Lp;kGhW~bGRx+ zl=jX#UoaKKL!Xq)`z;%=Vh2MC#p4!P=PCZ-(W6Vfxvigq-oaWYT#khh@a>e8Y-hSD zc>TSHGR&-g1vokND3k}}Zopa~udFEZhDW*UNI!$70r2v)psyOt%?|fbyZkxDg2?kt zpV`WoITvg35LS(+q{@Ww*vAAC@4r)RGq~2fgl*}WFDL~EfybOZD9V#HP>6h}^X|#p zrKR9vkw9rv*hzL_1AU}E7O8Q-$()cso-SmDWHPz;Aj85BC^aPOT^?2uPG0&AD3K&L zDSgyYTH++V+>Fa-#`@J!Ra8f7l!w}il;CK`=MBf_^~&1%DQkHs8HSmBNgvc}$4CQ< zx0ScDT@y;MGt0S@?gr%THAq(ubo95X&HpAE(&QA>a6lSqgfp9^9rr1Y7F#V8qg@*x zV2B|+htxxk4-E__L_|H2L@matuB<=Hc7#a!%%7$f3~T_+W4uTVCNoelXdwyxk^h2 z`q`?hUt%d%RRIF}J4t~+z=rNiY>@0@#Ns{S+iF!<-eoJ@afSVGuqOC`U%tKe5Rh%H zZX(!o1f703wFt;!6H4pyh^`!M1|%s)05$0bs8|0KB15{vhwUY^626b_12n{(O?f&z zZ6v=#CqTN-If?bZ>_O5a=8{`z67-iUdRI}38juc0x_+)+qd@S4NY9vp^<)(p{3&Dj z*hJi3@>m;q@4EvncgiOQ#oMXb-U;#mH_ZoG^1Ql4eu6E++m!uu>s88{}Z=<4+KaA z{rJ}W`W<<>M(4UmKa~|F?^;Q9H`&J0-0(+kWD|9JnoAeBZqjtUZ&UcEfP)l5*A+~zMm=+aja9uAPa`F7Z zfF9Q~2glioS{-)9Gl}qOJTjWFE2_D7JkCidVt@PZ!vs2Mu!g~%!5N%Y6*hZ$Dy$}nbB zdALK312Y6pzL-BbLLw=CcQ(AUC!Wsk`*>V3rG5)&0+0ZR_hQS55`%s zo$=^9{u|zHzpi4l%#OoZ=W%KG@k@RRI_`5*)ez7-HlI$l!axnIG&>^%)EV_xLFD~o z-`#AAtgBRGr;m^%{r-^3#pCIhMfps3Tv^z$f0OMN@g##@;gK=xc3i9NHyIFIg^u=q zWn1Rl#-?1$Tf6Um{~ayO+#gl#4CtJNkdo2uG zTP09xvXL`AC=(f*%O~5)=0J@}kf@zxyZn`SNw}4=d5I^WRJ*dj`q5tYw`CfCK}k#&kvYkhojFol~Br4EPI;J1^` zFB{3BpWMV*b{gCyGAeA_>76p&ke^gZ0Ao<3uUG8#(kXS{aUa2bKtdGMwSdh>M{6L0 zer1A==n8z^KEtQ5ku|xK$T3Wf1Os(BxXat<^5ddDR$(}>sxKb0{MzHkLMH0@Fg1ck zvxEh0AQ@l%zGTJ5f9pAmQhD5goGJmu3{cuO83@REkx527j3qJLqFFv?t%nE`5oms8 zx~nzA1w$Xxkitq8o2;m3O<%E~p?+IP9{dbo(26JXnf)kL4&v#cLk}9AeN7 zIW*s>=MPv?5KWk+2&fRb!~N#{#}_YZ%CQheK(H5wT$ApP2mfCFSE}mchs%6f49|e~ z492M|mj!VRoqx+~!Bt#UzqrJEuc|aqv@V3tzzkI>M2ByU$3eRTXq!6=a*+9g43bQYX=aKrYM5+GhC z9z&Jl(Lc6?x5nGbH;Wtxs9@VzqS4Y9Cs9U3Z)6SkJRQcX_4Z+nZXNJ<#xhbH!m@mkr<0le-bMPKX0~XV4VBaa?_DT%M1eE5{P*;YczdAN^qVPdZBj z;KVYJk%L)@c6$iL*)hw*s7u0j7UzAv1m4<@13uK>2xx3=+|O+)1Y}mKzutNxL(_&Y zNuM^l{VD+cbJe>^R-jgzr5i@my>c25N_-yldnsw7sNh+EC#>b$uScGq2q;U!8YGtx zsT`$C+N<3n_?^#WQW;!t0tiZl0y=aO-LC31wEe*59w`A1t)zA%lDh+LI$?>`)oO#E ze6Q9ez6>^2kbB;v0gT57Qc~EK5o6U6dxA;Nc z!$f8=$JvbsD?M+RB^+nZYu*wD+_6;vJ{lL(5zIN}m=d9GK8{gTy)XBE57VdIx zwC(xe8_#)>6*H@k2Rk_FqZypXgw=I}>B7Yy{e_!9|Muo(u3D=^7W~#)J+1jJvOf85 zwR*~CUU7donX4MS-ko#`TA$xU9n`s?unUFQ3slD8FP!uRqgCelN!8=VvuFFuRv}$7 zf&GzjReOIvx1mPGG5+Wb1|SytXI!TGVtBn3`?jTTL4VBWgEZ__W>O3Ezhil$=Ig?g ztmGH)fgFrazNg^#4i2LYMJ6rgO6>D)k+kPXuB)GALz1xTNg-kRxRSiyC#9EINhAEB z)hk0GL5u?V*3jy(q*siQg5SC1K)cO2oGE-+flvf9{YJlT3zF+=L*O7!Z1g295Ix2$H6-aZv&6NgF=abaEj zeYHC`zEU;uJ+M_-iW}%x1D+5i4OB=O;H&{5JJxn&NO1|_6+HRHwK=$QG}f!{O=upi zgL^GHhGJ*X#_J+XOzRABFTJcPk1>AN%g2`sS8nX5s}xr)KaKfG3ZrmQWB^j#7C z+Y`>q&rJ)tM%AW9Ztp~71U+Ip z+~)$JAUGMcWtX{~^ic-lHV1r>2TFIzn@rDSS~Ao);Uk)K|~ zlVyTcW2ew65l1G>z7Y{3y8l~IhLYvy?ZpWZrHfj#$gRTB2H370_+fa<1B zxHBB>dvAswxd)DrFL9^-m;_lf^Tj|67_5PO03ol~ zzorjT$3eY`!Tk(Z6Y11^oSV|6Hm{jzf#^^B$H{t8uj(PGnuWHht~5$;YiSa+wkJ>; z%?JdnNG5=pN}_YhVfla)!9VJVOPdtY_uFg6?c~J`lC!=2ZxS>(*?9VrlO+tjF zhSidfzg8zxlzpp)i7Qb`GO=`S-g=UjSY(O68N#ZynJQ@ciB{lNY!(Nmnc`T!3e9)I z#Z-`|l$-rZAyQ58%q=O#Nh>iUpJmszpv@yd%5S9iSI!u_#vcnzQw+LY8}CM5k!O+k zRtu7tn+Q)1vc#^Ud;CH|aFTS17cnNQBCGC`bK>nar7cV0Sj&RUBwX4=yuW*ll*D7Z zG(98s(uV8cz&=Nbktp>0TXdA?ZP(BYJt?w}yIrDGFpBX9vqCd^Gedd{DlC|ig1oO4 zpFjSAj5Xov1xlZIxJCzsovV+FbBh=Z^Il3;U_1Z}Y;MPU`hui-Pc88_veEzwO>s3e)_ZzaeRi zFBU1rZxY>s-PZN8w%jM}LpM+cVzs;m)Y11e7Sz9jLF9ItQ>?p(iYlolE=^u!bCnxj z@3HXJ7u+s@@4Kha=&K;xPFd{L=jKW@6i*ZoW(K;F^&PIKsf&2*v)z`}FIgj)?lj>R zlY_r61>=+LIsAWjUOR?98Cv_%WiAhYDw;`Fi7RdbfUHISq5!wF;wbWQLzOo((WlFC zp7Y|O)eaO}ZAGY`0W23qahKTBdf$UZg)u^lh%4V%8y|OJB^4lUU=>`gocml)lQuH)0M* z!7p(|%QY%s+OtY<$!Hr}7XMt?p}hH?kr9J{Ai1GIRB5TwcwzN8iw|#Ono77XICB?O zueS^qgS%95#v`d>3WJyOWhkN{#h{r4MB3xpzW)>K7+dE5d`U`!qxJ^v7}P}g+i?s8 z#s0Ec2ankgdUf#c7e8d7*Rg&Xa1ir?@0d@3At&1%{qA?brl7SL$5Y^i5_*3uAHRsG z1V=P-cJH`g_f8B^$iy-FNNubj|2*gF);0HS-B*VM@b({YB%wVi;1~g+*r7#~wG&iG zREq)z+k<;}h!b*)1m%1YpjF4<3!q~m?+al1vJvqI(Il_jFYdS5(jc6D^Iu9*+=9A{ zWRt=w*bi5Xg;KWnji%*>NXG<~0ssX(Ch(Dw!_q!WNXH`^QOrz~6(YlMQS|f;tLrG7 zyx;-SW0q#|T~l^J8$LtwNaQZ}O0Po87s%{6so-BUI!^$SyXQBH&q$#ewY(|RQYgVu z$QI&IRorLcd%~(V#DjcsPnUr#1`gw5M8;-=udzWD>U^wA zex?Z@f%BA>B7>u3pB^K4){_9^y~@e!?B8#GEiLAjU*hl%`<+(U(m86kvO8}5EV4BZ zB5$6-Vz6x{2aJ>$FM&8$fvo5NcnnHYRhFZSvIX^dzNIw34Yw_;kHc?|> zYBf#|=Af@%>yI+MEdGC{2l#n}iooJShU85h+&_q46k<+W zDZ8$f$tXLbHE7kJPKE7k)Mhr?^ek=*{5an_hrvP-w8c$HPi;#cydOuE7E%s zeIf-SW!qsx?XSVKC{Je?+-M0h^i|W|!;U{cxqP>rQXKO!m&Jsj+l_(u&@}j~Yg21o z)I+ss*=_fy-zqCU7ui`@8EfM%<1-LD0r>UR*K-qX{@?zOvG@PX69^f@8^5p=R4=e zS&OyAMen`4tGlbJtE;Z-2kHZrg>E&4M)mfnl3?dGf~2uv<|{lI&G)D#xSiLkuPM3n zB?F>lTU%Dr7ZX4duZV;n5Vx`C551=#->)vM%cJCJJ1 zZL*j1gAA|n13v|^ra$nPaNf&_`GQy3O0{ffzFIntOlLhi2LUx}T)=u2z z57=kko2LBq7$L?4D$nTxBCL%$-eGK@{#Ci9=}q*RO{R+p8ov$oSY*@Av{B14ooa^aEaqk|$JcI9WLwejV#WKi}tcAwZOBt%pJ@Hz1Tw>DK>9s%<$rDT3-H7JrZ z9s{)kF>dISTI_}yfIoG){Z`5?P!blDAms=+s{#t-}`Oo;pH6&SZxnI?WeuF>hDiAca~L*9501=Pp$4UZC><3qRdRM!J=R0 zOTa*4ObCJ}N%iyTSvkjNvv=1@_}&>vG~c6-?N;R}rvxwRZWDsK7)m%Gc%Nj4*O-xg zDpLrc+m2+Tdvi&g6fNlkR6qt^0P`~G7HUN$FO-;K5tWd*a}nwAhr{R;-A_l1tf){z zdRD|Z;Cw}LBIhH{>r0O)9em@J_ZY+dSJEX*8yTG-KWB#ouy3Z<>CRfq+^UDu0_j*X zB|wO1YI??xtMAf}KzDJK66k-0jYlzpoNPt7N+Ogj$^uB5BWnJUhAP>juC?hZ%DX>g zN6x}-1ZCRNrh_J%Dl^#!x(oCLQm@N4JKiu(eUhd9Sh~vkOtcW$UA%TIHu#L^j_k`j7xcD3u_>^; z!~#^o0DHeDY=G}KvYep1C`Z*_AwYyXKy>HIhiowi=Wui7Dq4v=>uo6eIiy5O?yw{x zBZ8+%>q{-cBZB+w0)||vlnl?j0sRFl0-)GRr;L$Hyehe!0M7lt&q_NSNJ$T*ZUlrx>q@#DXhr~E-n47eMWfV1U?ZrqFv+kWrR+h}D!a5@ptV zfLx6;%hNakKd8|;5qnga7m${ePnT7#9^;UZnp9=(ka9 zPgX+3O(jOrHZX4Ro^BS5D9SWDDTDU12%Y5KtF%f>` zFRQOTe2|oHbwhbio)oxpjYZi?ov8*zUEy{u>CNAZ6ma&>J@b_4U75yY!opOHI`_hCt)h zBpITw7X}j=hV0XM^HFRm6QN$ny$Bv;tMYESZrHI(reEK3-J|1Uut0iYE1OFtW@TKJ z?CPTae67pFNpi|@MX_+bqi#2RZGoZDRnhX)F^dZ6TjKV^Zr-Z~_qV`6VXimoBZe{D zlt^}(T_lsDO(=6HDh9KuajM-xMQ{gozHcFORFT5_<(p#Vt|P*%XjSp&RJb~(`+l?D zAW;t)>6<}fcJi8lesaht5dy2&Rj(Gf5=%^WD~Y#|D@h1Q;(%uUXt!Z)R&~0#T(f%b zUi1x!8s0jrZxxka;0|4V6_#kAHvw5qR>;B+J*BSj2^2ETo=3kimiqYiG09K8Cs_+G zb-_z-*%t+RZaP?*hJFk+mj2$?@84^0G6m^hz8!cZXLzPLB`9ou!wqeF6Y;s?GAjGc zUH1>%zo2cClJ=f~Dm4BeaU@asZ^O&2-jUvZTJz+0;@(2;CS}Rq!cIp%157Gjm1BDW`DaVw}as+iYTgn z{C*lLj2XDr0&2j)>0+Yh=Wgp1sP^5!8t2lQ`Bx5O_wrmrcY)sFK~v~vNiMBW8M^|E z#q?^gh)SYPqgjgAlIwSOs`wFZ1dj`y5UC?az>lVJ#ATHRGPExRZ9a>QE@ z&+Pr|V-U9ZimB?8YCV68~3vMKo1#d@vEg5QD-|sk2=}|l0;i{7EaxQ=C5gM(;ppP{lyxUe8 zllboBZjWvo)pl|=A2=pYVBiYMRSl_sQaPU}AuNSSE=&hW`Y1qjAsZ!{I5K83CWZm< zygZb|R=Qsn2Fc_fg1@E7AEE__GP9~;>g8Ji(MSY4Sp_vwW>DP&@krL@CsTZ7w=X3r z9l}aqJvGvtW6H&){w}rI8ZECbDRA*Kk*EP|S0^S1(JvRkMR}Ll#yOc#6#G@ZtRRmv z?$?E`H%j117m3%4Y7m}?IyH_3^OhBXZUqC|FD4-SY0ct2!0I%#8H%!2`&5SIH>PQz z)U~@@R$EjGdNcT>`Ih=?W80!R}Pr9Eisp%~Y7T z=G$$YSGynE+s~92**!yQj{I2eP0v53jJ6q(s425~Ix#i+dsr=}uiEBUM(Qbp#uBA)({)1ktyGKyjt|mQ-PU$zN zofs>f+)91Z8g`KqA|UxQS?QxJ;Pgg_FRa}>i*G8qL7oYf)WaZ=YBsF@Fo(meki_t9 z*v*@FRm?kHP$hkW)F+tPXVNM@G{8@ORTTrC(#BDJFJc{H%kp6+q!tAi$rSBpFHU!d zp>3|U9WrjZ;-i9;hnR{X=6GW6IT`k7X)v{Hez{lsl7tdG7yWshqFBoy;k!k(^hb9_ zA7C=S=rRIKI!5&h1KF1WZAsa6cJiN8-j|sgxpZRRsf?9Wdjpgw>SeKQ3kG*}(hnTP zyMk!$5yn#AFeX7LBFP#&oAyt$SNT0mN560yGe)_GZ` ze_PyNxV-R`kqAIO(TB395X5n2qsnh9!H0o|el(MBAK7kl<=Qp@*k;?j^d%B~5n%5|hlQs@%1GG>>QYVu_-z-cOzi{r? z6Xu!yPZ1?eB}0^C0K;El zZ<5uDLyIU2a#I))gEj|Gj1$@S9v&j^WC(zu)?H;@ja|6MnuU_@oS z9KbIn_b6%_iZWqafkxYDbL`NI&NIBdNj|9&>B-S%nn|F+?MD8}=#~3jwgrOV&J{yQ z_#1s_968NWekD=!Qim`=ekKRF_`R$2qp!>yl6!e)l<1xZqqYaVwueqov+Mc#+9IKW z7V-Od>L_+hfZY*=s<1lJgI^3b53VkP^_y&Y1Qxn`KO&tqwIxxN^ZoMO6gi49ude z(0T?g3FG+-p)x^41y<;^k42Y%vE7NAQp>XTp&6_o#ID!TSVd(M((G06aG2DVge(@i zySX{-_fv&eo2emx?)F;ME6gZwL&=`6HWD9hvMbGf;n2sn!q}lBONt?iDvFAgI4YNh zda{E4ehJ^L*$71mM-d=j}3ka8&kg3lIXH3iHesUKKkMnxE; zqR+{Xm?M^YAEMt8Dky(z!hSE{F4@atD3>=1RFeIb$?xhuSX-_AeE*z(Uz=WQHK+kD zrX+@Z-!swn+IV%Pc}9)vCg!`L!E@*?$ngqLn zaUxlIo&%O9A_*$nowb>|CI?N!K2Rw_1*ZJ8(pXr=ebz_p3+#w0x}!kXZ&6H4G=a7DXKR|n z4m7Ylt~-s@34%UP4KGL-In&MKr9^5&O$apBxDVYR@Q1=V-mbJ*fZ%e*a14@QNcbs5v# zeddk&2PoJkWYRs6QNmsVw$nqzj=l^aE7*1A0J`Eq7)xf5%0|J6r|{P(-~I{$oNl77 z-yCCqU&*e`S*0LBD^(jE?xi~Rpajr60yB!p1-GHidvMNE;wy}iGauc7I3iS-_j@A1 z+DMdOb}o8_`BHoLH^km)Kt;_>g+@$SIX}SKY`Stne9+yXbc=eDfOt0!qsrODf7o~f z4E-i1Jq5EHbizFgsn<1DmCrbph)r2JSvgx#^!&X0G8|Zap`BYr?q+VEt|9!sGAXbk z3UGF06sTCtJCQ}mVyKnlBVU`V#4PSi(qa=-?9hNr9RDM@KCPBw`-&)mm9_EElCGP7 z6K18i=~bY?kPnzqDj9&a9a`JWTL%d+3QXeq5Yl5E=x-eZ%;6@F?FbPT;(#xGYjo@? zWKrzMN2vf8Fb$}|GFf1Ha`ctGXM^6r*sD}!?jq#&ZB86Fcqa|=D0u^{$Hs(>k~g&u z#|4uh3{_u648Kh6k({WUaSG|+G3$73ae(fgD!(J-A-hIQL`|or^ ze*^1jFik)| z<^a|fnf#)re`6?uxr`N0PcZ2uvH<(nODth#%p?@D$p;WSyJBjV$24Mk3kIF=r7 z;PH|}lK3>;N(p5;VAeb=m!7#mqS@#VTlNiB+BlM$q`i8=D!>al#)E#cbuCVw% zt@k^>pr%n*Nw|ygVrTbx`Xdkfb7dkBbl>j-j3RK~uRH;{APYt{TZ6Q7SJk8TJ9^~& z>x5#k=I3`S2Dj(M{rAvWCabyLxDvm^ExLd9bU_MIqj}uq&rj zw{lod^oThSNRevDTSujLZ#OhRjG)d!AR4uESr{ggvz{CfXzBcj2Zw(w4(GF{%+{ z2`P=593LyZBMuICdQlVPLu`I+(|Lr-8+-daUHR=j=Phc|KPrShFvsBh8 z2d?C`=w#)9m54#AmIcc%yZf-2qVH258ca&kB)`v3-e^)hpgs@uQ--9MM3Iklkj0$>h+mhny*$)IgqIR94yi zD2_IX)E9vXNG9v{zL&Kl#uxGhcgs6o2!%A&o5Itr`M2smZ`F-2E@;uOR8*;gfgCn3 zBL^4VC!X0eHs&S480$@>%YDN;C>|ARaJEydW-3*XNxr#-Q9tP(N$4(Tt5YQ%%J58r zuq(WF{k^SoVpHzBQngxRes-S-HH;^CDtHJ~ zQ~T~a-XvrOO~ebJoVS7+!`bq~QUCH>$YCr=A)gp^`0-<9Sp!Fb*>ig4C6cU6L4R5DLGb1d#7kdffqf{^buFhtS5MBEs)h9Qy5sA4#~E<2_}Fwl7n|o z5(FgB<|!mUCS(36D@_lE`1VU0+B~3eRPhpJ7U0>T1ZI)cq0R>T%Xe~CAc#Sx+r zszLWB=4(sF6imzxZH`k}Vr~p9@ZxwW7Tnf%?!shtbZhbUA#%Ezs2QN3#fWxj_hwwQ zlxbT6gkG#59-3oF9nc%Pv03x$^@kai=Q?Jgb@vAo6VF~=B;dLeCV9X2?HbOfF~EcR zHyW|2dp3J8mBVnjupkW>@93~P82{pMKt!|*>+eXHgKlkLe!HJkxgU#r*jhcRZz^?r zmjCtU*eG+EL+tNQ(L>eBHb&-EcAv+8dp@&i$d`hwnJ5Nr%?`m-?$D`fYTQ4}#_f6xAJz)oR5o88LXCW3U5w$7B_p zKQ|NTXL$SLkiKSU7^gqKF#Y>`Ayx9-elHT>H(OieVAFiv-W-^sDpl-UZ4Yld5dHzk z`wC*WV~yU$>ETOJ18ZfWyGtrS^ZJb7G^wc>6m>ublj4|Y&1*}-* zyW4sGgYx^tAB z9+4kr-##S{pXv=_h|p48nHmBJOVUZ1)2a03l$k67*mE$D%h$M*lpQF|*|CqeTg9ng zaJXi}pI(~6e`zBDuOtY+!cZW;HQ6vAxf=2%a^$<%AnKAd+fDz#UB%$kOMGPU8>eDl zy8LOdC^tA8?cm?+bc_pzLJvpQwu=aV7!d5D?^AQ+Wmiq^(z|%a@=V;W}(-l)FdFqXiLxZNY3*fn0y*!mW1Hn0 zfx6@TP_dtB->CID-el50GA$Fofa(Iluy3=GP+1G^X-T(#OkwAw8m|7QXun zymXpcMtan{14!#owc{-CH|Fp~$^B%!6cQlAlY;EEp4)+6D38TK%U#fj>}j0)`lJmThVY# znt8Ato^L|?>jkLAApDydS-&T|WW{Ar=%`bx7y|LG1ybf18b5uQV zNUE$oinIk838meZhh90p&yo-qdMZNii3$Fpu423T1+fW~Ije*iCh~lEFLT`het+h& z$#L7mEA;EDS*@y6tkSNtvkIiRxgAASs%ui-r+kg3F`)_BPS4IxSLe)m!jk6=JYX68YuI5v6IF11uW|iag=J6a@9ka>^|t_Jo}VP8&*DX zns-_QwBJw9Kk=DWYEjQ~z8FegNFozLa`7EJo~LL%!05-M$p(>A-dSJM*txlwaWo|C zrP1%k)kiHa!3Q--J=Ae|n*Pm}Ig$9GQo;eRW#p%dAum(V-gDv7>Dz&z)#dTiw43_g!SN7X;Z9q-O;RPs<0h7@5R}NlcTFH_ny9!T0Lf)d3Kcz`|UC#9UDV(LX+gD zn>(*u{nz{7C1YQ;eWo$Wwe{8PeB)xUE2s=-upd%glBN2H>y>RFYz`?jQ8FZ8bWURR zdK!33Y5KQoN%vF^&Ei;gX(>ZsQ05j<&ZnE1emSn=WEDjwCR1LYA37!GmjnsEsC&P( zbW8B+(YS*6)VA<=OMCheU!zj{I5<;yP&c_jT zD`2E&8WQ@g#D(-}xB-=g)y5%TqSP8uo?M&Qm-_dUY}1xm#P`z}t^myUGa!fS1%sAr zJmsyK%JX*RqAvG?-lyx&!3B#;Rxd{+(Hz>39WeH#flM1ABYh^G3m3|}%a@ktH)cOY zIiP9;D|UkjxcLhkB>){=Xv!T%4h{YNstro!(lFIG?HNSjmUb${Lt+W_8COP;(It#C zo(G{shz1hdR1onFm-G4blr#ZOzu=#7?+W>kpa}CH0i-$Y7R=BeT5X(NLeFVLU`AMr z*OwN)+~G&D-8{W^K~bagK_<_f+eVS&}#Y%?e}_B)*{Mf%mSwsw_hpASsu zqY37$e!hoXvC-bA1H6^8`NA5#vY181GugdsH z`S6st{WTj86Zv)E>}YtW*W~Fr#@SfT{*BWDXjkFSCnbgaCm#vLn1r*nzMt1fzur@-8W+r_G|xoR})9qS>h zZwWcO%yQO;kNg8NJfCG;Y_IR!?l|*vNdDk*Po{n-=!3_HgWuRM4>-O^QR3WwP}8cK zZ!BDo=?bA~U&%Lxzj}6qS~YfBSMpU?u)1h0!Na$Fi|QZxC@ic5p33{yTD?iCK{A+_8W~#`+?u{YR{qXUi%vZwziP_aQt*b{(zF zdSn>L50>*RK0ML(-p55~Pr@Ox_g@=k!80=R5>%#QZC^iq7F$|~{!x8B2D2AD0K3O@ z&~f@XHkM5y@|f5s#E)feqO(3&a?eq;qF|C~&oy%+Di&tRvUa-2smZnYkiLJ4-+|b* zJ&s`@@?xX^nfIpWy|se5L1Vf+6TegKX1MUo;u#qYsM&lC`^KU-pM>~PUz|@6KMtH^ z$cX;h{|U7NL|j={F|KmjDnBxyzGpjc^$B#%IhmaE;0j>Uc%@Ys&X9vO%yrIEQs$dY|;H zK0YN^Q1--hzP&~2n7?Ur=hSGDtX0A(AsTmcQ~R&DcEbqUzyJ>+m~g%hZRS8MT)&4q z!e4+XbC}fUqFQ{I-(6E)5rL_<>fG#&J9hKXQz~vYFY_7bwX_y*4I`?vNs}AeQg^R1 z>&8gWWP)0F#X7w(0g+8jnDA3tVx?5Hn7{T)XAe_TM5^tf$#djCvx*3SbF(jpK&ajD zU|+LvV$j_=kU(uS70#lvRhaG2BpsK?SKFCww6YvRVS<^k(?kE((m4GRf_IlWh;aOz zH4m?^@eGn*Ize-M+bP=ZU(DX5!Z)2>JJCX8(EY*}Taj49QDF;q9|pTe`#ldeBk{Jj z0)pcw>x~)iIrul{{LKF!{TTzEf;DY%=71H@f0?4WFN`C-f-8TOLBX=aF|>2qw%6#n z=h@gVoUOXkcD0Z`JlEWLq>j1nlUiEWfmD5(z(wEt%~qYAM`s20MsZpqc6wH$y)QId zb>cIsWvn+P9yUE``NV$0Aj5vFgvNjMQ9jSH*F3i#`^j~!vw_BbU%)>qLucaoyXSe7 zGR0qN=Bb^Cu$SL!c9J`3_|Ij$-hS|6#RVL+iNFr99`i%1FThB-CSsGcNb~2^gkj=6 z29~o!RRoEj9Z_C{V0OmWwNMr5kWek4P5=-IY9DS5oLmP zBCkM3y%&_tWhx>78+LQ27mba2J`}y&UVQqRD(bDn?QzlhpMt$%yhyt>+$4>COw&cD zyjY0DVN`nFgI5yMzY7pG?>@WLwKaf8O-BJIe6~-NGdfKkZg+R{_)Lq(Bw_9CDL;&) zAH-(M$;uDrwVCOVa6g5KUZ`2WepG9Z)5X6SOA}DUMl_PO23u!&bL)y8E@Tsf~P&+{XO7d zmV2$cH#X_?6?H+JY`p)NX7&Xt$vHIDo}^ylg6_&*W|0(jq3Nq6=Q8Y8)5+lW)~;aT zOyRcTjB@vf%JΚhj!(O0gBpBv}E*!}%13I?;D9#3N!gt9E3^D1 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 literal 0 HcmV?d00001 diff --git a/Wrappers/java/doc/overview.html b/Wrappers/java/doc/overview.html new file mode 100644 index 00000000..821fb656 --- /dev/null +++ b/Wrappers/java/doc/overview.html @@ -0,0 +1,11 @@ + +

+ These are the OpenNI SDK for Android APIs. +

+

+ Get started with the Samples Tutorial. +

+

+ See solutions for Common Issues. +

+ diff --git a/Wrappers/java/doc/samples-tutorial.html b/Wrappers/java/doc/samples-tutorial.html new file mode 100644 index 00000000..37d5ab50 --- /dev/null +++ b/Wrappers/java/doc/samples-tutorial.html @@ -0,0 +1,407 @@ + + + + + Samples Tutorial + + + +

+ Introduction +

+

+ About this Document +

+

+ This document provides step by step instructions on how to compile and run the OpenNI for Android sample applications. +

+

+ Audience +

+
    +
  • + OpenNI Android Developers +
  • +
+ + +

+ Support +

+

+ If you have any questions or require further assistance, contact + + Support@primesense.com + + . +

+

+ Overview +

+

+ The OpenNI for Android distribution consists of a set of libraries + needed to access the PrimeSense sensor on an Android device, as well as + four samples illustrating the capabilities of the SDK on this + platform. +

+

+ This document provides detailed instructions on how to load the sample + projects into an Eclipse environment, compile them, and install the + resulting binaries on an Android device. +

+

+ No setup procedure is required for the Android tablet that will be + used. This version of OpenNI for Android does not require root access + on the device, or any sort of driver install outside of the libraries + packed with each app that uses the sensor. +

+

+ + NOTE: Previous proof-of-concept Android SDK's released by + PrimeSense are known to conflict with this release. If you have an + older version of the SDK installed (ie, one that required you to root + the device and place shared libraries into the Android system folder) + It is important to remove that release from your tablet before + continuing. The simplest way to do this is to reinstall the tablet OS + to bring the "factory new" configuration back, or to start with a + tablet that has never had PrimeSense software installed on it. + +   +

+

+ This tutorial assumes that you have a current version of Eclipse, as + well as the Android ADT plug-in for Eclipse, and a current installation + of the Android SDK. For instructions on setting up these tools see: + For the Android SDK: + + http://developer.android.com/sdk/installing/index.html + + For Eclipse: + + http://www.eclipse.org/downloads/ + + For the Android ADT Plugin for Eclipse: + + http://developer.android.com/sdk/installing/installing-adt.html + +   +

+

+ This + tutorial also assumes that you have an Android based tablet that + includes USB host capabilities and a PrimeSense Carmine or Capri + sensor, as well as the required drivers to connect the tablet to the + Eclipse debug environment.  +

+

+ This tutorial was tested on Windows 7, with ADT Bundle version 22.2.0 + and Android SDK Platform Tools Rev. 18. Hardware used was an ASUS Transformer Prime. +
+

+

+ Structure of the SDK +

+

+ SDK Setup Procedures +

+

+ The SDK is provided as a single Android library. Enabling support + for the sensor is a simple matter of including the + "OpenNIAndroidLibrary" as a library dependency in the project for your + Android app. The contents of the distribution must be available + somewhere on the development machine so that the Android Tools can find + them, but no additional SDK installation procedure is necessary on the + host side.  +

+

+ When an Android project is built to use the sensor, the required + libraries are included in the .apk file that is created. The required + configuration files are also included in the project as assets. +

+

+ Once you can build and install the sample applications that come with + the SDK, you are ready to begin development of Android applications + using OpenNI. The chapter in this document entitled "Building the + Samples in Eclipse" gives detailed instructions on how to do this. +
+

+

+ How the SDK Communicates with the Sensor +

+

+ A major design goal of this SDK was to enable communication with a + PrimeSense device without need for root permissions in Android. This + was accomplished by using the Android USB Host API which first became + available at Android API level 12 (ie Android Honeycomb 3.1).  +

+

+ As part of the Android security infrastructure, application access to + the USB port will require active user approval. This takes the form of + a dialogue box that a user must click "okay" on. This interaction is a + design feature of the Android operating system, not of the OpenNI SDK. + It is not possible to avoid this interaction in an application if that + application is to run on a non-rooted tablet. +

+

+ All code necessary to obtain the user permissions, and use them to open + up the sensor is encapsulated in the OpenNIHelper class. +

+

+ Major SDK Components +

+

+ The OpenNIAndroidLibrary contains two major classes that are + directly useful to developers, as well as a set of configuration files. +
+

+
    +
  • + + OpenNIHelper + + - This class encapsulates all + code needed to load the static libraries used by OpenNI, obtain + permissions to the USB port, and initiate communication with the + sensor. It interfaces with the native code that makes up the OpenNI + libraries, and generally makes communication with the PrimeSense device + possible from an Android App. +
  • +
  • + + OpenNIView + + - + This class is an extension of the Android GLSurface class (itself an + extension of the basic Android view class). It is used to display a + depthmap to the screen in an efficient manner. Since passing the entire + depth stream to the screen entirely in Java code is not computationally + feasible on current tablets, it is necessary to use native code to + accomplish this. The OpenNIView class provides the means of doing this + so that developers can see the depthmap without having to develop any + native code. +
  • +
+

+ Building the Samples in Eclipse +

+

+ Unpack the OpenNIForAndroid Package +

+

+ The OpenNIForAndroid package is distributed as a single .tgz + archive. Unzip this distribution to any convenient location. This + tutorial shows the package unzipped to the root of the C drive, but any + location that you have read and write access to should work. +
+ Once unzipped, you should have a single + top level folder called "OpenNIAndroidSDK-<version>". This folder + should contain six subfolders: Assets, Documentation, Include, + OpenNIForAndroidLibrary, Samples and Tools. Make note of the location + of the top level "OpenNIForAndroid" folder, as it will be referenced + later in the tutorial. +

+

+ Create an empty workspace in Eclipse +

+

+ In order to avoid any conflict with existing open projects in + Eclipse, we recommend that you create a new workspace for working with + the samples. Experienced users of Eclipse may choose to skip this step + based upon personal preference. +
+ To create an empty workspace, start Eclipse, and select File->Switch Workspace -> Other (see Figure). +
+ + + +
+
+ From + here, provide a unique directory name to store the workspace, and + select "OK". The path to your workspace directory will not match the + one in the figure, since you will have a different user name and + directory name. +
+ + +
+
+

+

+ After creating the new workspace, your screen should look like the figure below: +
+ + +
+
+

+

+ Import the Sample and Library Packages into Eclipse +

+

+ The samples are provided with Eclipse project files, so they simply + need to be imported. There are four samples, plus the support library. +
+ To import the projects, select File->Import: +
+ + + +

+

+ In the resulting dialogue box, select "Existing Projects Into Workspace" from the "General" category, and click "Next". +
+ + + +
+

+

+ In + the next dialogue, enter the path to the top level OpenNIForAndroid + folder that you created in the first step. Four projects should appear + in the "Projects" box, as shown in the figure. You can now click + "Finish". +
+ + + +
+

+

+ Compile and Run Samples +
+

+

+ The simplest way to create an APK that you can install on the device is + to simply run the samples once in the Eclipse debugger. To do this: +
+

+
    +
+
    +
  1. + On the tablet, go to Settings->Developer Options, and + enable "USB Debugging". Also, note the "Development Device ID" in the + field under "USB Debugging". +
    + +
  2. +
  3. + You + will also need to allow installation of applications from non-market + sources. This setting can be found in Settings->Security. +
    + +
  4. +
  5. + Plug the tablet into a USB port on the development PC. +
  6. +
  7. + Plug a PrimeSense device into the USB port on the tablet. +
  8. +
  9. + Verify + connectivity by opening a command shell on the host PC, and typing "adb + devices" (if the adb command is not found, ensure that the Android + Platform Tools bin directory is in your path). + +
  10. + If + the device is correctly connected for USB debugging, the Device ID that + you noted in step 1 of this section will show up as the output of the + "adb devices" command, as shown in the figure. +
  11. + In Eclipse, left click on "Simple Viewer" under the "Package explorer" to select the project. +
    + + NOTE: + Previous proof-of-concept Android SDK's released by PrimeSense are + known to conflict with this release. If you have an older version of + the SDK installed (ie, one that required you to root the device and + place shared libraries into the Android system folder) It is important + to remove that release from your tablet before continuing. The simplest + way to do this is to reinstall the tablet OS to bring the "factory new" + configuration back, or to start with a tablet that has never had + PrimeSense software installed on it. + +
    + +
  12. +
  13. + Select the dropdown menu next to the run symbol, select "Run As", and choose "Android Application" (See figure) +
    + +
  14. +
  15. + The application will request access to the USB device +
    + +
  16. +
  17. + Once the App exits, you will have a .apk file that was created as part of + the debug process. This file will be located at (assuming you unzipped + the OpenNI package to the root of the C drive) + + C:\OpenNI-v2.3\Samples\SimpleViewer\bin + +
  18. +
  19. + Repeat steps 6-10 on the SimpleRead and NiViewer samples to generate apk files for them. +
  20. +
  21. + Apk files can also be installed using ADB. To install the SimpleViewer apk + file, open a command prompt, and change to the directory containing the + APK. Make sure your tablet is connected to the computer USB port, and + type "adb install SimpleViewer.apk". The application will now be + installed on the tablet, and can be run like any other Android + application. +
    +   + +
    +
  22. +
+ + +

+ Sample 1: Simple Viewer +

+

+ This sample simply renders the depth map and the color video output + (or IR if color is not available) to the screen. Tap the screen to + switch between the two streams. +
+ The purpose of this sample is to show + basic operation of the sensor with the tablet, and to provide a simple + source code example of how to open the camera, read a depth frame, and + render it to the screen. +
+ + + +
+

+

+ Sample 2: Simple Read +

+

+ This sample shows how to start a depth stream, read frames from it and access + a specific pixel in the frame. +
+ +
+

+

+ NiViewer +

+

+ NiViewer is intended to show capabilities of OpenNI. It allows choosing the stream + to view, choosing a video mode out of the list of supported ones, and recording. +
+ +
+

+ + + diff --git a/Wrappers/java/jni/Android.mk b/Wrappers/java/jni/Android.mk new file mode 100644 index 00000000..270e26bb --- /dev/null +++ b/Wrappers/java/jni/Android.mk @@ -0,0 +1,54 @@ +# OpenNI 2.x Android makefile. +# Copyright (C) 2012 PrimeSense Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +# Sources +MY_SRC_FILES := \ + $(LOCAL_PATH)/*.cpp + +MY_SRC_FILE_EXPANDED := $(wildcard $(MY_SRC_FILES)) +LOCAL_SRC_FILES := $(MY_SRC_FILE_EXPANDED:$(LOCAL_PATH)/%=%) + +# C/CPP Flags +LOCAL_CFLAGS += $(OPENNI2_CFLAGS) + +# Take native OpenNI Path +SDK_PATH := $(LOCAL_PATH)/../../.. + +LOCAL_C_INCLUDES := \ + $(SDK_PATH)/Include \ + $(SDK_PATH)/ThirdParty/PSCommon/XnLib/Include + +# LD Flags +LOCAL_LDFLAGS := -Wl,--export-dynamic + +# Dependencies +LOCAL_LDLIBS := -lGLESv1_CM +LOCAL_STATIC_LIBRARIES := XnLib +LOCAL_SHARED_LIBRARIES := liblog libdl OpenNI2 + +ifndef OPENNI2_ANDROID_OS_BUILD + LOCAL_LDLIBS += -llog +endif + +# Output +LOCAL_MODULE := libOpenNI2.jni + +include $(BUILD_SHARED_LIBRARY) + +include $(SDK_PATH)/Android.mk diff --git a/Wrappers/java/jni/Application.mk b/Wrappers/java/jni/Application.mk new file mode 100644 index 00000000..9c7ff560 --- /dev/null +++ b/Wrappers/java/jni/Application.mk @@ -0,0 +1,25 @@ +# OpenNI 2.x Android makefile. +# Copyright (C) 2012 PrimeSense Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# *** +# *** Note: This module file is only in use when building via NDK! *** +# *** + +# Android should be >= v2.3 +APP_PLATFORM := android-9 + +# Use ARM v7a instruction set +APP_ABI := armeabi-v7a +ARCH_ARM_HAVE_ARMV7A := true \ No newline at end of file diff --git a/Wrappers/java/OpenNI.jni/Makefile b/Wrappers/java/jni/Makefile similarity index 100% rename from Wrappers/java/OpenNI.jni/Makefile rename to Wrappers/java/jni/Makefile diff --git a/Wrappers/java/OpenNI.jni/OpenNI.jni.cpp b/Wrappers/java/jni/OpenNI.jni.cpp similarity index 69% rename from Wrappers/java/OpenNI.jni/OpenNI.jni.cpp rename to Wrappers/java/jni/OpenNI.jni.cpp index 7c9ec844..d9f69264 100644 --- a/Wrappers/java/OpenNI.jni/OpenNI.jni.cpp +++ b/Wrappers/java/jni/OpenNI.jni.cpp @@ -18,8 +18,11 @@ * limitations under the License. * * * *****************************************************************************/ -#include "jni.h" -#include "org_openni_NativeMethods.h" +#include + +#ifndef NULL +#define NULL 0 +#endif #ifdef ANDROID #include @@ -43,41 +46,12 @@ typedef union { extern JavaVM* g_pVM; -static const char *classPathName = "org/openni/NativeMethods"; +extern jclass g_openNIClass; +extern jclass g_videoStreamClass; +extern jclass g_deviceInfoClass; #include "methods.inl" -/* - * Register several native methods for one class. - */ -static int registerNativeMethods(JNIEnv* env, const char* className, -JNINativeMethod* gMethods, int numMethods) -{ - jclass clazz; - clazz = env->FindClass(className); - if (clazz == NULL) { - LOGE("Native registration unable to find class '%s'", className); - return JNI_FALSE; - } - if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) { - LOGE("RegisterNatives failed for '%s'", className); - return JNI_FALSE; - } - - return JNI_TRUE; -} - -/* - * Register native methods for all classes we know about. - */ -static int registerNatives(JNIEnv* env) -{ - if (!registerNativeMethods(env, classPathName, methods, sizeof(methods) / sizeof(methods[0]))) { - return JNI_FALSE; - } - return JNI_TRUE; -} - JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* /*reserved*/) { @@ -98,14 +72,37 @@ jint JNICALL JNI_OnLoad(JavaVM* vm, void* /*reserved*/) } g_pVM = vm; + + // Classes used from C threads (without java in their callstack), won't + // be found, as there is no ClassLoader in the stack. We find them now, + // and use them later in callbacks. + g_videoStreamClass = (jclass)uenv.env->NewGlobalRef(uenv.env->FindClass("org/openni/VideoStream")); + g_openNIClass = (jclass)uenv.env->NewGlobalRef(uenv.env->FindClass("org/openni/OpenNI")); + g_deviceInfoClass = (jclass)uenv.env->NewGlobalRef(uenv.env->FindClass("org/openni/DeviceInfo")); LOGD("JNI_OnLoad() complete!"); return JNI_VERSION_1_4; } JNIEXPORT -void JNICALL JNI_OnUnload(JavaVM * /*vm*/, void * /*reserved*/) +void JNICALL JNI_OnUnload(JavaVM* vm, void * /*reserved*/) { + UnionJNIEnvToVoid uenv; + uenv.venv = NULL; + if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_4) != JNI_OK) + { + LOGE("ERROR: GetEnv failed"); + } + else + { + uenv.env->DeleteGlobalRef(g_videoStreamClass); + uenv.env->DeleteGlobalRef(g_openNIClass); + uenv.env->DeleteGlobalRef(g_deviceInfoClass); + } + g_pVM = NULL; + g_videoStreamClass = NULL; + g_openNIClass = NULL; + g_deviceInfoClass = NULL; } diff --git a/Wrappers/java/OpenNI.jni/OpenNI.jni.sln b/Wrappers/java/jni/OpenNI.jni.sln similarity index 100% rename from Wrappers/java/OpenNI.jni/OpenNI.jni.sln rename to Wrappers/java/jni/OpenNI.jni.sln diff --git a/Wrappers/java/OpenNI.jni/OpenNI.jni.vcxproj b/Wrappers/java/jni/OpenNI.jni.vcxproj similarity index 97% rename from Wrappers/java/OpenNI.jni/OpenNI.jni.vcxproj rename to Wrappers/java/jni/OpenNI.jni.vcxproj index b95c484c..8fbd5be2 100644 --- a/Wrappers/java/OpenNI.jni/OpenNI.jni.vcxproj +++ b/Wrappers/java/jni/OpenNI.jni.vcxproj @@ -134,11 +134,14 @@

rbVPk6R^;)X%o*>KPf8dmO-sbkABlQ<^Sbtn_uj4Gs*&$H80fWqNDQ&>N7Np6>2;z;LEjW z{P_;*_uGT5OBX9ZKFPtK>}(@G|K<|*yGkbtAus;K_Qc2LY4JHLQ8~jN9w*hF$G~_S zRdPka#>8<#OFy88aSR$xO22`4bQ1?#|zr0iK*>3E2ej(P=2jly<(W1 zl@%8jwy-=oJ4UCsIgLMKcL0@PnVD1qe>2dy^Z8Sh38Sal7X@`I{`^SdS`NQar}$nt z8PFdx*3Z1K^g=2N+>w)$hX6le?K{5LPH;>!s|>fkiSx_;ChYin@E!n~qeg>J zY;=8HU)ZILa}MG}K^hMQP{)rS6CiaD45`T93Z($xuU%Of%IFS#TG*XTV37iyUBhU= z0a(0cW!s&WgkE*jK~o$I5z{0AQBhHjOWtiQEku&{yfp)arBR3nOic7>D5IF6#cTf9 z4vp~8NuS3+2enr+syO^;NPb)*J{hDLMl>z11pYq45eSYV0{c+qlT5gtnH zhe=09N*XWddDRf|Dz>*>tU&;hA}VtK{(TnRQ@YaIyB*Z;$m3$YJo%Ro*28EKNzm$$ zi1_T`86trlD#jGoS`N0XWNv=tn^9rN$;vvi`xQW!=&2*Ojz!J=a{X?MR*inWXs+|* z@6Hq)pJa2Jjd3LLzOT(r?8^=gt`>OJ@%r^^EF-Efg@xhO z)t=BDbJp2F0}1qpPA>>4{);GYqHhrDx2mhAp;3zxaF}O5hdvlNsHq`=p|1}fM5WeS zuv?WU{y91nI-_{>#XC=jaHPV=#ob-{=+z;l+ay*;OioT-0jCq#kFHa2mZ|1Jai4H{ z>Q!j$?E!M#-Ve<`e`;xJ@^NrTJXT_+rA<*?t6^?EwbZMH?;h3B(JZwH39hENN#VJ> zJUHgOtfyXLDc%RI7_|7nTfz0r3`R_om@{PoGHPI8pqbj<)+T}go`9Q2@OGk#wstT< zS8uPUf)RV8lamve5Y#fg|dow%Un*&oU{+qnqdyf5p{s1 z;q}s@nB@bf-zDrDH*P&yo^Dp$-Q8`CW~l}g0bC{;!O(z-AgF;S46=1~^$|Yqzq>U# zX;7{OzjdVKZtj+fqu%4v7dSZz2P*m{Pwzqu*c#sUj;hDb4oG`iD(jK`{rymiveBQv z=3rzs$$owx7`W8aj5O5xpxeQt)!%cR7@UEihWhUok4M8`;oRr=_*%7^Wy~NK6scDl z)nsM!@-s4$k_6}SVPu4-%ZP}H*$=+Z)KDrkI~a>@=gB^i-zh3C?(Mk;{q)ad=JO|j zHLiVCppH$l{Bz^M7MY!$J;f8}*$^Q8bgS+BHLnZ}4yrpYjlgV&Hn8ex(@)q~0HfR5 z+A=B-i*E$V3`*UJ34yb%v9sq0%dwJTQ09ytUxEBL^j+UU@PT!wdr!~LGlac|yQ!w4 z<4a)Y;1CoNqLTCa&6{VgB3GPg-JRBej@2x3@wYQ=)Al}n?6~N6YPDiC3Rx+!d8AGDo0ZjJb8aWD#XhA zH=;#FVRhAtTiPD?p^*8OK)I&l#-xZ>jUZ?r$7-!>IqLzh)gp$}tGwQ;l<-bKIi{&8 zB$R_en{YV+-)ppq`iHiOk;cm8%HBQWjpZD_4V)C=dyOoptjRcSFfpK@7I6s$BDOf zI)Hz;L-pm@er3oJ8yg!a@YpmyM^4H|Heb@y{WgjGg=t7|U~esd{7pil8U2A{Em$Sk z3*x_wEM7*0h5h*D1&c43Z}zsg<@)5FKY!QyRhj;!qM|(jCrL?3Sy@ccWl&qD(uvgO z>Nd@70aIWa3%Kp%PeUe2$>-0XvldNl9XNL>SdCV(5+IPi<(_=2zdH>{L}EV0%8~rq zvBcSbJ3C8?{-DJwD_Lpy>ec+@@}HbSmaz9wtU;Lx>s#bTrk$drAvlVrP6* z?jRxVPV@Q{6SMOxnu&yQBon|yK=h%Kxe?E2Pp2M;*d+1GbAsL|hM zLkSF!qW6e4T)jO#>pUaxj^ma^XYxrhB|db!i28lvz6UsJr8E9a$UKx<3kx-W)Xe`q zD6G*(9hWfrv+Z%|NgJ;ejjSZ=RIWu}(-AcT2TL#YX?Su4C?M8IMx9|5@!|*-F9RF+!-oyYz6y#u1=+~xgjxWU;Upy7Er-hR%-U= zobAjNn|ovp-YgZ$$8J(}b9*bpVuR$&(XG~F zAz*~qvyS7{E_0FB)O7#jzSjJ*0DcoEp8eXWK$OwDckjRzYcsPLd9=6X4f%IRB{}AO z$3+k=S8;gw`*#?inOUl5O29sTY<(0H7k4tZlt+NtxONQy&eB0NvJ(-_YS4tJB3wDl9X+z!e|RzSo;@$eE9JWkai8vXLTc{ z9v&!Y5O}PITo$)YpFgh;qZMVxv!7|XiSCGfD0H^nof(Wni zzTshr;F!aC4QuXw5*$|Dnl3YsWw2PPdK`%Cb*%Cq*3!$yH-3ucFg*P7>=O3%+wVEf z7knt0z0cOjS@X4669o-tCq>S~?uaQziK)NJF+hmn=?T8j^vuZA+h)TiSv@J~1pW-~ zGcTCL=?q%h+SNv_eP>6r!zIt{!OjgNo`Csm5L>NU2&6Ny>6RP^{$s-{z0WRq3)RBY z+7gTz?!i=Tg~r2Fg31EplgOssNW??KUj;G%B;>xtf~k791>zD~VXc7T(gyP0nQ9I< zx7wpgN%+eg7B-I$a7kG-%3d}b1la;c(k^sXV74R6Rx1chU_79(jV_phy|W>Xj~}kr zTD=ePf9!a;osLV!@=3_L`6I-K#z;j0zZxH3U$A_*Q+u17yjEzoI#p6Ax^)J?Kaeo+ zF=vZq9pCajm~6dyIZUwH9U#T$2+-M_f)gT|P4^ihp5O5W1CdvS-f5SSBq6mz2KcM! z`1r7?BR+g^neUj;sdn=`nA!C8yMAzRWn<$S(DIc0F6#j|b$fVwsQ6vx2d%@628GTr zmR%X$JsFD8Y?_SGt$EtD2{ADX)6?4@um9(vt0TWG*~5J*c+=%76wKJWYd{`(!npvq zV$_q8Ms}A^6`4tC(Jwg%KkYTe3we)XFcynF8PF;NpvK6+;F5a`C=J7(g0Ge&Ey2Ds zqBlTB82}a53e-iw7&$rd@RpQFt3+gF;U>1jib)&Ztie*7{igvmugS?Ye0*`_DZ^I3 z${PM{aliqKJY-@e=F=SJTUY>L45mx7MZb|m#PrpxvPXQp4|#zR%IFJEW&m)3I9vwy z0Ii5Xjx^JumKFurb(mn8PBRV4H)H=ZwSk~+F-k5okBqiixaB)>I6WLfCyIDLEX3H~ zrJ$=T^q5YhIENuXK{33nqRe=tT2ocEX{K*=NQp!wBP*-2viu>x$0tZfWDhFX)LI%; z(*)X!{ytsvjGfUbw=^vEFp}=wyJxrXAOOrKfc*Q1%HBoWw1-uOISnWE5(Xq+zW63O z-DI@d9dtgWhK6ABuvmFgdZhNFRS$UuC9bL(E!GX>22H-OZ2!2U>iO}4Sk_5De*(M) z{=5+hS?^7=t+FExd)YUCCq0Mm4v_?;=;I-x&ZKa+ukzKiCd z1XBgg(FmIekA1hsZ`(}nMdi+bn3po+*xB=piaU+5)0%FA`KmvXwp zG}^>QijQPju>|e52MR4UF4ZwPOs^-+Mnx5LDTJvlFHfThG>YAJmU7R{r0_bs6U#<$ z>dCl{x=l`{K;j6k@jJg8AZMyxU3~3KA+31m=GF-DbZCX{E`Z~m4q76kwM6iW0>3k( z#F+^dNqPqceot-C85H+xKREw^RX&U4W*m)B!`=+t{ z-((&id;HTlVy)-?^Yx92pzosf{u}wDEd2AJhj|_1OLdlW{LhlT&RBHV^Je^AQ}+)% z)AQ?smy7+ghNC{Xnn zqG46Nhc=a(TD#o4bp}j50Y85xlk+BjRajtR1i}Y;Eiy9tH?PkE0$f%YKsi_J+Kd=$ zXlQ6|&QH;}cHRktZ0!v6Xs}=@lH9y~n}}dMltUEJJhNF)un7!?>f!l)uX^ax0bwy% zc~_5}Jc}V{+rrY)z;FsS+gGtLoo?VQcNLlpK&TLCE)djt$#Ov)WX{zO&fB(KJ|ZKdIp|h5I6>>- zpdru^)@Lz67JFUXjepPEnmx*>*$`H3h+;gP4nJ?#he}qQqv#OSv1!%S0uA?@GRS-rE^z<~ur^r4cI<@)5PQZ2dihgXKV4c!3dRHHj9D^nJkK^4;@@3YYW`1aWtSP*f(& z*ulVFyZ@iy8A4%JL1e0_sY#6{r1226UhHXx${QXDw=_1kv!lKJNQtGNR_^?8DKGW( z`h+3I2SlzQg*-kzl0g$lcSG)$le06l`hp-Wy|KDDF;SvlZ*3U}v>w!i+q=7uq>~P=3a^Sl+v!De1dNeSqYw{I`Pv+m0q6GoW!_E1y*fO{9mW9gYMrVBA( zhK45>&%q8C=YOXFjITU92jiR_mSMww$*HcUhVSfL3bHlbG8=yaPLKT#Xd-~|h6EP4 zYCw`0FX>rZ%a&^;eE85%U?D6lYi*t9d2|ExZda(e9p=ZOE`lBu)Kr;Kzj7L+$D64UWe9_v3fhgd8>|je_#y;#y&bLrq&?-1g-B>B6A4wQWjC zG2Hh!1~Qjo`+|(Y&@s?`j-!B3!vw1(b#aQdUNT>zPRPj zpJY=FS=rJr<3C{Bu{Q!kL*>n%0+QQXw_?0c%iBjrEDyKw^K@$gE_U_R*BC*msX3dQ zXVv?K0`mVR`8()fA#1*@E|PC)WyNuQJPcMNMG`n&sRM8js0-54O_Y?CU0q#2KeCO* zeGQKd?i&h4ysRtwhbJcfXwc@*2^6b$02NDDt^zk4{tRh5xI65B1lPTwOtI3L{si%x0r~#C_WCadeIQt5W$C8emCha75hP4%4J-ZK>qS%;ZRR4!VqB zi91g&J{~Kzj(lMRG>3{z4eUXWYXk*>b;(jWYw%?It6WfC?%McgFq8NXR0UVEmc{W; zB}hbQ(XbGyF@xg8)XXea$omG_zU>k@NRkYKV6I@}Q_fFKX)7r$FD}v$`6s7XQ==OU z^8W#<+GREgW+ebB=im_eqhWfMm+!sgyyc80_!tvoWNA5=5uR`N;J(ox2?Q7wI6(8q z&F!+kp0ucrB8aZZ&i)*zdW~A^Hi%8pAJmu+hBY!sp>=M!QYTAKf&)@ffbS#BRWd|> z8|15riB*ErK%GHE9;tYE=!X8FSvm=4bVBWJf96&5uM4quKFo#p(boqiGesvs$fbfb zH8a$E@q5s>m|9t>ls^ape!BZ$IJPt}%@q-*QjLKp=VX55dP&fop91fV*E13kf52gk z@^mZz7GzgeYSwyrQpDe>g)pU{d^MV92<;jN^#l1Y1qIL?`5ImEIE`dd6)^|{Ic3Cy zaBx(WoYlP3|1{GYrJ<&FFa0ZkX@>^~H>d=`nP3i4SPC%~9d#GrBvKIP^V#oy_N~wm z7yrGeEChkfU&o(Ot6mpO6oNk3sI~T$nOP$;@RvbvjX{zek_35=1n2nVq``n=?^a+k zL%uLdo@ATh64odu+zk+&a>fKLy|M(o-^k4ee0=F}a|u9`7!T5USSrCRz{VCD8#@#f zBxQxX(HNSmFbjYOh|jw+@8+uoaaa{&9F&!BqQs@8yR1fVa6!okPIgOKTS=#k$;>}j zRtz=@`xeW=V?&Gz2nZM!U?L49G}C_NO!wK~zPCjuO{nR3E-m~LYSf(5IqZ9jq z$5qqRyh%z*gZ|3G0uf8bpK70|f_|90r#CAzv(#b)X0xN6-SO(MH5^X5+4NT%emaQE zV8vik@n|bpKENeY%{l%7^PDkU;@(I36fymvXjaX?Gg|WM4-NLePtb~HYZPn5lmjcG z_p~lDtG_H7O)zsc2x>1}pNlZ}2@uC89&Fk*D8$6Zymw|8K*))PFJHcT`4XB(e}c@M z90+A*ZiVJt*iqq|-3}xy4^K7KTAQ1%OiVa!8RI#BsKha>0%uY0=kl1`Ofjg>j5y2V z<8v0DX=;+A2}*nHH8HOzR656j^WjfbA=#NMjDa$ly%EE(RFa^;fO>D#yfO@tJ;C|K z#ZLD2|VS{3m0gekV0 zr(mECwjnWHU0Ge-L_QSA2@U7qp+Ziz5hnZ4c3+Eu-16XK%95S{(~s$NTM;msvhBXFa6 zz&KHGH$;tjcVolq)vJL@Yi}s@qNC>&Ne99E$s3ZDWgpGz1wJF7)3s|npsm;$t;U8Q zIQJJ$qD3cv!x#Fzys%(pZccIg_U13L#K(^uW@~UPK;|SRRZ?6G#dO{E{E0h)9uWka zonlmOE@gv*gAPli$Gxhp8avxGP;d*_O(W~sxlClX)@|&aoML$_14>GEJ5%T*6wQF5 z<}!%_7BwZM{;LG>_Ku_VXpn*ozLyiul@tvoclTlX-pm}3=Al2Nr(^T>s)IVA03yAF z5$&HJkF>VZ-mUYV{bSm)CVR{GG5AvI*}KzaXJV7ZLOZ}$$cSrcWd)9v@1>=!?QC*h zlEZ!ZhV%>p=a*1fnN?f61}eduI3gY%G}P1MKkAWFAh~3SJ8Wf(wyU1^ZiN(!yLCV= ze);{I5YG84DJ&c*H1U4+j{Vlz&-EZuO|r9gG6r>5)I(UYihb3bw9h2s$0D| zn&QGP`_M-z9l4x%c>199A$R~fFF=BYg%lcC^K|MPNWMSU~ zPi4*%79M)~JxGMVCEzx_Jjg|GE)7JZ8-Olvl9UaD?haNb+u<#Snc3Ns{VCb=d;@6p zg%J{|1z>M$Q8}8U5k|msT|e1lf^&oGQY~J++CSNg@6Q`kN`p~8+cpm;Od@J z3qjgNJ8yUAm^(O%_-{nbB%|3OyGp`J}|0>)0^SYNgo1; zsMjvFqUG&8*WZIRFq1d()2D{Elv7Pi%A8vdtQCp;2TPKF-=9}gtaXdGHNbdpeb3Tz zg{9UKnl8;!OB3~yk~E&BRqa(tPxw5b^5U8r_oY7fnB7prYre9Y9rzSahj1-Ul#xZ(J1hg{v@ zrgtOb3BG=MqVs`2kkt3Wn_0E08YuMCcjXOFd%x~`$L?*^s{btEmc*xe3=JAPY*KIJ z;MAh;^W9fqH$OX>9R|e(C`&?It&2iJO5_+kj?|0CAx=)L{3yFZco zc*BIpboo67=2usF3=hSiJO;Sn;+wlrK&6$CQah}7Ou%xjzVWL7myB&;ad9``{fFjh z@8#oj(`f$>6oL@7OZ5mzL}USPi2$f8@LVtxU7MPmsy$i7W^GHBCA)mtVPkI#!1roP zI+z>4JWp(4V~yu*8`NSFPBPQemj`rn@+NgodD?H3`=r0TxORSa-01}ZEN6b!23UZe z`{Bt`{;7!b+*^IV{fK`SQ|Ud{+}ZhSaAs&{N!Rlv@fxup0tauNlt>BzNHt`%5jTD! zu!Bnn?J$UN8-qO)2|mWfmD+aCe*EZU{G_<32=ET7MAlD!1Rup4E?l@kBJ!(oR7G?l zztq}!VUh|{%tVG&n)wof^JT17nM?s3c4_*~?7nBU3#*~7v&ebXwoaCvn{iUHgmwCJ zYNLqzA?))rjG8Kp0O*USDp<|k!>X(8n|fSV!7UB=vA?i^HpPE=)vrTTm9!vQIuZEe zvq}b%fK2*qxwiyvZ{oSmfA0CqMvqGG-(TQA|2F{Dr45bx5zh1bq}26Y<~h<{bR|#^ zsvs9y=@`yutg7eGPVYMqWkbygr#6j2P&q9c&P-0rIq5gXW|piuTJ;0?a;87-rgOvH_m}HC(bXt^)uWxIw|8DSJQM=;h0m5%({! z&9AiKTs{VgYuQLPod3G>1A7h36FE93g`5J7`&oHWV-=2?jFt)x&}oP5+0$Djh>LUHbsmSm>TWY$Msh!;f}oK z{TCC3H7ah9|0!)IQw;165KJP9__^O1vP9%ReYiv3pC|U9^m$%x?tL`W`mmun9&A1g z%8!gRS{t3gv=SfR@cR09AKbD1!=<$$pC32Rz9b{`!53oOo{*8A zuBkirnjo1W)7jcxQ8646=EkarNr;H}JzVDD6eL0vx3rHReqMGqs4W=T^2WCg086}j zwX9j`wIT(R+zm2?pi(uPe{L zz%w`|*9!v7`Eyv+S7@-S&~)^rsw4Hn`LH}uM13#3#-DX+1EB`2%s6d}Jd=nZz0Vj*1k`k556MjlK z3a;l@ptnxBT@IL%Sy)a6@`=Ht1cC|tiYA#r19fmbcMc6bfilDjUs_Q|=UqVH8d$ag z7~(RSymZmS(V>W=5$L63^IgEAl*HzBMaBMvD1M!zT7NBk8xWX)CPqdkH$2=>LITnzvI+|oQ9m6u zhjjo90+@yx&9S?;r>v+5usb>{E6|SG-=CM_j+^XfWT9!d$_xhhLrGa#UKW;k@~%JZ zQlg@>aF#Y3X&@CzX7V?XBs^GyKH$p;X}2>6IaaK)P` z?I#Ev(b9_1(T%jUv(0CUJm~NRt(sjCP_upCGzG951b?KO;657@aeAu9dCVsKML}7}~V#&7Kx5w#3U57^sHtH*G zuPK?BXhfRh%(Putl^2zV&q_7L-@GAfJ6$jk)jbXK9JrG@cV();&e6BG64 zdor9C@<9?#L`vXyeOpsQiTXs~)Sp|uvvb|m^$H-J;MNBoV zSk7Tbry2s)u*?)GKH#H(u)573oR8|(i$vpochMhmvD+_T)d@ZD^%q=ws&fr#2*dKZ zuM3rco5%Q5SuQTcp!_UzA*(QYG@Ok+0jfmL+V-t8wib{NmtUyAvwAto$apD1GF7+em8X5{9P*7B)Lqlde91EZBA-Dz!k4dJnMuTy@ z;V|B4@Ma###s}CtJ1difqK8rg7a5JeQwVvAZBDcp-q*PaplEtCFdzO;8(v zLFk`u+^8l*EiT?B5pi`XD=jLrxyJ5Rry7I)5JLOr8a1RMvH(=CGWjKePfV-l$2&1nW*2FB5_)QC+drSaK|fc* zlfOB0CqwD&>Eobs+!Zsjz+cX5JdYo3|81@8U%})hb{`+)f%;b(h<(5apa9yQxRLnu zDg760Ab#s4g9z-V8r#Tut?Y!JJlb~M8xes`A2JFic5UoEZi3(9-A|m)x9uDMN6!U@JQeXTE<(%X>Zd&g4uybt8uT=x| z*=w~_K)Gzj^U+C2lqxIjQ&OH>qh?{riT6#?f)gXt?BqX#6FVp<`!!ZAObdt40mtG` z`n-#dCk%TIcZUMJ%Vdi`^(Ct4FF9d|MJx_F~+(1PD9{~FlStN;U8?`o2DRY!FaJp0+9q81SA?b zoA?`-f0k!`LCvw@Hdb@v+O>XnkIMj+_Cu1!=f_+J9+aWb(6&Fa8D|fIY8Y$1>qqQR zMLQp~e*3Cntzcmm@DzwmhJpr-dMKcMGDp!<3j_`#DWp{p(wxh+{>~VKTXzKIi-G){ zrUHvSvgc_G0coZ&QfUK_Q3MB8e%hsT!26;t;vpDn=Djs!A3(jPzZg$@C*l zeXl6*-c%Q1{p^4-AenN=^v}&)I5&;RA9@V3EM-{5U5r~=*5pWLCMQ3Jg*Bf9kB=nE zU3zjwpbl=8&Wrf_dVm++S$ifik`h9&`YF2QWqkB{2iB1G??_BM_M%|XH<>99IlYmp z%qdf7=I{lG;rm?lf6$&Efcx)NMRfO^nf~`$fARYA{}B){UHJDr{(T|uviR%7O99F3 z{E5Id|9d5{s9ibC7^i&j3^73|{Dz|uX}<&=^&%g^v_@Ka2IiHR}-5@*ss z1g{<4R)R>gm|Ffb^9b8vtN&KWMTpA%ZEgNo+-H6B^_9C1Ho7b}S4Jg;H@5Kp~o z-xGXi%1Iw2VJ}C2`1b90s-$2*s8D)Vmbsy&wvrl}z*zm_3VvNJVa=H?-dW@Mk6P!R z@U}t-x;wxIB=qpDkTI;6#V%gQ`_nrvECMX3M{c@ztl)@&p=_4Q)xcwo^5 zQ!xRGo$i0{U&1Z8WhBu*fDdVl;}I4S)e8djuheQd-@QEnSj_Uz6KR+C93A+bw%_~v zbMVfptE$4Wv#|UoIPd>^LvSgX<3FZc5(q@}qv%?rJt;ZN?lnI8|A_hyaID++eQlMZ zG7~bgg(%6YM>J%mvI)rwA$wIGDqF)U6lElYWRJ+m7LmP2_Q+oUQ}6fq{~V6veZ|A) z`HcI%uJby_%*wo{Wqt$(+gPpZg*_>XX=@^cs^CpvxMi%jMLmR>K!}0^-Cjzote%|T8?ZCQ%oPP-?4TP;$hmdx;p#jYWVnY=oCs?xLmWb*)QLy zrN}Q*u^h+b9x7?hO(4GJsOH#sX?`>^IH_mVI&^zIuyOt+SB0+MvhXWE?!bp;* z+_kfv@~sBJbJWI*?nuo*bGzOpp@c( zr?g0KpI=$q#d3)3=$^Mm9oZ^mK6kdxPS4F9d#C&RbKJ4jksaI@ZQ?W+oCNWki=;05 z3oDNM+PSFo!9ujKpEz>T<@CJ~C6LZzW2qUaGHlzwUaI7aI$_So#}QZXgX_oAA?I)x zucc60`tk_T+>waQ%WZ8K!JNJGROC(}$=~Ay+$`_^@$yrsFF#~r3TawiUim59$sTk} z%y!*)kKU9 z4V4YgU4O39Z2tSLnyDNoWp#v5Im#9p&!`7NCRJa}As*;peso^IwXJDeWF+CH9=xrG zYBUqgOtX}vR_>?ze_b%D3g#)(aL-!W0nx$-CU=nfr5rXT7y~k$YT8Ux;>eDjeJkH# z$9o1lor9O2B)%80u`XD~xW2kMy>7qf;ITZXiKAt|zpAFRrW-A!{rT0_wz4=_<-9Qd z>c`;3WRO`ZrbJ$PoZ-#&^_)CBQ_=EH?d^48LRCMDud^N2&UONgcY;!;CQPWk;hWx6 zm#c_H*MI_8s1cIp8t`QN_{)qsKLcJ8>n&7;HDMA}jg8X0hojEg!oWero91%Eb8*Iq z@aG>po^M@DEGQv|*op!Is$Q8fv%S1k2bmaw2QHMV z>hc`!`TSXl-fT=!Y84aSCtf?zR4v%sgY1%dxyjVf5EJ?7L0y+@*K!3hF)=eUO#U7{ z(nDDZo`Eze?#X1G<<~eG3!TWYgg?{0df&cXuo)_7wqTztl?y?S^mzLYa>jFc#=Woe z@7)XL+nl{{ps!!(&e)JVK(ggsyV%Rh;5$uDIvpjnc>3LW0gG{3Vj#;lMiIMf)k{`p zElK6Hdk)gKC93knD+G8Tnq5pngIG(Xn%5s-)HR`TU0Yg$Q$VTVdBDn+h5y!v4nA^ zc3;DTi{CkA$mhmVYC!E&&vcU>nLhN5`Q09J28b9!#hlL&@Lu-A#!kedP2A<8gVO!W zpa-MEkCd=smr>q7RM^h9x@KZS5JdKb@yGp2Yr{B)*3;=c|Z`{$VLz z&Vi)NZf4@Or*w*qe>Hu&bkgk@mT-Y#bq+j5&f*f8MOa>S}KtYcY)Yyw*Xi+busx;5BdUFA>=ugE`N z$wzniXzc&p!<1}Ailddk5}_9KmSC((8)vm029?p5jzL2B_}kZxv3=YU66Kn-Z3;XGl5T{*TDm~)$As6=HX}oAhR$@ zDRcS~?h=EDm z)endUr~@tU^XDSksynB=^iTuSdI8exSlks_O!{ut+dAQfhN^1j0CHn=zvjURqSO2^ zq57Kqol_WUX{=?>L0>eb|28W&n4NjRqEY+VMHEMit!ai){F*u{ng~RA9vFDr#6mS;7Sd6!5&L+>u(3u>=XaHANjdJ z+g!?eu(-e+7Aq5HM{pjs;S|~q7%WKH6pw`_Jk?p>DL6JPb*6fxpvi{mKh&IEU zzq8Hk%cl-Df6{>1;SiI1ZFRNqDg7n{&5BsInwp#24%C0^4qyaPeUm#S67E1A7gW2~V-l#3Xn5)=LM!l3=74J9)SG*^9ViD}R^A8x?CKMb}Gb4JTHLR_ARP zMNh415Q>XsEDI&wFUS}UK0m>I{iz0CSSp_dx58hdZa1}c?P$E6;FE~2!d%t^^TTrVtdboXxl=C?lPf(@)Fj@gcl zaq9xg6u+lNxD0i6kSW zvj5#9c}hJyToWhv1ISeDNVa4QZBV;*KX*pR>tNG*soo`2jnL;Gabu2l~1YT@-kL21=m&UVeB)( zk-@Vii`~yk`@rr4rxofG>u+S_`{m`b*Zax4(c*#2V{F_5{q_k5bYy72p{wdrP+&(J z-dry{F+T8}Ap`NJ!U7|A>jdnPj*>qRRyWL{lY7{m-CypxB?m{8x6g|zI(mAu!R_Fp zQV;-__POOb&9`NCyQToso*c4+_@E<{9(B-gxS~7}>#{R3=-YdDm-)VU?(!}il_gpy$&QLi06-++AS4Nq)>L?vu zR6sx@+-^~=*GTk1Ucnlt5Osl+^?~IBgpbqg^DNw$#rvZpj67j-kL5htZy`?t6Mz&z zj@H(d5zntD+=%_{K6DR_+->a5;HM%HdUZY|%58mqm`^hk(~fJt&w6K;jB3BL5=HKH ztWAjMuFuW|biCtw!JZILS{o^GiFAd>iOGY6!xv zK}hUDc0DOT_P!lY4y>+>@sl%1vQU!B5(97#e518lw3XV|(Mz+Jm55>hdO#hIIE66l zjez~2V~44$yA>29-b(hxk`osvB6wH4Yy?Ue;&GY1Rz`g^1A~r^2ar_N@426b%lqgd z>N3N0FE81N(dRz~=)%IjUASO&D@D?MgB)f5l_UBC*2@6DXuV`eIZkxq;HFyYvcD#u zT=@QDmCBY%wCeC+FzoplrR+XMpU7QL-1cyGyY&)t<3FlBiPLTuor!&X6dxs~Xg3ZB zlp(N35ekl~Mz|)y5wcq=i`2kZaL9>4Js7ZF_g7n$^XEzAl`-Dc&A-c+vw8Nz6OE;z zHQeaAc2oIo{a)50u>NfD{nJ=oQ*AfZ_4;|ZhO#=)+#A`Qr>pS=C+DCj0yu`cx`-Ynv@&Xa)lhCmpzast1XVSfU5ANSTKR5U4 z$AHwv-??7aLY`XqEi#?@E;d=+3f-#>l``dNt73;EM_y1BCfy+GjXdQT{q9|_clRw8 zVp>`{72luXu|$+J;*?dVNSQG(@Gb^OFV3iYld8*PYoD&43)c)6z%aXP%grxNcT|~C zaBg3*#<`U`F|QE%knVjux!ra0dV19TG)C@O1W7}1L zvg>amF6vtWBhG!{t~n!j=X-ps&5(B9-{F{(cYevpZJ$1F9Y%@idmN_kH*daDdW(ra z$v@zRWW;Ka>I8H+Sy_M>t)o<_8p$uj9p5%7XrvHzOx%GYWb!ZpZq0METM|+MnJ`+q z*4FmK#00Ay@9Zbr^8fZLW?vc?|8Uwm>rqGq^@hWf`t@&J0W@S~6D^f6E!PzKG-j6T zs6oSlF&&%*N(%HM3Za1OfWre+r6bBj(> zV`H*?$6^5*P7aMu4pl~YYK&_Ae3i|d z>eVaUKv;UmTIw9*3kzX$1QgygA!lU;4qZO(8;ETxP6{YJ9DIDc-{uXvk+JsHHtfS| zYhxQ2g&*F2;9w-xr@y*8<&?L6d(WR@+D&&8)uo<>6R;%Prd8hG9g?#4)f7sx(}4P5 zZls{_$AMjBXU=PKiS3HC1B$m(*ciA}Vx^|kwvN`FiqYl5^Z;p< zKJlw%_almEfx83N;n9?H%6pk9WvmkQQhDWi2&)^Ow$sAdUDfm3UjB;QLsoL@*4W=j- z@I@$#Arav99tdcYbPKsz^xxm$mT+CUclT~E=-a`3^eYRt0|ic``}T=HFz)`O-uNeE z`VmEk%HK%)EeTao;Q_KolY*VPpMXUby?A}j);dKe9|=IS>x)uXK3pd%A)ng5+cn>~ zp;*Re1DZLoT!Hw)GwS#Y1k$^cyI6iq?8{%@;J9DBKAqRMoqzvj3|UC>UIGB3AOKo< z@#9Vh#cO0X8Qr;d`qZiKw0vsQIiSCmWx2aADoSZP0qX_8PeA}JS5UBjb;0&6=Q$}U z_m*S{JXXX&C__g(wDft9qfEfsD+FGBrpPAiOwu z(3PSXv~~@QUzKfIfA@)ayjcJ7RFcC!QGt=eY(@C?m!kN1RM?5beqeQqXUh$9&X2wY?#)o^VMm6*1q7v`I$bp_mrL5(h}t#w(mN%T zo^|IGH#f_*$S<;O2yZXBoBy>m%MR<=4+FgGuckbTZK z6@?sBqc5)-t}ZZ~Cq<#YxiVI_z9LFRNePFuo}TlTQ{VPe^FDrd2KR*MHD=$vGJ4^% zp|Tx0?b=g9=_(_FaVe6Yu9`^6nx)tj{Z(nOSp0Feh_(KtL(Kraud0EAyLG3A#o`bxU4_`ZAh4ad{o8SC%A@bd!`3lUMt zE$IBbqhWwNG4k68UXVxFuRVJfM#<#f)!1mzktL{@^Z_QgyB=~8ArGxqxgfsn)}h;v zxcl~h_9mIRNl{ZmS>xyH*7fKy4TI;Tgy6n2zi)dS_!^h_C{k5LMaZ&i4bKh+n&5qi zT?$}aSsrFWTtHS#$5r^Q1RGKryoclLDWlpkvlffM%WU9tF3lXlk|Ujf{ouuO3(%&W zoyp5+b8~Xk)YW4@7!C{$X39N;2hSO^<~%?8Ot4>)DU!uPDBv23A0F$TjvCm){%JzCla_CijtUFF+|&A#MpX2zsmXz$S?w z2{+%NrH)T#ZmPf0P+vqi&3i-0j_Ff$%#&r8@BOUaL%T0aO|3dCM6N!06LQakxqj=> z%6sna6@?kSiAn1dCbv&9F-O1%d|+JkSq~N2I($)_)>r%#%6HIEQ9*G8)?!0P$2Dnb zZB9xS;*yJ`s)kkvjNo^B5_ckdY_Ptbf>_Vwt~IhWumDwXw$>Tfl^aKn7+_y`r}S2< zqULob>^rpIUd6Rb*2({BJ$Q7|AEXG_PL}EerccbSe&hTz68>i@#s(O>*g>+JpC569 zU7A$y@1`Z=-eOXNYcoLi3rJ>`YEC)Y8l=CAi&E&J^;>Hadm{4V=-44o!B`6YLuCRK zM<4t*j^P&!HU!JbexeOI$z7qLRv<|>v|IAO5j0SU+dDndpv>g@cUx2)jA;_%;|FFo zg3Ke&QDxrmeT?&=@B4&o29OD^ zErQQu3*0i3-%6Df#9nrvK>92YSu4z*;jk;xa{&x`oi|D^pX#V^ZbZ|!rqend+T0Bitz8& z)_tCYuxrgT&ojF;9#Vu$Z6*asOa*iFnGrx@oB1%|B@`M6#ZdW1HI052)pAv zr$XBKP-{TiUK%WM!={rN41 zwveCSSKtDza_DgvcLKksfGnjfCHdUV&)yHK-28Sg?RRCJIxNW(a+*yyIF|jk?;)0_ z6uuM#MQ_bMlY%GwFy#58M{Y_=fiW>2`mNl!@xYk?q2t-b#}s|%EU7%a;b4fH&d1vu zpkvK^1PD+(G?z(5t@_wX1k&%;6w#KKM@^|E*u9%oeD=2%LV_ia!Xe0-)la%|xd&PUhzCv;iYT{|o!L`wf699DM{ zF0%x|JoYF(JvLbG+Fma`JpFRMnm_4OXd6R^SQ*J@Jk^eWC*0&!D*rgD7Vm%a7Z=qd zJ$I&emUmctg{;Fk=fek5VqShaa47imPR3niIXkwv96ctF%8yIjM2owL9CdhQ1cy5G zkNz?PXI@fL5)%YaYXY%bQ|44Ol4Y|wj4xF+#d$*8nryMoqTwiqhsmAZISphlrmf)F=qi?Z-N99%AFL;{mM(m8tEsp31%PACZ=ZTk~CkGD=V5qYWr*? zI2mIdL(8Rw$!B(jM*r2`^YH*f=hK~^uCXZOo?Kt$>}kJ4aku zStRMfgDVh#wzaVt8kU2MnBg$vjDVX|-q$Z)tk#N6S$5^=fG5~6Unx-iK`ul~>rIMQ z_Rl}ZO^Nm1REZEEd(8Bgqgu+#TeI(SbRTQ>!^QDFQX5q`4FVx5fsj|7uS2kQO0wV8 zx_b4azAQXCbhE8%#HR92BfbFzjF~($=sUD>r$xQU802wUDq;Uu|Ijw@V^e~~} zveF3T6GFP!{Di3>fWp+wOzvvVO(mt@FZ}kCkksuG=?tm6#7&UfJVX>2%sg^Pao5}u zB4jR!WIT+QWxH*7-D>vLS7M|1v(Sq7mru%A)7^!yz3;=_1TAgW5-^%PcsG(X@%KxCD+AVN@TVf*M@8|(p%b17{tRLq#jJ9=0~i2NGA{oF}!-rK3%$ z?x|+bjca#K6<1J*>|3E4+j%mD^8;rk%$X%v`!_n6UV);pA7ksSTD=3SC2WS~-^QS; z&d9L!7QXq9@o5*Hq3;We6p07%?g|Q%HLtH|H^Hku+jnK}rEH!`$Gj?xuCB_-iD^$^ z)UPA^UvgQ7DXrjjqN7U^bFVDv5du-C*Pd$|&x>b`$yW|5%-lK5Dv|$l#dPRbt=l() ze;k6Ms-&@tU-}#N82T1&tilH8;g8 zXFUlVb-6C54|HE9)@y$+3|ZHaR6xo%OW7$~wpZsD_A^p#72YHyKU-R+khTqrzB0c! z@c!l;pWu|H9Dls`8;VkCAImvyVaia}zK9Dn)Gv@S5fjlH+W6XK$Sa7W2*{R!n+J32IF@)bQn^FIWT2*1J=!zY7q9^iEEAj?;*r``6xW zo!UAkSyJZ5Y8L~^j!^4)Rd8L@BU0$^W#QGMyQud4FmWo1tcW$*^W!L~-c~_-=C_ln zfjTuaobhD!I@;PQ`)6)?n%1p$Zs_hefKDG=p}B+ad7!A#QwI&qg97F~+*N7dn2Iw( z7Jr5K_T$IVVTRkz-p8X1KhXB?+OGrsfTgkVjV_Gl&_M{4;gS3&s`<1UTU6VUh0vrpw>?2lHq(=O6sFwf*<`W!@H_ z8TiMoZ-L|Ycb-Vl!z_9K#>OTYI$%8vIs70^+k1gjFMLR1v5vq$3%53$6rHQs_4~fh zpv1j#8Ui#_G)#NumbmR-DyX;}$@xw&R2MNPS*O^`nL0Y(&#msOe(A|K#NLTerd^H_qOy7w#-9TusvCA{~@+EZRqlAiYbeP{_u5PkUwD(=A88L2J=98Q=ko!{Z%OLpATm$G2!*VBr9$w70cYJ_Zgy z_K;&|c+YEU?%!g-&NDViTz3*T#Hqm@$th2qV^aGQ9Y(YWS!)=TmZjePWFJcRW)K(8Qw{OfyY4@J$c62SuEL9hOM?%L5q2!_C|rLYKvQC&~0CgLOmXP zVOkC^NxP#rbAO&48oK-K+oq+&mKjDquBN#7$`j9B?QILD_PW@eCtK>mRvQrYQBo4I zABJru<>i{%+VWPh;PGK#Z*Q+^fi#%))m#J<*&Wr)6=+LMOCvjYkc{kD+aza8-b8qD zS=l)Vj8Q{FW_`#vAV8!A67iE-{9lsHQ$BybZEr7vdm8U-QdoxQty=%>onpD_=l%@b zXOV&y2L(p-gyoMAb{{-8U1Hzu&mffZF$YH0zR{c&#BB~#pLsnf5K>V}3m@D#5Ijmj zv1rS<7#OH?$B0(8jC#h&H4VU#e~j1Uk2^&-GTsr3iXFi|LUQ^0NjNMXkw zr;{3ANSFr(nnZYcmp}#q1PVujZkIV*?_!)vX68pCmR-*;zlZVrmIH7`#+fr`7$wDD zM&GxyOJ*TUo?9MowV{+bz{Gg;h|mH`Z8^4|+jfYvU!z5GM4do&?$k-RMgZ}aCZ&@U zXA==gdHeQhc?_<|;NTz)<(m6!>$bJX#qRMZEvpqfCOB(d%jX1KtBvuROY6--r zpeds3Lk1kK95}EN?i(zNJNp;AG(o?76Q$cTA>q(lEJDf*;9}3N1M*jMI-A**JKPKn zZ(7YTB%ce9MXC|S5usZwK@JXo$;pm6K>+>iVl-)5qm!nl3=*i|k}FwO(b~!-EWA|a z$Cmv@J?8;}OFaPIpz6NS6u+|Km6m2*>WYj)UwRq_CU-`IV|1dxY5LkScBW>T7m);n zhNgm_LJWjM7!WUTJkUn6%66EUhR4$IY1D(XprrIv@Zf<1SQ|j>#Tb@MnwOgAXk%U7 zRzxuhZE!sOeUJUfD2Z2QMLrAEfLO}B$jQ-JcO=psK77`!nJnSPXivS-&-bA)Jb|Lw zJ6dvMNqW-93kXkN-(mig3;SsbU>*(>42*V$GrY&oEU?KaPvxb5&dBie33T3tuKlI% z1tP^_&X?SUgbn&_2u0lx-4lA8n8h65bK&ittl$AZ)+>7GFl8SX_4v1#s;D+ zIHc?+PrCj3Xshco<9C@2)%uNsb*y>UUFhW+zu>`wGnsj3PCr})Q<9Q0($jAq%xHA- zB=kajsu1a`i8qHT=d?&B(bMxdz#QDTa05iyt&JWtKAx0us_PmL;j)ucY;beF7mQA_ zofnf|zvdxSbakB+5eYEkBr4%2ZzeV;Yh@21DGaiLLA&c6l%wuW$nXGz0QVZ`;)rK% z&+OiSS1@$7*rU}K%KTm@-b&I=)&B+43|Q=EKgTWyhz%(q%}j1f*phy>*guUPU0Zt$ z%emRUQYpbQgR+adc}v6Lr^i&2G|&hpKfUU>U0`uvvU>W3WvcfkD;NH`sRTpItym12 zK&b#(RNW$7pM>2wt;Hs2XgIlr{JLOE3(J>W6F@s-jam~%1+OC_Is=(?fO7G2bHmxh zMpN_khYz06;bQ0vNqH-RCK`l?x@@O9xCWCmJ`1R-s=~OFPSkp*eK?w!e`!=Xh+qS? z3Kdut^8D^!K`4a;;VH#+Etm4Tx=W(I*xE3*?#iDq32*-SQ__aLtFv<+@9k@9YJtmg zn?YXt5kl4|1p$R(SC@xi8EkZq9$nP$FFS(#Nq8%@XTDfnw8vZkh&>*-loZSR_eWx~ z_HQvn%F5Wal0Rg*?g}>a@sV3wcg4i$`Ev^>oQ@94@G#zhy`d*yf`WpRElvmr3l06^ zBhJTXQ2+K3rrPLzI+$go^|n+HuI()G=E(uD@T$Zke=|Gn=FwnQ0a`^lI0lk{%C z#qIYh$SS28({KgdZUxOs!KE9+LlsA&lj#*SrS@B7;OUnL!&H7^9SptgCYX;BBxKw%dKvP*Dg*) zR1D50KasaRv^!^$Wn->|1n}9~+yY(lKHnLLyjK?Ob8X_jyn6@R1i58FxsE9k!e!8G z4YcewgL53L+VdX=Jm3RX6SwbhPvj#(b|Na(`LX7UzDFIGrh}&3*Rnr-d8wHlL2*Z4 zf3_=k>XSw`3$O5Ls7MvDN6#^_Q4_%vU=p*l|i)1__+_S83 z%=*vp_|WLb*w`wbY3duQWFkzI=gC^_$$&lh-hc+VhH+f)olcG5w3QWojpl1jqWUA!x1`(A&^PnfbX_C(Q-F7wj++o*Gk@e z0=zIL$=TKKS5y|qy98}32h7{;@6*^7valMkI*W-7KD$y^R55)BHU&BW-E>vg%4AkI z_Ap_yzX`*=2TYUTI}D6j79?F?Ilr640a%dRs(H=84?z?z#eU=Y)`O#n2{=T6d4Gu) zA9ggY^t-#tmMUMFfo_xOT*yNFq@8Ou*`dy(x^ayZT%6z8HvA<55aEPDB!e9sOKVC> zceahC{o|k?chD3OKeGgpGC$}qOBxxeK<(=>1uE5A~pFTz2+yQ-TndTqLe)==b@dyu$p+R--?d zPpr$qpzGt!!lxHm277mOK3hml*}9A#pZyDZ=lpvI%Oqx=)(v-G&a+#%x8}^m>+kQY zm1&m&nWKIxkFTIem2quei@xHUHT~t`hM*wE9eY5TvuL|7GPW}6GYH!fr&Xz`vdFW` zZwC-#1ZTYn`Nh#bFh;pr!Fe8e+pol(J;&F9oA)QxFnbQ7C zr)TA~>p+43A?uf{H(u7se8|c(Ak*rN=yJ%_&y{SleM3_5{yH%bsIjLqe2mV6tC1Mc zv-m#FYV6?bvJ195;O!v$JBST-+5T#3qLuAxX762?TXyl%qudP6wjmO>$uwXk*Iawn z&V?wrl})i%`~%H%s=Vr-it>NhQ0e*Nd6<>%f%pYY_g?Z9ch5aHTTF@~ZngXgo3PM* zlt{n|h?D?B^-1cNJI12l5edvP${h+=`lxu|&ulvkIw+t%JVY;B8b|L+ON?|eH5oIM zC?zY;m=&e@s&zEaw4Bf07ar>%4(mWnp!<_wRSlA_WWef$(x(*t9DG`)^5)!f<8$10 ziEWh&iqX+&FQYkCRa^f0!n>NVsWnCNWrswO#6!bY=B_STFR!sP_bB%5oXTHhLXMo5 z-pfK0utCHbry2u7baMU<$I5HotqB$U-afX*MB}vZ?Xruc`$`iRlsklX$E6BymnV1P zb>50Qwo|u*fFYisJ-^9(i3&H0!I zCNim=92|}l;n7^MqQ4B@5eFN4ZKz}t*gEuQEVy~ON7XFt>}n%jSE=StI+?wL1T#Ei zELI_G;7@Nu8@IQV{p5p=FaSfEp0(_8T-bXBZ#`Jg-r5!ZV|cl)z#xTs-b~_@!uKFeMDL# zjyTY(JGr=e{rBy9EShd4Dke6!ocFTn3p_!5+S@2k*M~#iE@p7tPY!O?PA4h}|6~wh@u7f+niT(cs-W##!Ii7QO*O zK>2O9!wDC!2Qa=J^Kz=smx^ydw%=^SNw)(p6K~T7>#=$7Dmo{@#0+^R3Udu*WtcZZ zp`wa_!18#;8>JpwOYt=Ch3#ugSqIN6Dv~ppgPLbB3n}D&pJ*0VbLV-}kaZSf7JoKO z`HG7PpqRZ3iIQ?{6J`wPcF3G5^P}f&-;w_m+hgLbPqe4*Tvm5ff1PD+e7*>c?&jR2 zvxo(|6?w8+c3%iayY^SFHvMWs(s=PDvM6CkQyV!SsCy!{#gcgWN(g!m__A>9@y~5+Rp{{J%^I5NBDj5Yhn& zw`3+rUMAHxs{^*gkpAXe((MR5)MoE)g47k1b~3S>%i9DCRgQpbnHiX*&aT6 zSX}b1{_Bg;2+(kw2><4>duW)ZUidWfHQ#N6E4JcRI`+eDW6hs1PvGO^MBPkx`jj{h zGed-0e5B;WRs&EwPlKSYt>D=HbsDgtzkPcY8_TYrdR9p2HNEX7*}wf&h0|ByUO?uI zF{A8~pW~d}z4pUYbm}*5_>#`tw~zaiTyX2Yopm(VIT3#Mri$rKu}uCqQc-m(z1~hE zWv`~+#(;8%$o95;XT{q}Bh%B$Om1JAepg_gMAJy=cgW3r@)(|-1N0(Ki2kIs)Gj?m z7x26|+6>oIN*Fcs3aK>WIotJwY;j>m%4NVFf}5~LqiN%=$B;tg-}TE%;*;Fyh_4uF zv@#Mb?l|1+?POFJo}@L!5#^Sw1=t8M3q;Bud0soo_G|pD&4pxg^yQBZ z#x83=jG)Y0UOIrLX+J3`>E3Fc^aJhxrN#AQ;w&i%FAg1 z{+taP@S-{Lo`i@XeZ&0h1gO z;6;hwt*x!4^IAlelcGR$(+^k9qC3^bVJRMeM*2wr*)f6JZ7;cKdqvalj{fX2Sf42%aNm?ny+=* zO92+^J0T~D^hkRZm8$e?>Md@`#Jkr&$?MiV>i6e=3!iBS6UwQ1wgnVT;_{gYRg+$`S(VrkFYC}4EAW@~78f@U~G*L|*a z7(*^O=TTdr+aWLY2YuWHq5kNO=^Fp9Plzj`7%4B8zoU`sR)Q7UK)+1v?AhDbPITs+ z)}3~u5h5HpjGWN+xJ=jaXD{IUkC8=Sl_76?k`&R@G(tQ$&;SsixgpwVZB6^BZ61^| zAKu4`o;?fK(WVow=A7cYdkPlc~;M)&pUoH>(H^V-bBc53^a72S2-!ZBWa7T z=3|k7?*~uMWPiI`c6MXy&+5S>)?<}rAv(4G9vK^BCPD}lv*b%?{E`}Uh%mAkQ{K_h z*_^EY%3(c+rS_6W4Sn9Z9-)(fu_5K&b-1Uz-1SR7P@bwZvZ~3B0^~gPHT}s#LNeA@ zi(fpYKRN=?^$hpbg}n}IZEJO1p3j^au5A?VWUYJutECZn1uegL+qltEM@|f#;&8HGp(db&)?{$iY;&YiU)swMx8#rX)sk#5`DIf4W}V&Qsc@vOz5S79K~lEF6~CpVBt) zJ!&RwSK3v2^7c3CBlIi`CflPgt6bcfJmKR0NoP{};*F;h>$vqhCdRABCsQ-0YR9kr zP?YkI5I1bY4s^zR?L~S2uke`d%);)yu=}4aA&;qyk}9;DIQP*kHrlDlwCv^Lan^pM z7$F=gO;$NP7D?j*Wf+U#8edOn`uQ`uma$C;zIQVYF|q;cV`aM6xh8sUPxbeA7I8~d zR8aVwm>tyjH5@$S(nvwL&gCkCoZT)7-&Bm4`gE!Nj|sxCY^3L1$+df;3vpH%w-Rio z4iTcG^&y?9|6mgr%*dzDuL~Cr3C{h@Y|zK>QfsQK=SN7(%En%1Bap5OTNJm;=YrUYd9lcIP#YYTuLiZHiuI?x@se{3c?A=&smS4oMrhienuQcR=?&lT`9K-{xFCBTda=gKq z+9jFMEWa_~@}uap9*tDQf(b>?kC3Y2Ih>-rjbjHnm?bBFdKx2L8m=ab7O=H9;`BDu z)5DOB@y;EDew{HJ^6$FF^{szqG~53EbiH2CWnsH&^6ig$zW;b(8=H`vTw76H-`Hql z{oqd5ABx|SA{;iqD!Z{mojR3{aRD5k*qwEJxPlUfe^t@EdifFt`d~>wvc&P~XSG`E zfo`3xQ-x>Iom}G~{k9`JrrPb_Mg-K&RIuvp*b^m2V>?*+Yhl|)^?9Ye&#r`=EG=-D zDXwa?shfNnI!CiGAvWF6kdm1hl8}(PCbsw4kCtTZ?mR;TSG3O>7Mgb-ngON3zK#(q z+Uv}Fd|Yq=Ku@`zdBR6ES&cE(Cgl9_k#4D%#~&p&JI{pyJFL_=hA(&k)1Mxx>10{H}wuEh?Bf|iyXq@=o~ znv+50YG|q-=}w8d$Wma{Zy6p7xl7(moh`(01(w|#Ub;(FfZt*yZ-FhAm9sXjE3P){do=g;B~El#%A_0JHbSD&7E4y!nQUuf z*v>I1uN|(7!p*uc`O9YT@;_se6tg^mcbg9~MDlZcBT-Mg}R~PK3nr*u} zT5+QXFfzRIJ6f9M!1XoKnumvnK1(}&s9N)^dopITA#ogp_`E!q*4b_Ye%)9TT;{tg zzUoIfd|ykN?;{{(skB?MqPqHH+@Z7VLoQE>7F18_CUKmUuo?Q~?LGT`Z$GNFM}jB0 z__ROYZooXkIK1F~Z}F#A8x93p5&K$R0<4y=UcLrb9z6ZCW0u15_9GM{6N8=<>0P^Z%o1k-W@Lsjpnow5~8~KYG450W?^DEB?o>qmBT)+goNt% z7phm09M;t}DYNX8x8@Qa8}=jY&VeRMnLi^V2tpDJ@ZNZvxZ8vZPoEIG z@uy3xQLk~at9`%8w`o)mE2g;nwB-y{=vrP(I3H~YL-y_4rk^}MS?~9Zg5}j!b>861Y~FtPKn`;rOkN}vb?Y1W@Vg4-S9JX5 z?c(1n(rNa5u9n9a|Li?F(m&dL@q}9kh@V>@MKq+_d&)TWTSZB_9<|xnPWWd4iYH;y zV}yoedT{A^`R*-uJAJb~_96Irmq)N1leDKg&-#!g>x#f5aM!Fnc9R?G6bnU@JmkNs z!|39(rSs~^Es@nV-Crc~5OxZB8xPmXitKk5F7vG}&z|Su!4FLH6K-)S zWa_9I(%lRHejZ2adBA)CxYcjd`SXt(dAEKn{OI3D78J(+ z=aQoRFJ>jYGDQ5qKU0k&`=AfQ^Qrmo%C%@B;%AHjd!cH->=#RM< z{)kG{!pnN{f0Gux29j>2m)-sLnVv5Y6u`(4p`pU=8~n3AAU}g9`06F4pe(V;ZF#o@159tzr7S;d-Y zT)C2<68ARq$n^5Q`MjM`3fOm$+jQxY=7NHi73L=v5W5?FqQc9SIL>?t+Cg&O;Kls; z;`{#Qrjn96nAjWDUbG!;N_BNEL`1}C7wv;jj!-vaRfw!p#aahRf|7{|9U=Zw0Df08 zXa)WOg#i>eUFk-OiV6ytiJndG3uN|?zvc_`GHh?%H!2~Q*cyeZZeH|{$L_xwpFejLxDG?X(WN;VDi{Ncdzi@)2u|4mJwQnLu9bz@hjdB< z3{VaoZ7VN2kCDhqbCMX-1GsYch&|lg-19Bt()w*mV_X2;RE3DgYP`4Z3|Q^hv3|Fv z1L!|&mXH3Ny9N1uXUmiBz_L%a-)SL>&+ zTwaocZfsRDb{yt``?3<3mC!WV^`XFq1+AY^!v z(LIB84vgG4X3DRMh_t|yC+PBce?P;q4lAg5kXS%#z{gi(J9Y~JorA+t*RNlnU0j@B zTx1Y;*eTzbMi4Bk3D2$xKP}I8m`Qvoazs^H8cqkd&Wedixvgcz%8pD-w5A&L_|n;2 zS7{_=1_b85mRgA^a6`;?+?#e2dF>f)gM8KdDm(vzp;5aI=Z0!zNug}*`{v=hV&75`RC0`gftAJ1 z_RmjnGU`3|yF)*8RK$W;MvquO(!h#>K;+)fZcozj!y=(z_1Ayr7!R)C;p#||-M)MEyT?3v;@V67yQ2X_|XKLxk6 za~>QfeTlT33yptU)0M%Q+}M~nnq@IudjV#`!?pR>6DXM<;6{D?xE#w7Sm-h`GIVt6 zXU+tRGm9+jaV>(65=Anl4OA zJfuMC&@WiNr={CK-r`~fqeQrxb`)+ZJ@~u4Xko3S^j3+pEqC#FqnFFVy(TOmc=*DU zq>dMX!}}4Toejc#l=~JZB?4c}1=6XGPxr=@c=>rh{arI)^Unw~C`fOIz3uuS3lcwO zybin$`;eNdim?&g9z$hZ3bxB{rQB7Yg!%k0%;fM5dNpB^9-ha7Lo-?X_T}x~n0C<0 zqS-CE{lTLxQ}2vfh?(Jp-5@9|FXgTi`SRt!=qTRH^Qg`EjUjt%Xy8kK`LYKTwKQaH zB>+Um3Bk4O$fdC~Fc|D@cta5#7ng3??S}Lt@&IaDOJqQx8^uv|y%Ig5+$f9~M-K{a zUfz$NTs*XV0$8 ziutwvRQ+CIf?MuCE6iBiX#>XpiA zA=UU%t_*yfRL{_G8)0Ph*BJJ!ucp7QD=RDWQeTpZ5D^w0>CBA-2`E3`9J2_$-p0jd zC0^>7Hi=$A!qYz;iSOQdQE>Am-F%|I<&>HR{t00O_(qxxk%C?N;IJ);*7fW9=H?&X zy+fiRIK^WrzOk{p3Gvu`llnp#D^RnOz8kKq>OOgpxhY9A1cKE2XWvv;e*%&2;FHxZ zbIaS=Q#w<&iM43m86~R$K3dt@&di&O*o}{{USd&A*@)>yDdEB=PzFFjNGSKwGpy5Z zchS1+JmX>-eo#iay6^<^MYrn1Bt`awg;L)`kB2_WwtSG|fE;*y{MfUL#oupXF+|z_ z=+QRK%*nuAMYakaFT=usiGud9|PEiEA`nt?pE zb1MX6<0$N-;4MQf`1jc>jxC!_gtdr?X)Z4^FiadG1Taz!42ZwH`r+0s>iIjf{Q*ZH zX>854ulv);!LRY<{RV$H!dT#ojp^8CtcM4Kd?Q|R$H=Hr*j!KV)^N@d_OUtNW5r+j0zSX3_HiRp>y#YN;+NUcpbBC!R)eDN9<-#R#Dwzej0 z+}-x<;`7Lj^Kx>Hot=K7qI1jpz)HD!Gv)tL_TTYXxBveDETxbTl2UZ0L5!`UXQc|*H8IRQIrKM;V&5bR=#Rx{7hYycqbF3Amq@)CS z6*jtZH*W&Yflw5)qtw*YOXR7_NjQn2bwRm9wI;WL9&N#n>gvxie{^r(wzRR4fAYi^NKr<{fi&7#2ZL&)$stlw&u8-D$NPG&N0i62?veUlUg5~q zERY-@--QFZHCYX++;c%nvoFzA_>_QPUtfmK_r> zUYGp=9~|cba>yDR-$aV%AwNu2UVaJ3Gay>v{)e`V=Khco2;%Nk6j1_(N5bj~pG@(t z$)Q1g&#mH18+ze!_$OVbx-#-;NSjktWtKpG&?JcIFuKt`BM*vA!-PYfr zHT)jrIbC@Cr-4Bl@=PDN43(6`gWe0Bz#&1C+0KkFPZvkwsg$ZLmkE%PNe8>ExWg0h zwYD2ACkX!6AXvn?51NMJ%5=}}eUuZe$zE5Edw6-d?0Z}c|tyu;pPAheSt_tcVM&1WV@Hvky~obuphI~)+-kxxX-%B z*l5COTEtN_m{{;S%|vR{g`KDOD#Ho+&>JTo1H&q3BB!{+%XdLV58paXSCf*2dR{w$ zxIP1ehi;x;UiM;SHs|-P#+$3x9@}f<|5!LUv6))NZEeGUhIJUIX5@7LwfcoWwDS)!+k#Rx@v39Dz`6`w|91)mE2a8 z_nDPU=n9%N{H5a=qpq%wNZMc}uArLr?!bRBmq@yU+f6dB9Eb5zYdgOrgM^ca$?7$B zk|);I?U^=dfuH^o?O!y$zq`Ji!?iv)Tp!X?+hf|h@v@4O)8YVWan~^tqBW}o!>(fD znx-kc+Q^m#S;NWOoL+Ti&2i_w%2dD22D$w_A?W^s_QuWY5k(JwO-G16e=d^J_ie1q z>tJw<#2IUWvjQ7y@u{Yr>8(w_9UnY^B00xssdM`R?fG-(A6r}BqT}Faja(7*Aerqc zVc4?exO#y|`z2W_wk%?fWGZ|xr?$T1Pu|lX=Zbyg5Q<#c2&r#x0kaIb)>T)WO$E&N zasM6}aL{r%E$S45krXDBGV`mT%WM9iyB|xQEpKnE^a4i6dAZpF<5%-5Chhl%*o;NK z3I2Jd=h9KpaBs1HgTbs1gN^Zz;#C}!RQT&`u}m=&KmD=mAGH_t+V!PgUpWom=rV1m z>SM|;cB64^55HjZv~@B^PW@=R#KXGJ{~@0T8GDt(W*;a-Nd&qi#(l<+KQQ>+V$|LL z{bJloQh;UNv>)N5zu`Jm{w#3mR!V~1+OH58rQBk`z?aAWT5x!SW_ED!JIK!2WJ?Du zUQr+Vov(5(@ebIHx#HUT@^upg1^m&{QW)^(TI7VUuDY3u9tT}V%3%H{1sZFs5#D#Y zXAPTnoxj^6U9@r9{~EjZc1XqF>E1k-{%6kE@!4QpCSvy{Fry`NYCjFDM7Y4?{Jb#c zpc=3N)N&uq`Rn-Cb@#~0%N_TNdYyN$!Tagd@ObB`k8Oj`D_qPvA^D~*ZX;)TyN7sT zL;$JV;DU)@P=(SxMn2R0YSOSF3@7#@38+(gsm=K~> zM?ls)eR}um`kvMGeTPNzVYzi7JJz+Z(2?ZGZ$jfm&F!|6vM1@TyBA;7VJih7nUi}# zl9T%i`I?;r!~l^JPVDHl>swoEYvGL(8#^^VPUo=ZdGQ$eRF`|{-(IhxhF!%@Qcqtl zPo=SGkHk-F|KCTqx@)#kkL@A535tfAdbuJx2mc00F*jrn#?TKA{xR$G%yZ)6mze$+ zC<|pe{JT5~f&)TWjvV<}OEGte%(Nqujf*SKJnGG01-0K{es#2|g$n1T6(u(>v|@Em zi5?f(ZEM)azY2S<>1nfpou#x=^cCBvh4QqT^|p(TnfE;d{~{;*0`YGz_ou|f#5k%P zp_WZ#+q!D# z2}9$5U^){T`aW`Dc3_X`e`qM)ufUm6(jJ3HgBtw2eZB{bPp*=?y+Icm5GU7+*-US; zG2n}-&b9PK1AeoTk6+qS5HemF#j*85u!iR9SV`)0?jHBe{^WeC#w@poWv@@q(j~?u_or@tm z7pIW-bP9*U;qvU5Kc5_xO#i*uv$p0Z@EctChDgaEzlM;aSH$%XcJ zWb#N=)}$o^J@*!)2E6-$^MbIj_Yr=RDOQ)^p^dJ(pLKN^A3qB0C%~xx%LE`FdP$uF zefxAK2YzkT_grwpb@We9FArVUVx#{4H8ByB6&@aRayjaZdqtk_ASq;!isoQrOB)EP zcBAzlec}Fl2MKBa*Q)pO%qY?HYD3wutJzYsh=@V;Y0M>ygD@lz-kG#gl73OjT-kpY z)-VRHZu(wtb;IWF`LMe8E~6{-n7h^7Pobt_rtLiSv$J}pKnYEza{)7tI2JGXi)Z6YW(9jcb-dzsh zI>G6g=K8WTWbL($RDy!{kjo@TipJ_5k6J!Ut)@yxMTM-2$}zQwGVQfhJMI!gMQ6{@p>f<}G4eGP3gckg~`&Ai3X z5+iMeV1=id_cb+ni~C@w2{Ny&b1YhXfGr!FomKjn{x+pvUT3W9vCnTS*wxdmo*{rI zNI+b?%OXde#%~y;sPBsaEOu-aPIcNNDylLw%e1SN)U_CW0|!TAM~7nJS-i&`JDeqY zBQwfx5y8L0N3p=gEs7>`1 zdL?=nm!iKlE)b7hB0qF!oQrEOkh7c+PHDwxr}Yc@9$7GI;5Qz=vv;qR%${`+OS7{t z@OO#YH5O}??#`f@O-oBVDynzK;?^GaNY=)pnZ>aHtP|K|GR1(?pMN^^+Ds$QdZzUN;SNF|Y`T2=?x$#5`uYk>TD68>r!R*n zU=J~^?$6ArM|!#hH{YlWRWS)3^yQo1EhMB8zRixk{ZzwS_JG~(h?paB<8sJKQ9_h# zN=k2mepEm}tc=(2yfkWrY9Z2^xJy#xWj$V!7PGgqQZyKOf`v@WlVU55hg7R)+f}u+ zAU&+;A=5E@)`rcwEtsTpJ-GKVE-u5M7m4zh#618$8}z*y9o_qj|DZuA^;DO`#qCC6 ztAlYL^4u?OSm3t+E?64xh)6sqMNW7d7;^Ne)efB_65m|9GLv=c5nyTW;J_l{ zIN6y|1SmW^szO;+^=Da`P&GdhM-F9R)(%i`-~V>%YTUl)!k^y@Ew+oaFVlwldI+=9 zTLI1Qsc+59&R*3rJJX!~PlQ$KIGdl$RThk4kzjJ|`gIJLYHzEa7Iz#P9bl6&O-i<> z6zd3%sjd8dPOpAzDogiX>ph4YVMa3_)|w-m<)U=ljrOph_B%&X)zcB;`n_OdQ|+Ug zK6RqO0P9BjD$a}m}vU{=1rQbrF zMm;!~Y45HZ9@ndGC%&VlV~y&cnfVeMtD(G#tfhA76=FERiciyz?dj=BQ7I8gktAmD}4 zBoJ*_mAe$C%uv=1>SK2gxN74WMO$kl_ae?$Fogv(!Lf~wE+9At#Rh_60g>WST6J`W z048m~C8?`YI~5K60GmHj!o$Jt{-3roNp0A_4Em4zyZ68-BXSez%`?mQzlzK5sS=UL9%H?PZf zMSBMEsxW+s{CQjTb4nchey?Ar(syGfvJn*~G;#e+SXdC^lt*H`F|6!!fhoyB+nK>} zK+(8NPEP*=nf+}trSe_YICx(;dS>hG5Ue>s(|pxmipGKivCgW-dTb;m1P!zlNd;VXqkw0CY%yG;-LLIMgjhDtx52Rlp^QWt; zzwffqUZx5-MQ}?@1G0TiIoSLz>hL)i8GcHBJLZYG_*vU}ZbUB8YX&k`mW8KZilm%`59ZX!td zs3H25N6ogoC<=@56*a|I{qWN&KaI`I5WXj+*gh{mJfkXo{razxl8pzBB|X^=IG|C? zIxi<}3?(+RrpMw2J!>G{{liEAF`xMxzzz<~Y;y9tD1JFKpaxq9#IpYzx<1gPTclaE z)i#ns4er3luV3}GO&tH#=E$br4~}YY=fZ&usC7p5(}#YnZ~I77wK+R=(2UJ_8=#8- zm1@5fTn^zdNVRVtuoA=2LKn$YX)nD*&M{X0XMKYe3aBR+=FDnFxHvdC?Cdk;ugg0? zhjHo0po|}7zF5~cW$vR#lZl7+P9*~L)mi3!1y1Yrjf5AwNPl$M(@C+2KMfBEm>8L; z`)i3uv`a8qsktdi+~Iwc=Iqe*=&YbqVMOlGVbLe=;2kSnChJD4dC3(+&#uf2I9N9S zmLs>vl8cLbwUKZ8UtfbIS2&fQt?nBW^VToxzU7Vag^?K(0ll;ioeFQXR>yXMP~@F@ z)%?AZQ&2+0deXOB_@_n>XMfEE#c^w0Zu?k<#_Wv~b^ZmEvNsm{x* zxqMUmHl0*^UESaMh-};B3{!`n#owH{?sJzh>FerZ(i${&jEB*yxtaCYmEd1nf2N7s z1lw4hRX(dxP3u(YD{9rk$@`u$n7=)_I(Zd^RHkX4u*v9$rHOl5-pG?+Jz(=-S>u@h zHBDB zRZ$EzrN|?^JSoPSxww=1z+FH@4_d9`zvNx#*qy_c1TPRCA5(30z8_m6Is!aA8XNq%)f{fwkAi;Qwtm;Uo05 zirEPXuPg4tLT+2n{HfDRSd5VqYMETO5rpFDc{}k62ikypYkfZEDJn)Xv(h3|zkw3V;I@4X2_A`@IWVHVyzBnxOQME0m+#ZU5 zXWV3B7@BhK9f;NSqgj!)6F6JfzE3+69|>MYX4Oi}#{FByU3SH*;9DdD=SO$+@bM9y z+5USyn*pfwe_#LqBKrLIqyHoJ{QvV8ieH7iop9%$WF;xyQ^Ih3SA7ccZ?Dn}2(__T zklkio9!V(U)qSjR zv~@+hV=of_4Dt1Ue5U`t?$0ZJb@LCXP?eAT`XAcS{)bP=Q*3Y3JU8}RdB*tgzdwcl z^pTN2`|nrbYsZ8C!#RmRoBbcTiuff4XFG;>m`<>EA}A!}I(hoe|GTh@0Xn5}RZ-6&9*7in3N;sH_2zH>l0z^E z%}mSC5OC>j9Ekn=`O5$Y$*k!QOP697A>z9TrGB5+`(}IJ_->wJRvH~S@&U^WkV(ra z&2|l{^3UY=aLbYZU}8SRJZG1Wxs2SsZN-BBdyD;fyLQaR$53dA@F_9e{X!NTXE+QK z%m|-SOmb;g1W{x1mD}|C5&s#y92*|8^k2O-VpSx^{Ph}2_A4_+{hN&;0UVH2DzoOc zX6?|aeHy!!GK`I0_{q?R+~9;ghaJv*bYKV8uN1D$yF0$&&GeE zbL;bcf@Z6ORz$4%Vyr88h8I;-a#}@ed;Um!xj4M>cjbTZ-FnTnAa5f4R3hrP0W$bD zD61-Sa8XEn%G6{-H62*Qt8`bX;OWv~_fm@S_DcxoY=8aBhCNc$WuWOV7vo0sqG0`KNYngcO~;UDX^fO~X2jVfP1c+3Br7 zDYdk;ULB%zCh;cP!F>889jk9_s$*)TO|>(|Q2=Zzm~k{{fXPPU^J;VR{7J#XdTm2|lehOPox4F}iW>Y5s6I|eMD{ZhgI zrVl?8@5=nu(jx3K@aHE;JyHYFI~}?*4L4IF5GIJ%^WGyL;*geZqHCBK8++NwMP`@4 zn+=(r5^O#<)nsdMs)MqP{q~#kJ6G3BIP^rx_L#PR8^a|>S?;A`bL*QkKT6xbf_RKb z(Su-sWct-_Yn+TJ-wLnvqoj-~_FGP&!Ma~gvU~pjxB!k6vuda8FX*>`K^|5;H+YId zeqq%y@y=-mN`**~!SO%yPe{76f48)_Q&Zc1%ZgV{a;LGfo$l4RH5+XBB2++2EU2a@ z+rH-6)~2d}mCN0`HgmTpa}o@Qwv{DJ5W0Y?+FsuphuaONHb5Te??6HRWcajt$ODv& zg@aoqC*nB9M_4N$Kxqg)=QlQ)3{n>tdKBZCtIqka5{& zxM4k)_Nv(8tM2JJO86Zkop#d8MVRrB{X(m$!Sv4lBHN+LRG25p!gKpgR@O+qy;a=J z2#ojx!^4lS2mMrLETIkETG_rc?SvDjt%xtc`%uRvXfl5PzM`fEP;2e(P}*C+0^O=d zr?zbmoM52T{gTi1X+x;8YyVc>`)WzL<6Vp@fkrL&mT#6C_r7_z^gBN?_SVSpHTi_Q zu31@srX0t+dsV+wnpbvpVV(AW*}cPpjm_EZ47_86%$3cJjTa!Ih$L-5r@B0~xo6*@$e(Yii;oq`lERg zrXwXx@XCg(dwrxRRH%<0Esn4nZ}GIHnclj!M&swO%`!qLgKd95ft}pEt-hMr2pG`SN;pPR{WwZ{OZV_M57bQt3w_A)$$uFYc+Ss7aQl(=x&M#X312v51Z0D*sbc%{bu_%)a~;== zAoEX3=7G;dL!{4*YuD`B*bNK~U%lM-?HeB#C#R36r-xVGDYcI=F-I5$ixI}BgEV%R z{^B1XymZ`V@jLh*)73Xd8R-!qRtA~IQI%)Q2HgbY2~Gp%^=kv}ilnYhute4s5`t$n zBr1j0W0s+DxPS+WbAQ0%ArK0X<{c@)BjO;4o^x#~*y48rtUC@MOJb%==x1#$+V|DT zjs&>$s*s*P-?C%pKk$wf8LF$Qx{6$iOt$%C2m~-Y~dsHPw+o(TsjuP`f)IgatXR=gtj+1j*(GqjJbUg2TcNFiMC!2vVxLpdMo0 z8LKUDc6bYKO<4N!=0M7 zrMczkS%YI%r^3p#G4g(-``0dGfo7Cez`j}_RrxGml4P3oX#WoY+6T`(Fd6BS_;7i) z`tBDV9_~jpJVl3Sm-@U&)(E%Vsi=c^S1_KR|JxdcUE9aBId=&WM!8FqJ&Cd_7>@9S z3NbfIrni#GV8@873tL*WUYY7>`K((b?R9XbBX34yJ-T%^nL!$zTU@;UYQ_w0Bf+5L zBPTcG0SOBdr9HqUsP=u;$eV5})OmO-{-kUWjJ$l-$7HD87eu~no2LfpN@z8`+ZQIt z<`$z4Yp!;1aX>o9n4To5*8qBxHaGOEKCunHz-w*5Q#WCq1Fy-JueQ;gf z-oVnPHJSO8{Nb75VayE9KC1li`t=k@jr8jh!%C@v z8%9m-xi*6el0LvOKt?`vPVe{fRG4lTEK2G&2FAzFS`7=Zvd;Yc`N-|o`tp`W-V?nT zP4+14i7%d$hG>i+o!ic0HBNp4X@@Y%2Fa%qJQe`QOHVG2j*N&JG#11E-)5>49HQ?? zvqf9Ayl7I&jViP+?UeRVr4|f{;Wk$KY9BP!?#RJNdnZhZC(7GrTbz>UY9A_OUe1jX z2^MRJuvO=H3m2_ab@g*R{d;z;R*fH_YchuWl-w)$%5f*TTztk$ziDJ>2sXh8-0dU6 zj{qomMZ=n_TXPjRSx*BPG{`=>HSejI1>y6)TL;0a`Hu&4372=nd}MVk16J@puXcC$ zK_hEUNt~MJoW0=u2T>GvVZZCr-``=S$ncVaAmhstaMFMh+3ZtYk|uSXHmE&M2S$q7 z+&JzJXQFDlMuE-s>btc~X^Ou91OSVxjlm$qL{L<_jRlQ!;0+p9@%LND3S9U1Al!VY zMx5~wr>5DauV&U;Bpd1PbpCPczbh<_f1zBcmThKOn(}N%OI~{U`0P7%^GJnT2a^tl?BFHaPPTut8eu8gE`)dgnmg-Nep%xm zO!0AXWFSq?^g4iX1dol{U_~NH_x!_)lEB+3w?4zPH0$(_BJY5j=BnSxHHs zi`Y)5TK+|RN(S(jqRnG8X+EGxEv?K{n#96x1B~gAPnZV5@C^LL(e4}>cj^dGuyr0j zjgXRc{_O@T7vabX9irfen0XlMzw;E$mHj&R*kdT{77zwjx$r;fCW(YyprtC7>h5tyb`FwOKFeLUy*yKF%*O~0<+A}3d* zGb5#{HCf}R;0KpG*48(Sj4%>;MMWt?uA-va`)~cL%DH%#QJt2rpC53}ALu)OTuxP0 zq`bYU`v|-9u72YyOtH0p3#iDwv`J1DCO? zAHI(ivp-BM8h_?L@|C)Nos)3o2?MH+5~jJeuLlWkcpeK)Iy_+@3B)=bbv$n!RmP0_B#=PbGE&#~rX@;6bg+-o_o472rPDNG73-I%I97;8X^3r~7 z4HHmQOfMBEnX{J8LtzUR&v@g=zGq+Q%U{>&5!?U+!P*uy_wn&i9yRR#3fgJHs;Zq# zv6tO_L2Lu%@r1D*4x#-y!T%;M_Scue>b1x_`C@;_(8dJS1dkvg2Gw z7~WHPIrf29E7N5~1vj2PedX)x8yRVqY;~|%M@5i<(XYa3_E;%&Io;jd2+pnwkaC-S zz5nvk;v$iBbzrSF^OzeTVN8>nnpxqnPlR^il;!kq5#c09lX1-Wv3&dXZFM9nY@&5j z<%`5||7%;iVBto{QV?pD8o?f&Z&+y^`|*NGp&=9hhcXsSX81Bz8r2Uz-Y@lik5+K( zH@Ndd&IGDrwJ)hxnTX|30@hU8D3DjxF~&&tTi%kvNjichQ!LNTud77rm6w&<45NAmKxiVV2wOP0d!G_x{kfLtIpRr%_gKz!?y+xvCT(7vP{QQ$z z1Boa}qs8DN^WGQ?8ahD;e!ov;4!}HA1h~~Ro*`e1-2ir#>J{YhtxFC%Z(T1`KP6KE zJofNgEBI_SKRkFLCfnx=iPjF}H5dP4MnrU=@FRoN-D(8M1T5JHnPxnUOz81^t5(8 zlVxy7d+;f@zV~P+-vp(km~Dn#Y94|z%Iyt=Qqqdx`$q9;g+C|d1+{9dS=;mJCOLn( zvb=mC?d=C!e>7C~OGS!tLS6u4iQ9MXz$M@BO;Au@oV@XH?_UR{r%y9+B3~l6nP}Dh zx5x=aK9ao>60Y2{+HJ+~Z)pN1+{1%|bw^&pXcd(O+AP#2oBx*J1PWK1!{_wwJR0&i zz;&-#V6#Co3(bLmajTq)3Pc)K15!!8zBiSXUBD>i;;N~w<<_&~L&BI;C5StJr_a9u zCC=?llD+zFousc{{rH_XR;wzehy-sb}UDoS}v8McgHZv7L{tIN%YsR*w}n%tE#K@rUemH`L#aJ z1j8=uD76XoX?pU^7c7ba%^^-vtI3;H(tdu3B0AbhuQpgjzkWl+tERdd^7+h6!Fltu zt}B=yjZa2tYiaq?p5}GAsrYWAPGVrYPaE!M!^3gp(fDWt!^BP6Z%IpUjsB86n+!SL zz4etD;@AWNS`Io7Zl1cn3=9oGX|GNBHEezf_a!;xqg(zN135IEKop?V(N_2k6 z`L3a_rB$z;I@Fch_p;-v-fVJ|%a(u5->unFg}J#E3Ig619)e{6rI-zm+)cW#V0i#Qokoya{ zJhOey*ngER?4;#VHL{;*LeE>pb9mPLJsW${XWh^QP_9W*GPYj zr5SWaCEvI$vPr+e#MBhODBWzcT*tpc_n_|xulnKh$MbY${gT53e?G{m)=Lvfr+H`z z_#7R*|EN`@A#bkTnB_VN!p#_?B&=T5{I!{+tsK}` z|JIF(J9#v^2=G3haxTwz1u2m{+YUxP6FMZwl&<_d6UvU~68$um#hEkpa8K5)KkZm3 zWn;51tj^cR2eVwkN0qM;K!rgo?ExF-4LfGNH~Q>C9#_8W)rsiq$Ja-^nCbEI^A>aM zy;A?3kaU9XI!?o|FxfP{X`DMSv>f4T@9IKU%?Wn)>VF!ji2jZg71j(-PJ)Qp)Wnj1 zltsrIBm>w#m*=C%d~@Ry&N8@g%F40{3C+|;Cg+%R zI=UbAj6v}mvOp+r|Mkn2wuI`#(v!NnTDgV!`4At-EkGZ|y8tswRW%f{8rzw2e$E%q zMJik09)0P&xf?l5Ik6Apl9C*upAO>XLif$fKsh)#7#mX$_3VHAkB_$vwY6`1G1dhJ zl0jc)5DGils=B(pR8+-G+mL~5r`om+C>}8-Db`;Wn|94+p8K%>`N{0vocGq>{JHfp zoq^*eX<0H4gRN&?o{Yzyx3u^FIA@CXvF>d%raR_FvZJ@pN+GhQdQvnmtfo*XEzN`p z`A<~=KvJ1uT=%3cG2t~pwbM9GoapYt!yN3VkdQ>c`bI_|b4u^MT&8goo3zBfHzY!z z4l49CE-z1i5c8&#x^|3q^`9LVZ>z!O-87%i>%w3OD7RXcR`Z6vBsKNnYvdkY3c+Wm z)=gcuKgGwlz2SAGKC&Srt7J79Z0-^)u5>0yGtc=&N&AlAEDuoaUhvgAXweSeFwSRWo0=D&k`ra4RWouKFs>7B% z@39VaOfcejywLhwlQE5l1+BZ4mCd2Ec8$ojZTCb$nQpp}|6(P!G9k9&=HhgV&Q?Av zlFTIC{YsP@N%CEeilhU+9JIuAJPuzsH#T0d=xqS}F zNr<(?9d;8VXn zjot0Y(JB7&$)0)vc~;RUB><;7zL%l22c&#NAfZV8OcC@oYG=FXxcsjnbU7>wGEIdaRN_u3DZ&fBS)GF9G+b{ zo@4pXwFLK zS7Bpe!NJ30s&0G&U&Gn6vXUDNm?vxbi2l6aMeW%Y2$0UiG)ZUh&q*6IGUur$ni^-N zD!Xgtz${=FTs~mi1x8m#R|gV9KYfZ9ig~gmV)N&9Kx}OCi?oZ!4E_!UNBURwvc$>3 zCAzx$EMXv3nL9=8xvOhobhMU<$&p7z7cU)8xkL`nms?DKM<6bc;;C!v6Qt<`L3YXG~G{-Z~3w2WTH+B$=+U$@y{D50QWTOY0h zPv=R#N(en6(!20<(M|mfP)q$U_ijc;PPIz`kP~rOt{oi>z8(;V2bxEj@2kVgMc0ep zVCR#$mMY^{oTzjP@s$s~VbMc#pWdZu>eIwT~+n- zMl>v?5LS!$7DyV;KbhP{Gi4Y`O+gVRxg7*|B+nS|L=oM9F!f44YjyPvXr{Ne)*HgZ zyMMfhl2kCjqZPm|-`LV}i5wuvBsLvnWKy}80?`agPBzVZA|W8J7ioWa)gR%U4F-J!cte~OFOR%qon=u|}%pZ;iR8995WI3*V zMn~NuLJQ>Z8=~CvY&CB+UKE_i@PSu#ky)(*&K3jt|ekMTsz*~5rrCuiu24Fh#%WrcW!?ev6V2^$hHt6 z49p4jiMjN?g^|_rlp4ZG#msw2rA-*5m!^BHHda$7&jsN5z=o3zwfu75;?|}E#wuM| zD@t1~0#?I|z>Fz&k$POQTpG9WPW}2-0agLMTi#?O&uj_XD&RCj6FNuX*D+&3#v8dn zI!;DmF_@~tGPxl@(XtP;tng&85vBC2jYXb8s37J?$XImpZ2<_ zY_zd5cV(CkHm6$Avln|N98Qh#@ZcAn-$QtGaobroi2H_f=vh94gn8W`T$CTh8Zm6vV$?QL^-gOzgboRZ778G|%_&Bu8CLhkue zcN+98&>gceP+~xE_Uu;LiE`y*{U|Gf-o4Y)*XP>0e_ASr1EEB9y}c>9xmVXXI2t}D zC81dPywqs(#4mM^wBq??(b3#f&tO6Wly|*xM;U3x6JPCEWbHaQtPc&vPaX^MbOH~d zj`l>cIc4reA(pOUu7D~W4jSPR2ksxBoDA$J-hpgL)u*-w3eD*lQOQWMhRB(jJYr}} zoFqV)QmJL%d_3ofy+}3pfZ3dRa_mR1YD1$Yx{jr*Y zpU-u5c}9HM77}M>`gO=>m#dTmHeL(GA{{ha*}5XDspl#rWtehjp2uG%gV|M zX54>%RPqAeS6V55h|Bw6|J>nO*u_E1&fyS>og}?1-9&#Rl4mPBr*}9jHIjDkYFC<) zXEocE$ct|iU-=5%yT#ZT1;{U%+ZEAH+LK7!T`f~6BN9SL`ZbDe&ItFH3s?SG+8=~$_LnQk_fn4G*R=nwcDSsq#3L*k`OaD#zX zy|bj`2m$`z3-8@yDLCtWp3-#WJ>xg)rob3777F-cUR(U8?j8+J%EGTZNgV(E&pU|q zr2jQ*L^8_;rBJ>kWoDijD0K&@!6ITkilZX?6Pq5l5%V@)kV zK5M+Rvw>L;W=e;`J{le#jN=?}0%hvB|C=~NL?P3#TqEzyG}X7Vd-{AnXU=)~w6x-j z-Af0_-OQg#QL~8A>KIM59u<%mGV$@7Jh21(#etHMqeL>`-|2?gL+jKq_IUU1-7z;f zmqlWRjHAMx<}${0Os|*@WmrEpJjp1lt*wo0Me?fRoB-W3+};NdS&osn^lbt{EA3Ei4RnPQ2z{o}d5S+>8OMtel+osoM;K z=gwJKTXS%8dwY05!tMDN6H*)pP+HLVp%(jc_YSlMI1U5ezIAdG`B`2Ld|tFsG!Y_k9UVZ zzf>hMvwpmIn0V)Ndjc9b%mw7wyGJOLm*W=WU1esrQe8gI7E4aR@ALJgcH?{em;#>=@d>fTXUO8$ zmKr-#>P|ok4qD5DLHBMaVt9Mw@#_N)Y^P7>W@o$gm`}2^h>^oo55EF*06Gr={NUq9 z2JxBrhdK~01I{c?+fUNS-BPe)Z;JSXm$7jvYtcG*Koux?g4o=y9N%A_4UK5c03}%o z&C%bd60G#MySs@8Y=@?or)NPy*Zq6Y@7DKAeRVmfdjAR?l;D#ovI6Kq^Zi`@7_%g3Dn^v{F!RX*vtfPj>9Z zbhSQwMlHh<)Hb}v`ic}VXn6W`x0C_sESFzV0ZoLd2!7=&H#g5RI_U&gSB;{7M(N7j znNVg4TPnjKL{X7n%Ahx&6+R8&;YR?Yfc8$5k=cx23Dv`QKwWt4?Tun_ZEYmy>Qx?K zEg*0>ERDPJJI|l+*9sWwKrmlxgT>3=1k#;(oHDw2->*T<>8Pud ze{2Q>YJGh@)jbKi2ec5`PU|Uh?1L5;ka2RFhX=V>dJTK1-H}#LLruLM$pbGCAY+p% zk4#O=oc;YnLt6`-xFA~ z`)rUs;x3Adb@P|Q^~9XIZj$7g(Cxb#9{hp=0^Ho(k0hUDtM|H7e^z;MrV-F*3P%%R z))^4$#KZ)}%NWAt=NM=~MndKpGhDYGZ8dTeVDj?P5)2dDfnC^%^$u0_;RLxVT?QGY z+Z#+vi(NOdBZoox{QkX}kx}j79L-S?Zo0%>WczY0|Nev15Px~;E3$noVjQqQnNm8; zvNek6E~--R!%Nad&IL1lE(x!PN?z8$eGJ<&=u>(^(cRV_L?xNUS*Hko{2N|ad6}J_4LfKn>$->_d9`?lr)$4<1;}H z4q1}8WO%*Ui}k+aq{sb#7j_W}Z0aKy80hF;(S{1m>@lCAR){=-gUGG1Ii3@U?Qu5{ zd~o%v2t0*z%#dXcmdAK!Mh&{W{ZjbcU{U5ud-%MOojdhZeYh~JAdVh5@PZccO>aFs z_LqLZ%HqnM$2@d5*}e-_!`**t?&qi@gu7YPc3IMLXqBsepEMJ)GS}|AUi@&R1sepH zjLl#<4}w(`0c&;C)&^G$vckx)X4AHaY>)fmbWdqj6~CBR$&VihpFerwf}7UX=7K&G zyNJm0pRyXaH@{-tSD;i75Kw0iAh^-d2i%MlyG%Z?um=7CZcFvr!omGgc#aSAYb(pi zbpy4b+P6eTIb)GfR#DEeT^R;i3DMDv%*+*hROJ`AClxDvoq1H5zWWrQSD-?Q2(k;X`Z0xm8yPvL ztpS#e^zrCFvb2B0=?N!j$!U!mSJ;5FQI%HyDzT91JSv+eMhKU{z~h_rxd^PJ>9O0sfOGGo02lJ+Ey!TzLJ5765rdLIP@!b5#B}bX~UAYzu5}ap{yMFyBp1 zBO~15I!#VLQBS&mzaO>|7(%t*GtiZmen|x*2TUhLtqmHc@4DT>W5OJq znCJmskenR%y78k&))z0r$!4dtq8sg#LvVb=({jwsAQVPRXN83B_AewGNPexwL{HDAGx%OAdKUa>lRJ%j50lKUq3=GQ#LY86$4D}J^@gVx ztrSw#$X=4Mio9>|!Y~aQ>p46Op0waCC=iQ6f^nPK;`}^HH{>S1C@EzcJ?O&LZ0`IuPKDh*3932B2vl+gCcSQ zj>|Ja%nSnGOx3<(BgKpqCt^^`F zAg0Jrrk94nt@cXq>;0uACC90cio|5kG3khD|2&AHJ~WI7D?@PyrUE&^W2jG}iAhH~ zNNhP<%>L~ib@ilnMrlQ=(r>X3TK2uF800)Ct*Gus+clw<6Ss74=m1|iyh*ARPqMRf z$&?k^tK6YPz%R|^SNoW`X=e-a#c+VD^_^|#!#g3k;RxHjmyRlOd`mHFjYtJ;!z!l7$3hfbUj9nU8k!9En$a>8|~e@2N2{^SvlI@k3nyQ{em+G*TiF@ z31K5h0p>lqFi+aXP;7qa`rF&01Q0hKGGRcrFsgW>yuG~qFkx|0Wx&fvLbJZ9iIi{$ zZg%D-5U|D>N@x~eosZLhscnzWlQ{B!nV5Ker2gpkmV?8UD<|A9Z_c>%B_w=HG~X{( z2`)cSV5!%Efsi(t3cW*n(9-#T2R#iWLW>5ECyK&>*yIS@ZKNjhV z@^a2`Og3GKPZ#LQ2{x+V_vZg%A@-f*Vtbf~u(D^xAUZQ19(i6~zf_%VTew}md-ppj zX)-#z8Z9#sO)7)_`1`13xr*qVRkX1Kq4mFwY=di;bNt$XR*{QRRR zsiBdPfRGRn-5aJ0Pz<&Ec4sU)YO}&`JF1|7Coc*G+QXH! zq9V-#vewgLr%oZB6Pd*B4I@eny88P1Mn?0Vcd@Nv^LVHBQ3U}FzhbXRN=AXtl)KYg z#~b?VU8Fmr8W!fpz`oGT^0U5q6ZKN=*Z&V!?*WeW-@XBBD-_z4*S~J*<~2E_GQ|`&|2{B8%WehmhXXA z`Ne4?zRbgUq@H>DcU0Bd5|ao~6KT?YfqHLq;)-Ku9$KIM7+sxZPicW|Y-nh0yh4@J zx~Y|+AwS>f+Y-RbAjo0m19AM`Jr^*M1240HynvLw(xJKLMCBQbbaK>cHaGShj-x01 zZPuhk0N`)DdpxNZKW2nbQi+ga8b*{Otjw0d)NU^snckTzU&t&ZB!&xYh2V_&{rh*D zp&EgIAe?5AgKp1PCl*Cklw!zJumAn~fn-anjcrVogln5%St^InU4P1l=BfmA3l2+Bl#fL(jy*bDcdQzlUyXnp7 zh+CJ_dNOf%xMi%_c;N(u%==aqpc7=$UYGSSoHyG6#G@hSpcN8D_uj|Y_Y zb`&$IO}W$cM@c#(5HS&dUAAhmhBu8 zbr)dpY}}S%H9riN_vposhD(!5p|Xq^L`R`Dc@Y zAWOb4+>OZ0Lc`mfe|plRy51!brsIEWzsvUY$y3D4p^S3%rs%;=9aA&T>p98 z9>E?{(=!`nA_d(3jjC(@X% zzB#=Z*EAMfLYMB-<)}Qzj(_+y9|qXnhyED^lXTJXP0z**$t5-OiIUnbIK3#`hq=HW zT7r$#DZJK&#QB3nG`C0K>yur-DgT`h;@3p={K>EX{)GPslBww*-$U{=I%?R-CH&yO zn1HTR>)o`F!8Sj;_N8ktaU4UZ#)4Mz=*S==^P|I z?{;>Z18m0uv)~s}Tv-?}<4I6tV>-(9D)_Bm$R>utsrOD$P9xO4RXPvf^6r@Zlox@!X-KGGuiS6vsm z?$5d*ASAREY)tj^KmxBr;jVuNc&N*$WRCYM9b9w6QiQZhY}_MY^(SPs3ajT^Z2le^ zYMW_7yhr!HELASjZiI^GQQ)yF7Ejucp?u=6`-Pa+K z|2!nPY<1h$vp_*sW1DJa{^A-=kZxd6N{Wk*2XW0T_mfd4qCtm6Lw;RJHEzj?lcaT) zJNQoP`tFMF-@%9EZtDv#6*uX~xd~3RGfab)E=7AWtrhq5ys^Gp7~PO1Z6KiDY0zx4 z$z$>iRPby)y|JbcCXQp5FDqbzhrc^OM|@WC(c}1h=W^1Qb8M(?rdoVUdw0HcadUH( zJ0x2C!^sO%B%_9_f&{|3k#pq%T38EUVq(2GzB1EaZeyQK+%}mrP_v4>ihlG_t%l8c zI<&OgiwV9K(f7pQw;z-u2BO@3DFh-9s<(7} zeB!ipNI3_2XaxhWLqLo_ZTVSb=L{taT+IEX-c?ySTXl!o%S)x{RoOQ}_}YP^cMp~I zn-y=Gz0ZHShahEW*x?Ws^>}qch;Qi98yo;PoB zUgb$w@|KEr$N~{PSuVqQ@o}zBJBQ%jFbLBIEj!q|K4%yT17>}5f6aFxBgy~k% zuqY-eocy|Nn|k%HUrws4`M4LGk`l7~24j6o;e^hTaGr0)db~4zs9=Q*E`N$Fp#}C+ zPP)1ZXSTe>K^9!@h@!ER&LC*7%|i`?uyRzPe_o|&=4%YCnsk<<|m}C{z>kx z9PgnR`}T7p<)PXlUqkfZlU+`!jHxTvNgpLi`Z4eR5!0wZ6IG;OiSG zo-b!+aFp+=-A5?`=?^im`_IqrV%KmjTTxeulcU|m>_K$tEQsx-6oHBNvm(JYl3q8H zKgE&V%ceR-3_@0*VivOo`1|=S4h>2QFXhx!h?RjYBc;ZSBQ=$eka z?!jxF%bd_)s&01C)J0lnf7KB8VYIfeSnkf&WT8bkUarFkH6S8~viO#qWw*}*&{tVc zbRWj8+B>l4=Z+_N^a87C}vf0=;;wkIg7}ROz2_j zdf2a8kI6L5|M_{aQ%!w|iRX{W*PhA3)sU->(MCZ{rNwlWy-&)$RumN!bQcc@Esk*i zC^pZ=Z3#cI$=|sLUzUEv1!I@>VdS%3n&kUppHfsI`)Pi5o{qQAWAD2d70=jxokP9nVH8!gMf(_FpJmBUSmS>w>l7aaRZ$Nd5*%?JOOGBO&u)YZ-n z4nByM3BB_1xC@8OEt!XOVhW-=> z7}?;C1ib_36kp$X3{LPlcf#K~A#u0;ObZp7s%Nnr4}=KXdu!<<8OnvTEPVTpJZQ~~ z_^b(@Wz;{D1=jld4$8~l7%sbf6)SgvK9R!?HnnUpZv|yUfWjGaPY&&&%7NL#22DR7 z(Q6gxbw2}SFD|}^n_EfhPUd33>(_hNGX5f(F@(pGUd!{Gd+9(L-&}E!FnQ^(z%{w` z{)+Lv?0L;g&| zE266}i}pR9WQTR91bON0LzcMqxPKd>rB0Cha+;wa_wZ+fLHb=p5ga;9O@GC>Xrt(5o z!pT!YjI(7D14&FPdc|Iu3#C18EE%p`UUh4!c>NmAhJd?!seInYq-f+8Sl1r&Pf@#c znRBu;LEJ*>*JR-uEFc%hJFEuBSKtNL)Jg1qVb9ibPgOMm`Q7b7siCmEOIya zJe=fk1-@dq{z625HRBwzuxA?$bc%y+G-PP&C(J?Cn`3j6_veFdY|WmWG7fJ8{DZ2x z4zG)~M?DIp#OP}c&;7f%p~m;}A46kC<$I^lelbAEBpG&cV90K!>+v6xP4)B3qA7=o znSAPnD+DDrUUv5G-zC3=H8oFCD=H~*8!scdLSA!f|J61XI%d(mm_c^#$a8fSms)f3 z`}lFhJ1M9*RPgczf$KyYNx8As^yf-b+rSxjxvgw#dv{h&G~`pj`%fP~h?4S}FRIzu zmB&(PLh58SKNrkzS|TLweL*wzmZ~b5j@ljNkMGyz@5pQ4H4}UIQ0M&auR;F?Ex5O; zQK_1^8tu_YcZzh6kAIop?s8LZz>HV)&iHkomTeKOR3WYM@8In9ceW;Y9gF>Ux=;b< zJLlh})=E9LAOS~{Qe@u3@|eQPb=jzkll#$@G!usNnYzT#QE47uPD;#fWpfhc9!r znO3R>%vyJm64coIt8ma}l4Krb#jNN&Mn*KVLE$KA>R%Jw7s-^QRwSRBF~9;VCH~3g z?4>u~u8j*T0s?|RngYw2tj7$?OXRO*Un#L&Vc$Y_6)NrV zlqII!ScNfDsOqd<0KNF;Pg%{*?da!WE)2^)egXbNJ6;2TbD{L9aAC5!B<>Z%LV3l~nBeXdMb z-4BdhN)g0)oA!kiA-ha)=@sP(J-WpaabQ_&HAyFqiKf+3Xw%;3n*_6}*lFUt4l^?b zFQSr_l~ue)Yl6ImI(~N7*3{4tKA)h@&CScn&s9`Zm~2Z=iAcM6=@Misc0VIrKPoF5 zso1x+wcI{bHt?^eAMZ#viF(%`KOng@E)*7*+*RzXnX6_sSt2@60({3uh`l4~V z(TD=~i@9vm#`p8=|a`PGxrKd`=tkBeKWVi%fQaTpMa!kiLB0WAMJ2{%Z6 zt8~HNK5%TOX0empN~BLjY`4>z0?huK5}7b*ogDz-vMISU;O$!x(!RMB!@cPbtAjap z+%eg)tM_@)sd(+$H#Z9B_0=(v#XIKi+8}L9A}!;@`CK(*SYuFRI?+b)QHmI}O6sW| zLTT3bJr00KdT2|3#a1n_K0!ezXs6wS*w4D}BOh6xwLrrZr{{1K7%b?d43^g&(X@Cz|h`{z% zu@|t02C@`f)eB{M^vnChJ;xW#+_eIJr=?B55_dM~40-eBDP>#ENUg0L{QX0iQh!GB)bX*Zf1_!HE`^(p55z?U*pqf3ko;7Z* zvKeZpprlm0F*4MeUbHl~usAjBLCh5D$aB0esD^|h&ylE zU$dBj+iLOG5jvgM@~db2>H$7d5sKL~ZZ$|@0a@o;CAhdt-a-~V3N!(c9|-1z#D>dp z^gWYv008M*QNF%+V0iQDO+Y{k+)L+28qGIl%@bG>YCiFG4|@-j6#S}aX+5TcNlmL> zZYo6f=ji(P9xM+G3c^ST9B9a#t;d>NEBYt8onJ+85c7sGvORmZ=T_bo2xzDa7!*wm<6|^uTZcbaxhn)qH#L5@aBtdv0#4#hZEax{WW#!M*!xzc{1r zP@oCc-}m{2`2v0c8~%`N>pe_NCLg8Pd~dDrv-wo$gzoqhx@Cxch?ZSlgtYik`_%lD zUSna%Y4+nT$r|}in3jV9`}Xbc@o__5Y5U9tMUC0v)Ptyr)6z2$wY=Ad3EPELSy*@} zm53p~%Nx|q6CIi2oVs|;gr>yw)HHYJ^?<^C4@}IQG+0XwTjneBD1uaYd870`L+jAU z_uQhS|I8M{T5z)r;wlzEuedU?U)_lohl2c;SG9>9N}n47m2Z&AXm7TX*GiPoovb`U@m z0yCz5587;kX=2mvS_3(obhET?~@*m zwUO}faBm`Gg8hVTktIqOQF-!GXs0lYiBr$N0&aq~zwfOmkU4yRKBzPxAcsgD`;>Hp zgJ3tTw0L+BFc5J93y3=>3`%t%5HDYj33cM&=FZH@0#_v=d)2GGmbj(ch#%i(e9@5k z$u%vlt!vkx@1~%;%JZW&_XCiJ(ArYEst0K(L~!Bw&E{>cUE3yl$0Ts$gp0j1$uXaH`O{`sxGmdgtZebbUee*VXfGwmFUnhf{CHK-5AqfwX1|o- zvNYG#^`LZYRwU|INvgL2MSNZTEb8vavlm-Od6s=Jxyr?+9H^pTX$d_Sq;6_#dhO2` zd^fJhnyiwa0c?Vh^K}z*Jj|`!2zoW24PyQCN=xYbq=8src)z)YkiC z5ZrY_1Xz~eKi(;PaP?&Iv3(R2&Z}HeaxvZ$?b&2Fv!DUOK{Fy!r!|*L8t7VD_HlRu zon3r-`z$HxFwqH(cn?HH6V$;23|peamUrZ55TQC%xL9rozJhD2E(CGG@54 z9_KJ*R0y}G(ZBO^U$kD}rj=S;t*yn*2ZNWErOI4Agj#gu!m5XORNyB$%~ks+C?@IX zfeX7eTV=v7_-QYn*wdJpJt99){*<_wB2|t~2mIllo;pCPBCnE@y(1pz=rChU|Ld2b z%MX@#;&poZaC^v(_5GaW*Bdg_*kT^7$`!JB7A8#++2#5dK@WuNK~uB4uI_1YA4Id9 zHPzLnbdXmiY7{zv-Qz-uR1PqY;^d=~lFIf!_1r9M_v4V7SYrmcA9!@GIV~6Nrv$|q+Y1CAD+M$c z$d?_Cm2$ALCGFgPO-2TP1krUoK$SF{z4$0mX6$!?LQ~Zd2SUQNr|ut9T$4*0dZA)T z{~B!NQ1QUKa&g|`j7vw3sR!lTPoM6ps34Z@l5s~i=EIANSt8-bFJD$a{~<0O6MclL z?4u9+u>qE8a$=%9o96isw@y+cYT?j6z(Se~wcxR}XPYEMMK!+Z*|q%}m`{g`yYiQw zGMXneH7Ur;x19OiSXEsOSX997&`PtWbGqDVnWIx9Ba?%J)F|T?M!iA=b|7LDc~t;d zzzn$~FAokdI{etKQ9ZpOu9IfOqbXn_j%UB-&-!Lr!m8npYk%o_te}ZT` zwLcbKnBat;JF6cS6C(~GAWt&Ixils`lAv;v3tWh=b1_s zm+_b-SsZtP%C@ssGSXhqG8Sg7W?B)`uO50Jby$Nzi0ge#I|cMxZ1)5%;zTkp~FzCkwIPyL$EDn`|JB)678~PtA1<<)-#KgzoyPN4B-(3Z;c5!WV(nicep@f>$LG zy#CLjw}7SY92N2FFy&qmW?sCV%pvtRVR9#k-|M0s-r0Hl-;+lClB6e{T>`yp-`~Ur^{~X9yoj3npGVrj(({7sbduJ)R zv@iJHChcV2ww&>;n}_(9!s#U&b=w@iTUca(jQt1R2`8zs0(KTSE)CDT!zlV!wq~|L zzvb%qO8O9c+JulMIb%m=`WAd3e2xlXlrvlQ29b-h+d?%J6fD;!H+0U(Ahabny*N89 zqvr`vWsuEc;{Am-isB0zKL$33B$B%4mBhpb--?pmIMEv!J1oR)qD$u%d^t=L=?8f_ zp3Nq!ELYexIEj~s_#tSH*&lWJ^4cT0U)55~kr9{D(>m1D?G{KuYUQ(QjSzUFV z)N*kOM4lA&;-8e!@YX*5eTa{?)yCa=z2b?!ez0=rRVxw?XDu-0*a?w{0~aYQErm2q*!v1;7nSaua_m{5-Ok649+#J$A>H--tFiiDE=HPT^=%DvtJOhfx$6n_%xUIkU@xMH zI>t}_v&wn50LM0)t-oeRL||B~*WJmWm7Mo1zN;=Ivv9>o7x(Q{pkPLbkA1|-knxEHhEzxx4Z#^vyUw0^AWE{7& zw3reie|TxaTG50=`1&{Q+y71~5#{vy-amuUQG9%Y?5C@j=3d&a9blxHUePJuaA$nF zk07t2xX8gH&*l$cCMH@eu|UyMy4qLgOmuBvzV#LXs;vp7$efO5@_P#Ea_RO{n-|)x z3|q7M7lZ99l^SJXsxmvPYHte&OtNA2%NNp|!QEjWpF)r(wAgd*bL2$bxW1*eChV_V_?Rk&Z}40!o}3) zu83|U`8xC>A{H$^f>X+BY8J0o%$`?cTgvWs>V!ZH+A)F)4Ql}0um%yZeo?m%qFV3) z=oydVI7j?$Ajm3DQ{_Tqr&XcnG*kxe<~ZfiXy z5SwV{G{hmcy!oQ%*~Z!l7u;uB`p>Bz7Kc=9(QGHNan@KL(H5a|;dm}oY8{QCB*YUn zot@H3O4$g}<>Y+S5G@2jIQ=H6g`^~zwY3tGMXZkuwnv;ri>M$iJ#l@{a~F~D!opxE zmU&sSw$jFC8LVP^KnVdg1upQ9+(cyvF}V%O|5=Eq$A>(ZS*eZ{G^XosaqYm#N#zMboW zh4$y2q@4l-*SSPz3^X*H0NFb_7UnG53~!MO&(*KlfpXaBk;E0hD0AGeK)swgk!u`VFJ?ICrA?oM53Pr(R zER46=fq=Nw0qr{6eNrReN&vDjNy&o*E+jO<3)AI|hsPXy@h^A_S=_s~3@?~vhi~E6 zw_uFU z)}FsV8+v=GD!)mE@IR{^nrcm-@?dx4qk@HS*W=83+eo>r6mKhOnuU=B(3;mZ!2KYUA}wA`zO z`WBdrnw(rM2_+%`(XJ(_@M?LYctQqBg_9hIX`c=Fah79?RLn*CjqxA;c|wdre09k2 z6|n&EqJN~PCwYhG)G4Fxq78rxm8Wpaz?hT@Y&f(|5bGZxgE$@D2BAWB^Af}p_sWc% zlmNB?QGuzV0_|@IpY^stnCFrd?D-EN^Q`W}hs-WltrvY>*?j)-ta!tURRp&7h`hoj z@l1uDPxKCQY{f`HqN9gS($dn((()&wFgM%|abf=B#wnZ?H1hwryNnKw zgRYtwheYvuhMjE&>&sY_ z>zbP@T3UY8)HHqjRunBpd}!I!uY!&rBNJRsm#wdrqg%xUUlphx;j(f4x*RNa^H{_d2d`dQGU?~3;CB_w}87@?Oxx5@dX@HD|ixNc}ISGFoi@KSzm`_Mxx z8j`x30qxe(rDPh@&uI&e&68O~dogfh=piO9o~*IaZeA-5NyRl%)1$KQdb7JjiXS%; zeLoR?r4ti!)smj@ox>BddSss)j{o7*Iepw>EJUGg{s+e|GIstc1QJ_KtnNJ+QQ_s$ zQM`pFvEonMJ177$)H;%%4P5Kkh%KXTs>gVCAn{&0r@D05L!wpy(LL?t0DRk9l zx-Rxke?;UN^&*GM9302FxB}SL*XQIM9SX3230fIGkoxr(eixPBzHMeUYvc+n@fsM6 zfywK2l-C&Y6@#Wk5I{=2AJ%;8otS`!{^IcP%{zBe&&YflZ%&c5uy~OE=3#Z<$kbG} z7BHulIA7m`pk6km>-oHTHS;)=UdIs1-HEn^YcERhxGhcQg9Z(q4HT|F{{Bpb`7hjG z87`eZ!SC<~jf^FZLdn>;{QY3KoTc~A8^nTyA5MKq@A zh-;?oXSlhJH0a?_OX}-qpf4A)c`~)s?c6^&c*~w_j$c;w#$Ez{Eg7SQZHQ)u`<1Iw z|KkGao7$}|D2g$Cw}JQY<4n8iz=fj~M4y(99A0K-I3LaN*Uq^Zd-X3X=C9527dx!n z%2biV-utM5#!HO&2N<11-BrGQ+h%cGIpoZ-W5+DS;qOT$f^*T&BNJIa-tByxo4eS4 z$ryZaI-S5Xu#gU{>CAX!U^+uV_<^M-zA--2pt&Je+$W^R7LiXO)qO{>KI`c8=UFoR zd3?FT6c!`8bkX=5uFfIb&32RGAs+Ak9N-QRxtErgyCp;VSaVJ;WNRY(gT-W#Y|j0#O7|7z5tfNI#O!|FRM5%t!p=p;2`j^%a>5+c*|Y0dV?H0vznS}b*` z-iK$d_V+I^M1SeBbJy-w=jm^K=0ltMI$;m5_B@ei(U6 zFeIIW4Y7QS5-iF@zPGfH5+1cIm{|L!U%hz`y2|E#G&T)maGHOqwyxb1VC1R~SY zZncEf<)dgWudDl#n);|Qe!ya1d4R4m1mRj*o~bawh9{2PJMGRqg|=tdg!g*=Yy)J0 zZFjhMZjQ{*aG6#k;GwQA=-+32hmS*x%qjB9>Y3P<(YUm1F$ih>!^3YvoYeVtW1oN? z{KKt6tBG3^jvqgMM4TElT?0e3q`L2aex8U`!Woh}QEzH)u5eyqLQUiR2esmm@Y`Rf z?R&cZ*(C(;a{4$aFCsZr9mI_-sR$1qK$u-*utJWqbzYyb-V-AKKwtkUXM9|)?N+gx zJ{P@9pwUh;PKF~#v^@g@52^5-AWDM?V0OVpM??a|Su46*QEvtJv;YdE1a<$(gi78Q z;m40vU<>ty1EGgI6;)M({H&w{LZAT+4NXx@Xy5PDk;6GRR9wm-1u5~PN4Zuen~LJk zYHHbqk>YsdvOWFwiQj5UN->PrRoY+xx*fj@x467Kt5k7A3N;?OJ>~bpZv%bG9J(H` z|I{>P#CBOGiKo~t`F)GFoRk5I_LVV_$yrTyY?P4Ig4c*zEI-=z0%XfLCPZ4+Yz~~b zbO~`1aE02-R}wHYKQBy*Fs6#Hfa=07F_U?VGV|(Vz9+%s=jEk39F!;^XCC3iLUkhxEfOVm#7nT^v zK1vs+9hQNcI;X|(n`CtXSMi-cA6!hm2PjpRZ}>OC6@)uJZp5V`x83OB!_yscummvc zEeVzMb2w|5)VNu?bSp_w6BiYx4oRxVgCi1H=4NK%V4fo-1@;d{AKVu&A`?B#9B{!1 zr6wuCRm3+qnAv}9ZDnOP8-7e&k_I1cp_K4LEeKD|F9A0qO6LmdymA$AI#B>%lY~H` zm&aSTHT?P>GIQ5EVI%65@3XW0#UgX9E)*&&=y;k`^t7|Op`IKarN^Z~{&U{v^z=w@ z67{`^-Sfn*3tz2!$NDLP>9&z9eNN2SNqBJo{%ur*u{ySaNh+BSM}GS_ZLX|&(6VoB zED1rG^6lF-{POm!iLloDh}1665%)1h?A}oAR&r-=mI8mRNn6IkJ6XZi`G!+i5nv6e zQ{i1ghw7G|@IExOV(zn2$}#K!_yL0Ft;TKqwJFN!#;s{7f~&(Xuz6m-eD1UqU3-*= z1J+gaB``O^B&8{lws>>Z12q6FY%x>8Qr32`Ud`>t~7yjZ6+-rhC4XV$Qo`_k8x3FFcN`2!~comyT;3MQQD{&^Q$8kY>{m zorKi`vmhMm>S8++hB`$i-OoN=(!7^7P7K-|9+nXEIY#gwVEyCS9La=DM$u!tB6tb;Q4TYjcmtSwTTK3T%|Vd|5nK zqw3`)U7c3#ry4Er#x>i8QfnXKuaD5CO3rktlBVNIQg)XxX(vKk%G?!-*Jl|h9t~7B zUi`><{&7i=Nl~)=c}$z3f~Pt3$0u3xQj5Pvpk%Yr9xb(y@GShiVGLimR+vRr;>yP`Yg7PZdE@Nax)TpAZ=5WnMN=q@$KYpQc_x>-x75=9zH4t^v93B=5zJ%yxIUt6Zm`;RZGxM!U@_ekUd-W7F@|{QlMe(kvms+8jGckH)z`dPRT_w-sJBrwgO5>7eaBbgfw3_#ek3q`H~n;vwVWY8$C)auG-SHr8=q`LXgx%`y1MX9JT)a< zW!hAw9Opl%kPceKTH(MRJ!+Oe|KSVAg~NY)8k=a@-)l$qb%L;*VWh%yli zINh$if;3MpIw7HAgOTPD>v!_eOR+EP60Z?QGY0~!wyP;B?%O+kUD!FXpy4tALk)(% z?Jf8BWLY&kTJp?V?QTe=&lx+vl+ns}Vg2jaL6T_~bkRD;w-qVYyIAaHi zupYv*{(bFpm`W`KCC3X_ldS{HE~(RyRT7`C(&Z+y&Z54j>&Zs{(C*+}|CI^wD<0qW zuM|-a!#+fOK||W>{o;&3H24*`9$yxbIQ>q`1v+qL#gp~E{G(wZkW2Jzi6BkmjI_I! z@|{PIS_O~u1e4!-*OjlG~4UBB(zL(GFLe}DAkT%4O@y!ha@ znc2SiKei69ZX{w005RZZKAmLLTfj+PZuWnk32A#tQy?Fc47Mk?Zjb_8Y_k1xO`xfV z_bU!6M1sj-y6E-m*Ng8h$F67;(hrS|$=$hQo1$7uw`cciMMZ^AGZtZKl$2WVr=XMrP%OZLEDgvx1!D?t0v^C?70u|H6DBTlm2t= zXK!e}7uvM2)E%k`7BU|!;D{m#vr$2W(&Lk=tv}GPe_E5+W zA8$xa8Hdz^zc#)S>vOeLwjqhC+0Wj@3^nMW!I)r&mo1OWv`KLi^{R!%`J9^rrq@ZI zxzOa-8-)56Z1TU?xSD=N?IRB};~M!@9ANbm6Qlm2oqc-i>b!yJBYX-OfW(VtBn>VnS) zCnhE!!{_maULqwvzMO8)o+Y>rS(%!i*onuI*#+Pm@GOP%mJSXg($&&=5t*4EQc|)- z!lfi63T)?2i}0L0IXv2EV{gwVE)FI(!_3UHJtTHz()M^76LU z)>P!U5(sg+zTk-GSuG^S#zLtaeprHxm>jLCX##yO49;Qkt+gt&r8d8`1QfLz^Z#GJ zB0e4{Z^7cF+t?{6h4fA=K)Fa9mZ9g zoCtpN=7E91^{N0wU(98Tm|0mtM0^25oSQen(OsJ=-fCq%4le zQd8fk(%060`{6^dukX3U-=o{Sd}J-m&3kQ;jVw%RYGyV+{UjwhSw>0<>e~|B)Vtw) zkDxoSHz0^xSzDtyd>D~mWa8Bg4Ux*^-@a`i_G#GGtY7S=gM&8T*ow@l$Nh3CkXJ-EVr(phE9drJ}=u|PgK35=L@Ojd3I9vT4qOB{fU-ZtiB*QgF^E1U{hm)0O zU}C}!^A-l~Tf^PV0%5OT|AeE?Q9N5`G7_x<4Y(8ZdgV!j302FiYpkDVHJk#y|s*s=bE{K&<#?Ci)lNoW=L`eHZ55BST#XO5JD z@#=8yQ1sakx2&zRf4g0-_PP zNIrB_H5^j#lA3NmRnBwzG?<66(Wga)pLW-Uzc@%u&A<>OBJv!@l6N#UhX5%({PhEx z!qrtbSF&z%OUs$XMIe1uKYva%#4L5>rgM~I^FgVPv#LdPYXNCMG6`F>+YuaMNmNNFftlTw3z*4tdh|9cjQne3>I6nVq&a4t%)9 zNH@&Hz+k>SeaEE^0V|%Ko{5Qxh@eLc>qdD!y$&pk-<{BOHqc>vf4*x9LFPn*<-kBs zIx25Un!AcFl%*UycDqQ23MK(DY-qT2_38LY8@;}_8}pYD47u-08x4&mRTpK zZKWJ!GzIOM2`{li!hJr+G!oV!xbr#6<)XifiAqz(PeMq|r4)0R;h3OBTgFd_-BB7m zd$x_PAFjJ|{M|9KDX4xr|9s}Sas}2iIi~$$=|^o^z7Sv)jndrZjUp|a=xv9BxiPWF z!T__Q($bgiH?&ov2!wBdZf++iKyZhIGdEY)qdZUUwOlOE(JY4X+%N3Y=u&-ssjz6k zav)>;*s)0%96~zYU*Q91Iq)#_=%U4aCX7C&$5>VAzRaEEE~ZjP(kB9FGLrTkhe+ z1_cGVzC56-d<8$DK9=i6ooU*{NuG`q$;Ku#I5>!B4r=l1Uhctf~ugMHX#x~F>E)RZi*V8{{vR`Ql{Ce`b*EvL*Q zbaaO3Qz}0sxV*uAPPT8QtC;8x!2LRu?DChwFTSgnnUNo2@cG%E$=FfSI{ss@=M0c}9*j98)95 zuTQ_gFqzT*`4>3L3%!0MaAov1x6*-=%ox`a^ z3v$Xu3Uou0?yfxtHqY$kx^kthz;+CdL3C~(g|;S+3FIN`sUcS>`8y)fs0m!UmETi! z#5We2g^;2|8os>z9SvGKD<8g(b*S!PqoAW5@bxiN^q&>Z$ny~EE8JipPWGhgoEb4W z*qOI0zLEa*jf6wOfB|8kHwSP5j`iMUd8 zb#!(h0l4=yQpfrF2!u>I#re^wij?lS0mygyK46=o>+86wVCGJ-SN_ zR}7=c5UI8DC+<>4$cqyIBZKxBdTl2)YwuIVgxZb95V zfHRm7SYfB~oUxxOY|J(Zg~T7k&TB7r9~H3kJQn%-U?heLLC(=A7`MG45u)Q-8{nyF zDAgJCs6}v>+UXDb3YkV|h0V+=Ypb03Y)3s+lA0c$+D*cr8AfKI*MPTtx$yFSKP&Es z-w>~K&(HG77jA?>ojnAZ6%n+vvO;RetGjWY9+JzwFM)Dc9FGF+-BJcjM~Z!;F^-ZP z1T>FlcydBT!gDM}Dy_RWZjb^O1HCmau6g)km4Ax1vLBn;?b{OUn^;D{c<}Tj7xyF; z2dIus1_PXgm>4)3!DyP)le2bi|9-1^m$<}45zbAz-#OWI59-TU`f?+ZJVk(ooQ#>aR&Z(pWPg|VB~r(i~`o8V!nvC+n> zoLpV%vb1B$$LtrjN3dR@xX8(Ai=7=}?ToRD6YH|1KY#rA?0Ui_<4&!Sf2>!!w=pp| z{@5hqQ8HDo?~#lVuZBHuM8vF2jQbPMVWGAzs#6yJ$ao1S13M0z-S1rf+Myv@zSLrvop*k5VwDD>pq_JBL$??r++V zT42`>Coq#4yea3)4N{6$XZihffs*G<^@M{k2Wun%pQ;Q&&vulG?LVNoIp^cNW!^in z)Ky!{{(z1KQvHy-%Ztu?9m=iZb8>dJ@kC4K?19_Uqu(IM6c-dc$HWa~_IrP&x}8(N zi$7pQ`&BmGAVxx(7;vI9 zXJRz+ENsVH?f~m+YVw;e?|H~GshF;sPM54%d&o?LAlkPwn2-IJimD$DiXrdbDS_kc zUzHhplli35$_fNoxoR?qF0W4fYi4UY<26;Z_OrHDDK-yAC;OIOS&jU5rIc55cwv0I zg>@tId2|CQVf82@+7rJrLmjO^|_o3^M{Fqm`ulbuJ*ggDE%N-ntAo2RYIdT<>Sl{2#;9aDRrN}uy=hYi@QiRqx~DM=YWD@GMQHVbc7OTO6Y8}3!P_1-=VTW@ zN+l@*mdVTEK?Sc-VAJ~hcVAMr1_S2_2PDrKnJ8*%*20Ak9?Y`?ELgCKC1gv>jfybr zIyqJs7zuxS?z7W)jC2NV5Bz%aNA`>Mg3ZZEpel%rX~x{*obD* zETpgH_~pSaD9hKqZ&-}bBVma=e}%J?A^FF!7w@bMR1)L6Unrpo!v36rPw-OrNQF08i>oS zCc7B;bmP^NV6EyY2d&+p`U)pIDE5ZXvPZzeYPOo)A5Fy22D28MKyMTsf-Q zBz8CM`2`Eum;dnXy?Rv}o^%p%@*PGx609_}0i2F7O6BT4?sE16qNGYXI@Z5@p+t*q zZk~=Qgq>X;w<@voMsJ6`4y{C0T343_@bt1W?tNq)BG+F)D5t)9Aw|m zcjG=ZCY|nPQR+jvBPAna(BDksD?yf{Ka|%RbUAlo30O@y!t<(W&~#e5un7jUN_A8pg`Ku;AQHy~mH# zWo&k&3Nd%jxlH-u?Z?LletWTJbhHwP1ERxTfYaSlQWAmAY;)uK=erO}QtaJ})*D6) zr!-Hw=(8uLu$$;;!OgfJXIV@_LI`?e?4bC^ffq1N02`5k`Zt^sMn^|?@7V)cenXRJ zxF^mE`XBV^uu(?Fbmzj;-v{r)!;j8lF9ih*dT;AHVj_$Uh$>#`6@i823>O#5*WuAo zY_BIzWh$Iisl_H)pFCvcH!PURuW)s71YWtVX~){?(%Kl0j%SYXo;>-g=@KC}EbL2O z-f31=`P1*<6*fQ7p1*@?J4wj)y6p~{_xuKUlAZ4jzrV@pyy2+zEu!pJl*mc#M^ndf z`5XlV+I~rrmeYCMh`9dJ2VJ#O&h$pMhVw+EkC4&bvu)jCTn6Ry;n#OJj0Xy_mht1PQ74fT;S&8itmB3MbC zC*0iFNJP0Ya6=EPlv2JmSGx;3W>}B6wdF00af^yd)A4*MMww)FVdK}wbn8w-X;|6@ zWr^MJoWd2xP>GXs<=02^qZLW&`I{?4F`M06j^EOx)YM8~ju(_9L8@G6=V)m72ZfK6 z$)&CWTRstevqE-+&*IC`V8Qd3>80&fE#1Cl7#JY$r6o0TSnk!% z3!yGjq{;}^nX8pu8BM4qC2*TG8MdbNCyOR0B?*}J{l!1j);+-Xpg*(T)GvThsKz!`Zc}R!~XJW zxtMaNm4O(v-a|DTR5VsBjOytRJMpVG@T;jr(00N-$@sF&sz7^<>!W;b!h=$`3zr^B zt&Jwg9^O}m-8JY!`P};I0z#GDSNc3;Im%(?i}JI3Ck zA8Cn%4+QY3q0PcMb0woiy@}XeStMq3fY6{@RrE>7nd-NNOr*yDxByq5!!$DBicuwo zCvKEAKYzAnJYo@vRkn8Q&5aWgfQPI^Ebh)%kJrfZl(R4Qj=EC*UW|LL(n0$qhEYA2 zx;aL63a@+b%l*`*66RjWSef&wqG4H)tdmEd@m>J3Rvfkdl<1o+6|7v?S9R zC0X8eXPd8O%v}=EZ(f8bvZz$ttLj&!Hl1HTkMFBS{hXl~8K8GzGMbyuFXrL@cE*SA7BJCmAOCnVD5Z8#B}OI`fL3 zvM7#m^)&hqFfu0_UuuP_sy#8^UI$a4^fxQKU{mPL&n$=thnnu={1XOZd%ANdI=xi)2E__M=Kv2 zjJe$1S{*yUqL}FIAqk=qO16I6kaEkI_=AhjIU$?E8=t?TJ`n(l9^poue3r`L>dOCz zuD1+}vhBh~QH()p5Re`)06{>yWk3)SF%YCX1f;u_p`=B+1f-<9OQfWw8>G9t_QL1= zcKq0L_(N*qj_X=$oi%PT#r?ZEA2>UeK--yVo`UH|_1TdCOUZ<>J9hoa-iRznDgl}T z+L8i;qoX0&*dbaRk;e=@ih{DTqlkxLMV!FPC#!tv3z_n=p?b^3^E)Iy?^MU;cE44b zIi8gcAJo_ML|&^6$w>SW^ACn8G#bF_q(^@*&%z7GU@*9}#>>BA89!cCSyjbtG9DEY z-ISjxvArG`Rqjv@+6tynP72(p`4-kzR|-Lc$94x@8Jk$`Yc+@)tFf3w)V9mJjdR-91z zM7nzjY$ydGA!U*2Y{`jT8xFqZ@V`bdS5nc2jzUti@*CYHvrkcLI&eH;n? zCuS;TIh<%8l$gVsfxdJb4LrLg-s5$R=;5&{yFNndraf%yj|ZJ?_7CM zq@eCHy}G|Z>h@7Id_F#U2~0J$oR3D450;i(C9 zCy`UT&5vS|aH|nh5Y6`WZ4cba06n37oa_5F=ET76McMA}Z3RY2Fqqvp4m`g>QM zW}Sfkr)mr($D;z5v)PiylzRzE!$fy50x6)`5zGP`PbC+7#?arO*A25jo0ehIi@@s!CgHH!T+KZ$JcXgMOj)5kD2Lcq@dXsLsL6hIoJ39?XIw#Ig-Y6?m zkQ2@l`J$VaPJmOB8rq3I_h<5yv`%WFNy+*oRx6X$*%XRyqX)mcmY zoq=~jh&G5m{QdpJwSx14yMa6%?s7Dncy*ndi*eSXYVw=Qr8Ac|DOFEPhB|03*^SmR z-iUi9*a_K8uQGZ>4m4Wo15>p@DJgQgSb~|kt+n+* zlu|`eku)iYClv09WpQ1(MM}!U#ps9azgFX)_Pwwd(6r`e3~fpQ_Ti2Wo9Vd^(@FPm zZwos>h70r+Z&IKCwLcr%CuLDDi<&l#n$eUBzF6|68 zM=+*##u!;=-h|On!F&fEE)ADf@4=YkzAZc3!QX;F+m&Gs2d9}*Zy$we!poQ^V(#t+ z@)K}K;FH4R8xD3OLT!J$+`fP$fuyH9OYuhXRvBZ+_t(IftJhd9D;aIAUMu|kIvvd2 z)n#e43$^Fh7<<$XHs{reZ(QxPJjSD@LjW&W+Yd2?C5w-`0yGAEI*!>G@>%n{foHjA920yo1u=sHcHqE-qz1T!P7iEzH?K>`1#kW*w|_nkRU!H^L;|6 zs;a0xT|@9J`Lzd1Q(OCku?|%D+?mSBV=+eH)xi9nRalwd!tTH)Bo#s%8~vywV?(NJ zPVWgQk5DP|fYsajvS~Gu=aykbXX>7I5SqGIaflC*@P*C%_^d2+0jRCWW!Ij2tzyJgD-Bp)X0EpbLp3jY}4-E~S9*pJNTk1h!1HTLNjnJ^rF@1tH&X`;7 z=Ev?=CfTq2Pc|nA$ov|wgQnwFZ)8gz5#T>IcOT*s(D~i4&hUu{YLFHNO}YKgpRS_61Q8k8YErMM@7#Tdx zD~q@P&1JaL{=9S6PEWpADM=K;a%3ho<{CehkY&2AMi;yQK~GmMj@R9Ir{a|iR$-ML z7g147*t8m275I1A9agdb`C7s?Gkncm!gDYV@Xk@j@>2j6zXB9NIzt0c4JCuAvt!RcxF-0`Yrr9(SEOy5#d^>vJ6 z!ozL39>(446Z69EU%TH%M16sYFDfU$js%|BKXCqm;B62^axW{Y$g4qaUq4Gwb(PiO zZ(EVG?>RX@8FrkUoXRBWq?xmO;mEq59xHlzgY1*q(Zzj>0aOXU&Oe%H+OS*Zl>0qU zBAhNBFYP=NGBMuHufQ2 zT8qq6_ldv%4YZk>%Ozx*ZD*Xeg#XEM{7nF?!52++uWx?6X1`;Psshw(DylI}e&mO% z`y$jrE~uokx1UAM4uHQVz*c+Sv>q1A?<`Ljyt7X8JD<66aP()TR6=h6jdqOs%cqFN zu>$?)ax;e_XUvR@x8^J;bBfHiU&A=@R6vacbtC!ncxpRsZt3Vieb8BZEP0?rfeweRy`fP z(63$b=~7G4S@2lT}-rA#?5_ zF7A?mar306*tO#$yHs$gncV0G;)iB5pw)&dm9beL%wA5^xnDzjUTOWF&oWXxFu=2e zhtu8DS7CK{Bef3!QHelah229yXQLK?l(x)FO))QC0Y0$p47^wWieMTbN>{~d)H~gA z@W=`c9kE?YF%=RTy^cp2^fhK{VB*}25^}4Z2jK8I8T7(>^ZcHeHzy}&ZsyZOdf=X1 zY!8!+y@S2p?8UjcX=$0?2O6~UI)Gl4=eZg)N@I;J%gw(L>a82@QptOd>92#tTxz`Y z;eZG!Zvc@6$1u*H;olY=E0IJ=^gwFS>vW!VkVx5Jo4PK2hp?=otiNvn7|BIZG|<5- zDZTstJ>~uSSVw>VuV1`(xn#&X%kIL=7jAJNc2}O9ROrRQRtnc>`uhRu$(L_eu?XEH zv(xh~A$5#((D;ljEZqdsGe=vJRKyooKpg7UTS$>OI6PF9uIYe6=T1+b;{~0D_L2(* zTO(&^EZA^G=hOf)mDAWjC1`b^Rfr7>wF?q?2Wb(S__?mRZ zF*(KUs|UxRqyV}xP^U?ViSOOLuRlMtB`Dj(4y-D-RI>lPerxM5vB0Y zKwNw~7V9Rf)AEfgTNTCsRL1{))lL8ZWi1?s^-o&!?+5?mgZ=yeWF+k;q!Jtuj=KM} z%KUi!4#6XDYN`HzpD0n1s&=}grJH~{`6@=~{m@&pP;g?pZ+(U<;a`j$#sTS_THD}| z=;JgoV1#K#kuMX#u6|>p{1#}j;UP%!&tci^K4CrEiYq&|`^eb)d6*MVl$vJ+2HGAg z*wa$4x`0B7W(zI>47a8mg+N%tu%m;-16HuUN0{~*T7y`+!lMWp9fO>k2MXVme|d58KTJNC6J{gc89a} zV3eg+WQY@sYE@QJItn5(g;%>cvuyCz?-Q=JRG3fCxt^6h4uPp(zE%S(#6rYyGU}Zk z$$ZdvfFbMZM7YXBTN@jIqa58%y#$H~BCY{Rmg#v}>ej_OmwoWxJHHF$4KOVM$`N3A z35&_^m;(X=un`;K&yp_~@;s(lpm=;g4^lMX@dA1Y_?a}qeleMkF4&+w${KJEOiWA| z>j0?R87I_fJ_;<=lM^Qb6lf%9TuRL*sxg5NEedHLiBci=06L--hv_Du5-Bek@KLN) zoRZA_L&YB)VbC5O-TEM>a{N(m$~}*u)6WfmflvdAn7f2nIIjg1VKau2SecQ6Z17Wv z|Ee?@yO#V~O8+*QmHk>-I;7hmf?>J~6FESK0QLVPZ3zvBIO6J+16H+419%&d8w#`> zn44$4%PUVyTgX06F3K~6{w(C)(ZNC2Ft7E}^La|1i{m`?@d_*owLR|lys+zO(Ll$j zIo$(VQ4WaMfTS}~UFC&+`=nb^8YXHe#9~jX?aP;4!Ss^g2S$L>)J%ZMK7=}e_6k@x z#l_rkN)L{fO~GDhab?Be!Xg*sN5GipwOzAC2l@DHlBzqAlaU31go5q)`I#m>18^PQ zrpv*9;Libwx3jlq0U06Ji^!G!s#4CU>gw^p3iUuqxx?&B^Yv>;ABM1wiuDU_9I)`4 zb@GFPzUAfyk*ddJ$uVVRWkKkoK1hh*k9@?*DJhAmg=Y@u^{)U3N(OE9p5 z18i*U2YGA|U)2~0(ZO16AaH_7r?$2>CwcqH;myUYn)|YGQIBR1L+;BKtr)Sa?7s*F z2ruNz>p~;#lLPae@QZbLvgIyngBN;myIQsj4k`k5&@a#>1rk;cjmKoGs{s9gG;aW; za6BJ|e{So*R0>2%aC;gSMd9ZI4INI++WPwZ^fVPse3!)=%BItu9#*E%8%Qfy6wXiA zb)mAlK+XlB%|U?VsYk~G(llWN3m+7?%|N)oBj@}EtbHK;KfXZK1BI286cw!pDxBU2 z!T7TmHy@NroXrr91!{3HG?9WzTJt?jKSR9G17J?Qm>ml=tM(Bxxe@B%CjOrbw)9%z8>{o{uJ19-;L z759uqSXM#F(=Bwm#&{)NC@(SbGBOi>wEy~zWx?!cSVKV``+qBWq@;#~b~z2SYxdQ_ z9;Az%Oxptmi*R2Y-fO?SjEq(>?;C>7;$4r&84;R_^6IiV)z#F7K&8UzKVr3$g9!*w z)GI2Y_daAmuSYhWnE3a2)J|TWTc(VZ^(?|BGR1&q5f|PDaPcsauhrCoLqh7!V+sni zTW@iZx5w}m{LTVWxE zUknQi0|}_rn%kw*9F;@;?!WYdh?y~y1oYc!7ij$o*f|3T2$<@cOd{7V*?*%#m~@PkV1b? zHjdY1Gy}MpY(Ekb6VZ94x#s1eg|8dw57gsM6~mv>qKvVKN3w# zbV0WViPyR>2@A-j`$0+)z@D9x12HfSKi(P%Y}^?^qkjRf4O00gtMVW1vK(Y*MX>+k^rsN4ezp;2;_D*R~VDS|EG$#HD)VdL{rgfQGd( z$MyFYFVGm~V!E1QD>%``0TRq9aq#SzQk>>`l#+VnrSL2ag$7oZ}022zTYp^=f6*)3qH z9FGP-C>w*HNQOI-vGjpA*$sEV<-@tDGhV2E<(EvTxJM< zDJ|Wlu!VLFwv!PCyOCp9RlKC`g}@a!-b4HD>eZ`kH>`B6uhz4_fF@hWx_~*5MQ8f!XPf|}FqjF4ub%?yfDiZi2FRysc z?yTQ~6{3H^9{h+~Kww|dj_J?2T3m_d>NC7R<)mU}wVgB1qKtRNyCGRaKR?vK$H1jU z3kFfhDvjYHXM_tTxVc>h%BYl=)xs~D%Q*5Nj0w`=!^krMf%}1KV!ZsrH;MS-B)wsP z+{M_y^ZD?)dBV)}nBK4(AHQ^&N}Y{c~9 zIpOiG9>z|z{N>Q|&USo=wlN+v&@%oS7xzM+kB>heTlzffC4;r~F0l6r8UYo8hSDys z=3HVjFG<3|dY6*l?wiUP@A$jYodQ;g0H3EXq$JS$$R=uN@=W%*u z(?OFiAofvEuhrw@aF#7LnP6OL?XJ_bFfI%&3Qd$UKm6SXCQyHNg!wH# zflDk5y5~tx1d2bWr@#MoaN()|3GQA2lvPfLh6NrlKPWVkfQ(&E^3^g9wFnY2{8~0Y z$h~UvC0!M<8mw<`Zy0(H<|8ePjN~|8_)Eim9QQ0xuQvUQmU({2{Wwn7|L-W(zPUy? ziJO={+?QcqW^WHEDZ=Aw5{(k}pwfJ30eb7aB*}|HFsLADda#@R2{Sm>GB5)=`Ia%1 zvn46(E7em^;C*ZP1yYH;hk#&~+KHc|mAMP@)IhGwU&-h^J$3T+HHBlB3lYMa2|fC4 z@8JizZ0CP_0x?fc0pbB-(>nvR^V}{{{q_t<8Dm@6sxLX8hdVM{y;egIAXgV>hpL?# zp0Cez1J}k}4))G<9=%s{`B)aY7*vM|0*up|fe8tO_4@egv99{k^78!5oMJ?Dw_;B9 z9!Wi0mBSvHph0alrq|ZZ8wQwMjdl&JB2XNG<@EL4Wf(er^Pq8YTH1-!yJ=K1`iJIb z;XIsV0e%?Y17>sElh1Ok68K<)>`C~In^-5!WffND`W1ccWrxzU{Jfc3vB~pna zG|5tal=CBzKGVGEa>IQ+LR_olsohV%|M6jeMd$-nxZbN)xNg1X# zP4Ld8#gGygm5X`A>tyAG`sNi6WHMxO4IUJa%_rxXf5wG{ePB%69CM)rmH=x*w5M>va%7Z;mO0tQj^}8K* z7Y$9_E#C&l^!MccDW?Kd!cMRS)MX1D_ma2gy-A&KkLA*MJovk4nP3VZ1%TPhbUCAb zQ@I~<=pdZv68qAMR-H%aO^7#u0;JqO+8*_lsjrb`#6ywZ6R*cC%3ryJ2(1{r0RC+- z_Fw2rIu6Sc_)dt0{Qe{5S^?nl)2ZrCt8lr7giGRokxE7f{r+LtHhJ$!&%Cpt!K@7*+O3*M7Ij_@!b{R+3#1v5G4F*S<9XXXkk7uy zygofWR^>Pe-U*?RRfO$?NhqzeJlSfU73 zf7zEzp|8`enkPRZ67RZtW6tJ`a@eqsck@jZaz-8_x~l_A za1xNBf=I~#Dus-@yR?72rRMh0Q3`~JOwL7E(c%gLOP65TazA8{>1txs&@Rkk&7v;1lB z&HmM(UTv}47P$?kc2o9o`1$%1mtgFCe!SIFdVrP=&xsK_h9D`&#Y}nn0qQv>jt8xM z4MTO~)v@$XN~U@v3r_1%kSA=nxb=4U%xQ0QeZNcwqn1dNE?8V5V7)IRH6WlABJE-1 z(-D6@{p$KIhK3&uXaRJlKG4IweDYAG)Z6^b{dWe;h`X*X`e+*)|6+Tts~h@~f(-od z#XL2EIZf025Y2BozXdEc|Fqdl3_}X#652f1s^A`h^YQGXxLq(TXs7BTE2@ zR7|B)!gUMz7Z(cnsY76$LJ+v5AI%8V?Ol`K>7g#cIyk5<9m-`+Mk11^Bwk+NuNtlgk;E8vpjO;bsJ)AiA4v1lc4FxoFa6!wx zRT!J+zJwur1qN)=;n_MmI)o^=IO|6$U|%f>!hrb{7@>mj4;BcZko%dNnbjN|h+o(~ z;jgNK`6?iz>GDS4{Ay%q^5+&fH#j?;#aA8U1|}L{Vh9%uNG~PtKf7@U`52AnbO@n# zxHWQpL0^(Mm*?clt5@Qp;)_r3ehi*#;MNa}_e8DppnBB9RR9R%&5ECQxJgen3SDWF~fqOz(=2Tecd#eZZNu{A=- zJ)sY;kWdKzCw6eUfE?1u$gPg!WCo@?I^bCB>E%UHA5>Uqg~pGT3WkKkKN;bvsD!7o zopR}NWYgnS&g_lQC_w5)USJ?kc&n6jD;qOtFGFiwX+occ#>D*SJd}O)6?`b5i3cmj zXV0QE4`F0_+Y@}D!Ie`2vAZTpy3DYaK$(sSF_(q2;1KiGaqh zQQ~fRD-|yr1K3z3yre}N8)vGjs%mLZ4|PInZarks;(v{b(mT+9_KXSDJU-qrFc5uu zKu!?~VHREAQUO+5SzT38jeWqBT@e3NLqlC!T6!cD}q z-lPrft1f5Fb+>F4|D^YxmdmNdE0|-VnDN8;i%mX6jhdf-l5N{n#`Bmep4UsnzOeN= zji;}#H;7U@ni$aURR4ZnMjk!6Hb+h<_%f*va33XQ#X~5FaL**dGnOGM8s_guuVn%GSqc~l&R=#fFLN)wT9!;vCzKcMneD>RF9>l88H;uN^d0dRu?Fi}c! zYMw%)L4X2Ac`A#ti@rV%HD#sKVRS&i9t^fmCf!4!Js_LDdUNif>e1h?j6^KVI*5dC z-!45+c(}j2>+gr{dVUJ#TaWzA&(BWfGwnd$uJDQ3tqMiIO>nXE!u8+TS}M|M@jb${UrN9D9JZji-P%$r+lqxt z5*-v0GX3eQ<)G1eSAv+Don~-)I#y$vEX_nDN2(Dg`RBwG+4$j#5>}LVVw%UzdEw)g zPhbwUw=`P@&j~6w%^F-#5kis)j;$@&+6N7&pRdF72~cX-*)1rWR?YqW%V{?GhQ{@z z+TXwEB}0sWZE-;Xefe#gj#vTTcJES+y3xDRY7v6=iO==Mr({pB*SRbh~gT_;8;r~gY);_m6h-3!$4x^c=QDtBe-fHl8{nxW6U-j9DMRhe+m&z69}fe+tGrxX!ZQ%4!6MFZ z+Dxl<%afAo;b8PJk+~dHzkUu>|ZkF97rK3kR1yDx<*nPaG z3VmL@>(&&_F&=zeDWbUk_txw%r!Oix&0BZNDH%wmsjAT)pa$8Z^_IA2f@~bW3}UFv z(X^(vdOgd@b|9|G+WH2bZHc+I1EGVubob-5#PFH*I|%>5+_wqkX=n`GrwYN!dQ z4fTy2r~W2?pZVG`O>Mn>zp)g&M>Hco%Hl-ux{P}GhQj~{fxI2L^(Q}HxXKxT4B0s0 zV>_L?OBkd5>ow~trDkjT@y;;jAfSn72-nZ+>=mbbCD%JcFA3p5FJ2Mv!r{leO$czC z$v>k@DCDg8W8oU%(ATrt*$lbgxnNZex7KYwi(epP)ob(Sx8H)S>?SPade#0KoFkj{ zabNu39UZ_6Cq@~7JBIu9>mUM_Q^)@Jn9Zo)Z($(%;>mxA_`$W1-LW;_jqdPcLrX+c@qMjfOqey zi6OF7K&fG6rluwenWhJu+NUQ+ckZVi969)kgQ7-z_X*(*kAwu|@g5a;cYJzGYq!~; z4>&CVF8HXtyiKr71j=Tt00$@ML36MHG%j$PNlG?}OVZ4n@q!tBESHgkk`izf1(^)< zAv+#6!ij1ZU_3$;Imlt5cF@t)H7Zhqbl<@YZ_S99n97KV5OfeIiM`O+{BRg9IuIXt zor$VrJaiYlMcBizMa1{&LA$vzR6t7RsaSo|4oC`_ys17E^O6DLJv;uaDyJZiG@EN% z1Z+ycev4CvW4)$E>zDTwKx8^1)$k(!{6nr^#}l-;bF|Q{4Yv4XZ$?ViwPYz!Ppx*$ zfj#%}@xk%B02oEc^?rqucOd}9f21wZo2l4iX(>|G$Kxl*#3i^q?y$^tstB&g@N#_U zE@+W{{zUP|2+E2G&4D5nWTucG2Imsgu|tYbme-sXvj_`=%~SQ^T!#B~FCE=kI9??M z1ydIG02t|zc?$7lt4hyR%iy5JfHR4sB%sXd2fw~SG|z+TqX!5zL3Vd z?#|wgNQAM*`Tj0Xc+M|6bYfsUKH`e6y4~6;kGdGyz`#Hbh~>Zqn-KLPUZ`ftJ&?5K zU^Ii3^$EaP7&1AeGl2qHp31G5cUbYA|e!?7b8!jLbp(Vo^6q1l27rjYK} z@(cQ1Yo@mP25}p-O_}p8w>m&Tns{|vT#KFV4svr?Kcfbv>hIXw9&eoKxbvZ5_bTJ}lr2wA+HxeW^ zWr7r75ZMM%NsOPhayl>4fjt_)e~T$JA~F&Tqduv&b#ye=)q#Cn1ehU!1~e8h-*!(s zV|5kuOLKFncY_-BTDj3*S_@1nxxd7L=d78L(SzbZu!Fh;dgx1+&VYTjyL$u9cE|A( z*m?PP-1=-IFCuN8yaKU5NQ@yqfhjcq=KS2;)oa%-Zl=TC^t93rn=V~|_&^b~vGEe> z!>?brPWLH>@(EC1e^UrmfhWy%Jls060?F7&M*Y^1$Ve`or|6=hx8Mu_Y1@!-(KrYm z6JYcTHxAr*P`s8r<8Iu$A%TFW!looc1A!XG)iI)PNw{hCmpeL*Z7P2Yw@ z(5Ds`C^$I4&VYtdVR%amTO({ip88{r{?WVov6``x;%JI&15;D*egT|k@GcII%VaG$ z1A>PEpxqKlV7wH&-x^2J(GhTDIsF0`2B~poqmo>X(>2$kZBKr+^bj?PjGYc}3vk1# zv<=EL=c!I#G9;CN#9Hj?LX&?q_gP^i8@8DD6jK%p%aoX8Vsye>HN;m_3a-p8(ZT1l zv=}1M^TXGSfb29N8U3mslcB}e(VsWK(WCMgc3C;Vf?0ZGnY~1cN@@>KPY_UhyG&=< z{?f{W+78Y{Y=~G7c7;5QtCdZ2f}Y-~5)|q+w6=Ni5b`TCOUBjest?=3Eb9{I2}IFB z>Ln)I%RLqOKYnCq$ECctG4b-KI42_5nreza&7Hchth@{vmP)qT^Z*tSdn5%m;GcfM z5Hxnh8Qu-Lxiv_Kh8+N?5D)of4S_se^FM*;zq5eVZ*m;1R_pnD&jE4aA1^G)9_D13iUK3$`_EWSEDy889&SFqnCqo5e*@6Wpl zg*jLSGlN}wNsjCDwsc%s?3!Z}F%6B!1_sT3w_mliq=P+qou0Ceas(LvEE?c?xo`SE zttj4;fZ%zx4r)1=L8!#dPEUW(xg#Un`TTh$x6KMeWZP&*N0{?|sb%E3nlu>_nnyG~ zM01t)v43tLLe(VcL+frGu5RpKDKV5z+*<4b<=O{wr-kh{F5S>ItL@*HJQ0>`eSYl#q ze6Nc&;htMtw)%v zVG9K*8Ba;ub3UY>mzMx4t++T2|4TUZ>`YC5w;4lPUcY{Q+Y?Igl@bZB!p@a==mf+( z(NOOP8ox-Nk5~Uyz3qn&LZe6y{kiW_L{~1?fz}779z{!@ zvY4zz+GI}wR@yr{>W6P(Ybz@)t>43ige0jYd=xmiKurqgiqCNmIdDfW!WgMzN)_Q64(9vUN8`< zUlP zJiufGtfy`4Z2ToY@G6`OAki$YIyz+WouGn;k;2RtbMXmycmqh<-Hl{n0lf0d7ZM;l z+4D@7z$8ztM(s8U_d5n+@W>GtN87yn21MM-N;+m^w!kJZ?z3A=KDTq+*CI=S@4KE? z!#n!@o9WS`lNZ;Bm{@aQ?tq7fck717N>ggi$iu#Y2Re@|A!U&_FZ%^DBoaFGt*y_0 z|Na5hFJyQS-w+eKuCMo-f}HrmXfXfVHy3!mKYuKmgAk`5$>OY~!z#NDGnc{WNF~7l zfrm%rgPxnyg915;LZ~kqO#YtUd7XYoP_XdgcxXRTHl_|t72&x7*lS;dK<=#)o+=$Ba`W)e2#|1m z82;LqAp*Wf_`OrabZ+}_x!-wrHavdGYFOR1D)_lF4Ahd7^>uZ@!x04p9;PSegRi3A@sFu< ziS_tZV-h2up7(F2$kf2(Cr5d|?>bFpZy>hLJHL3BVPjq0!`%VUByApps}?(ZszKCv zfqr~J!8S0j)a`ZOJ2`!Nk=irhH?>3+a8aJzzAaUAw6wjuTm$Z5{K_R%!nUVOVCDv- zB5+{o=gEGA9TH(DbBEA*e@rRw9eBTy;Cex#=u(l9f)VEu^fP&i_kl10X4J)c?W8$1 zXA{4og#w}fnokEbmehM?7lEEWXvB0D@{>4zb8AZzGjizsT*SH$71 zP#v|mvrv6mdP97d#P_{Ys=U$QO;*RywOqf)w2;gL9+O9kvG>Wdn}vH;obIMFJi7?{ zhT_Dl%r<`lx7BKp-m89U(++5B&b2=#&fY*L%V&9%ue-i9Ehe;wl^GmdSXTCg#@5=B zwuDJ!WW%6zFzffwX`{cNALRPNHo@g|5Tu}HUtqa9c9Pq>B0XSynEd)Z2=J#~*}icT zNFTwyI&HzHm4{wU&1#x5yYq#Ds3McZc}Phq>b9p9@9VwCa!k7)GLn1xmB8bZRb!(p z10m|!1I4%WV0+mm3_A-3@+HR4Tl@Q+9qrnzm$gcl7f7zu;t?JTc@ZS?ew8!4gTJAy zJTg2oGL%z@tNsVLzqhW`eoNi76NEYUe4Mh~uHi{AeK%eO@0j^N&$+B0Kk`dTV5a2c z;xd&YqfBj+029H@OP4mr{-WY?uX{TaK7U0l!(ps<6OHdxpTN-3K3?{61VixEWW1o= z#-OOJn!|hGxh;V~6t#`Hi5Tr99*uBsM~6i6>*Q2@a0;5#3-3+lwT`%~b-RJvb^L-t=j7JRRk=+b2k42%WF4JMdv!q+u7uG9j> z?9EQg#>Ln0jY}8b`0o*iz`vkI|9jZcJ;wM)D~GQpeK0No|M=g-?f&I`P14DUj)uNl zqU019wPR^HS@#f;g6oZNttDavI8`EA}e%m*WGTGh?IO}M7UkTu=QHy-dbN1gkt0J zzt`UwtmUa0m>Q{qk_+COEFB6T)fM`WCN4{2F!Jvc!jo-?Pon4#S2fb;FltqQmK^-c zlA5gh>3S||w%#pd0CuDQJvPMMFo5s-@A1DQ_1_n=S1w-vzlR_JEyn-z2a~8Txg&0O zx-i@-JkHN0v%U^=q~-pm?5JNFn*V!F zjB_%C8x6J}zPoo&Q}9+<>Byw~@97)%F>BL0|L0fmDB)Vh7|9msYnu8~AU4AqNWF3= zi7n-f`dWeOkz%xp@}s{?mSXxxe013C|L5$SSeD{dU<3-{HgY2CM>Bb3$ZO{<43*^g zJx2{Ssl+(>hkJe+^!&PnvpU@4(T6Q&V9`4Je}7Phe}$~)ID`6iYOkXmR9L4iyZP)5 zPyD%cO_pPQ8`Xk|{reLF(JlC#Re|nqVs#a@|9i6=op74#zA>QjfB$$@Y_w=XsFGKZ zZxoF{5_>3fmb+%6_gAJ7Inx~1_X^nUjkR{0*1a(>RF75)0!vIzpD+*$uY3~JfKZ?9 zPLZMF)d4S6e0b)`ZcNp0GWyw{Odsv0+a6rkXOb&+o=>88E0C!dWrnb1|bHpEo;EeRa&fo8T&M$;m zU}8|e0?!W^J(J;2vWB!kDPm!{4Vx)aqy|Wz=pZkzis?UiqPaRx?7NM937+`n<2MHSqcuvW?5 z@7?*fr!AI8Ov{fAHPX|%KQEUraC=EBPp@=+Ud;K~*Hx?m3P*ze+uC zwL5Z8GkGi0cKPFdthEi-jmI#08)<1-3>4WrUw1X)BF8})4CW@NJ8iZ|v$EK4Hr!Rp z+KXrXBF6-^bzXk{$|4okl}~Zwz^!tVyje}~p!Ow4$tBfq>!j`Y=%9$E23x1%JYOGs z6*Rl^epV0~KMJ3_SLm(Wam(!JZqms(*-Z7MnMHJ%1Y(oH@Rgf(uKVpq-Ylgu;XHAf zo;Ov-KVx){^O;yf83$E|DSXB$XXFRFj#RbSEBbvuzL4dMAo%phD9Yt2^ZTAfleJCL ztCO#K3!JI04@Uaf%gL*@=A`S+wy&-{Y84Yy;w(=(BQ{M6#e$tk}2ma*8;sI z^%EhQ1Ag@|Evp%1*d@dl1bXZo|N86ngVz|AgB#5Lf#p2@*rKqqNi z1Um~G+siC@um#+LMjcYg3hV^Op+|QC7bs${js zxa+IxKyP-ESGf`kmW4>r+u$67vfG{GzCv5SZ@D|#M@tW4E6>r5uM=H99*!X9F4ROz zR4C(G=TX+&&z5Ntw;%B-jcJ|5SsA~#n;+LV;_^Y|5~^9H`B>L!LUd1$ZNl17tw>JA005+W5pz9snMTa3`>huk2L04}tr>ExNgON)6PO^t$uX=eVoMz#K_4lt$YKT}F%tUc5127@o1I6TFxwZQ4 z+NvXjFYnpBHQT6#kQ3K~srx=Y187v;FQ4h?=xE?Wa+2%)^40{X0vme;(yQ2GUwE-Y zU4O69V0S48n-%0YFD`&du;RXHYHBt6j2R+o+E$`X`~M9~(+o@%aL75$0K5P*L(u)} zkm*4ec>lg+J%%0p2L^iF7$719LU;}!$IL7&(9b3$xO-vyyer+{bFM7cthWV)5BPBb zL%7}x4+dsu(}AaC^h87<*310>mVo{MrU$S}L(?g;-L{QL2nw2nhFzSQ1ax7$i_-#D z20G&62OxUFz1X?k?q8|IbP62AkZGG6=$54c~rW59UkIqoXdXdH5xig()(^^xNp!cWu9wzC=Umn7LSq`YHYL5r#mB zy$kOAv!&nBBkrs1J2>>3FCI~e?diRxLzC>=+W+p@8R*S_C7|tPQc*6g);%z6mmTjs z4{;)RW>f~IdyWo@GwTWxYu>6h5+?Wlvfyn_zU1k+YvePDk~)1;qk=u+aOf^#$xH0Q z*z6&#iSEjfEfdl;-BVT?icr0H6GB067EM10rUnX8lv8Y$;V`YDg|HHoS#1r-T+?fe zT$OvMZqJI9s8W^D?`3gVTqo+z*RU0ympC-`N0Un5axYf7aq$v2`6Qgy{#<(K^jXP4 za5WlDhwe&G95%0*4xCf4Ju@?L6u)=bL|#?8Yfj|4X;tOHJBJLV(^x}oOS4- z#s%~XBv!p|j$1GmDcznk;2!O}>{)Vok|x(^U=1jp>2L0vjvkx>xB}$Pd0jT(UPJ=G zV!zaTJKniCs($Ku`GdZGh27>&C|)2@o>K-O z%mQgo^cBFJpvm~h7vrQNA87G)r6+OD0zx-1*Z-_F+d(_{PO z^wef$kW0I96cVXi_l8J80wx`P=G8PkwueE=qO<@^YTed;NJ)Y}0cX=`K+T~^)tP@y z49sL~wRum0fmA{kCQ$P5?`hkGNuKj_}BSnRtdd2$kGY^!m4@d76aM$q|dOBILm%NoWGSJh0E#;Fh zR6ESuHGGAhbF3-g-i%lD@>+ZL_uGVPcals}@Exb+=8Aqugl20OY;&p$M6rpeJTU27 z;^ZvgC`c?#U}^3sjQ7W?c!-<{kuF<7o_|$&-JQ8r@(8z(Jq1fs`@JVEPP^5i@!w*} zU$k3?vrc>7d-L*PoJ9iUzJrR5m#HPv5*4#jBFk;sw+e8Ux%FUrc2$>^gNv@6Zb6l5@Pi&u|d zYto0|5aisy%;p|BDYWDNHKxnQ-)2KOref3b4E(iZQ1;2Kf6~zL)Brixx*V0E z%xRo}C7RCldpt~{I_%HE?`t;f&M__ccXEt2IYaCsd^42ZK4J%E)q0em+i06R%gk$T z!i2NGeLwoFv#|xzyHLM6vyHM%`f@F?M5W&P2Q;E+ZYGs}ZtM_fPy0|Dh8S(Xb5vGh zQ6edhFzjCVRY_4YpxpD@q2&%m)1f+xY3b{1-YA7CuB^;uUJ8sZOgLiW_WH@dT8Ln$ zhsV!)vE#kn^GWwWFxGY(PRxJqqjPj^-Zowdd z!8UQbQWSw11DA7+Ep;*B$3#`-o)jC7TiWQT-g3bwzQWQWmDy#PQpws+EkYl`RATvJoFZnQJ3)OM>D&12TB&SdF)j!eez>zdo#NiZFLw)82ZY~x&1Y7>RV@o z(dsZwYN11y0tPZad2(Nag=_-#OW}vLAyw>~iRTn6$%TuJw2dXduj?_AX!w!$^4BXD zermM2_J2|J7En>HUD)s-3WFe^s30k#lt_2#fHX)6(j`cDr!jy?DkUu<-5}j9QUcN~ z-QD$X&ij39eZT8nug5c<;hATi`@Z+S_7&91^+7~sjTH?2a-X}{W!MtqM>Eex<(54u zdv1_Wqn+CG+E+C0UgP!UkAWJ}gRaT&&HUb-g(7N#yN9@1hVCSdtk-=EfDHp&f*4_; z<#FdpuceffD3(?ykz0A?<@ZqOH9Gn(`rt}WjV8G#brVI*tQ9BZZVXgEGzub=guG6F z#K(_A697YAkSfEb-w#IATt){0_2Ka7yB)E(^TxJ~^-fpam95H%DU+c@o@ zqeHacM<+k%Pz{xo$&CTTs-dMi_G*5e(VmLcFM z!u`*FPl7Jb@~&Nm4m(5Zw??Ut9~gWT^$p3MHHp>H%vv|n?v=8o5@uTU|60+6<}EXU*jkT^5bCncCbSBw^)mLCz1iIe7T+eD4 zI3daG=?m_>-|_DlyfSvR+%ZpMzll1tkgXw|udJI)`j)h}FxyK>`sKQyL0PGHH_=$p z4YC^WwDaDmCfF;L2HH%4&9sM_8gY`s&>5>F%t=UtTH3RS{dUy6O{u7;0&UgRuc7Ff znQKy02U=T4$Hth1gp`vM;=qz}`EMIotJ^v_3>6p-#)pTF2b7i)x4hDoEQv1xXQ0-Z z3>8M^sP>sH{_sdbC3W?Tz9m7yvE3C|d!G!vH(2q$)bMaoKNP7&7zVQGl&r>g@qE7h zd~SXoq<#{}q_>C*=SffZ-{Dd)C9HH>D-WZ&RE*Yj z%QN)+36z#tVARNd_};68)*_M?di@hM&3Y>Jh#ZaMx%+AuQT(vomI!4z>=yqP$7S<= zo8vEh{r0`=6qd|LeRlI$Cb3iKjk&wSzP8(P-Yqs+{K5FBlH|F*nsR|~oCDV#4y4gv z?u?%f@}5OOVt*zFW{rE!ONc=~|1E%yUBkC6+p>gk$FEGo#%ld%X-ZFL{6rZGUOxAL zHFw=eI4ylqiT^XSkodmQxVyl2eCw!1vQXFC5yu`)K1bBXC}9+RiiRs^o`xt66W}SV$r6Hwj9_C1M>LtybYu)Ge`(dAl zMQw#fnLyU}#);bC$H)4ClQB1|y`>pVm6nW8hDW7*L>@({l#G>;H6ktDDmF@had~%- zQ&&^MuxI#RMclFK`#(He%`4*jIvn4-Q)j=7a0f-nvJbbK5N!bM2fgAkBvHGSk!Vo-aw$ilP5W0v~sNM zUmyawC^a=w`#v+XFpM-?4k1Mt2?-StdIQ`#IF_lX5{Krvf#r3-RbqgnJ0d#0Eb$`xsL(9P6i}vo@{mYoSjpZ*<_{HphcRtv#T&IZ$mM@$5nq{JI z)$$sqjUvz;%{=$N&2O$a$&Q}>7FMm3CMIX650|bOa)o1_s zVJ{iY-yc0^HaUj@kB^RX*wAtG>7It)V#B*raE^+8oNiXD+>cgF77wHlAf^5bv8M2y!MO5ApW~MBbL@pK?N`Oi zADV#&x01ud+VbSd6EdE2m^J1dJHlOu+3G)7^PfJgT!!%iZvv35&tJZ{WgYYZJ0GS< z>~6d1cOFMVW4H`S7I7jM3!m<6R39(5TUTwxc(I6_=6}}qx;Xz(?S2A~;8yYAIh-0* z&Kn>g&x26c0{i6T5L}-Iz~k~X_L!-Eq^8aT5C=b&J*2hrC9%n6Y7bna3vf7eyj#@&gus+QKGp|g>i_j z$CD>aP>FY8cBg1Uw5&4tpVsvilI`g~6V_;#c&7B@Sr1jWASL$za>?5*UIVo4ja77R zqn^Z37yE6TPJ0RTOSusNla!_W@6n-AS}B}kv(e@CUXkJnB5^PK znkIjzrx)au$o1(ze_T*EA^BA!c{R1LQt-O~^|bA2cHrnw2MxKt@myR=8CjiM55#D1 z#^{V_YAZL+Y^NBsH8TI5>1b+d>gy9tQn(HF*p17;!-5eqZ2kn9f?)kJFfd@}8mTYJ zSsB$K>$)&10E~U$@_|O4+1<)8aD05cOv?%~>c=NYL7M=zRNI_7#RS{kfM%$~VCMk0 zDCgp5Fs%cRoj>*U)45;tK=SeIu8EJ*GsW=QT5l^W;gf2bNK&Cy)LGUu+|4rs%*;e0 zT)LB?kp297Gx`GN8~rrp5g+e2a!Qg1nxcHm)z`jqOE%1eGmLUK5ihE3;57f<|0h50 zX`KakBE4WuK9XtGi7g^HxOR_F%(*6tS#{MbZLo5}R4%q6b&Y$lbv-1VEJuUCfpA)TPR3%o>KT#pY56 zC33KhOnt_}fD1-~jGCwT#gNyL$g_3h2RhQlU#NdTdR55_3$qBjH*Ogk?H003^rjZg zSePBc+>`?tj?vF94>8z?7{Tc25ZgxoTl$FvVFNOPv!uqIpJMz$su5lP&rBVm$oE#~ zJ6@;f{%I-Z1yQgX1N?eC7YH0#QeUeFa>;sAo%9 zc5k8G=;!YI@82Wdt~*9eUfKtFz5}1G%U|bm|G&{;!{c69DE6$czhA!iH00gwSIz;3 zR{Cc!1kM|nC4P6GiUKiZMfm&?O0r|&y38E-_mF>TT-c&=N}|*xF-%fO?_0u4tJ-WR z0@uo7NRpu{wPB-7MQg|T2z%tf zf!n!B>;BZ^+c)^f!-SC^rE?lczzltG@bOR{wXp7HKJH!~mQ+5>pj&NR2`aCKa3m@4 z8j7nZD0owb0BH;u>|iwU4#ZISczBXhQqLEuu2=AqGd~x~mq@wHJiLG?!$$wx&q1~X zg>e;ZaKGk;4@$rbryX9L^qzdjwmvDsDlCkV^v|7{&aV+Jn5_k@rf`Y71Z<`t(s)4I z@}416ShVu(m&(fS-OVfc^(P`ah^H@DAAbYsC)CW6{hP*r=P7OW*H8m6G=bm_&dQ?=_#KdV3WC_^${5+up zH}?R1Qsn23j%)}HMu(=QRVvU+zvzC7YhOmlLw^7Is|f-W|jz$F}x0aGaPkFQ_< z8cx*?v^6mS4pB^6nm}VH+%!+jn&M)v#BKsyGIHXmZ~bNhc`}NBr|RqP-P``prY#~O z#n0~qSWFhKKpO<>ZU=sCC8fd|yCHE%FlvR%gxo{V>B{Ujd@6&3G?*j5l|TYUPbTL% zMWF|rhocpWsV{gg*kubaQ~=92|DYi7ibp1)(dG;crf~naAj1y632=_h&dCuEBCVgc zvA46ki2@GvrND@v;z?Lr>WdKYmC4J=f!NAeHk#$xHV%>*2!81N%C-mTRBLOQaBjmN z)^?XTG;)H+vnwk{Il7s^J*-MzLizSyuS`I{*-I;{2{P-dk)feiN=nkmXlTP%hx=Y; z?$>x?!q5Hu)g>r38jQBGAakLx@H+M1(!2}E4U~`P|3FB}&$$hY-_+U~^jiL(VpO!W zAU!;U4cxI_K~xlQ(%pZMCL9rs}>$>1fD;wdbhw;U+aad>|cs z_6$?U)rbL{M6D+klYMn7BmYk1l5&|feSg05lCd}~O#&o-fwr<8Qh{5CTQe|0hnoXQ z0^qg-6CxG3a>c*tiZltX#=@FEU=IS}Zox(;$Rukv8@@wd1-HqcC{bQsUNJ)jKx|nl zshspOVY9y<0lH5Vat9&sz44EJCm?CUxq1b>greTuASe0huoOTVG|>O$2fI|u$eY*F8)BbQ+jqzX^X=uj5`+xrJ4_iPDs*e>Aa@M1ZPHbiz0dKm5pM;y1_kP_yI>y% zKgGSA3rX~rSXRP4nE;=-xR@A9;;8#kZ`e9?h1_Rmh+qitfh~cL0~DoG(~S~vm4WyA zy5jh}XC*;d%wa6n8O^ctfk3$PS7>((*EodM6c+xTtc7^f&4U90@ADS~1P4GB_w*J- z0monjh975VXa8o1AY}urRc8L(!aF%I2yAS?+8D2dCk9uLaw8?`d}e(e%$RzNj!a`B z+d3f6&fUU7Fsj{iC1((%ZI^<8a$oIlFx+rhOqZn%lYRu~Vz_h)Bqx0G=d+#t#m4Om zQkTClL0RaCzDMCH$j^^Oy*uH)5lqhaukM}bWq_O$)BLZ`05B2*Vi;yq)#R zc3%Rj3g->45*Kg^gx2g38oFU*VouiLB1yEY@#}|YX9pAyKGQRr{ca0;6HM+;i|&Zy zvmD5Vd5G(3SOApJV1%?p5J`B8!gK8RZ`6H4ry?uAn7#xt(&AT$4krfYIyXLW26$ z)~5L2CYZW$zm}7df@C@n(1HR|>gCH~z=Zr7+1S|lZ2vjv=}qn|TsSy8SK3T}*Z0Wk zF@aen7T)4z51OZ|2XE$C-H0V>Jz{d{QP1e zs>XyLCIKH`y=fQWWG1Fv{Yngdra1Ru=os&*nYEO6~^aCU|qvF0ite8xNAaU;CF5V-^hLJN zYZVKiR)vgOD*oHmX8qgnIUs-Kg&!o0E8GTYqaoiJ{Y?PYk<|WTfrOyq0e!021ASH1 zE+}&0%rE}=6Ow)}or**27=(qlYA>`O5F#Nf0KWD=e4NMAenH^o4Ln&OghEu7^Tzp% z>NHVEYb?8wl7hlzJSxn03=9l-69`B7&C2r6oeN%d7)wDZflL}3^YB4Y-whZpUu^<1 zI{b5lG|sb>lsR9Cr2gfh>-zeEpyv)I{387bs1hxKrk*FqcZj3Fc@`pa3i6}^#K02= z)l+Ac1|Tu@Lqa4kd9c`n>7669J>9(PD@z|<`-`D|=}z+qR1qb1uh0&zSPrh)>7zpx z=)aq4=!RJ+-Ux|mOfrelPjkqXa$?GYifMH)Zv)O$MMY(>>2TUOZ`{;2xqNy#k#DVO zIQN}hut^X$YRl%CNEG-{J9dN#^XhlQ^Wu57caf`mVd&_1gIY340W#P5`1u`ll&Fpi zZsvhHKva~5x~Z{|f?7o_?I{vylY%=PSHMINECL1wAA<`8n5=1o>RU~1k{SWSYOwWy zBO$cyHJrQ@?==fvtxiuze)$p^Y9mL>p_iKDNT?DN-tW*Thp$7O5X*nv$AI=9KGXlP`gMM3-h{{CkfG3LsWc%rUF0 zdq3Z%D11tUg6L;L6aX}!S_1!;SZ+%Q0c|D`Iax(<=YpG>1QPl=ILC-kkV?--F7N7k zO|B0tQLA0Hw!vp^b{pvKR~j+@9?0fG2rT_rmRcS}4SIGyj*uIF?U!mA(>~`|lq;T` zWE$hyEmuo}`iM#b-Y)cNuo5vKEp@_ zCTM=YgJk^d1RI#`<81{|Aae*0hgd>mqq#)~eyGjixPe*~GBE&o7#kCWOt`hRehBhY zRh<}0$0HzsCjz+qFuKMomUZQj%rhV!G48fvcLQle}R(mQ>f=oT9H!4G$c0 zIzRtUhio}2X|d{uj&^**WGw+;C;b)wS5p9A3>XUniNvWHE*U%yN+_9_UW2y4W~uj1 zBjT`x3!r)MMTNjxHjs{{nUWf2_cxR=0fY2#s^O_3{Qhm6#Fya8RDvk-Xua|VDAge; z)OnZ{bOA$9hb7BfrumK=@c`!7^ZlCnpqD>e7kJKr5zc5~X5SLvM>ij=((}TY4)z$p zjVf2G$;rrg^c%{ChIkvtWSD@f4>Wavme|~Of5DUvND17dI|)K337$^VF{(L&?Semk9Xh}6Se}!UjX~H~wfuvE zgV|1_eodbi_c5Cn!odZ42l#5JIE+*7a7wtUmE_LG!fDk4p;tPW&525I=*JO+^}3Nj(YKJt=5%ZUms&z>94) zw85AD6R5NfR7v)qjN#wtx$^Gqclt(ZAGQ{yjGy48xUzVyGgViCh-~9LMZ7bf@x=WUM#l1N=V&T{6&i{*q{KvX> zyE@y2arxR|>AOo7w%gTR@Bet#ho#dE6ae`MzB-)0@9~u+uSV0>9sMd1ysP$YFIwEp>zf@{0 ztSMWc8(#02E>S1I^$s^g7B5!EowbM-E)bjD_T>+w5MT0n^nXQCTV1uy!#^nL8tB}#Qb!~XvI@WJUhZ{X)g_dkwwpG2tXOs|(O z2s`71b_>mH21xAWUn}!O4qMwO3=&Lu7MbfkeFkP{i5_mtDoVpCGKi_!MG^`MF0WNg zmM6OWj@wPdk+pGOBAG3Ehu_hl`L9!7wW-2HA*s=S;?Y-q#T}jSoP|DroOUH0EIr8V z7OrtCp6_%P87emq8Md%`Ww#jmtUXe2<=?;EL*;IY^O+Z@Z=UvgzWT_wN5LDq;~sGh z8VO3|OhM~PTxu+sZA? zVz)Od&+jUBko%^W|0^byUd986GT>s>8w#z5tV5n$>K}%Mlkfa-V!h9|J|EeS^?Zc8A1o*hKi=vAIBg8{eqIp-Mswlb3m%MIXK8S>-5lH|ZsseXB*n!CMiRL}$335nO7ELy`t#q%cP6#Kuo9pSSsUR}XkrD7 zFMK-^!?6J(kyj&GJgts;7vjh%kOk{;vKaUI9^F7xU}1%-mgsel9$K~Fjq^&Pw^lb%k;WI}?e9TgB!m(ETU;c(b?b);V|D;n#lU#y-e{h1tdPC9 z-Z$^Ty0;n1v|b1O#NZYfxvz=(`Di>4nJXlSw1r{`FuK^(gGwH@= z-1#gIPZi+_T*`!VF6ccC#1wMGxAa0BENm-9;kSI2`H{VtvxxHC>pllj)fpGwcN*JQ2mcPr9j}@@P~W-hb+kvCqiW6_Te?1U+N zW`{Av;s^xDbou#Sm3S`BN&ZC8V2H3Nb0G?fcrxlbUS97~&Xn^8HGe0z3lmSJDIFb0MyWAU+;%;>7V$D7viJ=L zJD9Y-ufTf!+L)`TZ+(2_>+YP~pdHQ$cPOFn}Wb!P`xJcPVv z-j7P|M$5PB@j)w&_IJ5GHqU#Y;yk+M;}H<+FOElHVQ#LhWH-?}r0KMz6veE4>$o*X z{Ul62&AiM%FN6RiJv+Ojt&@XfR~r*Eo6O?FhsrBYrP^E*7K-^P+CQmBT1I{T89*!y zZ&S3nm8PVmEJte(+r@;CJGZjV+zKuN4$i$}^uiqRS6N!=rJZ)&%u*cr!@&P-24;82 zF~^+3m6G)B$9;9duNj*_`bW4%x1sD?Uit{on)5HbR*zgbdghNat)FD>_3F(ZGO-7# zKGold{++~j&eJ8RZ~v*f7TF5l+3A@IoVyLYIw(oh1#dg8J~f>7iJcw2D|^Fy<@nM@ zvJT<-pJvLYzJ1H$;%Z|sH7+VI{QgN_(nT^qf1t0iv8|^^iNHD)asO@r*^TT84KlLw zun(e8ZM7+<-N2&h-Vwzn_}OuxsiYSJ5CU+F@+3y3dzTJFT*~cRW_*K}Xk` zZgmq)s9yzXdN&IvFZX@>>7TRzXWuV*u5GPIL{D(_*MOx!ntaUW_BJtOM9cJ>sWw5B z&|4KXHIeGq_YhhYD$GC43m*(vunP$AS0DF&vga$0EjhJfk4Bm*VlRHneV0`KZ0QXL z5QcNwsg8CQ-=5nZgpfwZhG8SblWm80y2T}&Ds8q5JhVgz2uf>%DZ4v6vEPD0SB9p` zVb)_v3rtINbUR!8+(=FlKAESj1_U((>_y)Gn8&qcr$;%XPHnHp>YA=b%VHrKYQU3# zK1ImgA(7LoW6N7UGF&TPeuONyT0vtuZQFCp=Mk|?zvAbc;6sTfy!qH5cW<9NTK2Kd zt3vCGckdg%V{Dy)6I95lLC_#e%!6;wc)(gY-#?hT~!)gYv+ z4GIhPXs^kVMiWk9my1QE;^PBLffk{|y3l9->sD6YiM(6O-V-%$dyELYdz^m;TisVm z;-h}IGhD9j1s1Kvehw!+gNCVhm?%*|^1IhYit?(yD`~3^z^>tVH~AR>g8d%$Q}f&b z)AlbAj7_>6D5D-B% z@b_=cam(n*KGm%21i#!Pw1V`^@!nB)`(uE|5fr1sCnaM|B3fO1=@ESE*5BenY5RhoDrHyiU&TR0@;-l{=wc$7 zQITEseaw!Llrn>`B&0M7mGtXZ2RjL#*98bg(S z6~jdqf?VOA+p=Oj9MDe?=Z7bIL9DMR(A|lROsU*nB!!faG0lQgFOK@AC zZByoD`X>*WAz1k2n@vO^mZK#zD|u?pPQ38FoTtDYdK0dspFpQiOSdv7*sa+u;RF4Y zs%$KGb9?)xr3RSdCDrR8-qwG>u0Gpe0dvU9)bAdX)m22#jSk}?xOJdqOimVk)B66h z6T>B%3Vz>N1-C!R!_yO?2f>KVCJ83fz|EV>qe#`8DzeVQjXs zIZYF3{`oR&1Z}IRsK|aVDlDwX>#Y0Eorv&WHbcsf!NJF82bO@>UG|xk7Q;JBOK)JP z7Tfmv%3E;WJ34g9QQr}TiB5H@v4}|j-;6LJLBZmY5ukQlobHIrU}UK9dme{xZnA#< z2q)-FE0uR8XmDNcsC;bCrG49NtdzIeyo-V5i(7sCX*A4hzGb#)!^ZhCr< zEN)Ic^E}yC&!196knpnh^!KM|mVSi03QfV~C-lSjS}W!OKPF%Dh?%lyA8vtQJ%?xt z9(Ff(_v)>dQS#OsB%xD_i>$8OVwWBnBO`~0=gHzhF6T!^-seXmsE;8b2gJJByW880 zPoCVs$0rr`pl@Ww`fwA0q=r!{n7BYDFYuhj80T)?`X>=YDr`Pb1-A{pt?PqKKqMgX z1%o>lM1JYU_VAlTu=oL4B=~((i(<7l@5PIFQ#Z1XSGGbTj)W3}+N)P4e9-X>9{fSy(#^ux%=ZF6J+ievGL5PCE6BYp_o7rDX zmfF)8h_T=@Pqoq921{D!mAl}7(@h}AY6Y=cm#?O!wSIZj{js^uump%o|H}yY2eaL1 z*;F7j2G1bwQ&Ugqu^t|}9ITIr5#AyvpIu#rS;T_~>70Y+ozrY}g5jYdCf)PiGTShS zsc{6&-1*tbBU)NkJV;6#gOP)E&C&il?3Quwiy<(~#U&u{UQCKch1!*$!m~w0Cr`n( zjNz+)m&xVf!-pzc@T)a2I{&}<`#KR_FmXULxbl8! zpKFh*<%LglvQFkcFRO$?U0`7T8@0LIlS8l3*1>P<(l1}ez>YCly74wDYS1v`$;407 zMi_Dsfdj*A>6N14Qy4tscqYK`Ku249ZF%{@?59hWEh*Fy7fiD4wT7*^U%u?Xg-lQD z8yOh^w+p7KC^KRTinD`BI{FkGoUI2p`;sM`5xlP3DvhQTvv$Es;3S8E01L51kL@LF zDi1A0r(%0s)XeY$fvx3!_6rNHS79U+2lQ`#d}Z@T|k4=ZuyWIs1u$ zpijZZCx3tjt`ElBBvEWIu>z6sMx@RpUgPe{pad^{(QuVne-tVnG8|R2`mL<2U@*o1 zYu@_$qwG1?bC^*e5MgaUP5bg7BWu(5K}5{U}}TtbU`x;D$0_ z4j=6hXR8B?S^@0yun;d^5G2_&j^CgX{!yY@2~Rfa)cs(c4&Bt!^0m`AdiA(1J3aky zF*%~4&4Shi{YN{95FT7!`H==c6~+wb9-^ekI%YtV{!-iAT?`gy5b{1hh13ind-&ZT zi~Gu}H&uro8d?PFHm8404DDigYPniBbpXKw+^YM~Y1DJqP`vdoT4O7{>$!^2nVz#N(n47qAN zPwe9Uns7qc;9z5;Vebzd@a_a|0gNEc9M4iE6BeA;$AI?0YB@4HG_(%=NP@?959~_r z3-JdORrr11HvYl;#E0v-Vnb`^woLt8^n zZ?bGAQ~5I(qynw2tqixNot+5~N=kM$JqAqe;C^a1T)3bfDdfDaWomk_{Znja7~uo* zF4z!q2o}c5&Dz|&fH4K4jdF(!L0D$>&!Qupfd6E-F>wY=4KhAEG;BV;H$-?| z+KY?N2e8ygBXI}_+^2mWL1hJ;f}wKzsJ7SFk(=hJr3uiO$C!1;x3k4|LL~XoLR7!Z z7syluM2$2EHawL)?b3UZG1ow2o7Pvr)Lv-OXw??v6neMD2#oq>=jRoFXQ>DWt^az> zF0?;nQ1D6+ay9$Xx)Dzm6b8%6Y9fmVd|VT{+uC3s5bPE?80!^(Ea=W{*!)QiNe%m4 zd!&$v=kZ?hK!j36XyIr9Fy8lhiTR zfIYe^p%coFz@RneTmDFDZtm@=si~NlECvP!)QqT|-KUU{($dnwi*x7O2$+rT?CfCQ zkbbS+Gu`OTnH^>{?0Mp3Il7-EON;pyG@zmxa+!fyrR2zI;TpIL8vG4CN zi6Fi6Jn^EcH=nXvCowE+Wp)<)KShx@@jF|@<&iyrs0=TF;-tbkq=39QC@4-}!?~cg zs!HqOt>8)>DC?et5rbvhVrF1r258 zM%F;FvDXp`e~s1hbST(g|EYui81>%L!onBt-tLfLKy`I>iRI|lpss{#0$8n7DP^3l zS8fEgRFptmK&t>hzt>J@sd15dat|IEHzz;;C#8w*?v16ii|*Fe6WH;o_#Iv?3PV~e z-1~>c>(0{rCHdYi5G zmbrXyRosgT^}y;d)0A# zbR=|snEdRS_Qm1MFP2&h1N8!!+>BSgk(K@Vs$(CVhkGQ5%PT5K@O-(Od7 zYkXYX6--QETaM=GQk83YZT)Mu9Cd;iO53ra0)mm@;pM&K%*@OzHOK-qgOZH=&K)U+ zjk!5Ki=jUtl>uxRa%`VVNQggwj&=3Wo_w&@d+aM40TjErI@PI=q(>txk4%!MyIZ7P z;gFG?Z6>9U`uO2PBkWo}kIgTP`9CDEHuZM`w(;f4wJWz62A3v%)@QMu-ico})TPgs zO`tx4RSUHbDYwNhFw;bUvFtJE<1d!8tV!c-$`Ts=LaI);&B5x%dpED`$sx>)3=DkU=T{I4(gc)(oUmWd&W5K>jDb-~s|n`~((tdLgam+!#)OFI z0FT03Q5tv;kHgyTvgnj~94R5_Sy;SJ)($`fp643@usMjo!rJCLW2;}c6(PR$Ey*Ve zhsDOSkQd9+YL;zIFC@5QA$Hx)qB*3lUF)1f?^QgFl}&|?PUyh{kB+a{a7?i2OD|7N z>FGzBwln>a2tGYpOb+;=#L&G1F^;uxSy4)?q(R^yxd810L}h|){fG(Y+Gwc=4^N); zq%h)J|FZDWY!O_m74*HdVGMM12N&lX!y7dxBlY#q(m5VIf)Zg3niTbl-SW~2w*#PK zz_>0^i&^*Q;^#*)2{c#nutec-0l>dr&t)d4G)P?8z@XtR22MlU>0u+PD8T*6YFthvs@L-x2Pn<@2pFFbmZ4;JjLJYj){pH^TE3RIVEsgtV4EGicHkc zpS$~?B$%Th031RwLC?-58-a<534ZKgh-(y+J8!7W7y->VS?aE^@B}_SK4cs}Y1=1D zQ5ecn$pj|8+l<#>o-Wy~TjWH20W)Rb@B*=`@I%~2f6sxx=r^D$wLcua%hc}c>#L%o zqEqEk(DV3OSC>4nh~a&onET}Zg~aU}1g$MCv=1MarKWN}&iV|8hBJgbEFO-p-YWkpF_mtzo*P?mkGiKu)!DfaA{{u{ry zgca?`Cw1bl*QCjKAnq#}{l7cUgslW)iYAe4i3-Bmc32~mTW z-Q?v(Ky9hWit*pdh?nfq&U{p4fBCvILuwJ`(@U@n{s!6#`+skC`KPnTdRG9}r?`?< zD0caJMc)+3?I3yXsqPxm*k zU#|@pgWppG4296E)@otL1B#PjEw{YE)CL4FIe#sHCVkyv|h`9S~se;4phI$)nZ+|62d6 zOw?~{H3j52#jcyE(|&p6LE`stQoI)Y8#v=(uMn$0{0LEN0h}i^W>n;KLN1$s>OXkD ziv0Um%kovnwsxkz#^dZlo!r3{GVO^|RWzZrY4u!?YOhLX&PcLk6ZDOm3JPV;8}II_ z_Oq6hT(hXw$HnFGxFJ`|kOQ(0977!an$zuA)qamYOly)HqsG*Krpu27sPCU%%fAiL z0S)Ma@CIl%VJ@M}c7K;ejG=$!Mm$Bcc97P|?{~U_F&~~l+xC}wvvSoEifxDkh@@gj z!D}Q5qFrGJ1Dg8!dQ!QUW@Z)gX+=yBJ0Bbv$V!5j_JXb-!n$yQ&}w57nwNLb8~}=n za9{V`tu1^UoZReeSs8)Hf5nmh0V}a_aioM(*iYfhriXKW9k`U@$qbJky-d!qGShq) z5Fk@(H4P0~NAxUg+-~l>n>GYEINY&v(a})q0-2Say?1m}lQE*Hc~8h~w`@;4fK>H4 zatnSE9^RDeIfy6VKvj=igX2b8T0`$!?QjS1^sl_Ftke_}`zoLI0>lKlHB5i!mzHjl zk{Ym*ppyYBZt#V2gE68T+At;Mz9*HmXooe@`=2F&RfkarmCER-00Tp`5=g+w?)0y9 zM89sohkN73*8V?E#P~ zm3+9|pS6&ooCdbfz(NI2Z}4JxQi;62oT+rgz3Mgv@&Iyj6~NOXom9)J0P=gZtF<_o z*FEW-2;a_Lmwn?43fMcH9zx->u}T8?W`Y6dBF5VpUW8k5s(8~!*arc~Cm`i_uzB`u zy4;>`0A?z%1exgR3BQB^h9k85M>edDgq)ny=y#L-f?Z}NXLxU07@cf9zf@WuEF*vy z4ra(&LCMZ zr_c1mhYuT-*015v0cS5<7C~Z?#mO8^;1~f_W31Y}BkYB+Gy@=W_+;D<85qh_Q%e99 z3=t{`C8T9y661YN8|K>fB@K!e6~+kQ5rj!BLck0fEW5#In^LF(8|xU? zS{Dq$0Uq7!DpJj|+?c$B{!=ac<_|ESwY48JX1!HHgi4lo;V%cb7~t}uki{G_7c^#j zG|PzkdhI89EIL&trn^Np4h|sF2m%!R{lXClU#J0+5~&SU;@5k6+7hIRPjM{DbXR15 zr~x{8<+LtDU54@-u*2-$Iqis6o|!p;LS*uFMN$cHO8LA_sic>nyZZxHNr8b(NiQtq z<+}!Q1Y~K6T5SR68ZR~n>Gg>$?G9L4f_!2Tun3-tC*3=kSWVVL`CEYB8x$OFwGu3!Caxsa2R!`rQSE-rcwyd z0-Qx7<@SI?p134<&qds6^t~}&ILCvMbaLuiA9u&0250XTSkZvA`*h)l_wMc%^`**f zgGaYZ0Vg9PD!E5Y+(`iJL-q9PVEINS1YMlkZ-c-F!D`q7iJN6mNdKDK2Kf{mq1K}% z@sP@R_zxG*E-;}YMoFp;lmjY_SqBI4%*+fB#7+5Tf#mDvRzcK|ty%i)W0DWo#zgf( zJ@y9RoHFwAKowu_ZC(dkvH_}CC@-Ig+`5Ek0mv6cx-KS}9!vs`-7|yNIOctk4nG{Z zU^eozO~}3F`W%FG4d!TipB{=ZwF@7NDcjnfL5`mD>d@NsbXVa&NKU^b&@8x~9Vcq; z$h?J`LyurFvi^T?7Ls}hyCS)5&W^KJ9Lm5ULtbJws-%XSZPa&oZgj*rjj zF}eCSE^h1{CN>}iU>@kb+mnWXgvOMg+1a_c=JN77T3RA2JtpD3ow44ABrV-9=BB>= zU2*`DG#aTknv|a}Y2v@Pzh78fY-^)1;XFw%4Ha=h!g`R^uciFde+gW2rHsGq)ca|PkP#@x)P5ZU6S`hj za5fnL3bf$ilqVEHA3<#c-8obu$;pkdXIw%2$4{YMO)o4|asigs5Fnf@h|H|4{^ddd zK793I@xn6+fS%*w=4V(NfCxu-8vE)ao-P(c`)_Br4LH4z{0K-hBS~Bm;H6^KhAKH104pVImk9mf(4?b9DSH{fNBP z$k-T%>Mc;?QZ}KRGbW+EU)SB!(*rcT;bC=EoWw@sE+`U{@ZaP7hf?%MbF=}|+SKd` z_3Pu^3`NCp2sMZ7M2Lnrh;}~cd!YtR8Xy32alFEOd~*QB0zkTA*=elvD}xCnL zZo3~r$PCRMK!jPDy-zU#1VB7xxC1aP*f*>^m z13WcBD1uiB3qU@{_y&-}p`wevAq_U7eO79KRJGZbU3&U=M1>3{wD%bI2RdWXZzY?q zW5_&ILV#@~R4PBoeT-Jyxa=`WlG@x=a zGI@j9X56t)=+v2`G&h)OXk->Mth8S(<^mDHr!-Y(I(Fa`aDq1-Um2t9$18j`#)fAl z(tCE8R9wzauTghLNk2l^OruPz+0mh}GFw~3A?QaL4^X~!=?EvEheH|i;`q9@yiz{Fq-4x8H91E0Zgq9zRsuL*mFn4v4sTs*yu(NQheU=*ZA72!sWR5}-P3i;MXVOGPx| z5R5xG>63#F9Gslg{hG_b3IauDZ8O1VWvq-9IF92h0)u0G3Vv`Xay&ovfyy8%QU?MU-qWT^ zr-s9+s~`=zDNG!STrbOB#$-k-#e|2m!>ki#3s0ijpLlj%!}?Hf!Hs**R2f}jg!*;a zw5tq^j`kg6X`l(g>I}rQ7YDVvbaZK-#5y2R1I8yxc?sLw+rA6;sL=|3239&(FWU}W z9HQml@Zqh*<+_BJM2 zXlXO`FJ2+&8TfQxy}C_B)oM$QK%=jMMw+W4XSf6Axh6d{FuI@yjO+pGqvOLzj}~^e zufr;Qc&i{jUi;$Q78*fV2H&0yYM~^PUxHu@V&Dp(u3&m>=j5dEb8&iVDtEw@DP^}e zWgFT{H2U12;49&St6G4&{(m)nWmHt%`}PdopeP`vfYL~JcO%jb(%m6FNLYj@A~2HD zHFTFEpmfgA-7Vd`o9F*~*P0KrW}S0ppWXYuuc)hgDj}gU{!&S)?AtfH_Hh1Wwc|wK zO$5S>oSXxI1%0O?q6|U}N~%uFwjK0C$8JwR2?o+z2U|nGKf?kwM1?QtSqQxgve)Ig zIynj4ZQRozaXq;kgqvejyJ_+)9IULnLkvLWqO-kSoSXZnNHo}(WNQH)%lo)EHt_03 zg#bIOZBNGHnt7Odq${ui-_mw01>K{in=;rDK!%*#F7Izwx$i^?>iRB(tv@h z%npt*fHUOF&bxdP`M4sW1ftCV4>15_UTwiaYe14Ij#hkiX$dIVJU4H-n(>naxqJWR zKMQ~p0uZpkG>$}|y#Mu9J)k>*1+g7{r4dY2MHGaJB+Ph5qiZj}OGs;qcmk ze5?fx_Kd;G%xWyz~%&axS+D-J1!_Fq19)X>qm}+L|orh6Fd^(3FJU`19r* zf#)QHi@{HtDxiTu_RU<+w*ZrAE-5}9SIS3(hHe=gOF$(0-fq<>!I!^BAm;^$-s^G+}b%(xf(?S4RVdrWUkjRl-;UW3|=dn`G$ukX_y74wmt6Qq3nfCWq} z_4!Cwm$AX~qjw>vGlIezAmR0@K7J3J>}W$?_k&XF7#o9~NEpalL8ZW-0KQXXLC?+k z+Va1pE?w4#Ao}#;yU;_bsXGxNkd$2mdZd4u_RwMOX>P!=7o6NNaX+kw9BP5DM#ZZt z{1D~`CvAs0j@3yIdxQ<`u#fjTxS|c%$y|Rr#*kRr*##ausuwk+3FsQjg5L7$utUnugckKLaVMaRWgj5ZjEC4B2bk3jry2k9hC%G*v~k+e0cK6mCELa!tN z6jHO@vQN%3Ij``gNNQL<<s+HiY(0zC&mcdM4Rg?9Z=Jo^FJk1 zCK+<7%ux0{p5Q^(%X~&H$$~QtS1u9*IGKUCh&;Y40BT_~Q79P@{t-a7V5C@4q?X{{lC4;P1~wRR>_vK-|AaSL)7wx~?Epttqx8b@wqWRl_zaLM5)Cc(-lM!f}O8 z7;Pwo3crN^@0pjc(1K3$dytfT`;+70Yv~R?3&}?tpe2jDs?_ zpaj(f>TR$Uow3aiJ+sz}LC8XQKB4XY)(Pr@qmAP)En?*_;gkiUx=+P;IuTzalid4b zkGa#OOZIjB^BcWtE7|4)Y8Vj?c8!Y0bjH1LEv%9M2r?j*?~??X`^UkU7)zp8C{2n;}P~_N-an~X;pc@+Fui?Hc z8t7BBZ*licV^^eX&D}6uMPr~ypJ56M)5ch6)K-0s8lFjb)KN_;+kd?j#Oy%ev$6YF zOkK&_#-hg*-aS>QTOHg98PT9bSDW%7;F>NIj9n7SBtMF2{|_$*?z=?;MSaN5pyT!j zDU^t==etxGONHJ$(`Nev<2gCL!}wAlV=`M~uG9*4EEo%2 zofiOaL|)#o;lvxGO+rYbM{)5_YYic+@y+v# za(G^>I=|GcHRgRaUG+;m^hs-+)*qz`$g(784V*{GykE;!>9zT|B z=n%EXc(D=J7{`9QnOC%0k=)Sln7jN=nKonVFf{x-yzQtKahY?)Zy7Ih7%)G`LEw zA^JGIJ@sGz1?GhZwcWX_97|tschgrqQ7)+Ov3Kz1P~HPPc^97&IeKmi0-9QcsP^Lg zZwJymXxL6*&E9weL%!4C^xL)ACb#Uo^fjOZtFNu?rCN;|SWIz+x-L=72e`C?!CZBm z7J;?(cJ3ytY_Vc6sLzz@V{vP_@YqFl85u+)?kyP%fBT{8h! zl#^NmbZFN613Zn)`a*|qpC%WK?G$qt3EI!j&VdRV^FtNLlL!bTN9SS2hY!&rU%Xd= z3AMU6a*GRNn`RsMHW#fO8zvh@&`HNjzbt>*>UyiIJ*(lS!p4&N)k-052!51om@Gxd z$H-S0I9ek<#oEK__5xz^+O2;o-OCf3$*+I*Aydf!@0>%w49bF%1jQjDy zi?5R_^H$I3OkK66w(jwMz$Sy4AtuVP?Ab2JXv{@>94NTuO@J`izwkFDhFuG#$`~6wKhk2ObvvT6e7j(qC*UklYpKNorgF= zg~%M$P^w4+7u~>}>g52$>n-0^V|!>+t`V%n)8b!srQI<9OIk2tG;Gg$2q&OVSKH=Rx!p8zlb=hb0nc=@ak1%O45h+m%TP`EuAv+1asD<{ZwY9a|b5#1T z@y_fKWpq+(A}W#XQ;t?Y=f*0vTxyXSpCf{P22BJ?+NVH68;?I=(9tF>%|wbqs6o|b z+ef72`C+u}oJil}*4j`4>NSCrmmT{ozxC)=mK#0{*D$r=Mb3Rd?1W!#eyl9?3z_@8 z#mbZ1JJzAQkgYk%0)^m^6vbws;XPosk1;CzVe`<2T$NMcmhNRt(k9ugqP{kvR;-d7 zk4zQgr}7NUPk$4J@DsyurC1C4l~~4`Z+y+J>7;bbSOdueQ_Yy7mp;9>G5Vp$ml1Uo z>VJF&t2-~=Fi=CPAUq4n%_k|CZ}WvpaD}1-M@J!a?xKy7B%db!g2Q)sv+NJW&3VmQ z69lR@^Wx+Mrpy~zGRYPL#`+sYmDMM3AsfrXFBSy@MF6F8h<^ZQ@zQ@68bd8tpV{>U`Acn+t-wtpOej zea=4So?VWk<|FLhymFitnT!yAFBd91g(zj{g5VESbh7+_g>_U*jU@<>!f~yfF$zOo2!6-0M^!9tY&UL7pnp@)NH;9ulneP^s-uy zM6+kj%yjGPt1);U8-IXMZRExViL>TNl z=^R01-96uJTs2(%<^AP5MTMhXnyA0<^K+Lb7?@j_j;IKpvMgT#Y5 zT3Il_GD;4?!^d;z(Rj?HZQpm%!0?%+EgOKQEYOnGa2Zp}nq2CgFPYkwx?;YmE+bVF ze7nQ0v1_c2V-zYK4s%JFUKk8~2|`)C+D15E>bw$}J#`N05=Vj4aygPySM5xX@trFTv*+tmNCG;(eKMHM*`xR+p_O>$4C zfyQ+rC$feF*e{uLf{oL<201Cs4{t4%%pF`V2%sZ8zSz>#?o)JOI2vvu1?VN(a`9gb z?F&ZwYjFAq@4bmst-_X!+3HYzhDRM77C5|4NOlrKj#m^a8_um0gzZlvdXojaDk8KR zR;T!PD55R;i-nQq43V!XPpsT1h#^6>7mdE}!|-=Y2zJuTz0o-OoBbVBSopt{-a@9Q zAD}Z8pn{c3wDDrKPpHuZI5xxD&ZC&`TJI5Vj{j!0o5RVq-0`X&A+jWn%T+tg1Adis zu^u}N)IxIMSM*#2BMiB3m00N`s`7Vg-`k}suk9`E?QY+kN`|8LI(y$Bv%i*`m=+PQex`rg_lrl4FIwOdMv>Uxv zBJxh*>*MSDf85op z6|_qo{8upEb*r!Ju1GM442FecPx3ONMc0LR!9N)b7)=M%d1BAFB*a&7r}<{DBVXwM z7|N;1l9XKOYxwfkl(aMa3swHWTv_b&mEW6pawo(R#VMDTK4w}QT`%l!YKx9v3bwtO z`;5rp#@&obH#a$z(4=+sZD7v%=ENB|9#B=YQ@c>9srw@^zMQ8-gKf#x{<1n?)!tar z2smXFXnL~ed20cz(i>cF5gNOmzs@!xVIk+jeZH5^AUw%B3#Chh)IDL!Og6$?8?cqO z>>^_=KS;O0Z{!W`erEey5FS7CSSkrT5s<{MLgs^AC_6jr)zbXq5j%~&doxS7X=kmq z60eI+JY5>!qV8QaUJL}m_f@}Ht01Hh7I*!5 zfobfd#)Y*hu_Wl-ZY73igcqpZyRAsHiLH!1+zdP>5{&o+uthTOv@&(ZS&eGB@geh@ z8U`2zs>OR-*<>K7NH+O0lYlf?LjCluV{( z^FjFN7-Bvg^MX{-XgpetrB4JdkK?ehK9`#gLT(kj6;!DmDo(@Q^Ogs>ZoC`Wu_l#Ti_gdpHt2?{)n{zwepPb3a z49`{njsS&ekVm zn~1sC&>`Fdg5RemE~+OWi%wRsl5b8dm=G!rR_j(hz@J_UhJ{s558Uw^8}xx047{ow z0>jCe;I^y1ES0SN)}p|EXVZ49omfDB`-35C$8_6x+~Er8 zaC1gzG!-94a@o>;jMcmwq}R+}Wftyk#XR5?y96o2@N9aM16n1wvC{tt9 zW`0o0h^oN1>AQ-L|4`RJW&z7hn@a5QRWip^+4!r?)OvP-Kdb52Z4^Rkp|Sxm4Zf~( zkElteYZd2WaS$|wYScn5i&X&maVqKGN;rX#x77nK=dH=+-{-_DE~n4E;NQu5R7N=3 zG+Qz2XgVSI2xDN=k zAzHJOU)-QBc!Q~8%zXgBj_WNUh?{kR1G>JO>Z(3ztx4Jm&X+`K83A@bS}uY*M}Bzw zZ@A=tp>$9%iqbPiCE`Pjejs_MN|E`1h(5`tD^n@ZH5QDjP8fBpR^Ct^9bFFL*l8X- zJLCxd!vg5nIl3vV3pdSlP&&w`iJkY|Y)Fii3F;tE`v(Lk4q?f|2L zAFen6EZUu%5Z8M3`d?Oud*$=N<0SvX+3>)n#U+Ip8lUZDm*zPmr-#cAs4un#OJ^Dj zyNfn&u&RBD7MxaqhmYc35Z^&dJosCVM}LM4@VUItf?*R4!F;^6ymmfJ*-@3U=rCF- zBSG@Y4i_qP0>PHML*q>huos6n!Xs34poN8BbWISSJ0Gx8vg3y*~BJrE|oUG+pQMjN!$SSFr>^raOz2m6R0R2AhE-v;(UtPJW6;A2#-XCB^0h{V&Pt#80pOh{ z*C&H2mQ$Oio>5VyY>btKsy)Hfz>acyM1+m1Oa=XWw@oxlOJyK8?K)^>4G=s^QpXH| zhmvTB^HKf~*!XT9Zi=2zT8Aiy+z_KK$&cUf@P_`pdWa~o_wVg7H!w4O*}T~U(h2oQ z%|`#8RkGcN%1(&jv^fI;-ayQS4|%edodd?X&HcYS4a8+Dlwnv9*Hgki5W~w9#l@z^ z3}6e7n9`_Q?e_?eBJ%X{n5hrWGb(B6qtjFY+u~|L8luUnLe<*iU(g)BJ(JmZ$+&$n zgu7OBqnn9h$j95;lYa5KlFk05IR$085)yi<)pIKa7Is< z+yTRouH_}|6iVc>>#OzOM2^2T)@(Pyj6>9OfxGpJl#=~>Ap@tUs!kGJ&0WnLvy)Cv z`exOh-WR3CzXB9c!z7?0#O?%ZmP`+DWO3;D)WgvRR%n?&g;)IWihjqE1qo*}kxJT?Cwf}NKs*0ljb%$x zWR?t3`)p}>6haB75_Fl?sje#QnfuDA8&8c-1JP*|xrse_ZGvwqUu=&i@xkE;lBWaf zDnKX5&_C)5gdK;4{T6APIDwF2NR#|#R|qpI78zCA)PY-SljmnCF7r%0q_WKEANJWo zB`+?}z;|Eoh0Yy@?!NF}807(`okm98QAz6M&`+OI1}#`sSJ5UQy^HxO)()9e0oxYy zAEos2m~zC<7Nj9Qf}`A>L81S4W@^b{4N@~fsMU>_5Gy5?IBE&cUxACWoO3;RUO9^R z3xOwatJGzEQ~}jvZ^`q$%;VGZG=I$~FDf~%sL%2bU))B2Gu^!&3SWG2tj+IUCOSSk z`V``Gjb7RiW1<^LX90-<)C!w!e&3;EgV|(d&NI!?-zIpP_5X-8!f5*pZv$vYTO3f!9 zd~52P{l`jbR$N1N-)+COD8;Tv1+ZXJG1_#GxeAagSIJjY|7A}{jmT$v!x{Pw`t85`{fZf@0X zH;E_aqMm+koz84-%%R)DALVO8_lkafQw|={QDWg&XKTK8qp6(@zX?&_nlJnCD&~O< zzDEZuWUXWlhls$ZB^_BhJXGjrejAyH3aJ3ZdB-BB;pDOMRV(b%mQ<5-?Tmi?zUaOZ zCZk7IE4!Y&Hs5j`X!5#dPk+MDM$ny=v#wKil8YfP5+6za-1zy^@N9 zL|sD+#^ znk+0TWJ}aJL%*3e!}z1d;0D*sp`K6J!<2Zu;cmExY-K-+CZProR3i z#Gyay`)-j=CtGf{=AoB$&5!&7$D2M6U)IR!Wov!t*EYHijjNQ}d3}1ERgu$Fn8-#w z-A_pOCdAAhy|w^frJ6Pd{b%Pz>}d#m_4}7Vm`z zoSvMvI|lz7dYgduF<}@r@wG^#Z3sb#6aK*B%@dqO%gzP&Q5{r7`@#>!SS-$`b-GlN zuHHgXALnRKX&>KPuaMExHnpmqLN~`?w6%ug;2}%Q$wM=SO$|L9I^x?EWBuc7j{9fH z_Q1x;*~__zyyQe65V~*qJU~7}bkM!-)lQ6)6Qan)$;r!n0juotddBo;sT0ZsKE?vI zh}JcGX{f1LmKPG2FkC*!En8*oWxh4Jg-ondsR(9D;3x<=Z%@o?p-co%V%?P~>V&QulTWFE!?$g(r%c?9Lf02W;bE?8-^Gj3J zeb;{unH%In{k|bjLMalsyj|I3&cBvU(UKTF*}phBTKhhV?wkhQUr&5Y@TikbwD$V? z#|wbnZ8|wPQKY?Ik+GdCgZABpVz9Cvh4DCoy&BA{I3JHE^$;`Ba| zH9@D47Zd|uX(3^|4uAF~DwRs-Ho3gpu13B-BQE>%8T)nV7^Mi+WX0i{Kh^I;S!9ZhJ zG5=cBkEu~)S8N23-jUu6#i5Im`9tv&TR#M1MT!w74Z_oEvT7st=AoDXB zJ6X0u{cXhD<04vTDyt#MV=kTNCB-I2$v>uYEF)CX(dCw;yBavLXU_>6M*2lM**90+ zJT8A}9%lY7kH9$_{93Jktkr$wS7Oww)qY=AHraM_SahIGt85wmf>(kV3nQZBLIG}P zb9p#NW@^Vn#cFtC_oRZ!yXz#c*HzR!2!5AgGrXV zFj@=!FUO#KVm-a5+1&YJ<=oj@4zJa5^ND{9P6D)8&x+8g^RS3(Iqzd8g#i)W z(2ZG6A79^;uPukM(G_T$7ZD+0DF=Hnq7J+x^gj&5?iEg?KCA2jupbBptn5!oV1y+F zFN<98LogTIUxRgeB)FBaH!@z?rpBV*&#Zz8(7C545a9KIXj0f2%$omFpWD3)FC;l^j!oyfazuD0;@ zhXcpl<%c!%kd=uGh0v~o`OKMLQ_KNx2Kk1Hev&Zj3G0_&ze! ztOaE`X&nq-m#woMBDIE31JUx`WxiJfuP^ygb7JgRHv8eX1pNGJPkzR@t_wtNc?`L^ z9T8-SlqpxyJg#5APtk)e#zJqHK`P$HFiHLe&7`s6;QyLIH0*(4+O;qWzlD4i7E zCom|=6$Wo3QOc(kTcMp__JP&Ed5c2j>_gC%av_a658F&!X>uTO1!6Cnv0rP3L$$*1 zc0m)c4$FV+$2#n#f3|s^RmeO@TEsEr&|`aE0?AMn=XimLP%p11ZydAary$7PO~?I3 z@-Mm8QGXOm1g$BFx3dsY`aDIu%6WnZQlwYnC^}mc)Zqyssmnc~G+i%FS3jp0p(bj* zm@Lv3TVGD1JB&}wYrcK`aj8>u$Hz|uDcQCc%O zGrh8k`O0NaZn|Fv2W~mSFS%%GK|u6m6Dn{j%;1Xe9j))@Dr=4J?fYOp}|T)5{X! z&f!}!#U)KzFqi)Cq@PdteB&>&1_?*bU}P*v$>uaxY;G3v|ERx|JcSt9|hDbZ%c=&r0s5?ynfK9o1Cv_njdD^LnsP&j zJ3ndJuGo2P*Q=)$W48fI36{fbzYEbgpT~#6o1()(a!1R-BnQ8jURaMxK2T>&yZ395 zdvt&<>%RMQu{NfLH+gf{OYegEl_y^k?;8Z?j-az!dXak2fX2mH%#uMJcg9f`mF9aU zit?(jvOnoh6`Yx@W~ba}ONF6DC(zFG@kr(!K=K0ASD~HD z;%!Qru&75F7VO*DYdvn)QKo-g?gSO-^Pwz+sF_z?@Rg9 zWNvhe4)_LTvnR8EIuvHrH8Sk;3dY8A5$)LJy^3)yT z*`-1||8j_3u;}swt@^sO6ywI-u)h2J-iD#gi&=U%R#PULWMhJa*C&yj# zC2nW=iv-tV8;zsxf_j_Qwz}u)TSd5%5~8B5?{U{9bD-IGWo1}mp}URV{{9U=vBXf( zXzu+$E+_Rhc&*YBA^K{Ox(Mf5RPgox^}vrLq|8Rgo0T`n$Oh-`XNc!vN%$m!FUS=_rA6gp8jz5 zoc*CCXPlOVqiMHh`q5Irc$T=c$$yCv=dSPPJO4HINzs}F!eJbf{Y5flTrY%k@X*)) zjmc-qcmbN;FWe=U+p26-&CKn+5%n%``?;I&(N0+4Qembz%71T*#wu;1vtnbT=}law zyzotjvv;ndNi@Qv<6>xJ@zK4aNG?+tBIPc6OpqUGh_Fp`V`!)-v(>z^>HGH1U*|sN z`a2*_PuIt9iB`oXRuFt>XCbN)A2_-Qsm+z|E)d(fF z*+-&&b}HFEYxhZUUG@5Q^tVxe-u-M)In(KEHIqcwbrL*GdbEn*jwz667L((!V$Av2 zk@RgUxt}=*n^*8}L!x@4Oen8nWMZ(y9#IAw!r3Tkmdy>!rOLB*IRs+vnzz#I{qi*I zA~bm~WAsjccx=^AHU=w(jq)CK5RI6@-!^!OT+!bW-G6Wp6DRSir-y^+euS1R6qI2!ggxqE6<} zY*XnhgP(oR6W^2NqIeq0n!B!v4w_31?@mye{MM^<&&H6+?X(Tl$K1otQV7ehMqxsu7>PraFAw@(sl1I>BG zXVNAVH6K;b$Vx7~ODm0|sYM`35Lz^7lrrqgQwP2$yLXa#77w43(a^Miq}`b|y>~Q*=Og0?3%Kso<`mqSnbSeic#M8@i^O^m;Z+jxsxr z20dV={Y$%Pt0E;Wb&Qx}=X=P%xmQ#qLos~Rx2B^MrzO*sv*geOOQ7y2lDQ&JUJdOt zOuG9Ng@cN!gm~w7Uqlj?yr8<~sjQbyWNf2fXH*WKf+Fg63(l+rBpgpXqE zmD2ZeoW@Iz-Mwxk())*OQ(I`{IYRQRUY%sgNLPv11o7Nh zHim70H&zVGL|Kkf#xg}v5q-8mt?(hahvAQpl>I4O49}mRZdWhp`yP*x3AmwBDjri| z)6&tMY|rp8GH#7x{@o^!4_PN%IW*X^?es2l=+X>>6TNB?#;*D5A)OoFCbtU4K5K8k zOYO|nBnuxa(X=fXD|r3_#_M}AUKo+VB(f(xz9fhoUN>84ctI08E2c|Xf}@d~FirK$)s#i1-F$;*M<}*@0^|BbDa9(iN91zX zhnYIpO_A$;%)&8i=GucEhKXVw96=hOP!k76&PJem1X>c>0tB`tjxGHkK_GM*d1zu*>o6vYNZ4*oX zx@n`J&|2|sy>1DZ!|tvw^|VA?W{rBcZDSLYfSEtw>DAQ!{hFCJa8Z=3ke5(=oOfQ(2xX=San=TJ}Q|;@%N=D$fej7I~n|10Y^F2SJ z%-Wu*Zoav`Ff%iY61n!s6!zs^{rU6f2pExo`_9`tC|<}NyNW6B=hd`LX@9za`}TBY z^{lfza%XPA=dj=R;spDbIHu4a=URR5?aCR4=Bu{HEJq%KV3oAKTPm@NMMg$8ZI;x7 zWpY~^`V77w6cU0-#(xwoP0q%%Hd(d|Hr#xZuXpuKqfvV>rpV=+k?(ca&;Hx|kWY%E zhNE6o@V+$-9AHS~&x0gmqD?!@KK+O{?FfxFeI+;Sv$E}tzBzkk9H4_PZc4UM=D)1b zXHbw|kYySEQfvtx-Nv`9OK2Wup;+V`Yij653;ii*^=arxsb5iEo<0kkTFUQY+dY^v zR0fsLsO=sV0%;?`NJV9g=tDlhAdZWP$$H*1S!N;)Cv-XWfk z^f+5K_WCgM=G3PNm<)K)^jB7=L@kb*Te63v;M2?ZYy&w_J8P?)fwkzheFX}-PYB!L?rx4MEzjEjqpkFTF2ubxpsoZu$L;p5`365t{b z1b+}Kt7HR0X$F5NNo1kfsH&}0bWt3ScL zc6YoZY+|EM*rW@+dBK6Oi@?CA#A>?bU4W^ih8;A=h!CMs@x|Fuw$cJu?D8;k@cb&p zh!B`J*uyqs1@S~3k>o;hYGdy6p3)lz@&lwrh*jFfk zm1}x=Ns;+u{k5<+Jl1+%qOrJjqg;>rMs1!z@ZV4Q2sy+k*~zY{vLRWhrP2~>IeZ2Z zux;|B@UEq}SKoaMaVA4Ei=Gn{Goz7_!_Hr~J%MpcpUFXUI9-e|D*2LW-BW4EHDAbB zUT=5-A8Tf2A#|`ttzwYkHFmmBE&YL5*hkaZ`JfRwUtzq`1B^jRQqr?=z81EcL>;K6 zRyninEm-vJk-Wja zWR8gUmG(+>CwWapukCY8+I>?{YmaDT%O4Q&v`1 z&bojI^7L2c#Ys+1&X|dj1;-T$HujPWzY0ToemDyOql~OV<95{y^Uj1rpIM^N*`L_V z{tO`y$>Ne8{I^n;Z(NJ+_9qbq5!dCS%BIOu@|Mlc*}xdAc|rf#j2{uDpoZaNH_Ca> z8;X1%Ae;M1GMDU->}9y{NZyin^_^8@pb=qk@+))3kN3@Vm(tkG6(8FUe8nY1)Ag-K z3}$Agr(aE)M0pC5x3i+RdpIEaQXQJk8V(0wyrlK+yW_5Ua-I`Sw-N!5Y{agN1!?rZD>39a%70vE z7W2ZnN=!~x8Oy1arXn!Oh$Z^$16vmjTQTE86#`>dvf9F}DdAGT>_psm5Oe&SWqJO) zK&Whqj1?;Tg&2o19IgE$Jjt5!Q5rln5I{kk_i8+N%3_BI0^}x-!_KVh=6JG^sijP4 zzc~XGy6@R2oaq39m0rDD<2UzRwL>7pN!KN($|zlH-`fC0ce) z70g)?@=qk2!uP{lJIoz>Wr%}!4qtGG#3>)v*hOL)>pn6v&mhuR=Y1)Q2}Si{$*-?B=2>m@YPD9fggCt83wC&S$AHE*H8q%JRB5x zt)M`gCG2}X>oTIipk5^N`ZbRLD{^yUH#gN@yVluEN^0(fYVvWlzQQ$| zQlclo5jW0h2cSfvzSsI~Z13k;=;-Ls1ppOZHdd%X!Bda%cihLHBk!;^`BRvxOj zkzKZI|)*9=R8-_pVGamL8RCangj&}fuYSe-&{H9O@vvtzP}%y z^(sT~tdqcihN^j?89)($pXH%E_Orb1JF~#$zfR{L+eHqhaM`p6V`TbYp9P{l)%QDF z0f2Y0VoE_xXR1)o35~UU2Q+tR|&8i7@#No(=Zw| zk>2^AU~AkO_Fl1uHrf=wn|62SgC=sJU8h-PTd}J@kcE2SXVIlD^f6-?di&6&pB@i7 zc9OD;60VvWUMJ~tZzvlTT@G&WUP7V^G5c3>YAB&XM=?yPj|K#%O2#Vi4=O;kG^9+0|t~Q`NtV z+^n;A3#rm%+~414(y5wl@T|zSlE^Nw20=!r%C^>OgiddQ3IFk`?g%H$yKtVHWBy%8*wQaBL?^T)o6P#b84*EH*m6#I*IazO_UcRaY|A z)%?(pgp!)^nTR8l$dWoN{CbhkwbK2UdWQ+@lJUxqWP?9HRpUWTl0jWUUVx}oUQrRY zHW^r;MQQ_}6@Wv<)i=vfp z(Uq{Uu!k}vC1(=Bx4_qR%Y<^`T{5brq5n zn*C7>3Bwjk!$y1g=(u(Se<}rC#7RmmOI21`ZVn3`%0c%tZE&I}-PM#@vMgGCt!jF# zO}Tfcw7spUx(^OE*NA0`U`mj9&^RKqmWm;2om z*!zF8AI_{gw|8_#GL(Iesxi1RNx0gx^I8Mno&yStRK_$Cm79Kg%(Z=UBrq;58Vljm zB$iYGd5F{X%DFHrKG8i@binO18(KlaCZ>bsYQ6#6r0M9jzi<|fWU4N zftZ{X;RD3!-%Qa`7tl;7@tL)4xRP?v`)qV!nmZIa&V6eWX}yVklr0EmQ^k0i98QxK zIW~6c-yNZZ^tr@-m@H6i6mnOjf1FS4{3*FMqSOoVgaK;0rY!f9@m1OQ?xDjogvWB1 z{l9dSRB4rYCKTU&v{B0^zZWfhI4XVstt-`it{yRFpQ{}7kw$iH z+9_Q0FKq`Il_*xwGoyNBOP4dmMVa$4Mjjeu2$$`W!J&o{nJDA10ZM2>(An`Mvmhvn zfn0`)>Sth_#Ct7LxK47eQ%FSMGr$~)u^Z7v1E=#Y>0iS5X&l&K3O0!UILb1uG_j1V zX&UUtG0A9pbWsv{t&2#RmDTVfr$vVQ3G%Y9C;S`o$0MyWUGhp0tk@J^u}i(%HFr^X z^>H*%OX_j$KdLOhg5Tn;YwOjDSyNWK`sb(jA6})j`!N(4CnIUG1%?M}l|xp0k`2^7 zpHgO1qFbRpm4y;gOTAKZb!S^0E~Y;Je<-L4D$QYyopsi02kpa%L%G_lH?C)z>f(_J zWLKiXh=^Ny5y8VL+5aP6+qN*&Zbym$!cxRFRU zRSe-f@H-D6`4*vmV5vSSEh_v#qr7?y8G6QuA2G7t@vsau?nsP_i_7Wubl?f<+dB~A zz}}VcurMeyv;9^uxZ6?-XB!9kcYi9+V@l$BCW||_J;Hd;rmm~&bGm1AX>*$sVT8cQ zDJT{ui+OFHK^{OXMU~~$)Qa<~Z)sVKPYtsQgy%X0|23b`Zyph8AKVHWfxOur9zpVe zFSGx5i+Guo7J0j+h$-e{|86bO*iSh8D|aBA_tc$khidt3YmH>7u^a8v<0CX0w=KfM?)R8bM{o>aCl!g+y^`cvB0_4LjTP{Bsd;LbS^2L@G2$uxtvM$?FyG@@BgiU!h1Q1BI8frX~IH02pbk$$TKJtuW%{Gmwyd> z%={x*zx3#&gFscN7+-hFAErQRf}#*9zSJr!ahMxwad&XGrJ@uPxQJmc5YC6b_IgWq=O2QAaH3h8 z@GPcv@~vL}SbZ#pN-05I1(qCKpTfi;vv08ex$HD0RpSqHfiMuX)zq37{E>6+QRG~5 za#qZj*C7-D7GkKWx#~$9qB};$N{e*#GJ+P;xILDYsNr`?ELuApZmzFF(23dzP2d=$ zypAnz@4(rzgZ{1z@#8wt36gfh4j-C=JzX6#tf1i%*bd7a3AJPH`jm(F?z!NZ$_72l9y*BOMW9X!H?){XeU%r z8#6A$iY_QfgSnNnIrMiOu~j?P|Ag%Q_w-OroBwd!)p zY7w3{G$lTso_r=-0f4zWnc2;bgO}CsoX?2lzViIDBu%Fa>qm3Pd>pklTMIi>NPVC8 zBr0?ZfVjg`j{&?(I>;!6`u?%$_3-VST7Mw(rEWmx6M<#nfaZ)@Q)U71)nitIEBSM9 zuv$~K*+8IEg)sQDRm#-r*_S9`zqQtf0xp&mx*(Nwnpn6_h>PpsTL1$S*lmLCEmBf> zfuUTStbZxk2qMrw?b;k!^{@TpkSPqH6e7*Q<(K4$zOUK9tS6vY@WeD369B|72B{Cc z46uTON&C3~J|0bei3$wnU+_ex-^Tb$`&Eb8?`7f_Cz%813m^+YZ-15rlAu|?nPRK; z_0s0+;M&Lk&09+{${j}`24*O^cPAe70{PW?%%;#v8*o@zoe`T(4Lgf31H{C|CrWfI zgl)&lS1!*E1zhD`$;($vZ3EEV;MF!}!b}pIk}#elzuM6e2`@A6{~a4Umg%qWt3Pqr zN4vk@U#z}~T(}XHh>nhit@iBzO6dCPf^Str*Y9l4sJ$fJBYkEYbk4=t*m$AI7w~HU zQ=V*1!9X&F^J^eoK!_X@d(QF7)&H#5VBQzm7`wCl*Sd!sRV7{=(+;hQ%27SS#1!F% zJQ?kXImoV;OsPjFW2d>L0IdPN^^sCsSy|bQZF zYK;;Sqs{*Qz>3Z{7{n*`z3(e%#Yffbt==w49>%=KC^`{HeE{#)N6Kyjhc%gWM#eh9A#cneILh`W&r1kSXHd7KjFL`RSk7s4y8+r$HfPLPEkL%2|74ooh2Xg|O}3;!F8N z=1l?11BIiI>?82Y!RxhrmRyd~Jy9|;zes1pZ zU8MiXl!ZB#O%)!9*#)pw{2Y_KEW-~rbVl!#Fu>^yZ@}w4%c`lV`S|f8eWnjPC#OqWAaG{-3KD=LAY)y; zn5OU_%n&j^Hm}G$M5{(#TrK$3U!HFQi#^{29QMh`YZ1iC%GlBwq=hI9HeY4O5Yn!$ zj$nTALS2oEot=uYuh!qcYn^c~BRxGe*2?`I2zh_C0I>w5%1e%uPjOOKRtfO&;?t^b z3+^p^!2kp;s_Mb|x!`3-M@K_LLrF<%adC0Sn-i&pB{jbv4a6@dnB!MFYftLpY*B9? zgDS(^Op#W_W0r{9?zQku_WTd2kTGM)NYSY!p3>*%hFz{c#LRx?li~Mf$ji2Jc5^ycA(>%5dOBGXj z9P}$cOf`5Of{C669L?-(!|jwG>7zj`vE1rEu&Jx6;-Cu)kvnK5&ls1nO0{~ikJn7R)UWWHZ24jQ}H1JNCYI6?~5bl7`X(bd#mn}vV6xVc6?B=`At5MxMV zJFivevJM<~CNPD}%*^EEubW;MPsrZya^=Kf3SI8?vNX?Tnf2PuR3#tVl6&m6epSii zel0WEC7} zCn-q_SF*Kz_3D+WM@?Z(O!iV(^Ym_nwoKm z8qa9Ye6CMVYre5+utJ_ZhT$l!=yHN-5yb=UifDB<=uHjo) z02UP&7d1089XtE%$|F26T!KXPlDlMhct(U-pPqf}WqR=%UG@*?OP4yf5mfkyWN*3^E);Ta?Tn0b(z#d3Ud6X zX!jjWVBgQ50$`737qa)ry&4Zr4mAFer%c@Zgd;afDP%_hJsj#{s4_6g`F?kO>kFoBeYVhdz(P{$;y% z!lz;kC*kk_ zbN&fdc+b0%?qx0$6RKg?FFj8A$`%N(KW>Q^SK69M93sun82e}gMb8+(Y~&N&UGy?< zGAlCL=6m`afmk`FVEs5yOn)CDF`6aGp}_Hk;>oK`rW{5lro*#KO3Ei)9(&XcTU)a) z1X9F(`mNQvW0W2B2b~<1ltB5?MFw1eRhIH|37_e=Udhl$EN=-3&5M)b{tgFy{X5u|*71uj!NDQ*DLhfJ z%1PoddAXkKI5f2Wwst*G!YS6~5~)%b!{AhiRj$(=7#jMx7@3j_e0Pz0;X*0+d-FmL zbfKm8f!=Ly|J=TsUg%2H)>ajm*Q-}F*hIlbie9Dn4+t%s`}e;vVX1a4)g6?q^aCytD=I|j}5vbd1C=? zYpEXAR9zp&w#bHSOp6YRR-KXdV6uA z5u*6qCF6H7M9<8Eh?2!6B;Y8Snwq}!^ZUz2KqB7&kD(N@{~4PMo2Rq#^MD3Kksq#ee@3`13}_m`tY!?1U*8# zmyO^?f`6x2wEZQ-M=nj#!pDaLM#!qB@k>sQNLOdOpr%GMv3F(PLs1&`cf={Icti)W z9igD`Cx%+V!nrDqh>KBX?*i~7(|f0uz`&!`xQsNFg8S(Yzh(m&r|jOlkTev{9D&o# z+Z`F)9@&IF?~w*U+!0nAbMxi~!kC`9owO~|)P8e&6Xv4+oxhXwW)}-Gfx?k!Ll}(J z#%PiA{1J9eb~Y)m$KD}J(`1d)m+oaHTw2X_xd~Sea^bLpUlOBVypdxfrC!@2H)UGI z$H;#g!~rux6kUhDPZL{@Z_9Aa{C3lz_6kIz0$>jISTRiGC> z+Z|zgbuLy@3hDl(0l_jO@Cy1H9((U&=pXYO;n!u zU+|@OAI5GES+Co1t}UsvzU)ih)tIRzhJ1QJM5Og$?sgx&9l-!wh26%W(r)G?>oJSZ z`buJXMR~RDoOP~e*xJQzGl0gjwY8oSE}*;*64&sozD$vuWQz<8Ow8uPQhznvoRSI( z3^M-jp!#}<@D;Y7om^@U2E~eyR>&!k&>VXD$|o|Va;_&l*%lxj=-2yZ*b2%}{VJmk z38DNhYmS@QvLNYlOH6c_{I)dm+Jf@?t<6K;!XDgRJa6UWQK?7HyZeLeq1tXHce5_* zd2Ma22$}F~vCV{rzHg3QD);UEo9jdxx(4BeeL__iT1;aI2l^qKn{;7Bc`v?iBP%y|a433vC`j5D z1CWV66{g!Ml|LI})US!Z_PuR~OB@}6gAcy(>{W~6m#uHLbUi#H<1qGNwr;FpoIz{T6 zi>>1N9{Z9}-6mz4a`N&w0$0cM^di{A#MXpTdWE7wFRWL3;+1=94-r5S^MRBv z%bAu0y23Fi2<#`<>Q=dAZf+j6Gv|G>=G0cHn5QD=`JADb6@Gd7-Xg>E;-K$>k6REWMOYJ)5wh%6Qjg+hP zvL-UHzt~tw%mr-EaZaK^vd{%bvjN9Qg<64ZBj>B;s`s4Kxi?tz2 zz$gx-@xe0v5Ja~nfd4i;3gAw~CyoIx2<{sG{4M#_%IfMN`sJV4*PIF#aH3!(zF=Ij z=i#?vj57njpTO@DF79jSuRGVWv$JD}Cj!AR0E$B7gP}{*k=62f9g6U>*@lLvC0ytx zz2n80!bf|ZiAR}^{goFg$~!g7CqM@B^`!srB=E*kqUeh7uBII>fifd8r^iJknR$nI z17BcvoLDFjA0e+Vc2v|VPl7&4M-p2Rb{W{${oGQqJO8sB1q5{S6&8b_G#VdDXaeM= zlR&psTO}Pu9&EHVS=KJtyFWf{TV*g_eC*XoEfwipKL=>ZE3c&q0vcLZxh^J`ia2H*KuqI0b( z1t*Rt3|5`_nsv&`<%~U-+JXj!5Box~+cVFbp%OHKnpKxG^qFZ}j=bpYr=U;do`2XX z(z%Lgv$`{rwk9qC=~>Hntfa3$4;vJ^*{)_#TseodOhvGnS4=hNJ5<_iyIt(7r<-$C zA9@U=oqz>xS?{nt`PgOOt`){cm*c`q+I&?fL`iA1RkJU0xfc+3@b2ODJjlKUc1{Zy zc1tNC3Cdj^9obtq6=3^m90Y;7I--quAitm>>v>%X#Z1Mtc||g9ZX(lFu10AFaM*y! zovU;0{qcj>=k!~yl{uurbU$lxIy*ZXxSK_7U@!&2LA3)SB43NXy8svG*L>sASaavo z12IAgTr#|zd}~F;$aZX;r(_e89|{5hH3Mk7a&II}MCWg}#8RO5`rWyZlsV4U6^u#2 z?y~mr#}Apz!HaH+3m`i*a&xQdUGdtfwdkL7)f*ffG-&o)25Mj~1sH$&pvcYOi#(5u zZR8WO9xp`ljmp>;;Sj(hA~`rP1(CBA%00javvYH?qsOd$uh0B(e$rBN>5!uT^ z0LZn@Zk|-Zv$BAPn1Czt@7va?wm<$sjhUO52N)q8w|b#d+&+tHqxM`1e_b`%xl=V%Ph|yy2d6s$6@U$7|G>Ku{6ER%O`w-Uhg%je`9J zW&?5@Vr@J0KElI`tN!KX9B{HhatZzm%^xfHGf6PHpsSf*Gt0L$Y;2;o=TPYUH>1Y5 za;lo*x|2kMaW#E;2?^ziO2DN7NexBCBgn>EHJ`$ldTNz9b2GKDbcG3(@R5} zF5-2BT0h6_eInR32_!Zw&6nj34Gp_ZI>||sW!}haKuHVTT*{|$;{Iss5 zrFBi^brN%N83p_)UJzh<^h@1Ga+z8aJ7QvRx-=~<^Rc?lk4XY7SfEfgOi76eeSxJh z4FeAJ05-sZDX)mJckR^gmVmGZN&MP_Q@>aNh-ZRZ@?XIs}PfyRm;UORpf#iv{-hJB?9GW0B;aKoS2G*)j2KJi^ z0IQnO8^^LM^gPcZ9ygw+ew)ikN0$pw7LaoToR<*i+@E3qDp6S$gFC?Y!uZ937tSr% z@V^nD7HJk$ilfi)_^wya4YHdbeSNnoDiQCK)w&XTIyaxo{g8{J+P%V3{NxbekzuQT zONVFg>78rS;DCHf1#!*sa~!*%U|&OK(&T4@W??|+2^a|kVS(X#pRdz#fE|>99>9YFJQX@wF{o$-@JPrLGBCm@A<1~%l8Mc9E}JSXxxFxYav<-IB7&r* z%0d%aZU$zZTi(ituKC}j+BBufLBV{aq|F}2$e;V(Tt!h!p;u1X$|w5iXlklfXWmwC z(%3=aSXS;QAAy+Qb;lo&6i@=t1yT?W6GK?Zm!~`WZ!}LwZxr^=E)ky<8`T8dwj2{{ z3l*SAV;ND^_>dM=Wo6re&GF`&PB4`Ifq|yorjR~0ChhOvwC#Y>^TqS$amqldYcp;E zI5<8&zSg;Z0@0{$aS8H4r2yL;+_9!>)%tG@4YSMpy1vKpKzdbpvQn0vJ;{0m94AmE z19w0Ig79wb>bsPv*(}M&5uGt9De7aepV9cXv`iNTFc8 z$!mfwIdO@{1k4*_g#Zt=^Vm-Ex~v(3vk^c+KZbyVp}%Pcl?uT_p{eOg8z6Z8+HZ}A z=iu^w>TQa<1^moMII3GEYS}i^6QMP5w*N%)P#XfFIyk!ooMQcc*QR}q(QnW$pb_h= z#|F(yhSy!#r99&ic!Pa{j*BfXp=O#%5uruuGeBi%?S^yWYhy5}7U+s> z6r|~Jx<1qM6~5tFU@W~->+kQM`DP>z_`{v13&oK3{V|P**`0&w-6vpfj_-pkCPp~{ zK-3IX?Xf<>2@{h`zZ==o`w-TvgWh0~n^_Udp|?%GEOlGuO29`a@g05v=N+5|*4JJm zU(oY~{V=bHB!WS)*}6dSsu|Ffi`wn1C%dn?MBeuH_hal(1)d%b`Xa6XG}5r|0@(cG zxZV;Fo2lG(MsTu=7xngY!6Mg_A|87!pa%AVh{Nm0$9Dj=E&;z-NU9}gMSd2zU79>+ zU;jJ2x6dLmCZ-O2M0>}Q+x%xt4mdrqHVQ4PsWDyYp|Ebg6_Slo-)qV1AwBXQc4B-m zd$)zC)3|KXwkj(t>+F!g=j!tln&gaqNUKO^B;a8ka@@?NPqug!jN{DY^Ok%i^vXk@T2+&5laF{=CUmvm+lGDq+Q zKb}}$hR`k$Id^05yi!$D8#%I`xm98M9gj_bvDcn&?1L{}o-V&8-~9pP&Jv6-Uc5LB zpDQRY|3E9v&Fl@3l({Jd2sf|Wi`DzFDJ)+efXz&MNV!mIA5VK0<;O; zAV3|rpdd>On#)YOp8y~Y*nK%!*-CAu_^4%|=oB^p9BaGLQ!$+Axt*GW9;ep84N#Ws z>FvGU!LO4X)f~HBH~qfiP%!H^WIHT8rlz7Q;B>vY9tEU0vmXD=acQ-Msi_P2urcsj z*$=wCNWK4vhm-?ly-`P~5vbJ&ZB97YE;Q)@m8i3`GpK;O>KQb8^@G^}%G#!4ooZ<* zDNthLL^l~L80$V6VarShHB84yMWfYs5MQKRQLG&D920SW~Hw@dX4n_Kn6hsY^1$`5mZ!i0shqEm&3M=IlS z(bIP?p@v09+H6UU-2t_C`!Y>%7R<`(Yl%&;lj#HMf!Zv`M25a)=mh5+D>^K`)0k~l zik(MAEuPIB@K9L?liIN*n-a=uh0HwYdZ=0}Z_;2D6=k_rYSUkz>#Ct_k8&!YQs$V# z)poq}&VEQ_KL-b<@bMA*9-In~t1?4zC706bb(xzNR*%nLlosqyeU&J3p6OfF$*F8z zPW4XT%L6@sLjvkiX@_9hf$K}TY1-qD9I~?h2-45DUu2*_bd3IGT3Z3}s`>u?`)Uaq zVaWGozsm|Y>ShH^DuFsqe4?;wgcMJAJ38zK>pdl|ZF;IhEsgquE{nX02B-LCic%x+ z5l7;DiDNztpe$2uC@KF!amzV!lDhQ?VC6q3_#YkL|4B;qvXgK<#dT})T^VeX_~)00 zUCT>Er&t5dAk~+^CBlx*%#6xpylwcI+tG);l7oA!7{h2_T-?%FIZTI&2{}R3b8`W9O9iYVUbZFu;>4NisQ&#PS55D}( z**WPd%SarVNw{s-iev5B(3imxfn)*XTO+~`b5#E||2FqA(c%NnlW>Mm8KpRz(&U!2 zX!+vja?4zQ3F}W`zoqFS+qOsT(U@@jE{#?gN*hMM!l;&QJAPm{def^En0fj+)SL`z$N`3JSH;t_Irn|FlV%~iB|=oP^;CFbTL#aWn8#(F&a=~VS?iYHWSQL zztaTL2Rb6j7^ItldCBE-0O0*WfNO z$V@2r-$W>6`W*ebPoV2KFuE_dm6Vj0w&l#Xi6lw~oLHmRNl`aS#+#56G9aATcKOY5 zyWJsgwO>MXMY7{q8jqZ{w6yHFnVFb;H@DsUURx>-jA`hNmDtTFeUT2T)s0V-mX`KE z*zeXb;A;Bz&G7p23}hQS6Q#QZnS-12S9f8HPGX0FC)?9s3$$rZBH(b_k=){1RysPw zocnx}dD|E*Z6|ECf2Q1Zvy%Xs%5hQg=Z}6K{R46?=RZAo3qpIyiztlU&CaK1^2Vc72T=WQT@2j^95jnT)zRmN6sVE(H{BeA=tTTmfPX7Z zv@J55dt0u;5_emQwMc7Hz}#EuW2@?-+Z@~Xcp^4kQ z0NG1!Y@4Ip&R33qGOQ+n`!WUhCGIx@T=^n4HQ(r1mR&y{g; zC3b4c>vt&%6TN?7Z4ozThIEI_q^G8nEvD@%Qge-tfjAkLI7-a!@vSj^d#PPoti3I7 zFp1B)Z*pHm;f;n$Di@3nqyeZ#@CD)yoO_>93#HI0=6mL^!6DZr>^X~p6d~)QB=9WO z-kHej%#wzx;o4i15u&E@^LG{JsUxwUQk0S?C%VNp=P z@D>mNiIijtI2N&$mR46+dM*Wlpi;hnMyE)c`SIJ&uC8;GiWC9&6L6$ZMDFYDR@lWt z$GWk+yt-oS>&Ih(IXfE%cL27*1irnsh4XuP%hoR0u&ZZycw&NwkMHb??$i0jMWv-t z6>PO+Z7u&3^SdyeD%LyP5ziQz7*XHzIv?e$zA(d~5b*Qq*jtj4lEP@qevqh6E@fk8 z^>fKFCX%eMwAA8UMny5b&KsHW5*ARMAl;E^8Z=Hq6We*mHGS+S=x3W=sZ6S&B5qJN#}xuml9^fhY-_-XtU>QY@Po~%b^0E0M zD*49|la%6p+DT($V;~^t?Nf`RI`O7`E)$=fsT<++Mb6LFoZgF;;q)BN=C;!YaE(V} zf;NI+cd8;!B~P(frye}bU959cYx)y#g!XfFV?fU*E!_=HTLEnq_B}THtx5BK)x=Uw zYyndlo9gl3Ui$zCMv;k>oNC$F*hCQu&(052egD2?sT`A=n_F7C8yNO<;oAE_OZ6wP z%|tF)`^Ls3b#ydURAN(8o2|!E-oJlnP^ar)WIsRL*{P+bw)gIAa#B-AGwH^g|JL>z zFi6_Zvng^VA6I~7IN6vQnVHe~MZ^#-0}e>1Wkk1jkQ1#Fp*-xm+%1g=x1ZD#s4{4F zT3(C(0#*rtS?|2E8Zhlf@M^mSdo#0j1j5|ZQdL(M4*uI05uekKx$B>p^?+pR<^|UW zsyd`7D)i1n=gN@ckeZsCb0a4Va&W8wDy+7b#X`LY z4jZ$wvaS&mZ_IsF*%~t99v{a?;1imlprG))KV2}mX-9or8Hk4Fv^_gV5g!*SNoBAw zuw-N;0w+yQaLdfPH4X#I0hc@Fo<}AxGCKim)5jQ6THfv%t$GGhq~zV*D@})GKCrL`)6nOUIqr< z^Y-=zAeuT*yUMc6?n3=B>~MHk+1vY~L{FTL^oeW?#>PXFt(~0=tY$57@h_h~wG0h? zv$4#Ns&?;Nq{Nj(3u-&w9QX37VtM}DuuQYH_2u>T^{-!zz~uXNQcU2-$H#NJTB`#Y zCXrb8KIi34O!pseC0C#>MUwFc1_o};RF~%GC$&htZO#OgV?}IiK!CVjI!NDGi)<#o zj^qO8i$V!%Fx7T8|BJD=0IGTm`$j=g5EZw8NVjx%qX-JpA_CGaCDILogp>$~z@}S3 zK%~0_q$Q+FQo6goXM4_h?|WzNd~^3WqX*93`ycDS*7N*orA9{fgI&(jYOT^K3|z+0 z5yT7FJni>7xR1x^dGlkm&sB;9C5G{0Gb=EnK~onIq43ho%yE5nZDC=%>6Rf(XyP-t zP83&KE_g5&6L!3HnPJpnw|9_mvm)MY5Mw?}79Z#&;^uobj36bYMQq-|OX603P(0%34pW>F>%|#9 zUzdPxT_!PcZ59t#_~h7WcU#Q;PJSUEnU*Edu`hKH#jG2-!i zI>D;)in5&;PPhDvGaKx127a{BwX zK6UuZrWSeIit5^0PZ%@+1iClWg>B(|#(s&+|LiQ$Z*OI_)~QjHshFhvbo($bflsvZ z@eiYKycUC8O<@OXV;9L^f2L_y4d!XzX}Cy|jczmg1~Wov93PEuPEOAA{1=P_!Lm=t zlSE=eI7`dQEJP-Q-@iwJe=rtIdJ>yLs5Z!Z^Au=b9Jmheq%;NGmeA25!}8fY*tsWT z+Z+_t>BisM9Q{$`)to|-h)WP6Cp$Zq+i86_$yCJs5Q_@GmsN`?GEcY8o9NQ(!ymUR zv?f#17V8El#Zwr}&rh#lQ6V#7C1-Lu9scnHi^`XCe`n_&7Bv->x1ihRbV_GILGX@2sM+8q88KA% z3?MNzlI{c;X|d;G0vr*6^NU-~AkEb%e?195ef*v@C6D!)SZ+=ZF&_6z_{5G+tnip7 z8$_L7t#rH@%e%7pmQw$_mzb{EeJ~f;#7|zR8-CS5p;d3RUQsS22|E9l&7WtE8&>YeLuw$P3UKg6ldK z1F{Kby^xz@8#|4a{#UPFwO^hC36;=HKzKCU*{|JPkPj&!MO@B({3d8BuUv&;cv4YS zM#k+329d?6hjc0`c=GaH0A?_Ls_SlV$6m#iQy!?hx)0}XZ|4viHfBHD(#5P+keQxt zIZ_#w`kDXXH=s+d`!&YL$LHiQHIEbz6n|oUp{_ZmRpprW;Mm9KlCP4PnTB>kjNta_ z2)FMCB?ie0G($@>GiVlj*mbI7cwD%4@Hja+2mAUWo*17TY#2vy${TrzdT48Frzjn6 z_ND@%-lRRBjX;y(8g%V+X{9tcYi9mvhuh)p{i3hf_6#qD;6JGl8TJXHHjZ%V=KUs z%H5DtekRwc!s38=J-zMoU z>Ut$ae{!Ut8mO*lh`4thMhUq%+Z`;71R)oPKhuJatBMAN>VkOCT!JhAUGpCJmM?f5 z0Nz789lC#OGoTVW~gQeU*eoD&9Behn+MMc~@eZ9T(HUr znJjX$_Vj$vPmi{;vf}1koW=lUX;hZty`(3CX4cj{^R{k}9y9j+CK;(8KuKAmxckUVpSw~@h>gQn%msWq`XN@qis~87o_VV(dPN086Lgbn! z^h0#3KQpqhbOI|2udXh6A;(qV<+|cX^g<{I#ND~I)YLA#NK|@xJpTOrO&+ey$e6Xd zw&oQpy7KJFcD!JnUPwtv$%K0tBaU6?zbs!|bY$MN@KP0# zmzP&nZAg23FUeq$9%Gs4OG<7_aK*}PJ+lF169*@c&syPK z$m$*PNgBbUk8t1XJZr#}@&K{Cyv)nX?s`CuAQ()bZ3Ckv{W;snPa?|2VGrqearDLg1c}d z@3O}mKKF*@L~YWQpPe1P<@$!uAraL;jhiGyNdyH4XY{FcRek$r3)jxe3(&$dZ^RS1 zcLn+Ri5xb#Qp))9G!f&KR%1WH#fL{nu`y1g*>#_bWZ%ac865@JglYvEEMkg@V#cqG z4)V!BjjEC*A1zHQS6ytl*bTCgk>TM@XOa0|>2`K@^R^Wk8O@pj1i_L9H~~9~-0^0} zTDJpWN3sbG`T2*$7tX}ohky39X4q_P-F#|dx+tB|_dIX)TE@+!_;^ydGet^vD!Cg; zRjOI?aigX3D}d{+ja4az>nkX*sYuPXDt^w(Q&lL)&X!Sr2CG4wtp+S=D*aGtq8qL* zFK>?(*ah5p&-jCVxW+W>8TA7!pdj9B5NQ5R3&`f><#nJAkBwbw?IL)?p8M?^7oX#I zMe$H@_%!)mn*}P>6X*pnok5Hj_q9s2Dos0D=@1}Cmu7Z6*EaXzLo(=y$OR+tNyjs4YsENiNOq+$y(-y*Y7k)}QLK2Zni-(78YD+iG}=2?J6{pcrOq zC^y}Xwv7#Do=4EGEH9V7n$UmsDnGM$3s~x-qs46KTLJ?$6%yThL{WlwKnZryym%nv zr0XV5qRHEPHpsn#g`j%Z?fhYG7}7ld8B8MD$;UaSDcwS*i3?mm>8(^ z%5nkbC!aGjTa5aW@t)G+nwpxfEG-EN2yg^GlTk;tpKD>7 zF|kWaOPncW0ZnbvidF7M>}=7p5p!K}WjGXqPY}K-;V|>d*?s8v9n`#sMHMUeDKQb% z+_X<7YM5$LP74bP{u&&dtaQ-qUA6dn@xg$G!9VEff$;IgP9Y7ATL_^Ti?Hxww4mMm zlZhN?kw!*FUb=<5 z*vZKRTwFdE=VBVHMmP=?mDz^363vEHAioFKW4?Of3pTI4XdSf!b0;1{LmF0AR)XND znDV1Py`X&vpi@kIhv@6?H&meV#l_>Nzeo1ui4c!*JFV{rc-B)1g94uO$k(}RWL4A6 zXc7?;LeB;>7w~X=vz_b$*NVKhxP>+LygL3G) z9lQcsWP5Aw0qB1FG{HsKugk)#T;ngq-#{IXH&D+TcYBh>4|G zynHDs$u9=_drAhk>c#MR(S0Y72$TCUSC_-;^85MVap zF^D>Y=52s^2dkZXi%g4=$kA`c9qfsIz)^>JvsgQPdbg(lqnPjR}yP&?#?XJ44Y-Hw=X-`g+Si_$z#oU*~+1b4PKYu2h zK>^t;?or#zqy7B3iGcx>i8Kf-N$Os=zY4*_$@^%hHec0QOik$*+yW(mo-}y%YLfD5 zcTW#L7Z(&SgoYN(%&^`lpuYx00NkF?xDbbgi8`(xjtkZuI-h*i*m<8M5Xi}CKJa66 z^Xuj&M~IDs!yc%M7S1@6WZ=#}dQU8Bwfr$TnbONk-1h^}YW7P7(6Wd-EB)XpeNRW$ z6!R{W3>Sn##Kcb!hmfvgW3%Pesk^!GbDZY!dsr9V6N#F4vlnr;C?<-;@}5M4J_kTY z>nYEJQY*Lpki^Y?=Wz9EkFk9)9YTj-JP8S&EJ2xHyGE*Ue%j1|Qq)?g`a-;SDf|xQSbh!*S3i^A( zS@g3L#!)1`e1UG+IpCx83W@O|#>?q}c+j-^BO;z;fJe8hqa%yKd~MVLroyx1{a8Ue ze>pl~7cN15{+^*SySJw@5vRu8TEx8%v@4z6oFuSR)zqM?m^(eXj+HV?ukd;E8J!|h zz-~}ZvL82)mX$S>sK#ZndjbX&^grFP+*SL=RyJErFjPqaQ-Ku}FtqK|{bsPn#(Bo! zORbGpbbNI|Nltqbc~$5lwZXNzx@rla?X55O(Q1=bb3ds*e+~fRt(wUktDZy;sEf)< zOJ}y6;TfcrLB^H6eDeItm0K~SnF?nW4UBwoT{mRSUI%3^9ZX8Ih}XTLm0`}UyNIig z`C3@mNEr1|#Dx4(sioPmq9M~Cb> z#{ACxFfBW7jJ7TA+?IHnT?}tR05cv_SYmA?B_L2d^IBkOi3mQaVY?$p4w_QP zQ$$8bw}$k3STw|Z=i}oONqk~%j|2j0c~yvrE2}-3@Gp zb+dh*7OSzozW(ReBPg)sK7ur~P@VNfjM>YV9BRt6@E?SR^LjB|CjC5l>U2Ra1v9L2 zt`W4cVn_U~xHP`_fx6m5opO&K)AO>*SL9>)D5>5ND7O94)|Ho?t#9kLGWrbT0guIC zXIpRK{(MJgr(6W>9Y0g^o@!%RGO~oKgY`DR-p*MFWEB;Ae*D;k)ltsXhjMpsFEr!^ z;E7Eh@Z(#V};rZ%as|eCRSz zefDhg@RC)^dNkXB*U$5_Dp0aR+Qp~H$d1!cEDWFY^oRIT{{D}kYVkeyb1k&*1Brm<_XtY8Edg?=*ms~tbaZp8Lci<} zVo_DAmaDOcj z`1iEO7tT8itiB)o{f{9x0PB*|3c((v9f-O)#vqZP?q{K)!80U9OoOtmpsg(n&@31M zICgeBfVP9FE>Clom8EmB^Jwi)uVGSkC14lsQBR%(Vfnnax9|MX={_;&C)VAf_kbJg zjW}^gp)H}y;dH|rG%w$u(4+%NMbi1?$}~4OH?POxCRHe+ML2OogGv_*#S{%m9Be8sGdQ#^(8M47q1MA_K(=21N^V{ z#2sipc+ddz&XGG<%x=LgPVz+B?=9~o2$%6;y}5k(>@K^`=H~CF8n;_eHNe$}mFSCl zAro{~&_&;qC4g28fX^x@0mrM2ot=k)@PWv-9Zz(Qmf@a)om8nEW~M|Cjy_}|04#iX zWCR#Q!=r6g!r9Hud=Ra9f==^2S=GP*Qc7x130lUZMUA`c=NVXUZcFU%J8o@}G|wCl z5C4V=g@Xvvn`OFcCL(C)QxH{T~Q6CUSYBie4i{>r?C>8$D zklM%SokMrv+7qkf1vhF6!)q%QyE|WwGxBT8kPjL z4BTuEt5Ks68-N-%>U!$jkCrv9OgK3KMP96kg}M1)!4!C1>*HaS!bs|&;IsVE z8QXtb0_q#D)56WZj0@f$^xWJQ6P0^-bf-La3%mMFj~cyD9^CpmAM$BMkk8q##&Eie zd7b%(!fdcEC64h6(68~ud0-8Aa_z18| zz<6NH6$>PZoQq!32z=a&7sRo#Bc1+>Jo4PZr_8rDU3T8h2t3e>mCF|ydfR0Z7aI%n z2s{=mT@gj`5VDF;UF~hiLH3`IT)@eX< ze}M6TVQ?Tt_vD+@ae)uo;f|qa*~OAtelEd6@h^@Q&&{Kw>7 z&$EJ=zuJyzm6t!4@BiF^9~Phwe*^rGZ@kUCrylN0a6C*xzoxZnJ)r* zt7vv9WoRDFh!&U*6}h<`ZIM}$)VC#GPE>|kXEqQXEZ=ci9*6}_44HZP(kV3!%~O?)v5^r%Vq&HU zFsecL2OSNK%HzjbZU>tXdAmE;*5BhugZkt{OTAsV3vaCZx)a>YEi4wh;_&de>nA7I zbz8ZCKnC*d-o1q3YC+HWcHV>a46are5uE~^UV4RepkHjxPn#h}<6vjybSW5>jrE2d z%@w87agStTN<2MU#Fmxa!66fQ9P*Bp&9nT~1YM!}sp1kWajL3UV9Mo+g-09E6<LJKJqryB+XMm~_XJ-@XkN@=32J z0Lb_wTu;kCY9NA-?ivn!iDimRx?leo3(yEqai12A{~fVn{Cwu++|+QKw=O5;CMACQ zG&t8btM)}*Q(5^z|L2@#jYp6CVS=Zz&d$$&fE9~GLMk~kfnTQCGYt(tM5Pn^+WA>X zkCH7M)pTTifhOfo95eh*lpkqx4c_ueI=#m2F$oFDZ44BFJTj76E{E0r$fF&=y!K`}_b z25V_$1f_a|W?@#EjgP8pCB(z%g)|btx1QqraYFjo76G99keY!Th`$6E_f3IT+pK{P zB`Fyhtgf*a1L~IDP>87A{AWDmG6Y3D$>tyW^3=EFW^I-klC}+rByN_SHwyhii4v;6 zxwsmGQhok?O;`QDCJK!De}DdWLh#b&Xb~abNb0t&&ndS(9PV4vq5W z4qNg`yi5H9{nGlB;#7^PwY+>N{3a)=12vEIv+Hb|dU`ha?^(n~bH#p{X^RZL%a$nQ z@rXK{(%0U;7#h9u%F4|n6r2ZfG>(h;6I`(&G8?lK*qz-@Qa-t}HHk|3O0<3FB$ES{Y+lA2F=WKU_o6{bJ zsp?Q&McXXY%OFEtKr}QlKmIY2pZlmuvyR?}^3YwZ!9cs#eIC$gQXG0<)Vt$Hh>3|Y z9&BE@)LZDXY#cJNuEp|HFV5oIg`xT_%Phraj1!l((ij zp63wx0(>kA+Bwzt#f}a}VBcC1@;nW5ucZ{69{@s6TU+ZBtG0oOdE@G0!{QFu8u(0h z8ORl{z@!P;5a#Ax_#VwLPbIF2LVpi4E6C;RI@l3ldXfm^`sY4O3!{%wdVFv#bpEx> zi$xW(wXDhvf*U|hAQx&}4;l%3;(6oRj?9czpBaVy`20CT zHky&E?AtfKpRuu(vP~ZQCL<;lzk3oRZ&(#D@1g&BmwNJw39EmCMY|Cc?$-oVNvV0uzT=#CG7N z?}xxZ&ahUuQ;2qH4U6U1sdG%oG_zoqm2%3LrgeRxF;eFx4oA@J2lZa8wa946LoCoI zYq3Q`h&ztS?SI$BT15n!7s7`U$#4D2$OxYle{OY-7G^m+TbT$+tnBRUW~<4M2#RO~ z1wT;2!Fx>W-~k7<8!4yz@IbZ-EpFTSWlY#`K$2PmLY*b4fgCiN809@X*@KnJkPZ!0 zFowQ>x0oSKY#E$4-(;GRk&*d0@6AR&$=KSu2G|au#Lu+e!Tr`ObIi@ln<#S9b#N%j z&6TAIw){ITVIJ}#yy1OL3AlfdL*93TE$IE36GeIl1|+fC=C=omPvi!U!M7lFm;*5} zL?dsH#Ds-~>4oDo-Y%c|U5EM#9sS(XvsPI-JSBw+OdASSUUh-@D%_8rWGU#NpP%1l z(|Wo-3wGtuprCfB(}CWB9taOHJ=HyN2A@E&c>eE^Opl?XZ(`mKlmuJ~UrJTHpc^_a zK(*s>gPWPv@}DJM?u0InXsd}K#744g6X3Ga_4;cIhmgZ}VW^?9`6{vy#90Qi@q zbxq8!`w`B~`@eK}kg`A<(Tat`(m z@a2C6-wVK@cptK=udm;&s$5u75-a5L)X}lK`sn)d%1Wfl(_?^#GcvMMQ@20Q6+UAE z#OPQ5kk|1pqkKPD2pb3&=NBV`n5lg^@}0NmjBKAAyn9t}NiXE^l6Pbzo=gNd-aj=%Q1c&C~F7e;{JToVDUwS zwUTfoC#6R2pZdwlU3`sq|Fy>ing6u7qL~! zB-zw0489Jy6pxecpLo3LUS*fvn7&{)?@(D6D*-3;gpGCBe4a618BSl_9xz#@i{vC5~oGzXGS74(Zvi(m2 z2HO910sVL8`M11Ohs3`9_y0l@qyK|`{zDzbib62uye%L^$w=g$HOZ!T{&uhu&GFm-93lEQgNVP>U zfe8yiReJi|?ottmC64?2j^m)N&3(Rq3B8Un5Q?CMu9IJ#ozPao3(x;LYI>z0d)|-m zT;e*ts~2+3hf?O7A!ZMw3SG&o31rVKCl#l}JEH6I$^+m9hUyzue?ZPTE7d3#rlZ+} z(WYr4JB;9Vmwu2!{5Pu4GOq7ULEM@6{>sn^%&O2oz$L;Acn*XY)T`hriw4~yyS9)o z0#vsE(*r4UHnja!-8U|741~KI;}yd0hYZNfdE28!Mp_sq)k1-wy2nj)m0%!P@ zxTYgGwVVgHHXqkZR$x5nJUJ@^^)y$*Ymb`r=?4#7Gz6to;6gqB^a(ULw6rm_;EBmY ziP(G?8(^SJ3fXUxawJ>B9NZ(`>^; zaO8aIIa>ax_2QjSmd5XVyxjZCz)ZGp-oJKL<2=?1r{0#p@eDAk7ywJ+?O6cQRbJBvpl%0vWvFT??3 zEemNHpuNd1h^D1a5^~#*pRom$Zo1wRDk>iNtSnR5n<8{6g-p;EfRnLWkHt6WXD>j0 z^lBVqzP?JgZW16=68;v5!Q%*oDf%V}-`>X5P+OZaOTMCvpvOX|20<_=+TQ{3jF13| zzV4I@821UdC@cgP^>1onVGtngev2su!_NJ~4VOmPz+r8agU>9EtU{S$v@V-xp8<>2Kez>83p3f;k zNE34VG|Gz__*uoI=P2&-XnJR{2V{?;qGQnUVq;W8RvpZ>CkOqELD)BTH+pFr+uAr8 zmk9CDfD8}F%m#Xc%Gcdp2&xi6At7}QjX+6gm>-JQb;EhUK?}%4fDjhUuJ-nps_N>J z2;U@KQ$@wF;o;j@RM5h4bE~MS-F^HxV0%00YSlO>9oA=OJ-`u4hqk}J4_T9zzuG59 zM_BL6UNZ`P|;d29+54#26~W)xLXr z+jC|BZzttN!1L%nufxly=w+Ef|{=ycBi28V}^z}XWSEV9o*Vfiz6-VEb zi2`y3R4*`0sAA}erl#|Sr@sMtkiS2)M30n|hF(ojXDK9jBOtk2@6!r}nEU6qZ_ftv z#(?D_B%3(-9%!VdHbgE;9pi^oRaIqX&UM{ep32jt#e2aop`tbI4>A^SBC0!_^C2Hz6bEOxfZ# z>Y=O!&g(&pfA=tF8lV-RO8eYvXko5{z-X{^{hkhGtBBXR`$p|qrN6@pE@|J$P+eMd zS+vt4#BWgfPFe@Ouz!{w8tPEC$pJi9n6og2wzTx?_BK2`FXD^*IF~XImen}dQC85kI* zUkd~^%f{&VE%qc)h}(Q?a1($1JGWa*4Ek^<=e!1%F5(Owd|v;!f+;+i#_t4|wE^-SHrg$6bPtxi01 zV)j=dO>lEgwDfyY(I@@8afJ*;48=1U)Vuevd^GN_Xg8^OiHieq3%VsKI8)p|b;c{t z=SiJKqVyjI2nh?@39N#$aF2wa327{n*#2`^9RwR}(RPdb35VamkB&xn!flN5zI67G(t1(%t z1SS$-yG$J|FIvW>f$V--8HGfi-mYJF3|AMHE1i2Ap=Z;salC10Ir(k=0~IH$X7Lv| z|Ec*7aOXwT6#l|gF$7$WMkYe95JGqM0coOfFfcYFA`u?`J}gO#t6kyBOJ#E%rL%fy zX=Mqb8;_O!Tt=VnZiUO3HyGI1Kwz*|UT6rdD-iWW!bY!G245M39}WlN0kp4l`UamD zjJWGr6KeS~X!S$Wu(-pdYfXL^+mF!Dq}RpkXFmiWv`@u;e0(mSH$q>@ zfLcP5AiwRzkoq3f4`37!XWwXe+gP^0a<1}DRvG^RVx#xYIIBoV=8~1LBLJVS#RnW* zJSi+ zK^`8SO0@zc@-E=aTQ+g=3GtvGp~Vdrc5!jIc{72>7`WjfSX{7|4PL%HT-n&cM}Hm7 z=FQsKY0`Br#TJcu^$^Ib@n6l&?d?x!bGUhVZ{pw}PgbloOJ6})3-fU<0*X@in7(03NZ&?#EVciKh^*w*+0~Fj zYttm~;0p-~0lQc2e$)p_4;~&P|G_VLW2O9`Wqz6Dc-GbiA>D_P?n03Y`KU!jMZDbH zZikyGGe!6)eJopK8y9yGLIMED{2W&k3kw>2?EZdk01#kXC6YV8Xc!oN0+HF5QHQim zfew*Y<|#ffIXC8KH?}Z}0$(E87#KdZ8S(KwZ*N^&v$`!2Dvm(41@~$6aNxdzcXauW zK}eE_N4wmJ`IGw{_SXCBzwG*3Zbs56z*HnpLDf0C1!oQVh^`+$s$XwW$2DVLU&;BS zPtNHc6B#)Rz1`)vK4+IN9jr}RTUc=0|3LWujOk5_Pe|aidVd`o2W0rtLXMrIqvq0b zHy$8RbkEFcwcXHqee#EV{Rz)R&i>(H=NaE5sL|CPKBN(*&w8tt)$NIH=tZj7Z(oqu z3nk8KIR&_$6#I8a>`beqb_HVNeGtTA_MiRzTR=VJ96H0vccG2szm33Mvmy&RX{)?4q~I%DoRkufZ4R zv1Jem(Q(Jer>B=hMYY}Bgd=D{jHt!7_uB(TE>1i@S^9gYbA|hWNA7D{fZ#cc6WD*gPV;B%~TNjb< ze;gU1Gx!U%4h*TSKYt=(wQ3zFT(h4Y&q%Fhc5RIa3N8~9V^L91SVyD|=1nQ->R!Na z+Ep!J`=eNuaM8+0+6vF6t0qg)5TIsaWKvOP1**Qrxp7J%6b$4kqdbt>EGtPJ{)|Z! zRLihNf|9gFoh~w*Rzp`;F(Ms2dx>}TF46ct=>Tb>859S*;B|=QK2VmCc{`SFHu|-~ zTaFG73nQy1exk%pk>;j6uLCbK(?VxJnl=JP`v|BWxJ=jk+uNaB04vA@>;cx=3Ym#j z0>YXvUZhXdB}K+{%suMgrP#SE4dQG`+tb59_6}+yj^RTIyLLu{0TdI{iHO@|uHo&8k545-&+DUdBd(E!u50*GXU8k? zpdR! zkW4cb6%|(2-*0^|gH*r|qTN*4%ad17P>_}unUK(BN!mEB=6dYmCJbX~jII>N?1kBb zyW#IHdOCQ)|5s2FH+EcNkq@eR2$thE?XeoGo$WHkv`{O6EeM1?jzd!PcQ(J~L(E}t zup-QhW9sg^Oiln1uBEN@JWt*8tR)nZ(~{shjVbqg1V9vo{GS{h`#Y?; zo*joyPg8;lFg`xjJ?}zoyHW_K3tuG~-jR=^P=Ay2$cMq$X!PCk_C5!UR|=4;)VVno zK&3s-Pb;Xqpp}5F;b8B-&JfZ}hULE%>Yj|eyu~qv!;^M1@B19)1Mg%a>GVRXe!AM&^A|`tkd<>!Zi4+Lc-$ z7OPixQIl&vE85oOut)T zTiUkVxJ`)QFm9g%Uk!}&d@VCF7Fclsw;jsYrQlwF4DIbil_Sjgd7nS4g9leuHW#|% z23{O;p^v&BrV6a5a1z(f+&$!MjJV_XsnIVDld38F&GK3|vv00JO2ESkLpO$|1 z%oE1zsqg#KI+!Ss@rH+Xn`oA7aD6O-QD3r zyw>*#Fi@cJ=xT5GZ+#6Hx*pSq>L*1|?5#%;v}eQ_b6qXi!Oe|?kL_3Jrgs>Fp2!F` zSC=skEstfD<=j^S^zmDMz5;CyULfpwC}~g#gSosG%;M72;p&>2jH%BDv}{&M>My!2RW72X4c z8k;UCG?{^%5it9vMW=bZ7!ecW%~f#53p@uus?ePAe3_HFz^e&-ZPGClk38)43i6+} zDfO!JNY}&7+mdytEBP4x=5g5Dj(H%cUTA8Jj1HGqRFs-cR6;5XRl|eM1)?B?c$?F$S3%Y@{X?u**cyJPKJI$qk!X0SW-LTM7yaQ0dnt-v@=% zWcPcS4bWyhavhzKy54MH18f4Y_6Z4ODluR_T{1iP#G)e^Vf6fYDcm6tqQ|0z^(+D) zF!<}&gsgmq*|FKY3PCV*=81wJAIZs0>;Impzfe0Iuhsy{?h2c=_N9+TbkeoaNLOk> z4K{ksVh)vVh^@LrHMhRrU0v#iQs6KdsqZ5@<=pGXhHP#VLyibP36F6Oe&;`f)1k~N;I{9rl9c3-F;@; z*o#fKmPd@LP@~AC#%RvZc*lY!Y07}&D5ezZwNm8}v&%F@}GJB2$U2|@rm->g!DUQBBI5PoLS~Q(eA~wM(w%zu z>i1+qwGr1+wKxH(Akr7n-r3H?T(G&fwFH*M$mnS4XJxN{r_#vC;7i@X7hz!Y9G*k=mxW7_M45lrX?weGV4&Q2E5i0BRC`_D zhXp9>>tv(vvlqPQigj;GlD$PLk}eH9X0Czq4>;v5Jo?z{w=sIF)WB5S5EPY*|FHaI zZ!Ir3x5{9i$ydoy;e9GyjgaFr=pxVWNQGlji6to_%JcKzcP(rlZOWjk%Qs;K`}5aB z3Ttc6`?I3tR-&DwSxrE1s;zPY_ie1@dl?hcxa{5Tv0?QNBQCaRO%07ZM0XO9j=F^l zc7TJ6rlt9V6$={E*~m6V&bI*rL$dh4w_1%Y44YJcXJ(mJ6KRjBYvyh~18LUOs^hDX zZ+=kB!*XqH@)>4DE90oda5jRWIt%?>dxx8$H=^#s?qjMBFO7BSaUoiezwcxMYO3e^ zj*868*RNlAWUG4LpZ?jdLrVa`QGC+Xw$0z5PB8>mGmg>}tO zf*|e1LhkoH;3A( zu~Hd}Mv*aJ!oQc6LfkB=yZR}INNNBO)?tk_>g`z7H2+X4n=XK%`tNs_fGZ;1(8w*vf;1A!%oy&cb5eEfp*wJO?A9X%_*=7h&jZQz@4E3K88 zoS3x8cdjL{9h=OAk_@@H7OVZXy-@$EL>t5ix<3GLOhd^y!l~7gK!Ff8UdInMaHmQ?#A}4{x5@H%48}hP2Wh z#k0U`I`}QxA$Xn){;H=@KM@n3kp&^vzpq2mznTAvS04HO{fWEk|7N%Jnoto*n}v*} zzg7PEM0f1NP&!N=5#q}z@!V#1{lCYc3p|?Z1w%!lim4s!DwiN zdM`AQwP0@6*s78quLm-T}S?YgoxDi!hb5E zdhY+l1@>V4KW8d}S5A1~1W@pF-Tc189pDVK3{h8Mb58HH>>5@1fiv1mREQV-6`i+# znaRy(-v4b?i1zQNIzQ#G2lgCZ&dC48tH#z#VG#oym29mab@BJtr`I{gy+v-IKJcH{ zrrh+t6Z&}vM++$qCY5AA&yB0s>$$NM{%+*>CJP&*UJ*ehnWD7o^xx=0qr}ioPC}Fd zg*s*3TFNS1YDL7y@-CIZ5g1W8V!y_7w#KQ=BX`30B&hFTd5OO6Mv4=V3e;GaoIDLp zE0r$*nf|v^8L;6C?Y-_I&^FnL-r0cF@ECR=D<7{rTiM*{A!+Ym7Q1jKqv}-C^-z2I zGzc-XbCl#&i$nDd5M+OSh9Kg4g(uI&(Gl^U`Nb53xW){OIvxSnt}6zBM+^fRTD|h@aAz zhnH9UY}YWP7ZUGOm2L2-zR%m%U7WAv=XcL{sEIBSqb~b>aUX)|+V5h!vi&@e@UDCNv*7;MA^c?xy3?tBdO=%JKB5NvNAFm3{12}!{Et>QV=u-B^GTmGDFTH z`SY5oG+@GUrz4Yg0(Y?i; zBZ-vP%LD5BKAr2=li2?hn4`92tFOEK;?2p87DA9s?tWw}+{n|gGBD73`V`mc6hq<% zkjy8gKt9cciJeb@SZKt?M$euUtzJczDGIh|dwdkGPsqwDzi&-X9{>(BaL#_t9Qvt5 zA?z)Z&mxke!1FgVGmdN6?f39h8>V6m-WLwx*o>9;m`^{X8>W z>(-4MSlHOr&Rg4`m74(8R7`kcX^v}Q9>mcCR?w4uZ7iywRIx+7(6?`E0Jdw3ykmC9Q ze--19o<8fV8+siGD?r!i^7GO-KSzr%0t`(nExMkk=VQ=oU&X+=evRyC+-EUKbJP9x z4=mj}D*BmOuhZXEp>?M$_}JH|E*~hYQsqD<@~Uy>D78hYSEN4XE?ME^N6fdGlsyZT{cQHAFI!uavW& z9X2`P(Mu{Oa~**vcaOd1lyKwG zi@p7zUi~ykJuR|ZWZyNs{4Jm=E;?)RezkFNQPIxcRxiqAw$PA`e%N}|;PEYE>p6IC zZ%}>b=q$0w24YVy`U!0WxEg9V8+`!lSe^2crbK*I90OMuwIryTqN=oBya2DY0#@(f zpahgW=DoeMS1#2C1XKa3WlQ^>jJ7U6|9qxd7BB|(nqr7z+WDE1wzfvr-l&8RUF-MX zN+UAgTJd3`XW%Dp2p`=RfbJ_tmOP{FESSH234TWgJuR+O57dWb&~x z1AYhzzyDd)=g;No>5>(@o4*acy}cpcft586JW|RNJ}`Oj_Jwm?HD^ zU?r)~%F}##uew@4C8a?vpH{RJl_HA9@zbUkZRPv%!0*=rz6funueS3+;-!`~_D8mz zzSru$TtN6g^O!TF!(Y8xcUI|5X}haFPN7*=TVrsvF6x&4lri80i<4u_0ii$8QP%Q4 zB!cC-ZRSnq*USIix?}b9;Y%8H1=J~r!*q()#PQ%^05K8q`8S(1 zB}(<$)0=$9svcqQBvPhrD`1KR2+(iJbF3JW0+Um`15La4*E+nx^IR=hR8v#qCjmQd zwGFNbgL66RckG)Uul0%}*e%hWoPX`nF;L>8!mpelM(wZOKcEC&HtW*Aw=N6hgc7_$cWO7;p|F_>vu&K zmzKN{-JR{nYX|bHc{|@SWCwV8_^i$ifA3shwY0>=#lt)~CWqbVUTm+GG6ESoq~lVN zoUFI9PsW|8XlLhe=5oeKk;_-r|khjf0K@;s@LrB+@j*E<){)uljE z0s32KJqk`APj@>o%Z%4mRh7ajEH3`p*9TLI1eWN*IN+PXNuHziI6i)eh&H3A*}I2ZhlPesplpTh zL%G;XDN4*2O^x-tlP<3B9XDwx`hEaD*iQmvm#_4ad-#amTwN)B!Ae(kuht0Mhs!iu~)t967M?ZneegUJU9)h z_g5#>o@t3#uY<04XuK~zBBJrV-tn!DwA|dCS*Ix|Y9?|j?=3}un_h&;{FKC+O;M&s z0SoeFj(%5JpI*I{U+$vvP+L?)M8tM{IJRh^xTFli<~GJ_yW0D{Z4a`dCs7da3Bj&1 z=RQ}On={zh*c=@l2@T<;O958h#oH214+sd7JsRZM;PcOUrY??GVhS_+8W7q zN*dQ1(oh5WT2mvUjalJnZ?FF1gd#Y?4a$1Tp7^S^!^{Z z-aDMi`2QbQp+o49vI&LkEm=8cA=zan*(+qPhLN3Qi^!hYdql_z*?aH3j?M3>_vdqc z-{0SLeb3b&MQ7dj>wewO=ku|YW*VeJG^^f3t1|a>cOSaXU|U<~fk?x@eulm|h?M&1 zq#mGAp@xQfa3Q&Ta#B@Y4NnefZU$jzc;^C)Y2Y?V>%|}$lpttuq`2ZKj_}63PH}@U z-|_rROHGYe0k*QU3jONRNR7sh*kv;_!l^03DSef+j!&{FP$*LLp9|lqtA(t^hQy{2 z3Za)yi(n;Z5`*5~Ii6dffmesLC?L}$HOcq{QSVKEj&!+BfkFBV^Rm9h>Yce}ppQDd z84Y@ZLkp>n6cu6YysENwBc`vwr|Zr5MaIv?bvxmcFh{;b3*qU+k&_Mo=(06&F9Z*<5B{leBb}dQC^- zebOls5;n@!mCCJwi3a*6d>XP6<4#?$O(eO+Hv2Tr``WFj=oqWv6PafRgNY5OeVY3w zFD*_+s}8jZ_EQY=PIe(+i|7%mekmP?i*Z^}-wVJRuA115oon$L9gz4juF(;h!~|&N z`}g&4>%M_ATkX+NEYxj(R-dmb_bsK|4UnSij&U3a4hkf{#Z3nyJJ20YeV4Ig`jf@M zv9rHFa=H+|=*Kl>KnKRO!n~ZX(b><1*{>U9XJp*7vWn-nYy#T=aE?|77ak(vz~*Y5 zlm=hl*4b^C)BnXia%i3t609j$y$jG`!hkg?37Lr7t3fDRMMQ*k-Sk7B-qtR8)A9-9 zoK34VC@2t@=0>^o`6W-W+VVnU11}PGrzeVv8(;f23g)UD*qmoS62fOwA^pP;^(Ack z5mq3wrUy6h>K`x6%V%Xagsm+QaQnnJbHwxx(NMg|)%9KXI>eMa1ds|6rKP0_*e}1* z)7yYUvA5z0ko|HA9jXi%?zFRui;_xlwPL;9)uh*1jYD`H7bwL%YzJ~h$jOri2cw|E zi;SE&SuM532UyMlkxuigb~_8+LDcTEi(KHG zpr<#Hob?E35v$J+AeSau9=&s<2kadLZS5JlvNARn41JpJKVW{$5C-uB(rBEu@6FQ; zivG|Bo3!;?u5J!M#cd%drn~PKQo0ZLP0bPYrA57*9LoTbTH8)3&=jbhMt%8`{eU0> zm3ZG_^;f$5EYn600B8lhzq8 z>aKo==uwJtpC~z0U>sFHUV5Yca9-~_f3Bl*>Jb1gA=x?E+uJ)7!gC@5636ZxqQ%)P!(wf1#v{C4Ybg=J+{>`I83TO{0zzI<_; zmOS~RQ%UBNU-YA^rzgDSm8Zp-LUa@|DJLc8r2O65TKjP6d0kbx9mLNECwxrcqF@cRYASc_nhw=k)rp&7Gk_o`Tr*AdUceUunK}~XdN!JY7b{2^oF7VvT7(s< zJFdIpdA6l#TTl=e!W$#tfl1H-wT9-Op}j`r2nH8}02^-GcjzCDZ^$$bMo5(qv% z{*3Y00|Nu}l1045Z{FA=Q61CsuH!-AAF%1eKUpc1u(m1conjfP4zk(QQ& zO{dEG{HJ|_8}7`D|4iXFzrfrt;UzfO+d}yWl#9s7>Y|gJ(t)Z)f!p~% zH;-vN?r1PYusY{IXRUcX#j*QwrgE42g}jHjxJno_;g5!xS~&v&?`wknC<)9-Q%ymb z?~3m7FrLGG_Yi{JBf-^0wkI%as`m!o}h`-a$ecC}{klnsN<%kbsB6;vhSl(M9 zHK3u{ICnppx)u7Z=o3sKq%Ay^WzFxt`r1Fh&W)3j}zyvzf+ybM&MfRB}Lma^;Ub ze#n76&D3>qqr^DZcSmC^^8}=t2Ik8%9Ipm&EOf>Su`)5OANY|(R;lXfbSOddxp|UA z0!-@J4FRXKs&c)P2@N7YOoLGk9b-f83upBBc-^NR#JFSHSBpza(~@;JR##b> zSb6#R9UScpBBg^Vw4xGr#!B@-3V z_F_N573dana*-b;lO%kvPw*&cXlRJ*zw`6+tBj=(Vx$w!&Q9K3$*cJydk4!KtQdSg zTs`J?{2^E{C+vwXg34c^2VgO97f3Vpp<+3n+W(({@aD#cTa%)7O?5yLCZ{HMfyfkK zp+GM@4bwLL?=sG=uC!i%dAM)f=!69bwN{Dc%6wQFk;CfX-e9-2tn82C;*{mM-N5W? zBxl1vwlv_3bBLbr?kmKO438KvHiBt~<=}z&g%|ZA1h}8?hMl|bdFol583f4Q0j}u- z@r#oJM8(+faOlNpJa@%Gh+LbHQ0Xg#`e>JS?(oR;UXzpTi@La>LZZ&Na_7Qh6GgF; zgP#2f_wVhF^Sh>*hoX1NwLx*q59INU+T(f2lSl3%)zLggOvKxAk?e3E+Bw2s@jRN! zIzP4rs2<9^;9vrkv|k=aLnJaGjbnD^0C=X|=#+%hsjFnOKI$EhbDxqxp$Be%GnLjg zM`xAR(A?ZZBEYYOS%WE+=e=kg9opUUM}6 zyW607I+)&z)Q5|k+r@ED2*~4)py}EZ0Fmc*vlV9?kx;o-cCq0~2^{l^&4EU>jcjN0 zLke^CJX9a|g8Bb)0T6H#ftGGRul6w5@}7v(BBx%R=S;DNnA5q4*HZxZAT7NGLOBq$ z37%V?S>qn&+sULpw9bdlpcy|i*xA57IOLm)*ftw&p2MgujT~patLkr#$mIRZ(su#gLTc>a7%*;K#y)`??*<_uH4$YX(#+KKaDHUtPn^iL|Mdb; z6wJ=D?wv3^2q`=Df9?fm?`VCw4=#ts#zyBuuwG@9xeBJ=AlAMvcH{&jOrSL*w@J5% zj%!ll-|;jc`H5fY<-9UC_@0sjEQy?_OsW!+4jEx#(6_h$X$ftcYnAzeb@}Hvadx&2 zwz->d-T&Y)R_1@Iaxq>4KWvv7=?9fx+$BESlDM=)QYp(7=Tt6G_E8c0N#=gQhJ|Qo zXnX_pWkkR5M@b1cCnvZ^K-+0?X}y$>zk2!B;F=0)kI3Wo#mU>MH;jypS%}|segzaC z(y~HjQ(AS5+Lq>*f%Y058##~@f9X>j$fBSo@=pT2z4ztB;9Sx7djBA!u7ON*=6n9o z^+Ra7{)Vix+s`WlE)n7wqmf_4fdDxCiS|-wM}mN;EhX)psW;Q93b7n|9SPWl!bv_q#6qMVYQXtY<-4#htO(xjLaY-W z4fT64lQl&BhIy;~++(5!&Qpz|8X2W8U|$druyYy#v?pj9VCr?+hIR3#*tZrh4x1ug z#V}N%~`n{967k`_7_Cme{j*})a7gJVYd~nJE+rOTlKgS0L z7vtrCv9eLR>lcx!w+(yw=C571w>Q>BT&`Rs&tu@d@Iw0NyEr)MR_sb8K83KhJSgbN zgavqu)x;`c3d%-!L&uJaa3)(!Mq-YnvN6X0Rv?ih=)-6ReFeks2v>m zDk=!-NnM?tJr1UZC47UE(~N)2y@~`iO**@RT;)6D-~Rp>G0)tvFnZeLs;ZZ55tabP zWFEt|bsu;*KoNox5{&)QQgv(fI)M5M10g3D7bar=(a|bMS8L*IKfU)9d!AO;`Y+S*jVSF$gR! z;ssn$OHpzE^Jiu15RzN`E`vW3p*LKLwodT8u!61Y!Hd5DYB}E?9v=e*Q$i4GCuR~r z*MO_x>k~{ZU{z0HoqgL&K0(x5r^spRT5j$KFdHJJ5)tIKorau~tN6CjBCZUTP@d|r zT0z(NC;3qi0p)#|Zi4lSn(b~HSa7Uk9(TiJ0ZePBre+uwV$L8WFe@X2O}FZ!epKm% z?&*kiESZm>-TW%d9{(iNezQn5iUcXBg#Eq9wy#_UG0=8z)SeUG;IW+kbq}y3@EwhV zA9I@rLV9$66j!%OYWqc|9AHhi*xhoCzrwkf3W(p|-X5%RAJ|>819KD#635ZzX4k*T zej+<-m3bFiDk;V{EZ~^bVengzTl6t{Ktm4qKI~(G22Qc_s`%66)uA2Ov>6x}R+|Ai z1;R5-q3FGUy$S%t*w`2h(Y~TW*fb|E5IO<@FjpjZcOaRZ3>E&?CiMd zX(AX)Fq|!CS>MFPLYeHZS3`MZ>*#1_PxU1sA@6CI#pUuUS3L~qkNLH;SnpmXpahFP zaBQ!+aDr_NrMJ1kC=G<3djl^?jm9cEg&sUWq97pidD*6*#(+3AwG|eYR3^oOZFy*@ z0br34Y$JdJG;nThr6ncN0X_?Pccb+G_6)Mi|D1C!S?nzr3ko{7h5!JUDK~^91_Vpq z)z$YR>|n6HT~$LP4ZK=%a)NYX67+!oDvv_=Ht1iB4GTR%=ol}Lz#-!|l6SJTHG4K_ zLg4$r{ecqSve9=vFQh_`vojXxQ31Pw6yT5|dOQi3E#Jg#ta2_?ke8RF!+-ZS1UbER zkl8Z07&-PGX!ZbXfJ;mt2C0FCl@)~0Fov}NbRmNB`s#-S8j?pc-NgodE}~6JzuJi3c=N`uKGrR6Siw+jy$JcW%y{MuW#3^P!(Z_5fV2oZiriV!d(^P zND8dW6?zB=9Ii*}CO*}!a&m?p0Zbp@z`!m8P|Us@kQ4*XsCC5dP={2$YPkkP#-Rcr z7T3PxDkv=lA1@P*EQnhHuqP%))tCqcJli2BkB*q)%m7mCGyIF2QuYV&A4k+9t8K`a z49eF^xDh4XKe|*6gxd5E#No<5($a`bPEY>@=^R5teo0JTU9fSrv_yiKwqs#uqr4Tw z6ioh_MJAULI>ns1#f#5*nxgO}pTnBsRRAJ8;d_KW5+yt?LT-ywJ~o`K%}iuUPDTbv znR?YO3Ur}N#JgZZR+;0?MSw$=da}5_p8B*4u+>{#x1Hu{Aad$NWr2Qe{#FjIxS)N&0U z-@(>a^{X8$*?6u*Wn*I!lnG4s65O`CE9_}b4;QEb`2`d@up1hK7I*fprKMppujn7VU4~nLt2uB)d*-MuysuXu0!F z>hfP`36_`1;Sz>;9d!+j<3oJtbtMt^Xyl|XY(7BsL@DG@1(P~nUeG)oz+M4UfU#+Z za_t(^9vVH5!=+}L+FHAX^$T}yt&#Nf->`?>6FqxX>XwydPMuN%3+L@S{L8@9z%Io$ zdtY7XgY|5&jkrBL7N69>`o>o>YIQ4V&8gT!+iKk(5kl0Tua%$;eKXgp2A(Yyu-SswGzbeN znTWaZ><+iX&rdgaPzYKka8m>SK!Ya9Y~54za4`*)7ibHk^iqBnghz+69BucXn) z(d2>wur~@E@pq0^tS!e+vTDx8WZb|7qw{O!50mc8&>HyY1E=-~BFNEr!{GZXE9(Y9 zype2LRc3v-UZ3O{An==&jcp}*19FLIN^<`lg6k_3F}sdr@n&oRwbH!}4#W#Dvv0rB zi5gfDf6`~E!{ea$B*Us6;Y_}=8gpybXhK44tYdA7UJ7^--KV2l z4c8biv%Tx50D7tti$lw<+axpzw5Y_c#>T_>j@G88CMy=8;gC{LK={LiUEx>+OnSsW zXu~CG1z?umBPLu|r!o!oaWe~x3O(|>=H@Jr?EwXc6^F=jwJI!kZ2y>HEn+EW7nk|j z`GV`^n}_eu*n3riu7#waZw7|GM-nvA@?&e`<_Sl~YxewVB&GeLJ92_(9S!S4KpupMBDu*tQku0H)VVC_~ zUDDGvIM_AlRJ-P=mHF-F^P!>YNME2!@MP`tJ_cwrDOLc7c8q9Wml?j*73>TC6RLS~tfli0FQBKxY^de#H4_h97ZN!+fK zb5IUrfcakEA)$lMaVnPlgdALs4jI%>G9+oO$5|Ip{@5lEzKO}eOg+jXOViH@j?@8Qa=R+%Rvx+ zs>Xluw!+Max5uR7vT}6>=MNE~Bj+-$dc#`DA!5wgX`#2gw?a?Mu-uOggKZl5O!?Rt zVjP8zc9_ik@`7r;*&99u4o4)YwB7L^S-VLtyiRA$LZd=O?fW>#>`X94wZ4Xld+@o& zZ`YMK5w`SMAHKfvK5_i>iiLFh4<{qF)M>o>SygG@?JFJ6eU)z=4_7RjpF}BZvaUa) zTAek{Y+HEhVf0`^%4xMdb621*zejB%+v z1aY_yrYTq#JF?qyK(oS?y+>Cy?Xz^}>Iv7UoUhT8$9D8GqgxeTli`Mm#UPMOq`YF)Is$2Ku! zuW7}Q#aFO`+|1oI$7!t5O;pNVsL5dac46eHrC6o*Z!7H&%}bvqs#|7k)*br$XKhx5 zQW{Ei+cT`y*13crYB0npQRMd?y|I!Sp|493>{&%OmFT*Pt zqq*-IY!{0Z9=p-L?mw?DVo_YPy@yMie0NemkW*R{6(8K1%vQytSJ!~pV!{*wcJRnT*)g3D%AVxx0^-*>UyxLQeJHbEUs{C(>Q15wP-Ctyy}eWYZ`HYDY4SEivQ zUNXu47LA{A7mt=GX8e<8gvvzbPtSC{hs1b0>L_(9iIE1(mD1tLTy_5r-actfirZdp z3Po#gc)3@!0)A~qQU2#MeiIXiDuLe1eSMGGTJR->LO2e!`Am9JvH6nUn=7=Q{#l16 zS`D094Y#jVOEv!`l3VHE^^#t`4E{??5`&{$(%SyqJ;a*k87moEg=Si@DYyP0#UoD&=I??@xrzBpV;>oWY^fHGp z^p?)?7Qr9Gfl?~=^cvOf^t>hsOuomjT5o^3EqP;`$(qgOK*Q?W2j@OD%g;|)+`YOG z6jw6dpG2$SSj%3H+|FexoA1#oqr8QTT7YYlH9#;~d^HHx`fyu{GR*thv89)R9 z4O6>)*jMQSw>~!ptgczQ{z(vWj3_N#sC84fy&rcsfMjS`Q%t_*RPFbrch#8U9dA9Z zvejK_L6g?1N1qfQ;2nOQ@3oA+nTI(jNMV927vvvxEW8=I&T%EQ-FniT$HA%FblB)^eh2&&ine?I&H*1d0is1@fbzmF; zLCn2Uh|~a(ZS$6UhK4tGx)Qvm+nI>&4V)Z=t5klX3;wJP1av$=`f~TcIqJ3NWNK~eQBbV3fd#sbA)j3I= z!=cV9KR?|RC%_CFiw?(o^A@|4!3qCw*d1a-XPjW={MdCMu`Z+$5jE6HKk<+L7K33h znv-#9;@w%lewr&eIz%D1RJYdSL$%vI4JCz9yJO}67p-Bvv%vxpsQG>_A&C%J#+~u5 z=O519cem0&rBzbIsaLU!g^rK!1jMKG7@dXVO+bK#`9Jk63NiCE~$UBBg21XwNiHM0zBX zn7sK-JcX843TA*kJx187{dS?6c<_^>q_5H8X>u!s(m6zjPK;r<{*Mme}m zeU6R>E|HRwjf$RL=g`pB$zkmv#JDp+U&$xD5 z)@FBH?1FTqukaHDEtq*IUN3FcQbQ!Z#Srt+hnAPK3FZ$kZ3osO10B#Z-CRE<D0n;cq)tL0}{r9SrLB zzp29Ff)Kn9B`xVSw{SDr_!ZEwz*$3p zmp70?h=Gp}45@lLJ0p#vdV6{OlcWO?kVw0|g|4!_`-m>o_CBQ^jkSML?%lLESx7s( zLfT6n{3Sr<(}ClRpk!a6CqU0|?JKhL}RA ztb$HQcQ-B97T$4j!9)fKW4AdQNI_N)p#9MBGmx?RNoEQsjgILk1O@>d2$?%Dg&O>2 zmHPp>o$%KWA3gv}u)0e4OYvi+FOiXHc_ERo&J=opPi}D)q~nfrw~(lHt6YZE((A|Z z;SJOY(7dcZH?pvpom=uK+>S8I2n-5bUS1h=`e8f=Hbo3NucsQGd#l`E3i>p9mLI6243a-w+KK+Xv z)X_0*Fr^?w!8@Ftd33x4WPSzB_G923Tq6+?>H?+WP0~$#%=V4C@8RkL>Ytl?l@wj* z`&3|Ts&>xBH`bB*df`DOJu)%^BUXP&ay~xCQXC{|jmq+ZwK#KhgpH0QAs~5hh{nD= zdDW>GBMQ0w4I}DxdNbZzJBs0J6vH}rlHV=yn}x`(#;j}$#wiFekJo-`!;Zq5Mz^ZB zyrwv9`OuyeCx0SuzfC@}Kc_zMM%I>mm|06mW`sICSgVmQm-<>e~d<(2l zw+kKSWI0vh_Zeq+;A&^hg;&t8bd1)_=f==YP|jR+6zS_5)zvWA|B6voA@MSsmeeAX zXT1AKpGSyv4tKxUc|##L&=?v{#4&)vWFODqsl3r4hC2 zU>_jOS0kzm-flvKp8m+~rj@)4CHUM;(wY5n9Ybs5h4uMiuo%+RoZk>Q=+lUxdykE8 zOMQbd!bKzqAKQw=V)r-JwRyQ@NR3Kc>M^($;7?8w`$g`azl&qXV-=noS`_9I5+8os z7$C)gcR&}qm@}6L=|zC&D-rVz4j9k3o7yzbK(zC+qx#^;2#kOP?+=GiQ2ay^QBX82 zY{`U>>zf<6uW91Oo)r&75WXMPz8XZyB@BIXR@TZG9}Cs$nzqi>J^@~cQptB!)l?5g z;t~*Oo=n$+a8I0_9XO?bt&&SiC-B?p=;|NKwfe93=9EOJzkc1N=c!|5ZLNX-*4GzX zPqFgnj4c)ADqLjiBp6q*u~}W0q%u^EzU7J8n_0}|XcZU3c;m&~i1mZ}gU)4@u-(C6 zuFwxYdQ2Y+sKJAR@W4Kfp;1!6uMyNJnd;fGSt~`RVMG2vkt#HL63fq~P8WJ~8guxc7(pNgJj+m>Uzwqz7JVQn*l7Q$ZT8WPCyen@2&teD;LaYdOyA8=U7nfY zbL|f-o7qAn0y$XE-4Hyt0MCjO7EDbAHDw8bL3@9)Z>5%wy97i`Ivp%7khFtM3ltMI zqT|HA%J^?jPu-w(K5(niW@u}H^xqvFbjkUQJ_g2Zj7O5PTJD*h3>Hx=>F9j!+sJ-lUQm)d z-u2LPxVHshe{Q^ng`LRSLrr6u3$N=+b9LCPqe&?sRt(If#96I!v#aK2*5(#XIv1|J zQZ}{H6{YZnts$2CE(6yVWdkR%RF3AJy1AUWxPG??i*M&bZQ*iGRh1h*^A37DO2oBk zYliWjzj8z-eEF&q23NiD99!vNg!_7VxpH*-(2(hTAZ*}LK|u-@7#5a>kXe%c{X3t{ zOI0m%3Ri|q>^h0dCwd;vI89$xZbyFn*gcRp@tSJ(rL{E+5;1G*`~?Ab4$ArZx(KYt*eT^7isc04>+BtF;}&?9JJF1bpr zA9#v=%)Hal#^U5W^f?$E4C7Dq@BGq2u)wi-T@*qo;A0d8LawdD6D4|I@Cvx2BUe7L z=RamU`RVQ8ATavl!Kb`!uI3aS3l&JY^C393aByhV$E&EM%GcPhs9Rdz@7PB%^65g!b_Q9n*_(cG{pds@K2z4 z8ss8`=*b$VtpZhMSPoxBEgzq>V8*0Yx?j7OF>n+2Xzix;eZdFd`j!KkYt z>F$nio@q<|`~E#0S|;oG=7;Lbu`$tu!-GEtdw#;slZ5@0*^9RX|(*%7#QxM{n1uTw+8pBH_r0F|7=2|I^9%soo zL-A_mB3XZ>^i+PQSoM~q=k6`H1QsvYe%+HKv(M4-^xR~6)uuP*&*kp9J@L5llfV;0 z4~L8{luDFlPj;MjTGl({aJUXmN9|;^_lEo=4rDgsQuC|cCLSIcfyyZNd``pb6L_*` zNB2xCG620UE-AfuqxuGbb`xhGxNdx(o}Lb&779kj2pRhX1YCo$Z6H_5FqP(^fRujU zA$X~PZbusQMD>DpM$}?9-0bYsw7X}+eFk*(j;o_Ntl{9=f~FD*`}~;@wUPUrjGRdO z>Fd%P_?5*cRqs`B{1A!GcE(s&uTljFy+bbd-&5T)ux-7_8@hoKJu|WFJ;*m7KmC^R zNch#q^Ca(1GSbDiSKE+X1@W5O;3fj4X~%LYeSL$&`q2%8xCA|?&8|=@SFpz5H#qu2 zFEjJx>*Lv-!?p=GK03GEeoG-WJHV?hzk8eXBRqW03r7jqiKQSO3;%Q*v{dl>ftvl` z$Vg-GYUtbm2~~TP=pJb5EWCh3{{@5{Rbi*1l^-bawVZP0o{*eZ05*OY@xNM1E}Z zOn#*&-5K#kMWn(11lPNME7U;oSHc6A-TSn!(5qxnBJK;d6Htkg3pr2w9fW~Dxz{JY ztO)`N5!=r3E3GlVz&OoBMn=Y^tTJUx7DROYfBP$J`TRtdt&&q1<3t-c+pEfX7!_k) z19SpuTQOQuI0x_7gx0C+BH8u){K*&Qmt#Vs1x-E`MnueqXFY;iaX*`KcfSzZAX`{= z{qQtXouGjeDyor^4f#jqe>mHR_s4Ol`Q@Dpl2gYAJtrY39O!)Uyr%VYERQnTDj<33 z)cfP~RrJ2|1pEZAOEU0^<4cxX{mr_qf*r zHk{2?M~i*+qrjrKaDg3(g4E)hL_}}4dreDDBalRn!n)BAE|Qss({%qX-x@$IcnxkR z-NSx2nraJOa-NN@ZiqQ;1zZD9*}FuhohyC8Un_BFy*{yMgf#`@@4t4GdsMx?yquJn z=)t!{p3s>fVlM6GcG-0-N|eoEeDpbsM)g2jpS)jEdf;yRjjc4WYz2k;&a)7;Ks z4^;UK@j|w|!ANeqrrx2#)Y|i(6@cu*-yn|$3I~AAKQ_LEslpBk`-8y|@T>&dTl_?Q z)W^-!s|5Oi0ReL8b)iA}{ShgDA!=)V(?5y#g&fW@jugfUNx_}WK>L%P6MS2*u2DfA z36xL1hHYKFX99B6Nf>b=+;w$u^T|(6MB**KxSkaxJ+H)W@1ZR^>99vH@!eU-iKrR(m!do&JGi12WYA1hGff0QIYa;bnrc0nX*Z&y$o7(QJPCGagMF75`R zwQNdE%$Tbt$lKRe<-Nky_@on2_~A5R?+5#gb&C6 zecOM%0S&rGL&L<>)QGQN+xqK5#4IP#qz?BP7-GhLf{ice5rEqP24f-#BiXsRg3imk z?PMzb?%PtG$LuUDa`^ar?b#OSnIH->;D!JTmM9>0NV9t3jGuS>tdw4aUWmygJv3C` z-X32oAJAIhkhJ<6lBQ-?y`25{6iAwJaYuav6NN0dZry}B2_yz-sj2xqLxheHGkeb; zI4PoTcm9lw9B+qb5uhE6J9X+v!F2;_{njL-SFbLpB`;sPt*GDB3bW|(_x6r{$^?0a z#$xDk3YGF>i{?_3+)ZOyrNy%4m%gJZlr0>vdI5F7{Z`{~pB zPCp!t)carPC4Bz;7uYK#Bnz(U1S6ZSV*AG);ST5JAq`W2GK0p@{?Q%iNayI#U52C# zLPCzKQLoVfPjjAy$~HXI<9P6Z=t95m+PQgZH9LAOhU{*g5hb*B3xZs53x4Wz(z(Csg}j<@49CYlqiJaA>RDuFc&Pph@Kf zPfga1=XfPoK5oZ6RaPb^;$Bq}Ab5KL;b4r^3e@~)+AWm0&NF|hsZ1yJHfDDS&1JFb z`=r*vX#D*C1-tYR_St<$8{j1vYUF7Pc}(9yeFO&C^HcO}3sCBsW>Ow6!~tZi zi;F9%ggv_h#KO!>^Do!OGMtL!@?|Bi(EdW!2cseKY_RuDsV`5H6FM8V{dkx{!XX*f z)LcEaQe3UR-@zHu%Ojinl<7QCzrmh8GAl9n=ep0++phwW@uD^!=_pXq{&Hw%@PZlY z9&5w9E51YgW?qPfPp*9kwJ25A3u#tmx6?ZA28pOYE^S^>Qy+gR zpe&~ZdmQZZ;o)lV8uwV#6Q7>!_F!`;?t^QhykAhc1DidRAs{VmrWrUsaw_Dp9{qg) z=RQLuAiTcx;j5fHaYPfmr+0_9tjMWDmOw?8BoxH zqxH`kHP%IApOqiCVnQqo5^l6TmgcMasV7f>=+rpPz?Vo)E9)$ouczI)vEJHeZfDeq z#Ki(q0uU&PP!%ak{bu+Tj=LUn%f%Tg3^?AGIXFUYY~ftj6AZyL5H>hcrJ?Ec_kW!K zEITKq&rbdYN>)wnCQ6o%Us_}th%K_tf%bNtG09A3O}iPoy6a$0+tJaX856Vm;pe_E zUqyAee`3o_(4>7rmACSjzxd7FElS$)o9E<;cs`DZ%O?POxn0{wIdVAc16o%?Gbl^D3&0Sqp zg`f>mQ1JQ`7|7a37y?=iBnsv#Pzhz`$Nfu=4#j3SqM-Y0{R-gbJ-lo1&0vOhxU_&D z9X-UWz@d3SN#QE?R7;COp~s@@Ed7g=GCywOv6xMRIw9)!@Gvu^URoZ))pPNZAPQdU z7aqR`j&#SJ)p=D_MUX?&pJUc1WxogWFfc3R|6NpC3KA4v;Z>c2;_$nu^qlH3;LovI z%qogm%PMxlEA1?F7_q3|`3o7E)>!6gml4RFXZwG3)|C``#9httu#VHnrom7!sDSeP6l zKR-W}DYHt3Wo2(gz^F5ZnukmCHj+V4Zix(|FipaIq}tUhU+bb+nD%0V>MuEKVDRI9 zd^j+KO=6~Y4qBz#e8Fr?)b`b4C%k}>5zzPRld#Op#(d@AW}vBAa5LpW0-NIS-tK6X z+nlLWXW4E%pQ)iCl%Jfje6+KTB=HN^F!zP{T>4+rn3-7I@dEB+rf#0<gn?J(Q{mY@yqOWkf%8Jg0ez)pPjHuZG~$1D zOaIYbtYo=|cz5s~u3B}L?PM2#RFF^|Ctx^v7%>0+~?(ufoHdoF9Kmmz{b|z^Y^cv zt?tqBAui@+7(Xmew~GZJKSxBYudUtd>*wd@#zpLU8jL*A)O4}6^{@3b$bS}yw0-mD zM-ivS1_aeIddY$ur07>oO;AQ<8t}d^ zU)sKSXps06Tr{s-Ir*Msz{}_WTF=$F=Nfm2aJ=8Y#i(6?W5iPkk!=V5;j%^K0%v(I zK|$I@dqt}RZ>qA=An@j6tOm{o9|E&(I)p*Ca{h@l>UU3?4R|Eh*9!~NeMW9?>U))z z8q4n**el&2`h1WC8UjAF&S7I8n49|T?HLBO?Y&_10*m9vdU{Y{ z^rms#3gA`Lb5~4&*;H&S$>atj5f1#nnjrG@YYnyS2Ob9}V8*Wi$;=>V;b`c(7_<7G zEl$4BII~ZB%2dBTZvOYqZRQ6R-+nyQ$r{&R4W~+F?;aQlf1NLwKyq3{XH`K=x zP%E1N+YmT)Dk^*GR5**Yn>0XhO(cB{Z2RWux0Hqr@a+$dP=^-!5lo3 zxoxW6IRcqJU}OrX1_X)Vj9yfSTXIYXAj4}907T7j^?(<}&=&E(Z*U^bE9Izf-U0p468%lzP;vVlX|NfegiGe}2 z#ZZ!s0i>HsSKEx)qJGElQM|D?XVvAk?pU64uU*N=>23m&;_H)N8CGMJtj~ofhFYeY zz*1a!?Xj(jN`@+|R>KVY>Z9dfh;X{>72`%jsO!Mps+<6@26XWPx0Db+3x;Sm&0 z+VjNyxg#boU+y+%8up}~k&{q39_^Mt{;QF5vik0W@6Ha(qF1^8j1i1}!dX1@YAgtw z^F7bXPlL)~M1nlP#qLHJ=%k)>9Gp3)I%2|Qls(FXb7##dEWD?XFliT8Y}B+ zyejitK&B1u;(W&l>5P`ZMpeEodQE6?a`MNkmXj^95CWFc%j$Q-B@ob^$nR6@cy%uI2&*Xu8Q6Z$ke zjq!uEm#Ao{EVLJ%6RD}+>DgFW%|=SpJ{*aLrL|8AybJ_$>YppFUg{#A)KW?yMW~K9 z?yJ^%l&PGI`{)i)gj&lSjloIqGgbz#s{ALUKF?2^3yN3xeSBri%;mOs&hwacH2~_P zqB0d1Pn<8sCN;=Vt^Dz0(X#TXdVV?tXs0h0M+0TPxVSHiy_QQ6mN`VGZgxOMuxtL-KIy$<$p9_jLQ`1jwO-SQEuwUlf8ptqosn>9# zo3l%gGdg-a&Z^c@;&xiK{u~P3Bqom_ZQZ-R9=@ebBkHKbX|;p-M$&=(t@WY8)TGH)mY8u5(#J}d45vtxQ*H8 zZMw0Pzs75LrWsXgIdaq*UfcFd4nZ57RhGmX(8?)q$pW6t5lkOacQ7sJ+|{ zy3+D(PB53uqNAUKi-npg9>gCWETz$gB>ajOw#S~QIr8Fc0`@kDFM@;QCL_B&JjuwS zH|H;7P{aU-vGpN|2}a$>QQEa4bgj-esh1);|Fk+7Z5#}<8A3LM-LxGjf)?<@pfIR@P9$Xdhw5o$N&5DzW5e) z9|J>`XAenYtGrYc}DP8h73LeERl6DsyV=K_!fq@5UmvG@o-ldw zqASrI6gZCX5uQDJ1MMn!D}0FnH31AI#wr|aZES7@NWpZ(Q?JrvcM&K2F`vcYZAO{q zKJ$Jtmt9g?UfW+!g(@GwCiuIPqmC5lUMkFe@tih~ZEXBP6st=tQ7{Gxf7}< znrh;F52|_d0c%P@TkRBO_iVEZ24v>7{<4X#6C7sj!iTj&fn2nbOh`b+m5HU8>uo5T zZEmgudae}}AW3(&ujmf!*SAPu+ukLDOgPBIfcOR&KP$vy2a}1!rJ9PqlfARMotc$# z7rmXGm6FnE{fjh&oG)AH`w`41Kva7V`o*3HMXsgnyb1<^G9hOfx*~Z%tB3OC7BO*= z)y?5*En^@3_!MIkQ@@-Xb9yhR_<-FYNoQkgD~agKHl+(&0$n}H&6~bnn5UcWdVVG7 zMmdf8272MqF$M*4Ym*msk?L}C@=Cp5h4i_&Ld^Slmxc*mxP2dFh4Od5q_nsI}W!SfC37ZLyCca z-qGQmls;H?AN4Uj1*>Urd^{L3+iYx_NMmDT^#f<7r=esWE;X0v*)1^4La&Sb(4UEb zS_YK(1XRPyy<*mOU=wG)Ujw8b4!wMG1MON5kv+zTrlw2r)yJhLNf@-o z^K!8X3AHchVkCS+PV!wWA3gG`tXyGCH@UbP-L#Py8Xs^C*lKh%5}~-nt;s3#SIquZ zN;#|_xa6re-sc7pBG=a^W+q?g?NKjbyd6-=Pz7qa7t+$tYhrp%hs40`Xjd>WKP{5+ z+z&V^ZTk+UXswliK# z!!sx!I=SXbPyc%#Y<7O1^Z-Ib0Z z(69V|Y`q0g)mzjDiUM+^k(4g!mJ$%;D54;ugdiQ#($c9MxyS@9RL9NN3Cr^yQgRzx@4_jkAS?_ax)@s7ZieseCX@hC`2AX7!m zWPdlVT4AlXoVE2Qd{mxWj93s7HP3h>kg<-56kF!O0}_Q^Ak&@tkA_l#&g-++^6tx^ zl+j;SfGfU|m38wRY)^1XQ%G`HKa~l|9LPbMoD2644@XEnLn5ytoBR7O-C4FG)1mN1 zFn|_TlWGM32xt!_HBj#&ziD%|?C&0TJ*N-;Vcw;&H6hT5n zVu$L=(R50Cn&7fOh8dKi>F0MUY#3DbPxgKo#6PK{Y*09rjc@qv&K(Y9fYHnNGyu44 z4%W5(lJA6-+s;7L-5YHJg0PuCyRH4*5g=81vBg0W8%2-e+iMp>6WOO^Vn0qRPh~|D2S1tU^9E?Ciut#B#*iu5@~-w}eIE>U~WN zL!gnRKxiWj{ZG%_p}2K+#$aTVk_z7-QqXV1Dg+BAY+pvH>U($Ri~!6>U5~u!XV%S_ zp_<*5eBTpPb#Y~N4U7zQ=z~Q+kqA;Uvg;HN=?O_@7wCq(7U5+{OShN3SvoxP_MBKCRJ=XbAru?Y7C>jMS?x}U2`(qB-~Z!vrI$70? zdxqif$Hm1pg(Y~gn_Bsr?vf4XY)dZNsh+q`JS!SC3sv2D2C4;QQ#;B3ua5OUi84&UN< zna4t_4-$t5tG^2fJyaIiqY&Z0#`MdeTU^9P?A2MpdC z^SP*qcbZ2>aTrLbs1y;8<>leujg8a5m=6NoWDzc|Wy&PcA3tWi6b`#=OCgJbhLY02 zQaeHa{A9zA-onS7bf;5L{`XEF}3u zpjCLew;x8)qvaZ-2;6M2w@t!aDplcQan(Xso=* zv$Of3sOZIVBbf3;7#rJsp!kBIrKJUt46FM|NGJ^$QBl*tETg^ciH}dbg_+sfsFyb( zAc7Tk!%9w0#fgcrMZyCNwYBV-ncyKGnf?^KpM@Zl!(7aMpV~9@Nl1Qmbv0C@vzfg_ zNVw3wzN_y~+ESf>Urt82rb`Ey?;SMYPzsyAkBWNIt(r4%5a8~L+!k`M`C)JOhKoBoA%4Jo z;(MGrm!#`ziCikAhJvvaWY0!gg;D|};2G-S6E8w1ejd9rX#In0w8D&7o|Cg3t;8%6 zuwt@;g^psV8Gik^hq!r@vYW*IIm-!JEQxn#F!-81V+#lhdRgsBeBm%bAhmn2yK7@_ z9~kDT^6VMRyT&2#358;2WyOk5i;PsBwKH;eHvkdzC+$xV=ETavaz}KCAD5Uswx;+G zd=Qncdvc13yf8M{SU6qmCYD44x#0r@VDCwH?1cq?HN0m)w;n6ehGRTU0bMi<5+mOn z>EmPjB6(urdw`r%6ask6WYEgOsZUOB0?|~ks8J}4h)0RBvAXGDmKWz9N=iN8>xgkx z+Q2~Izi1aVf<`p8+vk3(5GCV&cyQ)@4*BzX6fBYqQ*{mU8DeR5uAe3Ttw9Jj;-RahQ&!bA?hWoRyT4nrt>ADQ8y|;y9f)tgy*eRXDl}9U zao6*-v*c`XkplHzEBDdk$8(b}zzk`m+^ISy=9_Z*etSG7%dK0yFMmqhJ$vcvJ6nCE zL?8t%6$67b@SV7_M=ISWL99=T4QEH~_FT4s0j-GXvud{k9sm=Gh@P(uSe}|f{1~(^ zikKSS**Cpf9S-xDxLSi6rnSotfb0`ghk6ej4oB0;_4-h<@#2jdfTfZoL+7kH!>R9% zlqzF!a&kIc4Vxk3KKeB2Hr=pWnrd%*{u7QaL%sd>x1$2qOYgPSHZS7J{ zR|Gh&$YPWQGP8G*G*^a3*2k*$n)3~J$hlmzIk-7^1cZe>#}glbMk&|Kz`(-N19G&A zGoj~0BJ#OTmix1d$5mylg)BW)e{ey&rCI56IZF6zf9;Bm&@*12-&i&2Pm|cWxuJtO z_Y8$goxkzr%a{^w!>uCs{vG^yVz>NKOpNx}{v)VVyjcb9e+ZmL?F5A^qw z1~*&}e7rFbGF;$RtlJo#y$R(&8}H1^XX+F*G+&=WocO2sn6$Ww{)Su3qKn|E%=9n} z41rJWTN?o_U`_wl{K^$rvOsdmn-~~G{r;V%aMkFTFYQu!f0-fq^wzLDyk+$ z&a>9vkK=>gQ!eP($4hLPf>K~kpg<`1^l_Y+W#h6c=X~2S_bs7lBh}({l zH@Vu@B^1q&190)^mKpz{!)8Zz;eJu zha(!8`Xhy$G61<>J0+33xQ5zrjKX$Yf~|y-l9@Gqtjb<3)!6V`ysJ~|X(}9F4QXvLDxJ3=i%yMP%`*@59uX1A$EEI3JS5nX zdlm$=NmKXFC^>g7t(qXMEyZQ#O8B58=n_X@ZgndxhUews;TAD3uVPRN3dta)+0#5# zPbu_T&)S4F!W4!!KUc*M-tAkgTIlQNmfqsvINq=TF-H=(&727vYQS-Eb}R{%D=rvO zYDc?m+;uxpJa?$G?oD4GDoh~kDN+D&JEubd@MvP8+KInw-pKrQh`eLVkY zwG_waTH|2eMuGm?a&T-OA1=*}zQoR2a4i~Nen#Brd{)+vMQ{e*9{p9?nqV#5YtjK- z3%DETmXP#S44;-3gwsgzkOXO3 zV1!WEg4e+4{n`|I;ZS#2bML~qJ)RyVQ1J6b-pd6*z6Xb#dVcE~x5phw?gZIVLr?F^ z;ByTEJTEupD)1EMs*>NoGzlJq8RL?m@h;o>?@ynoS58iQYfozHH_@>Oimgb+9Jcdd zQ0{g><6ZjYzmf7`qW+8qSyCCUE=N^Mtp3LtS$r4glCNHd+DJr`t)RjV9>mA9i#x8< zc2!$vR_u1>jQZmq=d0+H87{07N#V7&w_0}pv;=xgQvV70V|qPm8X9nsoXinYqSw>X z)&_Gk*f4k!?*avMLAyG_wZtxzQfPH~=%Gwgb1NPMrNNT9$?(d^%uMeK-Az)}7E?_c znoOU{vtaT&k6T(cY#d3&?3}9$A|pS2&3?peXX^;tM?1WxNT}ln8yka~zTk-Y4bL|C8 z6@-TOBzYr+GR4_Ng#v|PRZ_t{`Vzan4M@0#=@Jy}XA z_6N9RCdx0+JU)sl^TYyTuA_ftdwZL<%9tDpk&oiyCz$`LPFTC{=iqDRReD0@}fxEvF9USs(35<*WBEap1`5||*nKU*}YrM*Ea7|o)L-z+ktbJiXNXVbo z){DMWw7iSksGTJ z*^a(hSa)%*B6azAXp$IO>oMp6H>qy@Q2qBW@V~#D=>Kcah~{m56`gw)4eeRwpIxbU z;s1>3+)caC%Yy#7N&UOa{|6DeM%e=PEoEkoUVfeGmp1@QUA*1Vw`6+%ZVmtY4~6-A zpJA3e7V9#_2Hx2Xj2ft#lJ#&s{>zJ!WNJ(2safb~9HG4Q$FrX6Z>0vg`DdN|;8n%{ z$&1>A0o)`#CUUmTpBzkk0Fvp%(@PA@GsY}$YEB8IE= z1qH2-V!%v^S+6H?aG?$a@-+SiFlJV{E(_9a(Xuez`@xv+FODBL8C~b;wF7?Sv%Jrp z=^Q<3PuNIa$V>9-R=I+iu@;Y4aa1(>2CB5SBHU`SCNsi*zxHH z7|j3RYTW>W_R?7CR~Qq3Vh^B^lLNX32#3Y4Tr2HxCfTsN&YOgn={DaU6T=RGPb<;3 zFkI~=B`?1N*Z~;t-9Q3Eus_>BI~y1Sa*qNgE8VOe_oeWD-1j?WyAcQ}-o4psiWU~x z{DzJ8)F#HpBVT2UM+$R*1cgs0sg&mV+R_qQ!WS?JgQC6MX=81?T-TnrvBYw8z+uHT z5$0;^<0q$N#KbewKG(pCZEYw&TP<(hVYzR(!sT*KGM7GCU?KtzOW;7r!pfSx1481( zk;33lpDZ6foDU>Uho17!uZwIb48c>bFK6W~VPHteNWP&{91a%RVVxef;S)Y2f@x1J z2}NJ0|L!^if(e7>;k{IfkLh3*m_;>kcwO>4IJO;ZOcvWO;KM6@E-PJI+YT8ZO3KR6 z()O_f0%t`@7(6`Lz%rA>G^8f{3k^H4ShV4*2D7jv-5E%#e-baa2i+?oS)+wr3RqEQo)eHxj5S z#a4xH-+Dgnkk_4j2oDK?~Ou_~1S(cW;pwJNFr?h_P zJ%95Cm*G{{7rMI=W3Xp-=V<2P)0BaY*x2Z3wq`L8u5uB1G-S$wiDSIrb*tXAnF<%2 z2aMhC8GHa-mDyYD9`EU~+nLV+@W8Y?We=F%(0REYtT)7#>Q+}75%*6%trMFFc85AVx-jm;Qjjn zC|4BXF+k3qDV{=%1n)=iQ7gEHx4feX5X1I1^l`Fb)HB5h-;1_ct)r!#KfC52`7oQ1 z_+>d71}igK4&pKh`d88Oo=P}x(u1@Cg1Q}+dcNNG=K)wbSFIDal+S#!f@r$TPe3uJ zVE8bAf`}~W$0MBU4<6AYuQH@yeoP^p6u`ZgN{4{`u20S!g&)j&r5by&}^7^xXv!RX;8KFEg6dLB?EjKC)(<*w;Z+m}FQc%HcmYVUioHQB;Yd`7;|da@R*H=v#@D=oF7F7~>3Tjf!$TkXjt z^Bl5SSrrSopiS$Ldd@{ggw&~WmwB!N*XZd{@O)cb(&zJ#$p%~MY6u56ov47A6D~-A z>1=Lx-k!~@^q>K(kRKuj$~@0ln)2HdL?F3B8l4W+1#_pvQ^<>h0UZR|HeR@_4h7E6 zk|-)Fs;QBm@4^5{!bJm#WSk76q*%=RccVXpHDNRtdjk&uf32i9&_mVhgE zy?(SH3f|NfKoSM0SOyXIk)ph`bfWx#9%g-~GT&!+TLGW7pKs%3XO~7?UcPtF;wmdY z`TM&aMR9BTk&uzCjg?Xvw&{unrMSCSFrZ!gyMy8<3q%>@XSCgiAo#*xzi)8o$2|DX zO}f%YD3_|vRjctKexi!egNcif{-HOU-v<3zW+%G)I)!s6m>lmZIZ3^1@RovkTo~=$ z0e~n6ax}H8+*Mg3h0IkhYJL3U@4s_lXV3gMKz0xT#<^UoyEsGrX>kgd%=6JA%b!I> zKwdci6Pir54L?}WpCnHnS-Nw=H>54O4z)%}33JM94lb2r*-5z(U z1j_~BkI67H$UHyozJ8f;XY1$))`}CbBA0IWRD)k-)p&V3z0och?t4l=mP(3DHT;fF zDlRdxCsX;vb*}=pPCwkEE%>-0YzbVE;VS~yNdNHg@S>sznJSmIxIiwpUkDo*C z8OzCGH-;JsoC%B?3EWj#ue<9(nGh9)ap8aE@QJ=0kJ|4BR)di1O8&MVH;zI~uiZv+ z^&lCqlOaN=gh@||S{Mz|9JNP=WnFf-9+K1{CMN%e0zT#`s9;asIrT=4I2jK(V z4JFj_6^|pm!(gmwO7tNv&Sk!>bepaK;1@z{UpNvg9WDolP!3d8;RzAjPy;g+Ma1N{ zw>s>xJsSuc-hD(v6YFNug4Bh?l%>3pp(TZtndd;*%YHjl_`h5L2u`GxI86WX zqnu(!%;ELQ;AHO8mY-U0-n8{)R)Y!Vz}`neGi2xIaR8B^;%&0ka&~?Is4}v7eBAO+ zlRH#p~ zj;g~6?bgQ{_zfTadOcj%-o6L4$s^C!xoD}gE9l2Y#>UVrhbula#^uw+J$JHL83Etb z*;Dd~oj_pPs>cA363L>V3URIO9ei~N@SVcffASn*h+^}^Nv7Z;WK0eSU=ARnI5`YH z6Q3ozlC4CB(p7sfp3D}~7kSTXnfOZ59SU@NLWh8zgciNnchZlbmTZldw}6p(^<>=4dG)&a}8F2AF zo$XIUL!8kt3}InJ8`%QRVDND1Y(Z&eo;pV7K#^Vi6TNeCumLPPikar-4Dh-B$z@?= z)WX*m&AC88I|ke_U;eP5pvxn*acJl;34aLE(%`ZJI#;RZ*)=2^Tn8{&VavE#-vxWz z)Q$0U>2NxnvsHiN?wV;?f#7rf@#?<`= z-(3wkyO`K>$sq{BAz@uRHKjUDn1NSlYZy%E`vBzk&*`S*5%;!+6v6aJ56aDZVLaNS^v zAR~MHBSx6a!jPMtEJ(rqwBek_F3?+*Bd9))GnY0c%C629#dLvD-PM7?fyrId?^i8P zkJ??FupD|{drE#`j(QIxM}TJ3D;>x8Y03c!2e*^)GG7??qwnq=egq>}KIhFEaD(<- zOA&Cx!NCDF&Fj~%JaL3##-1)OWeFKU}&fW8b+{< z<c}nbRY+Y1iN8vRR1)41qw^(zi_azJ3im_CuBs8mD(2rq&Gaw zd${LMh?Gk;?@i-|6qWO}Vl!C9&)K4KG<@Y!N2r8fdme3*N>$q5gm*zH=?1@hm{R3BorI4m5x0bwC}yyZc7mVL9U&TOYAi=GKmeukSdh%)>)Nd6WK5 zPFL>la>_kLOnII;)Ro$k1N9+Z#QHybVVAu}#tKkt!Knp#lgi+Uz6*dc*h7(Vzl-73 zRn^D3f>r~VMH*j<>4Vz=M6ec2{ZiQ45QOdYZxOw}lFK3M)Psk}CaC8_hIr75teFhE zzG{Hs^(N1qR{FObZ_!FzHe zzT>zupdb+U-ThBfc+z*xV*S;jZerFjI#HWuUz}L*Q@{Os=r07jfne#9RrLyqywMbW z7rV(8E;?F4(=X~=^P=nUJ;4<`U!3={01Q(-tp;=9Xb-28Is&8+nt0&GEF5$s6x%=+ zEL5p`dzL6dSXw6aexcw`EsJOe`(n7;{>}~_VpH}~`Jwz>m=A>< z@G9vcQ5bymfqH~KDHR7ON1=rX#HQS_n^l}?43$QZl9OAH{4#~>9msv&K-$I@F4&l;^5%mKBCe!y4?Nf547j1&f2ih$O->Ct&Irz z=|fZETJDN#Gnd|}?DUoe14c8aX9tC_n?qh&j8UF$b?NJ2xpuF#<=+b(+90`rC| zM?vJH%L(r$A9v1lOX?N0B=mP|Pn1zadJ#ioQc;BaF3uDNsE7(?H0{+$fkeZdKpPY+IPNn#q};r+2}z}84omRKZO<-!NNwfS zDT9RJKN~uZn&NG4Z%G)r-EqqWWNDw;Fa zcFzse`>HBjCScXGlLWo7SoBy%dieI)<7G+7n8mZ8G7OUit{-9w!(`6heg|ZkM>nyF zknT;|oD2aD6+Ga`O@0do(8km^GzJLEdNw;R<%S(++6?3pof^^cVM|0ttX%cgJ<10_A zpU9oxV0yrp2JV?~dFoa)yNr{n(T&&Djn&+f;^26gsS;CagXZ0d*{E^D(w;N>FzOBC z4XSHJ{bmCHfSW^XNG;3cD_g za1!U3$}QZ)$mAKx-1_?Y;ui7w&NJqL<38Wx@6u>mco5h8((zvPhH>XHgk9V=>BOVE zllJ4sv%BPi7vV`4;o@7dN&a{=5S|4gs#3;dhsEX?v?9iDY@Xddf9g9^GB!4L`1`k1 zu@&q+Zk=8WviNIGZ{FA(?6Md1J=oi}?6X<@_#Do`Y?Ul=eSL7zfLI>)onExVo(y!o z2ajI7Aj7Dcyy}3qIy0l`i6H<*wMdP+e2V4saz}SLG0uSj^Sk#}r~GferG3F>l}L{Y za37szV8~X9d7z~>Ci;+bwn%7C8N{+X_SJKX7Eh8#)yrC;clXpc*lBH|>F4VMEA8dMgQJ6tEHE%M zxVOJ|ZK!IzYFvC}@ZiXXRb4wI1ecsQeq&M3>#Q;Kgn$+UODIXoWFVabw-G$tj+TgJ zWpU~DGykAfVRm62Cm<0aK+5($s5|KXBAPq9T{|71nV2FNi^yzTGp*h)ebmfBa*Jq? zR3uC}NQse`0sBrwtmjNOuQL|kwL_0?!5pPb4L`p=L4N(0j@{Ff!9hWX5l`Jmd8K9p z!y}LItvO%hnh$Vw)s0oS4f4Rq!n$0d{<8-bbWTqQ>nILRat{E(yLNF{zrsR(@F;EJD_aUDk-yzBfFaRM01MGznt?~@l;Ke)1@J;be zBhpjmZf#S^60vCH;sKh8B7EK~Z&*iC-1#i%hLXlR(p!(%WjSs=sQzmSUxCgcVQkt` zjW=3+nl-Rz%iY3L*!CwE2m5}#@JMpy52tNtY}`SQr0{e39ASHU*i!2Q@mRvMA}?&2 ze>`B620lZ!O6K8i`N2Asz@cn=AtM~e{9h)W!10hm8H`;ti`Se#MRINt_OLZ*B%`pOvu(HBwZ&9|2;|i2QZyhUcFc?9fBA40W!F zA`g?i&*N(}t6r3nK{KMs_qxhWoOrFRL!Li)Fbl7M{o<1%yuC8(qzU7+LOD5k_yk5v zEyBe(uhj2ujHc(NvodI@sO-*jYm&;%Ek@L9YbBb+?|)z6ciL|Q-VI=F_{1OHnq%d6 z75f0428V2`+I{&a;Oen~))z)EA7lo|Nt2T|Ur4^=8?dts5LKeKy>ELWsH{;F9mD9t zuM~458XFij_<+jka<#%(e`vVBmI8DfKDzUA2dQ9M8f6J!R$bZaJ}IY!U)R zXm`@_3BHH;fh?%~De02DCzc-GG#ncmRFh{ch1*OTz+`Qw(V<9K7$|{^5gBHY-bI!g zd#k;?w{DR#yn1DN*!0JUmUbP^z8jX0cZ?N$5=2(^v@Znsf0$^8-|S`KjQ(?mPQZvl z-hXG&pH*tJrR0D{O+5zNpIyfoCUEK5GD@E)76ao<4)i4qPY!}jEV z#xQltJ-`0=k?~j$`dNQ}yqm8q4ey$)pALS~fN6n+=F6kL9Y-f8aPkNLq2*;O_2QB7 zb|D7-h_ppAhFY*ml)|Td0SxaiRh?x*UI7g$-)3JKGR?#!bDy4365JHN%J3~ayWDY4 z4(xJ3!r*6&eCKl&9o=<*eMQgOTDx4haR|~X07L}BWtS=`+U95aT}-$>nmQF_MStf% zNWJ&5jzos|spk^f^Gw2YB`v9^obrLlFp^Z*idE!(=LZ-v9AjGJG@@0LGu^)r7L>}p z8fC7o6f>*9%6Jc2i)U;P5JJ~+znd9+(0%qLHMPIWLvt@N1(Dp=_8JKk4nbjoX>!8c zV`&g^V-Zk_zS<0zCu>jQx3mK`;Bw&#(d8_5X}kbfGi7)Q@mR&XIHpA=8=mOs^`0Il zn{NKNv=D?*WOdf~w`)L}AqSsY0$R(%`hzo}+YmSQNyAjCnhIn)bVw9)>?ACmy4Ur{(8UR;${TUiuD0AD&2u! zN;sWgeWHObiE(IfnV^&*@D9Q79Xm5h{T6F#!?$lAIocwVM%ksRV>$k?HpqNaG3+p@ zBf1J(tOf47lLDu@;;n1`80|^7v%md{+DMcz+Ww8Xv+#Pd)M6y$C1M8FLD&pj|H$V0 z&1Nq$mU;^P@7(?KJM7V|N8J^w<%ARreK{5;?U=Lz0tJ_2x1g{o#BhPr#nSBsgPCde z_(lr4yPhe))_4&UgD?zAgEa-+LL)bTa`JQAQpIaFZ{9>b`qk&3X68Cz-3tmLprCCv z=Mz&iTtqKl$ORBVLV#zmT&l+5i2!LUV@UDZkkIDI71#;kQUgtKS4a|jkbsEDf||Uf z!_qb+K@&CRY3721i|tq^F)N@Oo3hrUX%5eycMs5r6Cnlb6Ga`;v`2-3CIy>g@uf0# zcDCX-iK>c{fJKLdlSr{iXA&_=quBhVl2Vz=if}vxt)zD(t_&qtT7UH`-(Q{KRQ4c4 zQ%U#IQT|AOu7HtuNn-hn$2W=HMub#>uo~M(sdcytoTey3My}`i0m=+7WYkGnAni=Q zUw3yyTkQOxgRHiFjS9q#PQQ7lN-Pd^U@i;9b4Kdtc3FUeBud&lo}bFtm4exvxV{q> z9?e9R%ZAW8ZS@!-1M>527sA%c z9oI#z_uFFc@LKziD?C=15#9EbVk=44z7${kItB z5M&gvTiO2v{eH3Ku=DC+i;R3sjMTIg#L&+h8$*`}7-nN(_R%Z%`glN{kj@)#?*obm zT38S#fAcFQwBmr$LH$JnfFOB zvr)8k*zQ{b>b>c;xYLbVX$Ag9#UzP#=kr85($g1BMlWLsw@;6D`Yi^V8XNM|%SzNb z*AM9Yimh$}C+9)ngY8|j*Tyem?$JM!l2=Ug=l9&>Q1jrDq#ta%!^G5ER#ccD5fKvu z!8(WIu2Ia)%*RKaWzAVwf-(P!~7vJYv9R@^t1) z3a~*iV1o_E?sa*bD$t2llULCk9?Wsx8X5WQaM$l#P$^Xj#=N|)zZD7FJ2%_>7wEWLFNy4XVa&gUn@rfLExf313 zgXb!(G0D5ty;iU({cdUiwk%}6Fo5A_JkCHQbt(6E%xp>eE2Y;s%__fr*;7E^(ratgm9e2_qUZ6tTJgAg^bd{lbf(ql6 zHKBB3i4CW@g;$Y-ie^svK$&HsGEfT~`pOCiDsBG07()m|XRiLhK+cb!or@~;dIzyZ zFYlbq_WG3{Ot`JTYr5;wbY=6yU;ay>)xF#NxJOB*LA9DMv`YSKHlbtNA^-~A>qT-TsW78|t-x0qf9j@#0} zgu^t-HiC%87pedF@lq8!77=pq#^Yk1?x|!3Tmvx&+>1>ge%G=xsho46>Mwe)#`pl) z7pl&IlzVokUW1eU>o|B-?sHi%ZP_^-FMD`$a=eV=8}W%z^3!R4^F4?&^U^GSo00)+ z+=RGzKY!n)Wo&5RC6n&<4i7IuKH{j;dP+t$kc{>9V;4JgK7X!~lw^!(p6o0(3AX~R zJR%uf#0|H$G$yZxP)N4*^}X85v*?%4vM@I=aJ`0w`JUO##DZ!x?;tjqysuv#QkSou zo}HeZi8+_7tgJW%EmDw+JgFi7eq`xU>w^VmZBUaC5a2NIIsPc#=q-n$m+Zw0)yZGt0F`O=nv&~P$bLjRI69m=$P6NO6x@{-6Gsn zcoK5|-McgovAKemw_yay*9cpjq|IM?X+l96AuriVw+2!1JFYISetsDKz8EJbN6X7g z6AB6^+u3tY>knHd=f_`%1ZsLC*iy%EM6|OprYuDba zQp^u0*C*G@QuyWn_@Q2{4{-3;hqxkw0upZ)n-`rP?u9Lx8JW3EO{en4dT5_ykeNLI zad)J$5}5dl`}xZ_!E`+2?~V(6voS5Nru37Kk!P)HH;C#pS_`gk@>b`n^0u_MbMo>M zVB@Zm_I`!$8Dhi12%%|4F)BJ{9JH(>BW3m~DzS?hKe`B`evKV>*$y8bOdu?sv!2hm>;-Zp4nh>bqJWro4#l@`>YB|2Yja=+HuLd3&Qv6|$ z;LLFH{aT-QK|z05Mt=?8gbcit{WWb)4o;kHoJCfC5l`F?FC^k?M~8>O4?KNBK^1lu zbXEjXS9fuss#4`L*z6USo`sc>^(E&s>T?W_TC>^lMowG%6X-x9*O~8=Q*L6nyuw2; zFx_WDecax*qv7ei_iD4u=bsY+RYpZh2t9(1E-57BNqjO));x*7vb?2auF1QR(7NSZ z!Qg|1Pbc=fwN+V7?cg!XcZhPnjO_kgy&u?M@Qz+b@We7<2t!o#JMl>X3mRI_BX9nP zaN58B$MO3TeeddNiXPdbT41{aL@|OtDwqOW8X8(!Tj%kT$Wc-PWPpQBo1wx{B)#3< z?AaZ;zc5I1S?OQ?NYKH{ph!Ts7o`qL0l!xGuP?i=b@JmXIYU&UU2%ohDGLn|S{|YM zU5v}yccsD8E%W2ncU-jL4;!7x6lk1QObT0cf8ZrTwkI`HdKY6$*g}jh7(ghz#V8@I z#50>3wF$ZWhs(hf`c~QhG856z&haka!##_){5Ai6ZHdhcf9TTC!{xjD`@MuZX&WzK zZsbwCxLBaG{&yRV>x}`m;gjC!K9>|rQ|^D6z5hKKtU?W(H*f#(Ax)L(ul)N1+-dWL z_kSxC{#>JZ<;K7J{SV3X@rSQm}|4^h+_^O5)ea9hzT zNJYDl`0&n$B3C$kC`uYHSJD^KTEQ+}U@!wFTUbK@Zv&oP81wS|{P*+UBf#$r|D%|c_oQpoau^lL2b3|<*mJieRs;x4+(Ay2)LX4wxP4;eS42S;!%fo z$?jkkx?HN=DwZMA2c3ZCj^nJl#OV2LgTpQ>Z85l9%{r^lL4wZYhj$$p_wUjogs0-f z=B|!=J!6S%j}sbi>3+-nxLrFcHrPx3s8>y%+)ni3@Y{q=9L!KT6e2vhNK30%df5Ji>xGOH}z=)V03RK4So!%L~4IZu=6AJCEodmd> z;Y-~L^na~KD%PI<8UFyhrf0Do&#CcQr`qnsC&Q@YChE-_XF&z+k~c3a53;h%QH0^? z^)p*nPu(3b-?;`t@yowVK~}f0LxfE9n(smL_M-bg3(bl_S(%v1B73B)46t8h@9t4> zEIIFCT~jL#gNllZ``&SAN5rR;uVM{J662K?nymaO8IT7~jCxxQdKV8&>G6d_JV= zE~(2CdmHzw&cv(s&}!*t5^>xH;Te15{Byzy)6 zZ3epY!$ig4{nA3SPwF%@xk{Nm68W8X*%P?l*i6B-k>ify%h`eSH#2nNf@$XU$J(I<-q6^+A~QrW!DH z|H}w48sXZ#;lu!9Y5ix99uX#>VPRn!gtRu0f<`!RmJe9cR1jzVss%KkkjKL|o0@7A z%L`Ic9Yc!7ni{?H(^84gVa7*5O#r4qdu^>gfJAT>uJ!}H=MBJ8;4rx|cu@rtN=U!9 zpEm)^a>FrTumY2mg0d*GmGtGy1GuLe5O9CRLr%jlrQZjWUY&!3tatBvoEI{#?|iUf9cClRaD`yQ!lz3`IKSR0-Dv-%-CRoA2N0b5_f zot@i~x)8aoMMKj;AoZPt&Doo9+D3HJvpghi34F{6G4kImAw4|0O_Dr#qW{2{2n#o0 z@8Do+%Xx3_1LQn6G$p-nnN?162d(!v2QWX8AN>AO%6ej9H4tb8s;a7kx#Obt^VDu6 z-+`WRa&mHumDPG^6RZ5ya-SkK4UJGXWdDIBclpK(9!L%KFd#xg4ivbd2@45Dw~_*N zP2BO6oea#tK#UAX?VL>jM4WB`$!b;F)&T@X$TNRny&^RcQ$Gb^fNerZA?qABLbpQXIs>OWIxXNphj zXN{o`;L#QX;_|oL+;t#BKoJGXT3vU3x9*fYpkEI~*38*G3=LAIi^}EE%|u=LE1+33 z9i9x@#S-Tk8;`G0_p<}Ff2ayvC|0&x;~l_dh9d}xppkI@rTm~IIN07&d%UIh`trsh zah`T(nNzjq;9|y88m!;@p-aOa?bcKu)|sW;zSGM*kBd7{;UGn3WRy^tg>YB6-^#aF zNpB7a!z7@Ev?sb?shhNvDZ}4jf73n>HuNsl;%NlT)q1punBkQkJy7v)FOgWxs30SEww24#jJYTwmW zm3I&ff{-+ih2;iJQ}8N9{m|kW%z7Cd9!?P6^p!2Bb?*4kS-aBptmWpp8)((0Qe<|@ z97C%d*ZhuGWN5<|Ha6Uj>=+w|z=Z?I;!CV(Oeig_#QOUBT&>6M8gN2DKf3~>GGHEX zME?OIAD4z8tRlCC4k_?90Cy1tBQrC!JF7!mtZqwWfxG>zWQMD=v!W&)Z9jex3SVJC zFtV`)+!X_K)!Mofz-uPd^o(LYom~1;8X_dTKjTgU#hE2In_YqL&HQ-VpY8?B2|h4` zE8<{|=I-BGbk7Tq+sFV*M=%t^$H7r}Qt`)ai}jy$#v0cdR|&_qR0|zF;#;!*MQ#0U z$rFQths4mRTMaRToVqSZLOOVXg4^)tg;Da%=iipea z6Ue^v;o-FXuqOfMV@!((`C7zy`uaW^CkF=@e!~ba@e>Vy_?BT#0~1@tXn*6VvoA$-NbO{Zapy!oma0kHIB9 zDk=&d|Dmy;zLpm4!Ec}su1e$G6u1Yz6!w~z=cXk(oSP1tHWyO~M!jk7Z3{c>L1Iql zDacHczz1TKhC?b**bK~I0(LXgzkF1rHRkEXF8KQ2f8OUSA3G}m?ngb{-Da*L?e=Sp z3gVgxf4_X``-PkNs`KO4xz<>G8nJ*i8Q{!^@UM5( zq8qL*4PRk+bK>}Oph6j$Oxvi=mHUhrPDxPz=6?U~`mo*HU2?L%{yt+wqNwf9+}w`w z@yeE%Cw}_CyQJ{r7Zfyz?GlWPdebyM4#I^S7*jJdpAr((w6%AB&7`uKPgeN=)&-mt zjqoqZaIV5ih0i-6n5qmMG>3+&u3bx+cb}}C*)lLZ38mnFb9zX?9wh0wiczjbPY8i9 zAo`$|@`Qwk+WLC!Gl%5@{SZ7{T)sw-*)89G1|~Ly=7YJP%09};tc|Cy5EXe(Jl&gfZ1ItzTtb91dcYtenRh8KNm6l3&Igh@>sgXyuZa2~UUR zwK3jmKq1`CVO%{~?s+y3SLgWnIH1N$YiqY+IhB-@erb49dG)3X;R(n*UyhfT`}6Dg zCj=yIIg14b4!#m_k&`oj^$L}jcK|yI72P}In(x1VuMiQ@pkF=x(+c?M!*s=@>-hMt zBRBOZ-mDC)?e2zYmpvFSjSS&`m=S0t1l1CR7&xv|-=w7_qZ&<@kIjIzh4>F2j#ni` zB|blW{n{Eu2v+ASI*yLQClgIg!JP}b<&O6uCE?pQxO6~1I$jq2EmvX1zFY2`zcK#A zNU>0i!Q_H*tipv;K!8z9OyJI)xtm1LyBy}}ZwT@Yl%Tt`6BSy5?9Uetu4>J#-sTeh zDSZYantIdtr;i_>8LsS`SgXSBZP3qaTMtiy1(U5VK@SljkJciZQ2$l)vk^Fg&yM$B zTzvc#8T%M zIS@~kl$XcH#Z8nsXtMM!o3z4aa2wa~_3LjsuPiN%3=B^HN;4$r3%@MT(9=U}9O~}Y z{}UCChc~Jp;`8n*6>ALzlcuJ4NWPdJ>Y0_5j*E+ny80tCvzwRRc(*VyF(qf1`EUz7 zPC6Qb7n&OIZaw~x^6UPzU8w|Z9xNre7O)6t!JX~|EKFp>Jxw|iT{_n>wKX+Gpjvx- z54@w^RC{^=GvaT8wWr>R1Tn_cUp-JBykcUy9}>8^*#%cm2JaFGf^RSNFE+M8%xRCH zrM~{wEUq5NqakQ0`_2igpZ-T6r}3)uiSSr0_I}R2Y~3riph_!ENtxbI`_A}SiMb~) zJKNg57hEjDxG&tDd65|RgviIKed!OE)-}n0d@jI8ROU7}|YdoL#{kR_^%i{CN z%ecqlyDdQB!Ecr|=kVU9xEJewTyk>0W98-CqX#Pt18f*tT2`UJhQBEq1$}1 z?CD8KP35?MKiq?{r_Zz*ae8uMT`|t@q%inHr6u=#Da{6|wTp{duzp*yfb}I-2_r(v z{_oFkfY3!qY1JIUa!^p<0Ug}ncz>7m-ja>5Ff|aonzJ{ix-v5}!O)3<-%&+AE2i+1yE1B;4p zm6W{Zes7EToyaBd9K(AH2#_Eo)UmB_pQ;s8y+6rpRbHeyu4OWH_h7~N1-cA7TG9ha5fK5O$FW!`t+%4r3AV!SOnoCnZEuB;F+(P zq9K9CsB1&mZsGHwGmNyr1qiI&<02vk{-n@y#JgW!h|RWm4LhTH@h;&@4(+Eul9R1q z0g&x;+W305KXgInimu^O0YM)i?gPp(JB&UCXZg;^1Ei%ZR@c|b38wR2dMC5rh)ZAg z_b+<>E!ApD=-Q263MA1{QB_7=Li;j9$RbVYZ-u~@4=3lWJhnkWI#xvH7Mo|4dMIct zM21NO<*Y>W>r-^}vb77XN6+fbmFvcM1OuP5vbKkN7=}!F3JP%sUJM7K1wT7c$dt)^ zlNHOGVc2ocT+qCu3omZs#q6PZYesa>=!;os-#^knAPP1$GlM7_Q{_RX@wo+a+%=XY zNBfQ+VH3~57;E0PgZOkD1ygP%Gvq$JkNFcUv^bgH*W~YBcg^Gf&Vz>no6yc0Id@Wx zGGt_P2ULHjyR00?tEv|nRu2F1*4h&^<&rBIR7Ju#7>WgR!#`oXN}J-@Uk5!CUQ<>{ zL*}R*oryYNUuatg-Y$1h(A85Us%!iQCE}u?<;>R|A?Q(G@a9F(*P}i`JtndLhYkKu z)@*?-{FM@Az>_5T_VT7^CA}yT-mmra0epsn54{jHp*k!Qs4o|jhEmskbiHX@zU|C_GT-$c zysGi#-w{ILcmEC;*cZd&{|D>@!1_7FQ<^MrBJ)5K=p8?%pypO9nC^77_#dX~x-H=pGD}U5ez+=nN7yT$&XIBlG z&fW|lK7^LN{BRSbpG3iPpjVryGO2KJArU7;_aX2d)JB`U@qfWiAM~SvS7jTORTW{U z)-uULHP_v1D-Y@1h(9Bd2dh@AFYkYb8rnSTOjYa#TJe+ryqHnPXIQ9m+93b19M>;h zE|FtCN}668_UY5H!|m{7eP|$9DX#;`dD!45>U)<47ZdnU1od)( zIO`ehIdsV|SweuzgGyhI< z6Eylr-l{6b#A@Yxv}~l#%qR-{z7H*hQ2gVDfhLvQSK}`$cN^Q1L*BnYR^;S_vPZ`X3{ko=-`|823kaeh7wZc314+Oo zcYu)i*zUl6d@BVqMAz0-I>ysrkIH^;C)<%$eRlRURTnl&dAfkj@lq4*O8_7t+P=F+ zEmrLGPzG_R!`Yq-+OJkRH;~D_uLjh?@6=K5Guz7={pG^E z)0>FMi1_OxtY}}>6M&Wx^Qf+>vhpmU#=IZXSGi!OirdW7vSAX-H;&J4bfJTCVtll2 z^e4QX`h+X0-fABb5BMH({pu@f1Php*9UQ61H%4`sG#Y{$9v&W$aK?RyOP15jQ*8)d zoo0>eWNj2!(I!+#md4Z_YzW(~Jyv_GpYh=ZX=lP=lMy)pA4PUa{He-}{Z5XyT)dnf zJ*Qb8r|;s}?Y@s?kxSSn7d7q+m;xeQ@?Z^6PM`2SLB=D$#{#YlkLqr!E6&#d?^hj| zYmEZ6eP?Y3<6AK0(A2yb%;5(fu2!L;q$Gxx7PZgQtwNeo%;w>ViLl1M#XoRr($f4O zOdDE5W>(Y!Rec2tM81R0uaafC>Ngja&#*#Li!BxR_Vx%wE3azo>E}N5Cm2I_<$u7( z%bF*7m^+oH3`Uy$W?KDV$EC7886roYe2yBYpS zt-TG3A8G0^{H?<##Od)dizb`XWdq%i)%aHvWaHmZ3U-0VjA%5Ukujw|!+i2$)qt;<;VDP=&~x#0F#$S=t`=LPgoPX*dQMd0u~z=u46~kI z9k=D`xa(hCBWPgja&Z2+nfze_8jk&SRo;f%H!~IF%c3G@1Mmv+*&ut^%;st+!4nu0 z7q?PZRh1dF+!#|968WLMV+*xA~#Gk`4Y_Q(U>y|@C^ZF}ogf7YqT&l80t3~4j@Th)yFX5EOjMqgY}PjhzQauEl#hTd0VdHB0RgvJT7Gxu zyA3VD@S6Yfeb-loirQMujGzymwL+U0n_{J%hBvUDs$Hu~z4V3Lrz8Ovqz5%Qd4YCA zHLB*VOHM>0(}gbA%->7xEh!3(ku;Y90$_W7w^t`4?8{x*6r%eow{UeC}PWQ=ahi(y%t%G=CO z@jF}>{yy?c_4TgtZ2BY4blH)UmKzo7+v|tShiem4bBQf`D#=X;t5y1ctNl3_V^~fD zpytyBSaGpa>&Rit0%kFfv> zqDIqSYe<~>l$Xcb*bQ?RP>xvHYQLBIDr`F^g^$l0NncoGcX?(f7c3zRGx$}|jzWej z*n&|DI4j#VVi7k-(pT6mZv1Twtf(quWhHBANtSy4{9tdbJ6kCf+&~l+2b;sZ^06Rh zumAgF42(d~v5D$^TlL0fL;LR;nofX_Yl-CFLg(J{mQ>KLdk9F9~*lg_zUgr zV<2jS4wC?20cy|30WGuO!HV)`92|^E_Ba5t7WAm_ddrH7!M1_dY7(q2yRy%3q002; z*{2vaG4jb}lHsP}w1mw;9)gKFLPxW^biZ(5our+l3!NVh+xO<=mx@#2(IkwwU?&{ z!4Ylx2|QNvjB~h+x5I_m@0MygEB^-i3gZfO1!%DOn&Vn#??51gGCi9oH-Op=qJb1h-OiZSUkNx6@x{L&iu` z&yQ%uSVyg1Y!aAB5>qSveeImMc5u`Wr!KWl57tLENdbR3Kbpk{I?M6#b#xK?<=%VX z!qWC>8Jf-M`U^}NhpV@V`|Rqyhqb)U@o2z(fa1=C%T(<(^Q%Dqt2Q0L2095Wls-=h zZViC;bHxuI+_OPW=QZE92^w#}2eEvYdhb0E5HMdG4lkxHE-28f*x?5)#LSE?i&Dnx zj3C%G!l*ChMH3{I^_iri5 zKr?M^f;)FgZ0F^Q3_D(BzBxJh85Fbyit_?J;Zzd}z1vh&g9Um=1$x^shxvt&lyu_Z zV4xv%xcSD=RH^^&e@C??cx}D90Ah4_g3| zuc&+i4g|WPAY7M<1eZ@D5dw(Zg5v_e40@S4TXB7TlxL>U<=OlGey(o{TMgEs7@-mhw7)on#zl`m>i z6Q?g8k|rRLnCR{uB_vQREB;V-*s&J{W9wSg${^qld{D!r0Xsrpdef{dty&B+XiO=s2^z%%_|rnj+|zwXMA9wr3WLjIxX>CAwC3 zTMzmSGpj1+=N4%EpTBrMpwW<>l|8ZrEK7W7@DKqo8|38XHW|vjBWnE9e;Y2!D#vwl z9`m^`B8@PS@%Q(~r54)TTjm6kj*d>sN=j)2YUv*3 z$O8ETa)^<_Z{TCGF~RQ$F9Fi?;F|1Aq#M~mT+ZgXRi&3et%M%vo>+6^->4Tg*%-7|{B; zZ66KoKQ2I+fZM@s**?9NT55vnI)~K*IAnO_L}kv~v8APhed)6DEes^s0K^5{ywg** zi58M7bhhQ8p)tW)tIVb^r4Gje!ryW=($Z3&)Woz_LYI6d*)SCvLkCOFJQ>NBi-3|5 zS&ol1V%9YnM&z(VS!}|Foa$nS<*VKPoiSuxih=Zf`>&bU+fDxLJiMGa+2C}>j0hm- z`f}-0=jg?;oOY9H<94LGqwjEMJsQm$C8gwO2Ua?|D33eg!Z!OW+#QRzAkWERb9COZ zH<7$(;ZGcQ#+T`aui*^#VH<0!vpE?VN{X5nk$h);mFz`EBf`ZAPVIuiCW2F%;HZwIjpIc@k>RHzsmV~P-%Q!c}FZFhH< zTbTR6trG4=>2JO8l?Tz!E7WTZ+QF2yYW(!O?KRurZqZnhP zrLpmFt;hXFHW55odQk|y2 zy5r~%0k*Ue?&teX?Xg~J3JNC_i%d`gZY5vSg9fig{0S6mi4k2`?|<`;vhjYGtsaI4su0VBukv=CjFFB(zOl zapy3(swBDSS3tZ$pMlbk4hp5}Ij4Q6ZtrY;n+0zU3|IRHhJ-E1fERrG<|5d-+6|*PZxj3bO!uDd9DTG~t=@urCE({?&HCKZ_^9^jT zD=l=d*bEU65D~(TY8LW!#84w@`(<0O)VH^{f0_KUJBwV;9LU?+ciY-3hq}A#S*pE+ z-Hx^(@ECK?_$-(+p zN?yxEK0BC%T!|cE9b;qXOHW6K z{V9y3m>4ki0Jc^n*xs?o4}}w)>~__GwYbucBOaJEK^_uZRF@}a)cSQ$&TC=N09?&1K8q&3S7Z}Jd`W^U07w6{t(Fd^qgKaFXUvD2L+|Sgcq|XT; zsnr?sJl)Tv*DKj9hdN==(a`8~j(%F-f+*V0j)j&=Ls|LzTW6?>pu+;6H`qB~Bu$7O zoFuUHyR9umCk}`XkU7og7Bi^#5iSt$$8ha6SV%Uz+{iiqx+Tm~rz)GbvRqY+4F%cW zQo-lX<4~J}HJ#)$``f%5eqc1{c{qW+FRsbV)PaNwYJwm914e*T18xY##pIq_|@ z{>}n-{9hRuL@$UQ_{gkrl2Gt_o;}mi>4B(ku!iDy#HEJks=F91({0LPz(KWQvNQE( z4<9wN1<^w|{dwU+SxMblvG&Ed4Y5!?*5E?k*eD8ADo6!z+4y-6)c#okkuyY+7=hQd z+%?q|Ru)%hmq!3Wv0cyhRUIxCkwE0?5@Nk!fC?S&G`Z28)|D4FCqYmCUfI@-W8lxFkvaoC) zR2d}VAQCan0m4^)zSK7bc3e)kgT<~7TTyZh+s9`QUZ=xQH&F)x1#*6V%Pvn5eqd2i zQ4f+|HM^)l@l4gM#Mr^d@{`L>l44xy60nJ&ywnXvL0y;b2Vh?Z(f0jOkIdGUiVSZC za$1aLR95<85ewCN@MF=;&CWt>ODfBk_(w&2bqbmGc4m1hG^dHzPZ4#^Elq5HfXV@} zw)E1ju8v?ZdQi3b0ZQ9paN_6e1om#VY<{zsNS`+D){7Lzkh?+9@m>rUK6=8mb7~b6 zy!VbNgjPCIERtTD2wj8#T>>ta`!ADTRwRs;$>lZSkO{aem#?i_$-fW4yh%0eHJXtu zb7rirEM+ay;MbbmdE`0Ih84<7rijHvr6%5ie>Jg*s|5|D@@v#6*|s>k-f zfBkZ9sP3Zs*@zVip3Z_!7qmX!!fp%2n{_G&7nc&k&PQzgyx|^i7_v)qEj!6@h=}tX zLYB(yw|!mggzfAc&d7WPL&#@AJ!Gfw{f6h#(t_4Y`4JI+e;(V3`T0ply0>}- z!U;!11LqdQKXDTBdtkw0f`m?PWQ1>F!4R-_+{SJ$**-4d4p?@9A>K!Y%-j42*PzCM zffBb$#v7(8FX1sTGVkaJ)9C&7!rpeLqv<`F)VE$32Le465Wo|xjuRDt(0~8V2bZtr zFi1Y_;hM-+!gq*AB9Xnl9A;)_ZfXre~zd=F#BJb42m%Kb` zUh|;9z|+F{Da{JkuvA9JTl_Snsf^4o-iI@UQnI@n>&W-`OGg1n*N;zZnf|T4R;6++ z!6=r`V*$L!$;PTGVQ(cPC53Def?oNe`m=X0yi{wNe~t@067-umZ4i^ZN%ce*997KC zKgA^V9AU-aHUcadf7F@*Z)+mQLtNaT!4ISBXi&jlH1JvNq>o<@ER3zJn=2Ho*^$*SA|Um0c!809|F ztk&*Hb>Vl~$j!=fbZ`g@UIrG~iCEwVHr&_p@-EB0;73>`7t}An@(z3}xn&lQO5iC&RN`Zsko0BQ1Rk&5jzZQt^phoA|%L+ zV-%I4Y@k?k_&Ljr0tfVwkr`NVG#!Q=iN)lBt(l zN34&gsn~gVXo!gT`1zfK2@l8*u3fzfR59at%r4?NqR-bL^q zoSXCsiDS0w_l}iC0nRm2g4+mwe3{TQfrF0mpo~1%SPru0Ikm8-=v@Lx*V1VY&BROr zdINZ{LK5pU|5u_vN5tR9z&Voa%a9Ytgz!PIc62y56}~vy{h`8nvcD?UXK!dY_~}6( zu#ROVB?Hexz+y=jI6yFh24GJgns#b04(8RQy1J<-ZN})3-anpinVthL%S#^-V4?P=uS@0gvLvyXyNQ+Rc>wfJ0hU9tzdTczc42Eq7h%H%`5l+eIJiy=Jpsm54XX$N;El|R zIknc?siG<7HEU#OTcgsH^eC;4SU^g9d%JzPfX836rJj>!z2rw375*-wb~J7tr6nco zJUlQYG|HfQ6DzM(!=2Y^-oYhnMoK6Bb7UmGeI5p(3M4si{a{Ci_Md};1Kg6L*um|w zyrLuz=nHS&K;-cluX5rvAvz7oN=0R*q0u7HbqW&l%|==>%+h`7rD=cV3x)u9OL0qX z56tC%jemK2W((33#%R6Q^rUW_c+jE zL-%Zsw=%uH4*ae?coid-b78anXU6`bDG6$)0XIzGXAGTD)7-4@M8GDRosEij2){$c z*lpp;BvSux#CsW1`fi(*TD#rxkQMzn zwaWPAG0#pr6qqR06wJJ)WjSr|gqD0=9Q}=<&7$W|gqz=5MOGd&5n-@*LSUKK|o6#ty4HHthDE zo={t@O~2L||M4+N4b1SM206N(YQAg&%!6)<|3t1AZom;_kVR^no4-*}X=1UlGqbX^ z^juXW5|{TnE7;!;0RJ@1t2Mpx^?|tL-_sgT=VMDA2|e|_3n0m_zt$iaXb~!@J=WZN zdeJ18QsL9XRb&Ih0yqB7B2PUA*k`xG}@rT3! zvg+yUtj;xaFTTCG>yLi*iiDH`D~)tyMx)z=(kZVjY@Bc2+=no^OHZDvudu27v(>#y zLqb6jN|2SEErzKRnv;|B#1Xfos0coZZk<~ntAhI$xGyyRGBTmyl@3gxf7uSe`~-O^ zq(~RycTwS)kn=5dX-{g+yIk*j|UovSx=) z=3%smkB?teQj+=O2P7C>xpGlk8{Un!O!f3&^iLPtuC}v@4!m2iMne!UERf!ce!Dhxl_mCY zbo1Tl&U;xDKc$-EBibbn5Qo{>w|8~~U>1YgZbGR9ch*L5TwIPZQ{;r=l>t9XNC-rc z@DjO91VmwKo%15LGc$7;PNY}>u7Jl0ZgV-n?(n&cOf@j-uU-^J4Yw-QbbRr=k zVY8WWj+X%smfkwAxr^866iJ5Y~V6H#n$jNTlzSdg_#vM7PE+R5>8Bz-GGy^qh8WcM9HSxykROjL^BzjqH{ z`wvv-o$;JT4?-j`Jx-QeKvM=hKCl&i<%Jy)K}hYsm2?sW+cdnvt5?rTvVeH~3Zon5 z(anM0>>HCct8SZNk*#wu^My4BU4)+gvkqeKc(DjDMG%x}sNV*>EmuJv+-c`*D`3C} z9rNqrG6Vs7FO5 zE4@(^lJ<7cbb4h$@lUC@l?+3pXn=r0v-|u-J6r*v(J>p!Ey|XP)UR5@M)xf*2RD)= z7)d^EWWyo-vp!nV4pJuu3uqzi84Hpb1^YcGuyelvpN(P_& zD#vq|^-(-%p6wR;VL0>;ovrk{u@AIgd-pSw03GlJCx;;tum~wBnOT&KT0TqwLqMn= zdMC+H1lUPCfF2EOP9Yuxk{da2`}8|Nl#pLgKr7t|5qTBr8^0qOL1f}E^UDO8PWCWv zEKTxIqw3-fwUoJevR=!~NC{|?V3~S~35Y-h-Rw&U_uVrV2yBcObaMsTE7Y}z8&z~L z(j3+whLl{Cd?s0RmTm273JYuP2PS>~ z9Qo0jl%`m_VI0V!T?u9RSy>E>jMI(yEpc%OrMGXh#dO<^3?_uZ`c<}XvzDKOqi}Y6 zb{nY^MNfWfV7WV`5s1>W+ecti32KngaA6Z8BUysa@D_d{qUhseW8sgA1n3~`M)_{P zR3Fcex=;M_^JDS8y{*4u5@8hVR+F>=I$YVJm<}7aE1Wic>=s$z>;p<+@90?RvU|XM zfodYG?g4?Yv8UlmQUK_TXrgcF`oH48cFpG9kweQ41B`)n!nHn1zPCC=2^Jl&fxQEBYG!69J2N?gXHXl$OIhFCbOJjbFpmZCUJqBJ zWxHedtzdtr&GcTbF!q-(YsYHbl;HHGrs@XhfN8jtJXb<){*RnTaFg}*aSo>>t!S3W z28hV_CkdWn`dZr;^FovqQ#5S^CXK$86*B=Q1cESv^y>Up3^TjB>yvDoj-WM zcennsIZO>!4>*fP7~*DwFbp0+#^0v|+Pjfab{;Di2gll285w0{Ny)cLRk*}_o`Pyb zTApOgCRUIJ_9@zkd<}j-sHx3kj4do4#4=k>JjcexEw{V>E(|!zk&VZvH~a)s`}=YC z2|;271#0tK6HiB3D&MfMTghErfBvMJAn{}pVOWrrl{L(noR}!qSFEfa%--4B3eGCz zN49?f%C1%Ai15r__P<+eBR{;w+2!R0&fgg{7gI_9L3Gq^9S^e^gL9 zi|>+{;6)G`w@7+}75dL#-@pF`M!Bn-8xNmTL{bvf={<(<7D-G4g9)JSr<*`7#{_K9 zxw&A052M$y^V36aZf@8_<>b1$|FFIjrD-ltO}z?{D!8W-jQwt^0>D1OL>-?6|Au+n zz?*kqRRtSqt=F&9^76V2jj#H!G~RV6ZN4c1szuq22%YZzRbGadx4S@ieDw?_iL~JC z0z3evA#-i*FVUw3GzC`uG$4;Oy(48~lesWb4=!yNdf9G=g)sUe5QVlg8TQKLE-*P2 zbYK!O(~|q}{kg|8bdlka5pI=eS1mXrwY5TxU%-FU%N?&f2xJ6{pVywMclcMcAK-jw zj{c!p(>yiB%arw6eZ1Rj$Z~DW>EoTkv9AlC9Z}P#EcaenNG+iA_ZO`xg3aE@*4mm02_fcD zcM_bxejPvGYCHsG04%ET&IH|+hx4?O!C|@WK4;Kfe?$P``zEdq@I#`%H_?EoDt}Dp z-`38YL@EawM*oj~ej0`gg8mmtd=;&10Pt4XgPY;d)W*0pOero;r>e|H;d1a{hnyWq zQ8q#}x3&`MeNIRinxi5QsPGa7tg;e9Bp`3H44nCm#!L$ryprOv19aeS0_HDwSLlMz z@YvX7RcwysiasK}u<+`6a?R<7kQq}-G|$aH2O4b(*S{%!qw}@Dh2wa=0SPo&_SS^C z7o14lU_n#Yk|t8O@S2vJy>6R9-cn;v?COLicqw1`ey0iU+FaXSds$&X>U0=C21$u8 zLBqSq^g9veDO1D4BzFXV!K|H~JyTXwJq&zZ?734JvubNMYNb=$hyy0du*YgM)y&7MnzEo*A$*F=650kYZnl#Px>{xnQ84l9D1j$kpMt-L$-31W5SS(ti;q ztd8?-+@ag^?Mjnk)T(bb z_+zfJXN5o%q__+OTM(@E)565mw9=~0|D(S@B~h?F{F*}MUJLaQm{;YfSIn*EDS>)K zT396)cViKQvN?KK;79{yb*(4*k^U}Bljdr zs=|XhY8Y_i6N+M}JuvLsqPCD+dMDH$meEj_R-Ov8v@5F9Xw5*K61OAj}EA9%>K|xNTWi zCHUgaHg|x=1$6u?6HZfYfBp!$?CeElKL96{xA{3~YEH4x;at2fXRo)dxJ_qUbi$C# z%J#8j9SiHi5R^6PCg*P*sY0aaY5nazA1T6L0KxY`itVZHE0U(g-OYqT$l5^UJm1d{ z5B{d`pp0}|%k@>81<~?R8v=pg;^i%?tLQFS9jTSLbAOmi86=>0Xe12pu%egpg zN!afcIxVoS)WRM7l+t0pghbrM&CO_W!FGyYH+YS;%M~et2DnE!IeI#f8RiTGYMN@k3JTPYVQmp2~3($LJ`ag}>ruX_Bz)7QHz!vrbWCx8ri+4JwmVNKEi zYgTjRm;nylGS!-*sM-7!u_JfSKSu@bSCYrRjp6+7=cYF?u59VmuiaVu-aB|Li#l)m z!bdD1e9*WU@fwpR0=7abBJQRAk-V+r>OsY(wgD|R)tnfe%BpEJ@B25Oc>MeOXK7Dy zw)6~PqytIc1E%?tckN-Z4Ec#k<2yaXh9*b2wDIpxZiQdHvPJjTb7IF?KvYWF1gq>@ zMhSOgp_A7Ukv~CUS=p>6Dt`UpSlIOox3kR>C0>i8k&cdNx8r3=YRl35nDoudmcfPT z4_a6Md*4rEMaY&UQ|o%IbmXyU(Di`#m4Hm@w9r>3rP1xn2E{ilu|hFu!;NWO_jecO z7Uo%%i=X8v3cLD-$0jD`gqOw2F#Xl6e9Z6S>MCIT{D23;>5K?%s~q-1u~U>WV7Cjf ztS2Gj*3n0p2U^anONiWo>b`N&5n`P|{lS%2u8x;zfky2k_XD4Xx=;(-7 z8416KM#XQcpFFv7;8>bncT@?I>mFkFYSKq4r6=$6%q%Bd_x#4z!YH_=z4B^Y=Z3d8 zJ&%qHZjpIsDA?H8I6?X$Jf=5qXnd&(`iY<+5ws7gOU_Hq>niG!VPT;RqX(H6KoW ztE=hoZpK&#f54Q~La;GBKi2L)_S>wAO=XOKV`yfkXKC1Z@8_+j!rU4W8wvlEKJao( zZak{j_$6LoFn?>jz5C;ZTA78Fxp`!JSWb?s)Gyr}MZb^v72lfv{0UvyCJ>#!bqg*R zvnQUPel&`SK|1!q8b2GYtFg235=49>YWTjr6a8EKAWA^+q??PClX*9`V+=^z4pr$g zNlWuR;5=buXmDQW0#sa_viB{svdG6NdC9Dzj~@x{4&C8*Fd7*fX_7@)L3#g%G4DS8 zMWtRW3#%J{Rc6#|&X1f=*ao6AVOmaWGe1v{u-H9ZtMW81Uzn)GZ)ijE-SD;^D3M`b z#;4{(ezZ>OXn>b{q69QmlM>bQ8qN%1K+0aoe<~|m{3$2=#QKPr7Z44}K=7eYH_|sQ z!4>`PWOW!!tjold&2v_GOg+qZ`@ie5JM1pn1})2*DjT}Y@~^)-2M7Do!pEO!DyW)j z8*A(8ayafu2_-|SN^u!Azbk!sI-w{WPom&wISMu+R71~4-f2I6;>y^3G`t-JSJat@ z$HPYt+n6_+|H9s%t@v<%`ylJb4`r!tCN<55E;)oOceZ+F5AQr4&L}&@>5>)06g>R%MvEGik{eD% z&Fj8*G~sqwQBf&$_=f}}V;;x%Q@a zN1CLRye_}D*iDwn<*#9c22n}$?ZH!Xa&et)rOC}Q$Wq=Ge8P9nL0kV<{clW-Mg3gE zN+!68%AFK(a|9GGDfiTrmG{O&Rs8c61zi!8l-Zx!@|5!C zOrPmIB*E^GktJ+)JGis8eW1FxEEz1_iWSV;`I)cI?oczv0E-4JhWEA)PTY@YzRrDG z#R@j+(i|=^qApvly*HG+z*P68ex$XhbC5@n4lD&VyD~YAFrEeA2UFM!{=G4D;eIgw zPErP@OsL0JGWr$kp$R+=oc9pZ?RWJw#jz((D8_)>6t9tuMBL-(f}d635EsRU7ssdE z0mTD8@>&I+9cK}mm+;R*uoqvn<>lrk+&b2iz|%UP=WUh#_$I6_sdG3wi$BLGU9^2#}1JFx#n4){TKVv367dAU&Z@N?xa{$R!?TU&JL|0Zlu3Ccm5@+u~c0CJGyPqf+4wUd)s4BRJ8h@ywgB-pW@ zJePsVgJG1MuD`ZY5PB>!HO|M_WVf8suRA;M5oEqmRn+Wk%Ee4c;5Ea=!=?S%sOWVp zYhx2Ek?mleZ$K79(3OBc^gQ^`I>=Iltg80+z4D5Fb0EXjd80e=P8R~@A2na5C zZfz93zOSS-HD2nGp_mQHho29ZMMDcRB$M%{yo^TYf`L>DXZNf<DjnrGNR- z-TO1Otcr4oRPZi`!1BqrCLCdL1Q`jbN?bx!RfR3Pwf-~Zndqt5hseAhtP zY5_vp@qYEIKHdf@RN+n={XLDRsPoN^8}&KT^=QckqP?xGS{8TZsD<5)H($OcCJxY1 zQ0VjIcfCzBx3Q5fd`c4Tba)e|+4 zNE1Y`5hu66dg8EXnWH$?s`!e`C}Xl_qOX@T%W81RO4x2=-1~PvVUL&<{XMJE9WyJZ zvU~3rHb;xXLH9$+`8>Oa3cT83?Hbys@fe>FQrl`B)N%q264VqbF?^mg^fdZo2Z>CbdLlRG_>Oj zpNKO$t4|LSz@+4x$z<^B3_LtM&BXngguJ?t2U%bO(zL<~Kj=&F#Cc|?bI{DqEf-OHRBlD9a89{<09iRl(a3NfWG%#^F%Pv`iFoMCy^O8B z{I?SW__aLFEq;bk;x;~1D+nQQe5(IU>hiAT(9o2-)Amj@Pt)wEbCKOnXOgh+d4_)U2&J_^t|SR2b5;J{3=Tl8|WajbO|yb^Qy zKeJE)%u=U~i3x)vr!*6!PF#chwYqatJaPFufBc%*aAo^|>||B5dr`4V#wI%2x$nMU zT_jDMOJ1Qt{&6y-3TTK=hTlI+UHhzlPHJcwTNIV{it$fpXHW5%fnHyG|1Ww$y4TqQ zD+_k%j6h5&uc`pxXYKRtfMdNRqmb0E3LpjsUxl{LRs)2D6E^Qoyqk0%2`zZyKWJ<3 zOUtUPEG>OGbX?KVaHnprG!7KNDk@Nq+TgsR@h4?PQVZH|C0NxRx>Zr4qn(|rsv!wQ z8EpAP*E&`b+-sjQL_0X8picW1^&79M52=h+R-0?%0vks8=$;Ptm{+GIza?~n;-&EyIH{lgJ5Ls(e}MYjai@ijxYBhp$Jgm>M=#qR|y z9d5I;M;xx0Xs9X{*dH%~&;HV!{wPfFfk~PE*9|o*a}I&{fEGw56NN$AdvamN{vcyX zNsNeB5LEdoKDtP6F*hos%hrQP+ka)YDa>n-njZIQnIB8{B`FT6J0vuLDN1{{7fep- z>qzWV>c3(;UrsLC0@BkwhL~ zVO-v50gB<&CAYf9Y13<4Z+tFyCJUa6wK?mBwC9QK|g*eX~a zj+*6RqWdO$X_8S3Hw+Dxm6YuNi7$c?o4J=6k)D9%I6_M+8B&~prPq~o&XL@uRp+T^ zzUB-Zgl`HiXGg&xh%w=Eilv5ZY#W<`$w^HhUVZtZ4Y|@~mIH+kDTz5dySki!5)U}~ zLkM3ybJ< zL5%xDT23GvTH*)^PlkY7S2CLd*FH9Qfrh$VCA=m(ce}A(wJ^dv`EYSVvuOyJ35wlmW(Sp6& zL#>MnmP{a`z;IAbSR;u2Ll9ds_UhJqV+spT z9Zn|fI#ss-riYPE(CnYeCQBzn7g~|0`lm36&EJ5qT_~)F^DkRB31-zgv zeZFmNvE?X&Khi3=hI2=$D#vA{r`zSEAs~VPtfR&uwX!FzrS9_LcBqZJyLp0YH`n=E zQ6F$ygfE;u)yL-w^zml+%$erz+-Z!^o#%_V5JU=P{AFp>K}O-)8j>;u!@C z7}x^p=$YA!Urn+?HZ%HCQkO?ZSePk`$zF=|M2}R9>4iMof(Z4B3JW2T5;8iUB6RW4 zoXy$ZfifY?Ue#)Q09-IK;$!G;<3b6ahMb5Gm!H=q~r(8W`YZ zZ-%gTu%`gwmp(!wdw}Y(H4OPHt+Y`3s||H9Vod(@im}^k1gJ<(8!cdki`)2$gj@HQ zb%|wNW3hP-&6Ycqm?fr{CJF8_z7tAL7X?b?_O0#ZsUNF&lIQZmvlARPjNbax62-69|$Ehr$} zAR(#JNJ%T*-Suz0-#^QBmlubbGiT0u-@Tvx#5R0O0+XKgzFL}^fE|okydpM+ZZXw^ zV*_R{;2&&z=Jxk!rvb#^FhENYbcf{&zNW$9VSDsarfOU2-!Ku&%abuSCPW5>mN}|0 zmY>VO^h$9&JPK$!;MNOL3_uC-kWka^hE-MlKv05z1KcwH$ZDrG9PRvSVQWrKdsHuQ zLgu@Yc3O#2>FGbw(2PHJT<$E;snrMD_33nk|5YNQ*ICkX2-9D-H=f_gHW7XPo)zgK zQmW}*n*KxJ!MMxIu#XSw9EN*F`O5);RYnveW71LDnfTv<< zZcawVKRG$s-POen(F7G0ak%~2`W4rhI>?2+fXHR`w*>VC7b)Xmbn!Z8lO#5PI;NuQT(cy{>P;2HMNhfp8xr0><{NO=5#*hmijqMhcqZ;Gyx*_il=a)yz40SyMQ%sVf4T(W0Q!E+M%F#)rc@q^( z)ixz^RXopBuI{5yWs=e(j1K&`My19y&VNw@jSc-E63@&Gj3CCdG%>M(E;(P747b-A z+|8ZWxxDrUd2zVWUSuhCr8bzXjZzr*c!4yRo1g#F%#8Q3=^7Lc!pDovP_+V&1w=Ti zbTL+=W#!q~as1Pu=!G#SA{{oJ%M4z%LOOw+&e_C7EvV+~+8ydK%fvHbNphWT{0=kH z6d}){@o|gY#b{I%I2)HR)mlvi&|W6%U2M&FY2CSHB-^Qe?b`3-y#`>w8;12H*Y-Ae z_qJ2?j5S=OK?u8mi((Q&&s!9hNZ3IRS4(fm#4(N6?5TnCH5izim5&;>%NH@#>Nm4O z>%rlD-VPoj<|b7$fB$kAv=l+Lbq?k{U=jvPLPwmZ)A{L!U9~Ng;Njx#Yom@P=Qq#< zu7|Pvo`L*UIWVJ{GOwo^<{HO4cz?w_q-H73xbXiMwo)kw+fQ!nf)FIGpMrzl? zo?&lO6d8X1qK&K+_9WPS=T=ucftv{J0t>Z2G9e`;C0^|fu4d88zS@m?0&;RvJUk!Vocw&Pa z8H5jc?=-8vd%VzuPJlNT)=Kadv>Ti#81Me)3qY=9E<-@sBFZ9x8vm-%wSe)eKQJi* z;Xp3-{2wtzC^bGdHnY#9O8)z}Zb7-Sa9gJ7Ey_+y(^9p{r!38E2mD(?=n#qnvvp{< z@R6fsd{YO9Jb`CMES6@BvC=RH11#3g-u`#3@ZP!Pcy~A4Bjv1sbpVk(BI0&J!f)+T z&bEVwtH(JYvV<&`)zuICBv9no?7UpjvrNo>#c>UKp&?Zp+%6&}+ zP<>PdM7zrSf0U;bB`ybW&Q4b32Y*Ye8-w+S!te!ZRF%^pbu-y0aJIQ=1 z(3q2-`LewE4H>_{P^v(5&=6)IMQtrV^JaGt>N?QDcKfNwa@T1XV_-r>Mu@ zrd(bmO{-K+75>(wTr$sRk%;ni0o`|s{Qkcz8TfUyraos5$>VYDnfaeKe3kgp??CLeuj162Hty zDN%@LWmpE~L4Ek*p%_%CmqA|Nn*Tvajo#ts1_F`J`YH4^ojsX%PNWKjQS9?^LdVWs zJDvG;ryGo%XbPNRxX9}SVd^)jQR>VFCZhVHxCR*FO!^w4>aw_PY~6Pq@R)ha7uPue zR`CuI&lE>M$Ph{r2FY@LAW^8r+;d3adU)GVTUptUJt8tPi=ifaerQJSsQBYh+q;JZ zcu3eRxa8W~+l5rbYwS}+zp=Fex74sb;%&#AzrUCQRVckrcFxkTRC9~3_Tb*L&Vq?H zUAW~^mX+lX`{TH%6%}v&2^&w%0o!cKcfbr~XX)&!C24XC3x~}T)>&M5l^O058-gwx zJSx_`DD)nzt|QMfx2ES|R3Tt&nf($K`J4VnbLK%939HB6U?ngSYQmv7016mv0K|rX z#Q>8F2wD^}PE^rB?U}VU8NleuUec;Gqi}em$N;{!`8n0GaRF>?u<>i(eIog5VBor; zww4xv?=SdcDY|b zwR=t<)AarpVpBmzhLwQpo{W?Amcz;1TM+IUe%N}T zo2#J5G40H`a!%jt&h(cSSvbE6!ZM1!m`zta!~D_JYs2jC64TA7C)ewjhPVQQ(r&HYejRg23&yTW9{;iWxTuG zY>Z}avgRi6o`Op}z+B_@%E~cs-qeq`S3!0>C}DlTvUmx^spSU2p3Cors6Ft3+ z6XSvNu zQo~1*lCGly0v0QZn8-*;A?|S(r?j$?OvppM!OOGNpx7%10?yCQJR!bgjE3yaK%uj> z^ST+df?$aAn1f@yrG=Psc4MPmr*m^tFh{dDeOjpd^4@WXXDA=LqI} zeSOcMwRCJiXKMqI-{tXyVZ}?*;N(7r-l74lT)hO?+E5SD6&dc_;v%&~50s)c2+1zj zTx*_OLPtB*IyJ?zvB#AAbyWzSN_F+xNp;m@$ZqL*7AOuG-z!guaY*oAsH=m|GKxJS zgj8KyyE9xH8)NBWyMuGkEIc?^%HtIE^XE?}`hW}#!llPvr+3<14mTGM58ne~z;Gu7 zvQpYwTT>p}O6Q%;D4%ul>RFqau`n@Zm>$<1OhN=pF~}%6Iq$PmCAQDNeSn9|mQRLG zFHb3_u1+uzo9t~=)Ci2&B_!O_6+bKGfJEmec8JIRZ&Sej2M3Lo2ZBLj0yj1y9VBTB z3ov0LgsbK*x1yRq{NNId$x>QcUVh?gr|sn>0)r3`8~_j$qD?v+W?fP$<+^ghCFUK-42B#XlZ%X zgo5z9pIVhx5b6S291MRX=yt$~hC8aCOVD}!q|QxaB{vecyNC4wYIlR;vHL!gKho5| z0H26R3osKMPvr-=;GZ%Etr}ps(Dr9!25!5Ye)urHzwz)Oj+SQJ#@_xB1H+fRymn$3 z2FfLHZ2fKRsB_yBaNB*1WMDL#4kPISJg}y=Rxa_5nu?0UiYl`jt_UJ)a0xs--n$+vy*GOf8qgF*Z_;aF;NYMK zbA!k$!v*|yF1ss*-7uC;IBOfj;C%}czq4_M5Ce^&uE9AV%qTIun>wpQ8Mr|#Tpb2fQ~6W(0~Gi^01p}j?tzZHZhl^07PMC269W*Ut-GrLI5>E~ zphB%c8@wPk>QBJ3O9blP%dBU>;{II5S^gQFE!WHkx&H{Tl`Kb2m@M< zqMkiZ{sTyq!1G?bgXeu*Vh9XO4BhHgP5`z7Xgja9!R7{8&ZcFzBW^#6Vc^XE^m-Y6Y;9UbOoHce(_MMWqgS|)~=7#RWHhw#`Y;zHfC z!EiDd_t=GQv0;Vcj#k_E0I%E9(h@vz?%aY}iPDTWHk5^f2DLg~y>PrIsx_tyd!%$$ zKMXChP3yQwbnGE-2tYyLj%aE=Q7d})jtgMQf=3*bpdydp&w}e6n9)6b@Dv{(CVKk7 zS|Jc#fN&j_mw}$oa-iZObsUWE2tV?u50?Y8GRS1(Do`00n|D(tK$@Aa5C`;`l|xYn zgk5ba)~}nZTGn;lf}jj^yju;>{nMv!Bxy2CpRln_H~ELwm}d-{Ij@bn14Z54UCY{9 z!9OFmHb9#N;Aoi6yU(z-!LG*IAg}{nq;9nxHswH`ngZln!23p1XTokEizqIx_P$RN z@Vm}^D)tfF6Bb|VHgsLBB>5;mR#d3w84(9a$;-!dggfeVnVVU$V?l4Hq|_fC76!{8 zf)d~#kh^~SCW4B3kykG(FTZxU0Z2<@%r)l5$lKH?@vxxzts^~;y|qa5VHh><>sgG) zo%%L?YZmWL8Dk6iPK8X79adI*RfE=7B zx^yv=C^$n^k3+QBB^hHMpg?;M?czrzDOFW@B=Rpv1v|UCV7>!iywkXXL}iQ-iB1w= zE_wh81K48xBob}o(tEJKf#A!fhY0Tc9H?p9VVRCw-_ zM-q|o3$YbhKYuO-_ll3tx3w|sHG6PNoGH*v%Bp~Uv>IY%U+8&kg#)Z6D!TYl%67Pb z7KVeE^=II7UkhY(m)`eHh`G512*x0fJV@iO)s|TFZ9+DcaEXctV&|`>rNM4Z{vq&O2tg>=chMNy)vv2n%fBqW-tgqA|MK*;zy+*V5UG{JUyHl zCF6bjZ${>7C0)t`S|eN}$ViUK*xQ_(oGUwCDZ$Hwi3bWL3f7)*KCDelAh4KCmKUNL zC$1h(3DJ$;OB$F6PNQ(RQ;Dg32T3e=N~6x&z-2#GV2OUP{UWP=usu<){Re$e`LdOr4+5}Tw?dkld};BEMX7>=5YTrmAYuOQk*+vW`pHpToUWq;%2((GOidGX z7C-%*+0ykoY6a^uTUtugXBFv!gF*;-QDm?HA^}^NEFCuoM_3SI=ip$@U;@6+`3Oki zzIn6c`*$0tC&So5h5=|6)I7*^#S86%L_EB7s%S;VSTH7>ou8kqKa;q&V%3Aon;}J3218o|hC}(VL77YwIoQ?0{oOir~ zF}0Pc>7TVVPgp$9g#H{9q<8lAKA@ud(sgIt(#CqxACu^lf;X%>Adk9pHx|-kAQ=<% zFM$#iur;9+EiIGboz6dwgIKFfQ=BdaNVil}O<>{bQ2jCt*tpO+K)ulTCI~JxK=P~b zZ(iTM8`_E=%)r6%1txVhpj7DrqnG*5&zq}H;1(~}#HiH!|GU!W8`ILb0&P{opYi!!@8 z{0W=CZEbCU%ZE`28y{`Af+XM4F5T4an{OnHDxjqYjS}72p~u$W8y)ei#T6B!RkoZ& z1+dmLGkl(c7Zf_2PJZ{U3~=Rd#4pj%7FkC621{!@HaFT9cDPBqwrNA#BFWBRtW!pGB_KAK49V5qz5OJWmK5 z)x}qwsTirO!iFPxJL%DwL*$uR*H5r}Qqw(~Do3?=8@4>Q>im3^+Bs3-xsc1Pmou1L zH-IJ(G89LLiqZxsH>aTf#{%Z7w-HqLdT$ULhS?_J2!>=-<%BsX?D8&0K$nk#@bW?9 z0m7_Yo#VT+6@B4h9MbPSg)YRV(KVaoe(ui1oH-1$+Ua!2&EP(}~j1qp5fYDp}J+ zD@)74`;9Yw_`xa-oI9TO=?u#!8x6;Q0#m_gkOtq@&@hIj3z!a<_z5hp-(U3uW)Wvp z?YnqR19RE>-c+NB3Pq#j*C4QBdeiU?#a(A-Z5l$V_1bEJ zPcOspny88qh6DadD@-yDdZ|QS4ZA>0WjcH{DZ}}xVXqrqd+Y{S3#PKwLxFm0Cam*I zcv6KKSK^<(XMV>wPMvl~_E2Qw)u8Ew!ltgO%wdLAtEx0xHUwN@#Za$|7EViCldM7_ zc$mio$gK^uzZ6Eo0`Zd-jLO`tjb3oa&#$WKT3A`}InIxx-rKTt%k!F>MUe9+M7caW zcoYbVla$BbrlxT4-ljxXTb>laT8-*`RB9X~`u9HnK}#6L%<|vUhRP|!F(XnUvYCYy zT0#gR53R76(A9Ewrb|*Y?lLho6|`SRc2=<$u)wQZ-4}46;bu;u+&;R9X|*N^R` zuEYl>$yTNRkx#NG3Hamt2pOcBH;C;!m^>o#_drlrxT{-bN92arX9E5h&3OBb!|yyj z7u%#6=z2=S_)$sOw+F&-Xa zcAp7Ma!BHqrrTH!CK6Kh(v%*817KT7@~HYum^Y@~4hOt)tBDW|Yr zDrBaFWKdBzA)oo`c^q+{CCKoByQmDICw_0GwUJR4GUwJh#bW`tMTt}(`N4jxc(PCs0&s`k+xLa4 zrJUu_S^$uzQwwu*6O&YHy7oavd@`vEZQ^Fn6~i~RL7`r)27Q%!g(>_Cf-tLOO{%-qS|!ojtYTi_^O3V!YuS1s(p?uBGBu78b8wg|T~`SDQ}i zlAqv^ds!WSky1_--W_`maU;NCX4L^t0>{#gy5Fj}ND-eaAek8Jn?a<%&X(KX+Mld; z-zZx!mQOi8J@;#H-L;J*;m!8U(RFdk1zB5)=gG_`0p7jeOQG=v;ML$^G=w$bKnFdU zT7eFQAd6MgM^p3q)5MIWh1BGq*gulk&-g&AGvU53e9{yelP%;uI}$v(UN8gxZTrwY zw(*Dm(o4KgCY&WlvAvL*@ON#l8d6w-l~a?pJ9k@URMq#2JdU!KYJ5O;I6n;ULBPrG z^mpKec|F7t^ayhL_bhasxtt$kC*dNASajXI+P)}%>Z!P>+m7evU}O8v%0SG=!@}eB zGmxT7jo}XP>pwD(QtoyR{D7&MOk82&{%L11I{_z0>D7}PsK5ZBKGPp?vp7)489`(o zD2m7CG5w7$E$@tt<{Z?%UH;q6Q`rrwb#sMuMRH+V#z&mMkny_WDMm%vTy!5*LTnhI z?~l}fs^=YMYh`r~2C&seI21;rU_&%N)F_Gw4(pa10x5`j&I-^vC-LKR@}TrO^Z+9LIjI6gXTH1Pe; z9Wl%CvKKiju;PO1jWGV*@zJr1+wPy+bf_;!+heN!$owIT(UQ81ub>i0l1QB-o_S6k zP|Q?o+M$}Il+|bA#cvm;|Gv@7vzkC7PG|FX2@rO8l+&qD;t@f{#KynkEP-+a)UA!i z^pfpc6xPylRm`o`Am?n1UXKw99it&LLY|&-)}3 z3e`MriO6J->X%hi{B?qA5EsdtXPrBkcsz#Pq54I)*v?VRh&F8F>b*l5v}s|fyurx> z?*qSz%Zc8?8^G$W8=e9u|KjjhO;^L0y@MU>#T9SRKHc#rnLnTM9%q47S6FWYb{-6Z zPwZGbi+XX|n7Nu+B_+$0@f{=qXGiVU7w?5o8IVc9mJOd*zzZo0_v5FY522)7Pnn`W z2-!zm(wy?== z?Mwcb56Smp-o{intJlfeZ*K#Naevh^<}F1Pl}Wt$K(5K%DJ^=SJVSEHZ5g5-g|E>b zf?I7%oC{8Czi|jYz(oj;&7PKL7yW}e7bFNO4)c9H^wb2HVzIfjHRjZf!(p zy+t$vx88o?w#@g`7$c*b99B1Sc@_W}LPx(rN`@U+#cqPIK#s^gTM}=@lUe1BH__`?3zby7GnqF(m3S76j(A%mONx ztR0G=W&#sWPG)Bf#g|WUI>b!q?!|HY?Y+(?J+CO^yMd(1~R?z+hm1N(%k=Z0V0OTW|lV= zLfKjJK0if}5EJ7fqjcL%Srrt*Y&~^6b-jGlnar$Aj}~KY8}ilxYFZ|}X6#R*lq5RbTkykh9UaOC?m9Gg&YussQ`V{Gb#-;{!qT<1mBG+S3!CZ0Xs)C}&j53o ziTN*?_y{>xbEKraRf=>LBLh6n8e{+*tpBmw}jXNbMM6Yu?Xex{HaPqf3%bzQ$}5x1#c zEDeVE=YD=}xca$|i-0?BHa;U*JZ8j@OK@t}c%#lRve-~WENT)jig9gp{q&qzP$4nx z!RL*I>cEAOs7A3T(S>*H8cAh>xKg5U1?E3S{Ev_v250L!=r53@c=lF zBtZjwXkC{(H73|5nk6D-h*(@-kB(7%Jz!~5&r;HK<+kBxH3oWF!&m z)j4?%r+9icJ$v1A3~ROZRCR5R^T3;<(75`8^|Et3Pd`65N>oTlsQ2+v<;=zT@OS;q z=>+tS^ncfP*~5|6iBIK*E;YqW9XqG!8+9l9AA>K>otIB2yyYcj`v*#I;y1IcTUkMp z*E&VtLF%A+Jd2hHt95YW=-BUsq@>o?sV}VWpYV;0B_$-ZP09AAa%n02*oOwcnD_54 zj+JghjbEs}jf=M~u7Kb;XK4v!vYRiU?XQi2dcAcr$XxcVMr|LN?bflQmHJL(V6B$q z)D^Sx03JFW-@lhVd5JYEo_}8@>84;~WGI~q8IKkD<1{_+ zQFk%s>V_4Qwsd5%0NX+*bFp&W9v+=h7%Iry-RpkP<{^kGXPQ^bCf5{|1BeEn)hiM zBV}-}hi&D5{TdvTEl(^w)H3pzg{6KUq5k9{m(clq_k{Zkvpq1TE3vm@YwMX*|2;&y zqp@(S|MCODBdz(H`18m}TogMT$;n)ZH6GH9k9mmI50{0BF{NP<(}7o}Wp^b8r)q9I zs8&N;y9rZaxBl;60zmb!UfpzDFS!2nQPX?ZwsW$}_}8aonPWH9FA$%JoNNy)*N9W_ zz@Poh?z+h5LZUl{vb@`rC;@j*us6xg{d*hvePG}Y9wn==UQ6)H+dvJ5bW)_P#*aF_ zMyZ2&G_p!3a4E#{vEm7rGQpr^E}Q-LEx@zh1PBfVl)+y}(Z(M9?~=QW#r^N$!eYZF z1_l(GSH*({G-Lmnf25Io!&jHPA=vo8=b)uvUjD*Une<2hGVVbB>FXy1QX3Ov^^HfD zPiiE1^M^M|+=u+-|NlzQjeoJTS&clB|9*67(F=cBri+!<;zz0av3sG$h(g7>gtoM( zq8neqi=m}e+vHzrtlm`k>%TugqdwlpR%4JIFq4BxNF4K+^+XLMs{?IQpjcfN(PzdD zGbJGG3c-9-Jd>S+L$ktyy?5JkPkr#SzkZi z-niGkbPxj^g$Cl5rg9QszUbjs|Qow?Z1DMOlZ9f({%?160J96wk+ zvoD3;S(oOofS{nRyCw2u-wE_2M#R9dz9I71dHrj_5?IJ;-bFHS*v)RwO>GK9vJ3j+ zA$hG@K;82IrzEVzENeMossCBxJ zD4rp3{Apm4K*sx*gR>OqF;rB?L82Luk=fQZS>^Z$#}JIcTG+x0Op%hJqN#nE5-_Pw zeQc}567Re+WVFAE6VH57la}^oGD0aQB%+>yFx1ntj+$Bmtee0SUoUU4|1rEOEq?H& zdp1>0L4h~|qAolRW#B7%#KQ8#=E2XtzHi{wd%Rn@(4!~&2vF~ch&!0;yCZz~ogFdmr ztCVG`z?K>e{qciQ3$D?Uvnwl}=N`Lt9N1^96A=E;-CY3U2FPirM1A11cUm8h1TNBW z{@7>pCk&s7fLuLnO(*)`I!FRRi1q+=e$b!?1s~X~7&(KBJm;(LX)t!}m4Qg7Y&oq# zGspIb`$ETye&m8RYg67)DIiMAw1w1guyNg4$izd6i-UujVw@3-p4!JMG5I2r!1=ne zG9FCjzyb&vv~UEcW2GjV^5jy+Ns56#9VprJ-C_;YrwR!_L->I%Ext35MN2#b$wS~S z0qj{2(ZO)@)nG0+V2Tj6V@iSydVuhKprZB&gK}_C`ivCT*qwrg-IgVNOBEe5@mpRV5~SZ^c)xMc;uZl zEmHC#-Em{mAJ=ZNw-01|Fw3($_uy))@^t5q4(b5E%SfHfKJdIxtZo@!ODf7bDaa=j3XuYy z9v<+P>k}u7hp$Or11t0V4E-6>4H8A9XzBI7Fve<9;Wca`h1~?GsW}A&b-cN= zM@G~~Sre0!J4!6h)^HQQZwYt<*WV59BMIlknW{%>1_p*RFeYTxz65iRiH1o&3e}(n zTSMc4BnSWX^K(bPewZxio-&ENMs&;9=1)^ABqV`1FS+2=lY>YEHZ~-OHWccFT2{3N zEV#>Ly@gO6$;|BwEKW)&gP_F@xcqCt$-uuZd%}>ho7ixO<6^N!F zgliEPGK&O|@%IG80dHgM^ZtxnUIl6Y*~Ongs04x%pu8GtC#N+4KY+hv@>5e+m)(6| zJ6clUMZON5rWxz5r9s0W)r3-z<}ltxiwB!G%}Irq9cZ1XLRa7w{e3K-*~fFv^2G60BQZZ8U-x_V*nLw-^b4kI#3l$9#Si`ncC)}Baz7wP z;NaY6H&{eruzK(I(eLRf>3X3 z4o7i>Prvk;fTRzFYiDbl!ebf2(hW<)qeqW!h!hpEJwxbJ+i^d7RO^0V#pR#PMY@*A zO?KVqQxD9J(a^%LpIjC*RiU_Vlae6k1Qa=tD<*jO^ARhAM}kA5rkZ$WABY}Trzn6g z1Z>DXcefi5^+SblROpJ8&N@G@N2I@dr!vv0t6ASI1IT*hJ-+$X)fP6n!(nN<7%;!P z<@NiTu2Ko2sGUCG>mn#2ZrE(VrdWM-X2$5%D~Ijb z9QgE!FMlc5Jn8wsCvoto|99zYP*Czd>8W7zoS0d2%TgqQ7FilXgC?n>4}ZqK*Yi5MPf3Fx4EY2j z)%I^18aCj517+XuLOqZmyDvaECR~26d!B}E0hQWB5Q;i05nL1i0q`+-xA87(-5$=% zG89eV zo{JAfaKY>p?hO}R++eu-sLC|uAQK(>g9wU?__%cUJ9`@x>3M8?e6-B@Zx>uAZVEHT zy6wzc7B-yUO4j`HOf6$bxM{~Z^7{2dJfwj^!LqzgHU7-T24wes0xE>aG%dbVgV#YI z0kBeGD&6}EWQp70D#>d%y9sluj6KuF3>Ok7_Y2q@V<#JKfXO!~yAxmwv8H-EOxfHcVMCedgFE zwd1Y%32gC|H1hjQOiy=}O%4g+!w3jV|CA;U*xK2Vk(AE9ASC`7uEqbE2ipy7F=#nRIbwR z-uz#$*GSOzZJVjf--slI=y3#@fKB6U<)qEp$Q4Ra36WoG&-ytzR0}7HAPaAK*(}b; zmE7(nTFMLc4eT$zmmld(oF9b;-l}=a+ zf^kOIeRkJL4m&RD^FDvpt~p&fL(eczgg6hG$e5|hlcYFl&k!R&85l98cs#S)Ec>v$jT=fO}S+K_%#7}p+f+ zJzu|;O+Fpo5O!Xj?*EGOzb|z2gCAvYH zBV~$~tXLZdRw7#)Q^))Qk!;e|`F__5A?qQ`@3Wz0co~*7I=D2q#J-S;6QitDuYL~9 z*}nT5Bi~xV#Aa>7YogdM^i!a_=j;3TS0N)F2n|Il#AwX)fOV8VyF3+WF8vR#crju5 zxu#&<=NM@pGoNp_x1O6TX385hTe9nwkBG1rN-?sq@DSu-SvS7grk*!wcTdgcWdAiL z;l*~thB(&!661-Ry3?-prWl)1-&m`hR;T~2?t*NPm62tL-%ra#))1n;!*XIWZ&RF| z^>`<`Ra69C58jx((NW?ULE}B^bj9WE=pm0JTkF3g>Y*eyI9_CHbGW(DVMwj4^b42* zBFfq*+_f5683hoZF0EFl($dfpAQwdv$tn14Iatn(XFvZj2!6ldPiK@*Jd>s?h(`sC zD-qURLyZdKE2#JGX2Y@v`Wd^Cyf!HPqH)Fbms6AdO<$dou|F8?4!E*nw`i2ko)v99 z8~b<9!ZkjchJFYn?+$RZVquYQI6o(19q%z*dYB*!wtXl_ReS{tQB8Vx*+_xl$$WRp z-0UJT5m96!$E_!iKdaR`Rg5{Uk{==)qNXRwDlH28J!5_{%B`@mEVQo_%E$a@o_ifoe;IQ$ffDkPFrm^w>FqG?rd-G%|OR|kJAj5q}860 z@z)dmw$4|F>iR$^Vd%dKw2gHT7~Z2uEiyg>(a&!i6|}M^>NoyX7-{)FQe?n5*`l<$8;&5X(t9#pUh#&x@4aK#CrGvNlphR!V2GtAD8PvFY z+q*?2C13Cc6{freJr;54CE7(;vDAw#Y}F-k1p&S}ZRUM6nan=em7kfP-!<|*y5VBC zF0ztHkZinmxbX_!arE`QW%fmXNMom$Ku326W8&)SguuY0oE&6>dh%;a%P$w_XWoSk z9O;GHp(o185kVGbP0(P46F8c_u|YdE$=n|L%v5hhz{I zrl5SKZ#DU`OpY=3rqf2;hqt8OoPTC>eo;lkq2j!Pix1WE@d_&hnH|sh%K#touatGY zyh0t1zIJ@~6^M+b5OO;m!LVl1-p+!_jr)e|ppH5<{u6Z=X)m3&dY{&XEF8_y%SX5y z84RRTAA5E?rrams>+k!fKR8;R*I7JnXz*7U8xo=(d+b)>Mb8j< z7i-hS$a}3|7prTZ#7())40b1<4q1=xl~UR2GK zrCtLhqGyNuCgZTH)7ZXFVcpTbwf7e&WaeGH4(k07c|J&ipu!MPG$ivXf~#&^`j+KoEEzG zMn=eeCX#hN0AbegEEUR7HKB*>Iew*3SVNw0aZUmiOd6_Y&vW~1w|M!h9@kbo1vMn} zKF!2Fcs}gP!%t77e>%TXIHImaM*JQ8(c08oY=N>~!*Og2bQykrK21&aMfyg8o=WrA zd2BB>1umxRzl}6CY3F?PuJ$TNE5oz&xNCCxDc&sL22K-|Nr>T!5Q81VjxWTrIkFs6 zAs5$oS`Ksfia&$dp} zm}f%A(}D@IadDu^)@v+r{-v4Vv+7lntM)=wo(K7TXh>W*$(U~lWN6eX8qX6xyv^lL zd7BuQ977!!1eezvo-1A)m&Nxc>RTZNw(sSlqTCDnDG-3aT|@t(U8kyLew*>Wg|^{) z&N^W9d;{dbbcqC+SsSdoIIPCPd+F%rxKB7)h9Hm|MlU*oR~2x;F0LXrPMMzXUtN|;H1qMUr^DJi zaopofal0-3n@COj+}hH&9S@|z+Xn)h4DdG6W{Lj()eVI>ZST8zVbkF{v3$&krb)yk zbNlk+_72&Ele%Fpi(E(HP1e1>sQUgqwI`W?z+RA5IMt9(1edJ|8Y2piT@2*n{u*+$ z@JI2z!a3$HW)?N{l>|DZE>oZfMWnyT8$NM!XMNB6dhJ+FI@WBn@q8Y9 zn1{Xq+$w@Nb3S%ZH|hOkFFaYd@J5yn8wV5OY!Q^BAh+Y8{HQhD4W#?zS{rtLel=m! zLQfuE)}G%#wtn$ZO#JLPIM~_RwSgS#dmZCsYx#p_3tdNxo6(s|Bnfb`czA~B6_TZ- zIE!@fXu6D z<-HVkVQfCn|4lbcqz-+CC#IfiLPHVGU0G%dvm7g|=1l=_!Tq-PebmiJzl*aC6(ge? z6HfupoP9U&Zh$Lgfh6D?F~-&6;^OnAcI(x(Q91Vmzpr0C0!%FqHu4DCj$GU=r>ajz z_sEXpUl|!i67Rn)kDUXk<>u`m28OCS_l@)T_ORQS*pM?RNa1PQ_m(v;HxCa9!!Ur= zCTbi>dJC;3ZLF!Q`x5uaypPscHMIe-9!?6iNXs;M_=z)&7GVaIWG0**gt*x;>F&l9ioGcVYR%$_0dwW@PhL3 zF{`jQ3_z&^>hJW?cMi49dpPX+igiHWjEltcY=RopdE>WtZBZ2N+qjhIn53~ft@zEN zsQN$YDdg)I!BXfMw}}Yvf-aK__byt#Sf(l^&;%YLKbB;?)mLW^Q@*@XpJFQJz9TjS zPr8i128mQbv~QudmuoK2y^?>wSvk^(MC1X?3=fY2t$_za$fV(P_?=w@clVb{7(3-h z=R)#Oq14w#Mn~QhULL^03d8H+b)tII%;tb)vxZ8z?KSV3Vnplgw;oR~;Ih=llVr zui4uSibtBe%Bw!^s_K%T5ujn?Q+^DMG19PBi2V1u$cfC)o}aiZ&`uXJ==dPyQ7Hr^#B{<;UN|VysjC$rc96MFS;{wObrqxz*^{ zz33P=J867Hfwg0&JwjVs`_gh!6Qvu|tsQDGpTVF6jb-w+Q$07^v^?|n&dx7lGd9#DVqoW(RxwXCw4=@2NhiDA5wmeqG%J)KQN^38wooXqI>)7ie)t9}PR%=nv-d)9id3nSFB+$3s zweTCTaM4ZM@p4`rt+YSzg82~nx)nf`#9+GeHVGq`Bte6Vz?k^o;N>}jMj54j2)}fn$My5&2cvvZ46wPg2M?}g6tE|;|o)+ zMEc$jqEttJLt9~_AQh9%V_1H#-4j%nFs8#KWRjPaHEU~v_h=-zhGD}=jp}twF*~&r z_a^(L7kR1hqCQzItp+jwUh+ig>nY)jFJ}BQ*Q#oq-gV3=fKN=U^xX1jUrWnJ*SuC@ z4J|F$wEE??6N@iLv70Sy`S%++L$hn2Smv_A5H-aKfPc`*J$#r0e^9vK%a@Tsb!;gu zZ3Yv=9UdaQzSk%FUDgeP2?aG5DlVNKWQG9LHsovZ%BP$X3T6y$%f$a*O;;IEMcTFx zp>&8KU4kNA(j8JF2-1yoNOvP8N(s^>r6MII-3ln((kRm14d0FXe*D>GIXh?OnVILV zEBpj(e=P?Gf0G$Q@>YR^TI#;P_B3rCTIv(K`e08Is$IS93`d6X90foAh-42ii-4a^ zPEIaDM4GO6|3!iq^w`qV(}CCqQ=^#HRv@Qm%NVf5x5~VOv!0;%H=})2k-k&aCtPdq z`GVVAktqBdbpA<2ywp0P*nr{$o^9NOm~nZJn})3`(P=}C?<@OtwYPiyZoTJn3l01u zOHJsYy=$niPf6+PIQf;*y3*@(KOaVS=vhE6>dm}bf%Z1LL47bj!JF^E+~cKbrlxhe z@LC5$G0>8-8UpeGG^E^JHntQwubT)S)FLGf`Pi$!8Z)UjEE(v*^>O zw$pIIb}f2>6}EaX$%gNR@k<*AFn3!>O7v=g${{Bv)&z4OU^r8YU6#; zkCpvE_6bl%YeB~i7_eYa>3_D-2c$xsa!KRepUk%bD99-j9{vLst;UtPq*usHyM27z zbE=vX%>N1s3+o+dy?~y&9|Q}I$RPQz9hv&_rPt(mC49%>-d;~1Xp@A5-UJO97TvEe z?=+LZI0<^EF9x#n{;eUKc3Cr!D!I8qHj0a${sG6Av+iW-x@!LM$*K+#0C9MGRD-~F za7=#w^B=K~VCRQsGk9e4^MA7Fqk8tS5qb#}6zl%yJCgwV04wv_YW}d05Rjh~WN3x$ z3!J|(L8dS*O%LP?>)iW5^HeeAp*ntWbMq!B1VY0bIF}Goo|kGd#rvFXXu?YZL^75x z;4ZmrOql(A2Z|X&b#Al%SCwGP2(I1GjD~q6%+l>b1M#`IV*M`;cK;E;^PDM&$;bu^ zH2Z$UeKd{;3JNMLWDyY&f%!44|72zP#t?(;${;(CofrQ6nQCmHY=M5uYDj!{psQR*iWIAueP%J&X~mC|H{5m zn=P@6n;X!ZMXha8z~UD>chGoq2^Ka81Wz-C5xiKpl)r0@TLh`;9KA9OHI9gg0Emo% zCp5MV$RwhN<)i^~NxHZx76Ogk&%j&$^W9KdrV+e2zrfo$)8HKva^rgB;eXW-i%&r0 zy1bBRczrUGmf&z17&!gac3jlF`&cEXol4M!o~GF!I7KA$;kOOl9UOjDJMKMZk0cTH z_ys!-ur4bKG%~eVG9Iq5g3_k{r8duVX;ag`)hKA$z{6rt^dP0BkNW{<2*Z1j0^_hA z)(Y123z;V2gb( zwyrH2Cas(%UVzPB4uMIJnAg5Xm7P8e!&j(O6clu%zcqtLVQ=b@K)XkG(g1pvcDblQ zr8Q6A9?Wy8xy{eRZ(j|5a(OIV#v; z6E9~G^4!(M40#Urh2ZZ^F6d(V{JCnTC`h@qL?8XWZU#PSqY3^EX230220f?Q);?G| z3cgbBuO+$Ne#DyX?C`n1*?t2(W8~|q>d2`EeDdDU@%HUOe%h5#q*eN7EiFyAc4H0Z z1vKa`4ridn`jDv$v`*tZAkf$_*g=4A!I$!KDfFFs@w1qf&6|~B`+LGoAbqB3n0~xg(lnHEv_2k&52W;x zy>gC+4{3t`E)j1F8>*?De<$urWYv9}m}od_0qw>2j%3F;s0Oa}M(Dso53tZiS#iX< z=A8AnEWm;4T~>C10SNMwjb>e61(%#A$Hy57U$0s(Q2U=}Gedg_BKwOB(un_h2}7^Li?y#zZ9fsa7W(zx7&MmWdFvQm5Q$A@ej| zOGgJlX&{~mgZS+1Ivc~G0+%c@5|Zuu_x`kP90>^;`wf?`wS!~8pbKQ_% z?7JN|uvVBfqJzwmi47@)L9gSj+`FWtq(sgBW)Cz8d|ZlG3d(&XLT)aJZ0SKSy_)uV zD_}&$uKN`^;SD_P+w_hcf_N|tAZdJm?|iVEQPlckgwZw^5D*Y8mO)A?z$735Z`=!<3UtWUXswmo zUe1b;p}sLf0?)<(zarjGF#0wofzX|DHV*Sot)!tNiVjLKKg*6NRv1VM_jP>J6LMJw zJO+donAs4=%$yqoDLgIhxt-nO+L{!4R$MTM;LuzPF#@0hqA1w4X7fPf#Ku&u<7O+c zzag>W<>lSn+`RVE1GzeOL(!{~B_3||;HO|r=;ZV|K0dFcq{Jaw+NtXM%a@aI`#`w_ z?8i!riX!dqI>LwG=7L<6SW^n|ATkdx&IhTId@}b)DvA*>HjRw<3*im0W!XPGw`LkR z%vV{!JQJU&(*5j^_3m4_f(4W3#ef&0rv1CVz8}+f9Z4)TI8dRB+PwGYTX-Do`C=FQ zanp52KTXSCy%Ke*Ny`|tu5@(V0sY(K-L88e-^js9C!hdG#ZX;H~IA%gVc2Vd?$)hh|@e2 zo7C2b2Hw)*TM?@HdgbQRgL!WnkDm{K-qT;F6R_^}xOOEb@#46Z7jkv!z3`f-D}f~$ z_L=swGA?4`#4IVpbJ&&esDvv(cHMm@`LKtt3lJr=cOKuwr7$w3|H!&4+~l;dy3p06 zRc6`(Mu6aetf!|35oH?&_%3teYHiWX+}v^agALweot-KlmC_r1&%R!c1JetVq<_lP z7xdsh2Xxxa&0_2zfv6(=c$u8=H+7^`RHq}FU2r8pJ>@j*d;@}~7JYmhbk|cZDm*li zzc}y={15UodE$vqdpktlSOV!~pd4$-Z-M61Rn|M^`{#SfCp!x;eUQiX( zuXV|`fGuNpr=wg_5=gXObisDBYLZ{t5XaSF-Ky zUp}!@%lndY`DzBWE}(fyL<^3C{;;)0l5nmE;mr(LK7_CW^I`z;6uH@+9Z`d{_|Qk? zbUu4r+FVd(AIN4`$`l22C2PD#qCUsVAh4LkX|lRLUXCvbv*`Pa)*$-dw+9OA+6ZNG11aywKHO20cnK!Q59olPU4f@=I%@+V6X@)(VP#YmkjU z_g$ba`raNkd|Z&CWAV%$rpMwaG)Q(#Nhom8xtbw|!;$83LFEz6#vK8JXXP!jb~^)u zy|R9KJtWtuOh1d!bt~8M*0!!F{E86Q{fE=J{#WSk{uizO{qjFp?VI<^7yte7E6RVx z^Yw540cijIcZ4u8f3Q&u;F=z?Pt8@m_vGkC@o&2q+#g@1oj?gu#@2QUL^4yx+u_JdQSyG@5wLhXcyISi5`lrUG^jjkZOMp;L+1cXBk-@Pb zIUF;*>bHbUz9{P&0>84793M|fRdP~#t*oz=`4kd`%s z%BhtE?ZyEhs9pl#7#14Z3{Fl88>ZMMf9K}rR#sHt&Dqc?RLzG3_4L#zVkOBSIHszK zxT93FWaa`Y^4Xt1U(Z+1&CLLmXLG7%sM4mixR}zz;8kP;gruY6V^p#)@$qJm`uApt zC{Kd)9%w{=xCJ8c?yH1G;J8f?4%_QBj%~mafKq^}9kG6**gXPXITLAhb-H1=Y}X=e ziyKhsi@B}OLL!Hr1wc|*aNpBOKxx8XgYiqXpu)cbln*#GRJ@ps65NxQl||#@)0Dsm zwf#by3Vk76Lqq#KRae-yA#MdbI5=!2CE38Kq6Qj8u(Gm}hGJl@y6*fjgLDY;Pu;3r zKq>*|D^FD(J_^pBF)-vGJ$eLt z8+IFLGz?BoVoj%xp8a4bhvNHeA0t)FKSR>^C8ys)d?GmcvU7Z?gT7oc_be9f<`d>y z;hT67uU{<-*^Ht=P6x_Ov%XcWJwOIRrdF$Prh}w785PyFj6VUQPbZ^gQR^=tC=t^@s(l181y)d?gMMP_K!R#a9RlYG#vDt2D- zTL(-lTCFjUpZIl|eJfPFOX_@IkXD zO~l&{Kv~fE0>qVvS8dlqDCnyV>6iImNeBt)mTHy#vnas73(*~*SmNk_`Xd`~q6mWu z3K~AnfE&BIa0ihLNWNCr*DLI2k(imW!ll8y_*%=Uv-7QrO4!k+h&cMmdb#rH!JA(& z0f?au0@QQ4{j5ZSnQSE4Ou5DTVslCKC+E;vb49x$Atx_C6 zgP#Hq162Q4DnW)AyRF!;NnQ+S<+v%SspO8$PDi#?NIFb4g!qYa@i{{DoL%R|ab`&+a2LmyZx#WvxU zX07TchH&{2_rKx}%0*x|16KkddxEEfPykA!XHiCj$lP_7bPdsMlUn&@bYTO6MlEH9 zIXOYe$@!}J(7Hv>ij5tF~&B z(@OhG+C!7tsU|Bw|Ic?~w7~%ANtKqD$Nw%#r>Vwtx_tnxJm8h}bSs8olS)&+Nl$-~PR++63uV1H^?yrn3$%m4JNi@> zRpJ;#LjaTSeY6P$*)GVYL6r{^nNzc6vQEItonmmbd#wNJ3_vs$7Ouy}5`YN?AnRAa zp|JN!5{D8~JOBbI1)R>`?lBi>Jf1z@Zc~QxbalFJ350vt^=r!@MgpL(j75Ywk$jN+ zt%4bPR&a3cpFhvRV;%ozZ=+C{2Fsnbu?Ws<`mbbXfB#c=DEgoU2w?k4ofptk(n_G@ zcn|9dDrgI#0O{o9JaUhW{eg`y383!%O#qE^w1e*B!|9Pns#;odSi>jy^s#8!gVVQw z*}iHE3b&3^AnuQX>@zgP4Yu|m&t`3U9E?9*G++eV4a_%II;Qg;e{62HtBp?WrM?Ez zJ@~JkE#5SA8}PfPpxcy`lq)u)&c^2g@;#8|K>LH0r5gnHpgp)TRr44m$NyZzpR-AG zWSsdJU(C+12@8Y##bu+*N*PUzeBAw?rd(dDy9-G>^BuV4hp~EWO(0oE2kw44J$pK( z)r;bmpi&0R4G2$8n^QNOoy$G<%x7z!!H#F39|$9M$ir}g&=&!Yb_G`9dh1u7_?0BvF3&Pb#5?@Rm}(C%jMCcdb0UU zkcafhfCm|F7vuwi?zsI$TyR6#^j_g&VTDIGX{)HH(B;CqU}5b|aQk7eja-V>VR+3($|s>{`?WP><{?+clhN?WGG31JOt$)m4MTF z=UbC7TuK3-<4=$>v9-yfLnqO~-24XG5!5G;kU%Bp=)9Jco*wu1Ehzy3eY}D|)ZXEt zlZ(rzi>#?eeYwm4g#&SA@5qo3D-?5rNfyUm!nVNS}1~Ww<2m+sdJLVD0p3FVWSniLk6B*Gs*2=;qUJO%Am<# zy2p)XNNc-NKy+ONws0)6k34k009h) zcXV_P&$j#rYFb#j`mwsYx}dn7SJ$3(#p>`2o zO&~@M=g7`g&9Y_k*$2{~*IpV&>_B=u>*qZPs-_S!eRlu)^YUt-XO)!+fon>51jRU< zD0Ed6yDOo;i-la{#(JGm0Ev#rc@eCg^iEFKZfg{3y}o7|7&Q6C(V#=K+oPbgH@&*av-z+VPA3j|IpOu`n?yD5!@# z2D%sL`$IQ?^fv}y><3@`k_KL5hyjeu%-$gQ2S@4mor2zc0MQqCuXqcOUTzSRqtu#o$^fL>)h)udi>3|81b!VSj=6vytWTA;ZmA#w62K*HR=A5r2Ua_mJ9z zWD%^b&aXKndNoXmHq*b4pUPtkC&u{{hxaoJMMRYvtp=M)u+gdG3Zeg+lOWQoIe za$CQdF(giroGEOKj2xDfJbj}>K5(Jf_H`GhFQ9Cf>wlozXUkVi3o>6&^rZgr zSizDVMa28`BlyPlB_5Dg0@mZ-O|?OPh$i*^x*^?9@bl*u2lo8h zTI#!4NsG75_{*U!gRkHZca3&w;RDwl0p|cH_{?BvUFKbYcHK2V1ZbdMGj99uT5omz z2hr0Z-oK{ZzG+4m5EOtCebbRCYqC~&Q5~-+_)b5OO?Q>@F4Ob}X;;6=bxo0zI=_nO z%10$o0{5GbWSE3-@^W%YfD|)9-?OlwN3Ad*xJQ`yF5z9mS2x1zFZ5uW>U%@mWP|_j zTewXG62^Art}^dl|1BV)!^zertberS-+auRARp;`@A@^-D3TXJ5E@ zW`|A-Y`zv0+377GS=vym-epxyNPOT-5F;Z#Q74NpDOXVM9$r?Ab-kMK(+5N@zX=B~ z!?y&q^zlD)orciL42#`$ntsV@fG{&!U23xGg-P4$dgyKa-E(7Y`cQyBS6@;$UAM#6=&f-zbE`Jf&>3A`5kG8;Qu=6Cob0;Sblv+! zBAEM#M7g1d#`q^!&iXZf;p~-8Ia)R6_QkAv{*_6JP)gzF#yeHSiqh ztZw~zs_)yh-$20gmHp_FVy-=*q^_?<=e6mRI;`T}x(`Lh`O>fXQeNd~V1$lQ4@g!@55@G$@T=|hqW$i%EA{fuX7qpI|p ze>~`;jveloeX9%|Lv(8<{m;Gyh&Lm=CeWAjEK16_EvkO>e$xLucG-pl208t3F-H zM2Wz6-%?-tpI0|RcnBVhyZplq-tHkG*@vVNj#X6CimXq_RUSuTG;=XB6jUbN?nW9t z^Sb)6Tapx=%@( z_2sGD+6BYbZ**G7Z4~aEccCLZK2+Eu7k+u#eP(H(qCG(TxY2STbb@6ms&|M%89J{& zI)6CWZXN%wqu!isu0d9-_adU?9+d!&(}-!=PLX3`PO^E-N_4}n|5U&B8xB)^~<98)Hl?9I$4BGN!~ zg-;W&AR^=?C?s@S5>m!Laq|TQ1-i^6!7+;Wo!uSX-Q3zqz~pg8u?EBcp69B3o>I<- zpAp?}4`-qiG)S9%GYs>JYQwbxH||IbQuChR)aYl%SofPp-A1>R{SC98s>Q2=l}V+} zw9|{qC&s>Q0O8_lwX`3e@vS?msi}RE_Rw+e4a!E^#^uRbCKNFppBv2YX!_%A)Ab@1 z4;&Tb=Da`9&88fUOSni=aS3xXe7x23NJHdT`sb^Rj7Qfts)abSUEltkPQEA>XvS;L zo|L^lG)92<~KHCoQ?-i<(14!2wmlkKg`*+Mx=7sd^XFYtIpSSX* zrAD^HK61jvZ-R}ni@0nl**7Wc0E>EVKuX2Wa?#( z6bJ+?053A94FRvJxs|5ZW;NHn#eub3oUao<(8PasnN^TZ;ZV|m43!WwSq~iga;F+9 z^(*D_)EU)(uD)J{Hl^%wT=0`b4qGFSrjmke!mP{`9r-tNF_Dot**W}`3dwRBdBu{9 z(FguPcjN;&TXEfRhc4|?YFg{>t=gaEs;;b+G|uEbPAvOb#$z+47hS`KE~)1;^(W-b zY|3#$X4Ndip6JP0V$(COXD<3Jk=bX}%h5s%ja8`oC^j5p11RVHeJ2J#PQ9M5ts}MT z1mk}ucqNDb8RP9;weT3iET-UGiqFF{?ArP6>LU$Df6j9L9GoRn=b({{jG+`JqP*D@ z5h*Im*oB+a{A|no=aX*Z6_fLpMEqF8v{~D6cFErozm+J{s7`h({#M++%CIapvNj_5 zAZvu@&h8%SY2-_haHF`hR4C+_(dAWA-c`~2(lYcPPFX2Ai}|O~(_2l{Ka|(?@@Eqnn~pn6+k3p+ zb&|eyadELoDdy;7v!P+uciC`O(y%yj!q?;Pe{mL+UDsRZn9*ZCS!46@&kNgM057f_ zo8~`i_pd*S?p_@fE=l#)+-a?I{DE4M7|Cjqh7LbElKNkXg__Fc=IajCn-!dGTH{zFlGx?jt59!U}n5 zR{@(S5~eQtXYoMf8$TFSBy}frDU@WdX6f5gH~W<{9tn!PZ+W2ELr4Fk*_j4uyS{k0 z@d}w#JZ`O&;)}gbV$Vl0^ccrN72Vu>2HD5_#}o#;@;@l9wgW!l z-CuNDVA9>SlAu-+gp}VJ+#|7#5IY&IwYWTO%y|<0?i9h?bYI@R>gI8|11~d`(dcDj zixCG29kP3Yca`^%cwg-3$2Q@kU<{UD^|Qe21Nr^hp?N7`Ll&#FIYzenS2A@sqa~A(^oyM;%E)_?DHeg(tNI_S_eL z;-4+3v)T(k@gCfvjDSC!PHv7(AB()--(Rd`z0wogh<_1~z1N4@B2&JSFNPejwB~O@ z;h%T2x8r`!503WtrU8y$%iblXGSEV+V5MXAkxIq*i(EQ4vTj4Y(4XwAh!}*2S=WsY z3PQy?$ylU<^Xc^T0DM#D6BJ~>hkbiKfnRABg;*b;uOE3eFs6xK`g?fqg1E&g-DTXCH+6cnFU?qDVgIMutZw_>c~mXsR*`qf5P3sy^67Hj+N_A* z`EmMeo%0G_f=*MZlOFXI=0!zwq~+4>ysi&jD2ji)0#eiO%9P%XK@o5mzWh|AdP26e z=tWmy7%PwWrEI|@GbXnA@g-oLBW(aTQi&HMU1%u>vF>z>|s zoEuOzcPXL09IyoU6RVLSf@D2)?MJ?9gpV}eFk{I~!Bz(W>`}N!F#em7=MQluk!`_J z$4ysFIF??Uya;A(U24ePfjcWzJj4-J=O?WD?*D`5$g(J7#4PqFSaoQXn2qrdmCxre3^}-$CvnTaPG9 zT=I+wTymwkZRT%XV|#jg?t2wmZ&wf2Yz}!*-R93V0s#&1ASNH(ny%ujSK9p&81$%$ zMaN@avZ=4hZF)jq$n7A0@0r5d;jn-b|K`Q-hPeAm3fq6*28*Fas%mlnMM~hA7l(&gL40CHd*J%vvFT?cG{jpJ@176>J2N z>a=s8$a~z$990zsf1^{0Ee?Fi$BFDX8(Hrf4?3y_Ng`SYy%R!bWtevM4LW9os1P1| zk$gi0C~Qr7nvQu3rIX7$IXf256s)41rxp6wLe?7Ry_Vb`3g+Sv&kg7Iw4-&kpEdoj-$F_f0cY$hga+7zpi(HA3uLi^GWS9sXF&C8IR-x z+KsAc*0=K7R>{T@zxVw8sTv}ZQREXmaM9EZwO`L5x5T7QOtOv=V+jUQ_tZ^JDSf={ zB+jrLfD%zULUuHcb64H@n>;tCBmu%;?2pgBw_VPda?Wu`{Z43A~$~%64_Zs4^-$~g*d2v$Zp|Z{7Q?qa`nB`i<6 zo~SnA_e4X_lV7DKj+3I}%D*!G7FWFeJ+_ABpA~%292py<7W8=#{`h7JLe{#8^bnES zu^O((;wJk|1ta>2S5W@bk`_;&MCEKX`9A;$u=Na(kPqTS3r0z};DWn4FC5xQ|KTwQ zBfjK{9?^H4b$fdqdmVKqb=U`fJY#r6rDA*gwwM62=`cBt3667dO1aruf=hd_c>HbF zD#jYK?v>we3)rsY>I)x8l*w*==)RwRS0L$|m*46Z?b%l%!v+$}gE>Lc9kSO~+=0W^ z8&y|B)$8)g&w}=j#O_=j$nUBgy+j#eHyBdW-|%v;oKGhXIHjHGc*H0&PSOCy}RK0B?|AjHDUkj&X8JDr5;t-_n!YieK$d^$*`5 zJPhbaUNwvqSBx%I8^*l)knSN(c^*7XKV#>mMHJuiq>BHqoFKauQA z8L?TMdFVdS^M>kjr)|rB|B`|F-adDzz`abYy-M>A6c!X(j-vtbX9bO`!ePSADrd94 zPTxn=pGlQ6VR9h%BSf*Zmr)|<8hgu<1Fr*F1j};~(*qA-logcqkA9kUYd#weLHJDU z?6T-9sOd56^zIyJh^Ia(j`xvGq$SeaI!<}ysTV+kftWmR8&!*tJfRn1SYNsJ?q%1^ z@vytR6eZ=WzvPnm5m$R(Km0N^^vrbMib6FrRj``>Eff4Sdvmt2%C73{)q-3%lSVAd zjvmVf-*u4@%J7tRb7D( z@OU*E0fJ&uKlO)bGX)+(z|VhcqWAZFhFvFyS3uj*<9Eo-4+>SvW;yU2?toYc?t$~a zoon9bQEV2kl+m4%;XEzGskLutLw36qqEzCX`X$krEX?wpP+GprA9jKJ*ONTrV zMq|rV>)orTLI3XL*p;8)=l8>MnEyQjWxw(XYhq8Q&JBf?M)t#o-3jK)&1TsIkL%S1 zkMq)FbJxx^ zD{WoYMGCdN!H+{_WQP5kYSRD3QnOZ612w|yl_n{3-)!#YreAUDeLN2FBxH(T&IVU1 z7T248&>>EHwYAp>4|fTW;4-a(E^xWf^WNp=QihPs{bn=~vz{$;?HZjZ>W%ANzapo6 zA$U3yw&i>NyW``uw)HvIyZgWEzmsT=Cixv$T%2#c$t=oaM3c7?EHlilyX2kU+wu}& zU=`CBPr=P|P+HANC}D{u>~}&E-<8j@u8viXrI#06(=dGzfpS!vl^jdYLt*{iDRT^G zr2*et=)Jv@LjKT-%Nx5q{}Ru7Qbb{-MhwydjZ~I|mcNr1=W_c_ZuN47JyC$9^NwZ2$NOg9!D>OQ`6#&-Q%#y_(>vqV+M!O;%J;qyD#y$fNwLud*soRg&! zFDel<5_bW%H!7vE_pm&BdDSC5XM|Re^7%(Jeno_M z5mE^;iV^ndn}}LY!HnDDhr7*Vl%LmTzsCsRIiN3Ld}K5HXuAHArh3|LO{D znZfO@rg`ms z3q?8tg=$Vs^5=1M)OYJrtvEI%9K-?I8Zn!e7H3xW$bg_;?cJ63WrTP?=0%AmUI#~e zOxUjKwhDGO8h%VoG zlaNz2g`MrIL|pj}Ecn93(J@~~C^tquZrAnm z-H<@!|L>oAlaMY)EzmH++gv+##I zn;S^&Op(r89}~v>xE(f#X#s?hJNz<%UVf)IwX5f+a$HW&z#rRiUsG`;T=N>0i4rcV z6wGbJt;t6S{N0e>u@~ma^n`Q!2S`f&C=q7|2ouBtr~T*|0xcU|y7jN&zjql@R-MA4 zWc8dWp}WDT=})-}+MW6b4IhoVba3Q9AM8#^&MFp2OGy>8zifX(9{)}?z97XiMXvsv zU7v#-1!OR8uYG9o5W~tMY|3NFY&JRZ_%HDXEgycs`0)AX=b@+}!^y@BEl!n>LmM+S zb(KX2i=KR8=Lw{(8!o!!C>yGe6%;_Q`X+kCjS1a5Gh8m4;2KV}_&PbUr`zC=9M8!z zx~r_J&RBCLsLzV{O3ugK^{_Y+U+m!LV3=Qls>+$kEbUj*)717LRi@X^cj~uR?X*x0 zN*>g5Sau3T624k)Nee|R+iR_EZd#qNWU1#hsL!%(X|JVT3GIC*FJLYp2w!b(L2;cF z4KF%(q|tlufGCwbn)hz7!jn9OA8aaw`V40VM}dgp*JxTqQfKPzQrbvV52Qq!TO@GZ z%W%2zzL42)G-s2WuN(^_=3s=sjMR?5J5+wJ|6f&DqQX_-V3nxKYNUWGY^}kn8nx@Gqp_c;uzJlkWoq+z_8Gg|H_cMj zFckf)&EcJA;6agJ_~~I3w_qCXk!Tfx1&qYwYhJ6?dT(vQ+&OCgLtmN!caHhl=7#pC zfV`o#;+oSGN+I`Pjb{d0F2Ac5{U4{NT1Lk!nsB997k?&2#dElNs^D$vz7d)oGCQW; z^TQlDf{n`ld`rx@TS(OFnfHnC#=_oddgPZM5i-PtvzKynQSVd-2U$iN$NF$SuMIUV z#49!vjU=@NRBGM-w$UsgY-I3&<&Kav_FQp^>x)b8mz*7kh-dz;3+p`WqC`gyQS(&Q zSK%U)d)4@wt*=1->bbcwF8pN1=6`FRIk4iQ9vUz;zJ4Qy?G|XX*1vF7*=v+ENppy zgDFX0-*v;395H0sY!lju_G5@N4t+W?7>k=-cbE{2JI8@ow$r|I9IHAwygYu0ly`AY z^s6iLlcOetC$U^+@$G0IBvH(=;1l5otb9`*#JAFWn~D^K7n7)r7KjiYb8kDmO;0L$ znEj8N`|9fIW_?^oF7U1h&w)sH!l1?ho*E!SV9`=q;w=s`>2jSSh*`tNk~ zC(BV6Xo7z;zSz7~^a_x=D0{~4bzJ~pxA)5$7837N9Cr4{^&E!qY3dXwZG9j_M`EvJvLh;c$D-Qos7jkY~L z6069lkLF#gywHjRR^ljs+>?N}n96l}Qzw4rci%*s3Yj*TC}fwvRk+%=uQYo`=3j=8 zlrh8HdD0ckKkF$IR}xf@wU4za5n`4?p%BI6NhVs}v@@#~OOqTzUJ8l%oOsn8s<}e0 zXDWI;0et}sKFZRDi5$XIc)gd*+TsWV#;Lrtgjz?2TlB6^r0VHHAp2u>wilwK6k>(9 z){rvvxpfI2b!i5j*to}FDEsCN8VMXzqqPm7C?YQFJ^7?5Qg7fnY?otde36^e`Y&a; z2RR%nu?n zRn^#%o|2lfn+VX$+X(I%+DujzFq7SgdU|Bk7@c~#AN1Z9L;!-zSoGPbRG574&>Xnd z3RDU3UEG);C>9J=YyCrQyg>rPowrMOzgY#1MzDVV`0jqAwR&C!*@yn2INLn7`~|{K z!}FWI1iuGpP>@u}b4U3U&O{Z)4AA{UoNCp9l3C}yx8 z8dyD#IOxh4WIt|Pi>n;WV7$x_skaL##?LUGmJ{Ix6du1_HjS;I>&c54a!znI| zt{L<9{wxY$BZLE7l=>Es<}9Lxrx`QV6U3MDW!^Tg4WU+)7)znOkXd{#s%66UrMKFG}r(|bh zSY!SBxtAMtRnMqF0POU+Z<{7g&yybDDBlZ>ZEu&kc;qE<4Y_h+Jp>g*SntNRB_ z!AmEby_ZGQn>5`1^(;`fmXP0!sV@l%NuFQ1diP=MH8K#NBC6iO1JMPA9$b>+wTGuGBY* z`(++%XE;$vh){3j2m#v++s4cGHD!(f+c5R!-y{MtDDm#>QMYkg=Ii)G)zv#g$<73l z@MJhIezd&n${%YmlT7o(kdKGTs@}Yp2l2&wX_M=j_V+xZ^7d}zfHpKdZ$S~FM790> z{q;}N11|MeEmJo_OK&2+`moeJU7gv<^6m&jAYKMwJqh4+KqQ6XhQCs>bf#B7w-U!6 z+%76b5ec8&I-XWWyA;{*5jzl7h8XyQb5i=GcCE3{8=~BNMvL+V8t&#}@9)nQE}r;% z=UcVe?0o#-qM5madK@*m#Sz7KC?<=KN^2+%>Q5DwZfmmC{w~mdQAFeQLC^pEwkO&Y zxseU=VtdWjBfx+6k8XJZgE4|V;J)fK&g}e+ercxWEX^0ZVPP?!Od!d-c{i@nU##p~ z()Ic*VMOtU84R!8@cn7Ayz9!t%lm;d7pm>a%SzUTHtt_{P?5x5%lhRu$=SP*W6%X^S(fs9x_@cJ#;vUP;@(x{gQjd_;qCY}m?M(8V%huc?jrZjlZ|BBx3?5narJ&IDk zEr6EykWMVsw}aP#D+A%(0Fvc{x)iKv6S%(`zixL=EX3|fl9jIUTE zqKQ#36q?7k5!5eSGtc)8RSwcjB4Dd%T*Ur>mK6M)&iM9qKct1fB!)iU&(Qb#J)%=p z-?Hy%7%_lg)GfTD?9Ej5z*oZe9c~^=$mu6t7rJ0XKzvEz+-|j-i0lW*0lF@! ziucVB2=j7npf|m-Yno+`z4fKjt&^)YHP<{tF|Sezh0q_9&N#v(^39f3n%XTEg_Rj! z?<(7wKhai0c*5_S1Che|M9Stk*jQRlRXcyYahv<_9wDWN=YSlaIqw-T|H8yGz<7?z z=+)BzO58sc>E5}y$AJrTh+nVo|BHp!P2c*Ed(A7TNRpp(#RmDKwfL90k?vqR?C^IE z-Qekdh5c|Bdk5Vtf+DR;xUE7P-MqEs!q>8?fooEF5d{%!QIBBs3NTT|(tm<7NIJMk z^Wx*FVu1Ex*LC)C{S|3V-?Y=Z`z6SFAgtpsE9D)eZIkzN!Uh=)$bNUPQuUE4?J8w0*8R>}sYhdc;O>^8W7^cgg^S(e~|{i-#+=L7Q{3 z#7X&Sne>iC|9^TxoWjPK+Yayj3#`M?eCVGpBzXqpETQpOQHK%Nwq5 zG70GyR1XlvD>6pVNMn9I9Dtr{iR~TcXC}!(#4WSFaHmy CO^jgx literal 0 HcmV?d00001 diff --git a/Wrappers/java/doc/images/import-existing-projects.png b/Wrappers/java/doc/images/import-existing-projects.png new file mode 100644 index 0000000000000000000000000000000000000000..d4cc2d539323c55fefd6ae45a56e1d4e0ff0a111 GIT binary patch literal 96501 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

+ + + diff --git a/Wrappers/java/jni/UpdateHeaders.py b/Wrappers/java/jni/UpdateHeaders.py new file mode 100755 index 00000000..ee7b5b50 --- /dev/null +++ b/Wrappers/java/jni/UpdateHeaders.py @@ -0,0 +1,119 @@ +#!/usr/bin/python +import platform +import subprocess +import os +import re +import glob +import sys + +if len(sys.argv) < 2 or sys.argv[1] in ('-h', '--help') or not sys.argv[1] in('android', 'java'): + print 'usage: ' + sys.argv[0] + ' ' + sys.exit(1) + +type = sys.argv[1] + +# list all classes +java_classes = ['org.openni.NativeMethods'] +android_classes = ['org.openni.android.OpenNIView'] + +classes = java_classes +if type == 'android': + classes += android_classes + +# decide where class files can be found +if type == 'android': + class_dir = "../bin/classes" +else: + class_dir = "../../../Bin/Intermediate/x64-Release/org.openni" + +# run javah to create the header files +if platform.system() == 'Windows': + JAVAH = os.path.join(os.environ['JAVA_HOME'], 'bin', 'javah') + if type == 'android': + class_dir += ";" + os.environ['ANDROID_HOME'] + "\\platforms\\android-12\\android.jar" +else: + JAVAH = 'javah' + +cmd = [JAVAH, '-classpath', class_dir] + classes +print cmd +subprocess.check_call(cmd) + +# now create the methods.inl file +result = open("methods.inl", "w") +register_all = "" + +for classname in classes: + prefix = "" + postfix = "" + if classname in android_classes: + prefix = "#ifdef ANDROID\n" + postfix = "#endif\n" + + for filename in glob.glob(classname.replace('.', '_') + '*.h'): + with open(filename) as file: + cont = file.read() + + class_name_underscore = os.path.splitext(filename)[0] + class_name = class_name_underscore.replace('_', '/') + + methods = "" + while True: + match = re.search("Method:\s*(\w*)", cont) + if match is None: + break + method_name = match.group(1) + + match = re.search("Signature:\s*([\w\(\)\[;/]*)", cont) + if match is None: + break + signature = match.group(1) + + match = re.search("JNIEXPORT.*JNICALL (\w*)", cont) + if match is None: + break + method = match.group(1) + + methods += '\t\t{ "' + method_name + '", "' + signature + '", (void*)&' + method + ' },\n' + cont = cont[match.end():] + + if len(methods) > 0: + template = """ +static int register_%CLASSNAMEUNDERSCORE%(JNIEnv* env) +{ + static JNINativeMethod methods[] = + { +%METHODS% + }; + static int methodsCount = sizeof(methods)/sizeof(methods[0]); + jclass cls = env->FindClass("%CLASSNAME%"); + if (cls == NULL) { + LOGE("Native registration unable to find class '%CLASSNAME%'"); + return JNI_FALSE; + } + if (env->RegisterNatives(cls, methods, methodsCount) < 0) { + LOGE("RegisterNatives failed for '%CLASSNAME%'"); + return JNI_FALSE; + } + + return JNI_TRUE; +} +""" + template = re.sub("%CLASSNAMEUNDERSCORE%", class_name_underscore, template) + template = re.sub("%CLASSNAME%", class_name, template) + template = re.sub("%METHODS%", methods, template) + + result.write(prefix) + result.write('#include "' + filename + '"\n') + result.write(template); + result.write(postfix) + result.write('\n') + + register_all += prefix + "\tif (register_" + class_name_underscore + "(env) != JNI_TRUE) return JNI_FALSE;\n" + postfix + +result.write("static int registerNatives(JNIEnv* env)\n") +result.write("{\n") +result.write(register_all) +result.write("\treturn JNI_TRUE;\n") +result.write("}\n") +result.close() + diff --git a/Wrappers/java/OpenNI.jni/jni.h b/Wrappers/java/jni/jni.h similarity index 100% rename from Wrappers/java/OpenNI.jni/jni.h rename to Wrappers/java/jni/jni.h diff --git a/Wrappers/java/OpenNI.jni/jni_md.h b/Wrappers/java/jni/jni_md.h similarity index 100% rename from Wrappers/java/OpenNI.jni/jni_md.h rename to Wrappers/java/jni/jni_md.h diff --git a/Wrappers/java/jni/methods.inl b/Wrappers/java/jni/methods.inl new file mode 100644 index 00000000..42d40771 --- /dev/null +++ b/Wrappers/java/jni/methods.inl @@ -0,0 +1,124 @@ +#include "org_openni_NativeMethods.h" + +static int register_org_openni_NativeMethods(JNIEnv* env) +{ + static JNINativeMethod methods[] = + { + { "oniFrameRelease", "(J)V", (void*)&Java_org_openni_NativeMethods_oniFrameRelease }, + { "oniFrameAddRef", "(J)V", (void*)&Java_org_openni_NativeMethods_oniFrameAddRef }, + { "oniDeviceCreateStream", "(JILorg/openni/VideoStream;)I", (void*)&Java_org_openni_NativeMethods_oniDeviceCreateStream }, + { "oniStreamDestroy", "(JJ)V", (void*)&Java_org_openni_NativeMethods_oniStreamDestroy }, + { "oniStreamStart", "(J)I", (void*)&Java_org_openni_NativeMethods_oniStreamStart }, + { "oniStreamStop", "(J)V", (void*)&Java_org_openni_NativeMethods_oniStreamStop }, + { "oniStreamReadFrame", "(JLorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_oniStreamReadFrame }, + { "getCropping", "(JLorg/openni/OutArg;Lorg/openni/OutArg;Lorg/openni/OutArg;Lorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_getCropping }, + { "setCropping", "(JIIII)I", (void*)&Java_org_openni_NativeMethods_setCropping }, + { "isCroppingSupported", "(J)Z", (void*)&Java_org_openni_NativeMethods_isCroppingSupported }, + { "resetCropping", "(J)I", (void*)&Java_org_openni_NativeMethods_resetCropping }, + { "getVideoMode", "(JLorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_getVideoMode }, + { "setVideoMode", "(JIIII)I", (void*)&Java_org_openni_NativeMethods_setVideoMode }, + { "oniStreamGetSensorInfo", "(J)Lorg/openni/SensorInfo;", (void*)&Java_org_openni_NativeMethods_oniStreamGetSensorInfo }, + { "hasSensor", "(JI)Z", (void*)&Java_org_openni_NativeMethods_hasSensor }, + { "oniStreamGetIntProperty", "(JILorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_oniStreamGetIntProperty }, + { "oniStreamGetBoolProperty", "(JILorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_oniStreamGetBoolProperty }, + { "oniStreamGetFloatProperty", "(JILorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_oniStreamGetFloatProperty }, + { "oniStreamSetProperty", "(JII)I", (void*)&Java_org_openni_NativeMethods_oniStreamSetProperty__JII }, + { "oniStreamSetProperty", "(JIZ)I", (void*)&Java_org_openni_NativeMethods_oniStreamSetProperty__JIZ }, + { "oniStreamSetProperty", "(JIF)I", (void*)&Java_org_openni_NativeMethods_oniStreamSetProperty__JIF }, + { "oniStreamIsPropertySupported", "(JI)Z", (void*)&Java_org_openni_NativeMethods_oniStreamIsPropertySupported }, + { "oniDeviceGetSensorInfo", "(JI)Lorg/openni/SensorInfo;", (void*)&Java_org_openni_NativeMethods_oniDeviceGetSensorInfo }, + { "oniDeviceEnableDepthColorSync", "(J)I", (void*)&Java_org_openni_NativeMethods_oniDeviceEnableDepthColorSync }, + { "oniDeviceDisableDepthColorSync", "(J)V", (void*)&Java_org_openni_NativeMethods_oniDeviceDisableDepthColorSync }, + { "seek", "(JJI)I", (void*)&Java_org_openni_NativeMethods_seek }, + { "isImageRegistrationModeSupported", "(JI)Z", (void*)&Java_org_openni_NativeMethods_isImageRegistrationModeSupported }, + { "getImageRegistrationMode", "(JLorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_getImageRegistrationMode }, + { "setImageRegistrationMode", "(JI)I", (void*)&Java_org_openni_NativeMethods_setImageRegistrationMode }, + { "oniDeviceGetInfo", "(J)Lorg/openni/DeviceInfo;", (void*)&Java_org_openni_NativeMethods_oniDeviceGetInfo }, + { "oniRecorderStart", "(J)I", (void*)&Java_org_openni_NativeMethods_oniRecorderStart }, + { "oniRecorderDestroy", "(J)I", (void*)&Java_org_openni_NativeMethods_oniRecorderDestroy }, + { "oniRecorderStop", "(J)V", (void*)&Java_org_openni_NativeMethods_oniRecorderStop }, + { "oniRecorderAttachStream", "(JJZ)I", (void*)&Java_org_openni_NativeMethods_oniRecorderAttachStream }, + { "oniDeviceGetIntProperty", "(JILorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_oniDeviceGetIntProperty }, + { "oniDeviceGetBoolProperty", "(JILorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_oniDeviceGetBoolProperty }, + { "oniDeviceGetFloatProperty", "(JILorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_oniDeviceGetFloatProperty }, + { "oniDeviceSetProperty", "(JII)I", (void*)&Java_org_openni_NativeMethods_oniDeviceSetProperty__JII }, + { "oniDeviceSetProperty", "(JIZ)I", (void*)&Java_org_openni_NativeMethods_oniDeviceSetProperty__JIZ }, + { "oniDeviceSetProperty", "(JIF)I", (void*)&Java_org_openni_NativeMethods_oniDeviceSetProperty__JIF }, + { "oniDeviceIsPropertySupported", "(JI)Z", (void*)&Java_org_openni_NativeMethods_oniDeviceIsPropertySupported }, + { "oniDeviceIsCommandSupported", "(JI)Z", (void*)&Java_org_openni_NativeMethods_oniDeviceIsCommandSupported }, + { "oniInitialize", "()I", (void*)&Java_org_openni_NativeMethods_oniInitialize }, + { "oniShutdown", "()V", (void*)&Java_org_openni_NativeMethods_oniShutdown }, + { "oniGetVersion", "()Lorg/openni/Version;", (void*)&Java_org_openni_NativeMethods_oniGetVersion }, + { "oniGetExtendedError", "()Ljava/lang/String;", (void*)&Java_org_openni_NativeMethods_oniGetExtendedError }, + { "oniGetDeviceList", "(Ljava/util/List;)I", (void*)&Java_org_openni_NativeMethods_oniGetDeviceList }, + { "oniWaitForAnyStream", "([JLorg/openni/OutArg;I)Z", (void*)&Java_org_openni_NativeMethods_oniWaitForAnyStream }, + { "oniCoordinateConverterWorldToDepth", "(JFFFLorg/openni/OutArg;Lorg/openni/OutArg;Lorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_oniCoordinateConverterWorldToDepth }, + { "oniCoordinateConverterDepthToWorld", "(JFFFLorg/openni/OutArg;Lorg/openni/OutArg;Lorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_oniCoordinateConverterDepthToWorld }, + { "oniCoordinateConverterDepthToColor", "(JJIISLorg/openni/OutArg;Lorg/openni/OutArg;)I", (void*)&Java_org_openni_NativeMethods_oniCoordinateConverterDepthToColor }, + { "oniCreateRecorder", "(Ljava/lang/String;Lorg/openni/Recorder;)I", (void*)&Java_org_openni_NativeMethods_oniCreateRecorder }, + { "oniDeviceOpen", "(Ljava/lang/String;Lorg/openni/Device;)I", (void*)&Java_org_openni_NativeMethods_oniDeviceOpen__Ljava_lang_String_2Lorg_openni_Device_2 }, + { "oniDeviceOpen", "(Lorg/openni/Device;)I", (void*)&Java_org_openni_NativeMethods_oniDeviceOpen__Lorg_openni_Device_2 }, + { "oniDeviceClose", "(J)I", (void*)&Java_org_openni_NativeMethods_oniDeviceClose }, + { "oniSetLogOutputFolder", "(Ljava/lang/String;)I", (void*)&Java_org_openni_NativeMethods_oniSetLogOutputFolder }, + { "oniGetLogFileName", "()Ljava/lang/String;", (void*)&Java_org_openni_NativeMethods_oniGetLogFileName }, + { "oniSetLogMinSeverity", "(I)I", (void*)&Java_org_openni_NativeMethods_oniSetLogMinSeverity }, + { "oniSetLogConsoleOutput", "(Z)I", (void*)&Java_org_openni_NativeMethods_oniSetLogConsoleOutput }, + { "oniSetLogFileOutput", "(Z)I", (void*)&Java_org_openni_NativeMethods_oniSetLogFileOutput }, + { "oniSetLogAndroidOutput", "(Z)I", (void*)&Java_org_openni_NativeMethods_oniSetLogAndroidOutput }, + + }; + static int methodsCount = sizeof(methods)/sizeof(methods[0]); + jclass cls = env->FindClass("org/openni/NativeMethods"); + if (cls == NULL) { + LOGE("Native registration unable to find class 'org/openni/NativeMethods'"); + return JNI_FALSE; + } + if (env->RegisterNatives(cls, methods, methodsCount) < 0) { + LOGE("RegisterNatives failed for 'org/openni/NativeMethods'"); + return JNI_FALSE; + } + + return JNI_TRUE; +} + +#ifdef ANDROID +#include "org_openni_android_OpenNIView.h" + +static int register_org_openni_android_OpenNIView(JNIEnv* env) +{ + static JNINativeMethod methods[] = + { + { "nativeCreate", "()J", (void*)&Java_org_openni_android_OpenNIView_nativeCreate }, + { "nativeDestroy", "(J)V", (void*)&Java_org_openni_android_OpenNIView_nativeDestroy }, + { "nativeSetAlphaValue", "(JI)V", (void*)&Java_org_openni_android_OpenNIView_nativeSetAlphaValue }, + { "nativeGetAlphaValue", "(J)I", (void*)&Java_org_openni_android_OpenNIView_nativeGetAlphaValue }, + { "nativeOnSurfaceCreated", "(J)V", (void*)&Java_org_openni_android_OpenNIView_nativeOnSurfaceCreated }, + { "nativeOnSurfaceChanged", "(JII)V", (void*)&Java_org_openni_android_OpenNIView_nativeOnSurfaceChanged }, + { "nativeUpdate", "(JJ)V", (void*)&Java_org_openni_android_OpenNIView_nativeUpdate }, + { "nativeClear", "(J)V", (void*)&Java_org_openni_android_OpenNIView_nativeClear }, + { "nativeOnDraw", "(J)V", (void*)&Java_org_openni_android_OpenNIView_nativeOnDraw }, + + }; + static int methodsCount = sizeof(methods)/sizeof(methods[0]); + jclass cls = env->FindClass("org/openni/android/OpenNIView"); + if (cls == NULL) { + LOGE("Native registration unable to find class 'org/openni/android/OpenNIView'"); + return JNI_FALSE; + } + if (env->RegisterNatives(cls, methods, methodsCount) < 0) { + LOGE("RegisterNatives failed for 'org/openni/android/OpenNIView'"); + return JNI_FALSE; + } + + return JNI_TRUE; +} +#endif + +static int registerNatives(JNIEnv* env) +{ + if (register_org_openni_NativeMethods(env) != JNI_TRUE) return JNI_FALSE; +#ifdef ANDROID + if (register_org_openni_android_OpenNIView(env) != JNI_TRUE) return JNI_FALSE; +#endif + return JNI_TRUE; +} diff --git a/Wrappers/java/OpenNI.jni/org_openni_NativeMethods.cpp b/Wrappers/java/jni/org_openni_NativeMethods.cpp similarity index 86% rename from Wrappers/java/OpenNI.jni/org_openni_NativeMethods.cpp rename to Wrappers/java/jni/org_openni_NativeMethods.cpp index 63aa9f20..1f0e1ede 100644 --- a/Wrappers/java/OpenNI.jni/org_openni_NativeMethods.cpp +++ b/Wrappers/java/jni/org_openni_NativeMethods.cpp @@ -1,11 +1,30 @@ -#include "jni.h" +#include #include "OniProperties.h" #include "OniEnums.h" #include "OniCAPI.h" #include "org_openni_NativeMethods.h" +#include + +#ifdef ANDROID +#include +#endif + +#define DEBUG 1 + +#if DEBUG && defined(ANDROID) +#include +# define LOGD(x...) __android_log_print(ANDROID_LOG_INFO,"OpenNIJNI",x) +# define LOGE(x...) __android_log_print(ANDROID_LOG_ERROR,"OpenNIJNI",x) +#else +# define LOGD(...) +# define LOGE(...) +#endif using namespace openni; JavaVM* g_pVM = NULL; +jclass g_videoStreamClass; +jclass g_openNIClass; +jclass g_deviceInfoClass; class JNIEnvSupplier { @@ -119,10 +138,9 @@ JNIEXPORT void JNICALL Java_org_openni_NativeMethods_oniFrameAddRef static void ONI_CALLBACK_TYPE callback(OniStreamHandle streamHandle, void*) { JNIEnvSupplier suplier; - jclass videoStreamCls = suplier.GetEnv()->FindClass("org/openni/VideoStream"); - jmethodID methodID = suplier.GetEnv()->GetStaticMethodID(videoStreamCls, "onFrameReady", "(J)V"); + jmethodID methodID = suplier.GetEnv()->GetStaticMethodID(g_videoStreamClass, "onFrameReady", "(J)V"); jlong handle = (jlong)streamHandle; - suplier.GetEnv()->CallStaticVoidMethod(videoStreamCls, methodID, handle); + suplier.GetEnv()->CallStaticVoidMethod(g_videoStreamClass, methodID, handle); } JNIEXPORT jint JNICALL Java_org_openni_NativeMethods_oniDeviceCreateStream @@ -136,7 +154,7 @@ JNIEXPORT jint JNICALL Java_org_openni_NativeMethods_oniDeviceCreateStream jfieldID fieldID = env->GetFieldID(videoStreamCls, "mStreamHandle", "J"); env->SetLongField(videoStreamObj, fieldID, (jlong)streamHandle); OniCallbackHandle handle = 0; - status = oniStreamRegisterNewFrameCallback((OniStreamHandle)streamHandle, callback, NULL, &handle); + status = oniStreamRegisterNewFrameCallback((OniStreamHandle)streamHandle, callback, videoStreamCls, &handle); fieldID = env->GetFieldID(videoStreamCls, "mCallbackHandle", "J"); env->SetLongField(videoStreamObj, fieldID, (jlong)handle); } @@ -171,7 +189,7 @@ JNIEXPORT jint JNICALL Java_org_openni_NativeMethods_oniStreamReadFrame { jclass videoFrameRefCls = env->FindClass("org/openni/VideoFrameRef"); jmethodID videoFrameCtor = env->GetMethodID(videoFrameRefCls, "", "(J)V"); - jobject videoFrameRefObj = env->NewObject(videoFrameRefCls, videoFrameCtor, pOniFrame); + jobject videoFrameRefObj = env->NewObject(videoFrameRefCls, videoFrameCtor, (jlong)pOniFrame); jfieldID fieldID = env->GetFieldID(videoFrameRefCls, "mTimestamp", "J"); env->SetLongField(videoFrameRefObj,fieldID, (jlong)pOniFrame->timestamp); @@ -199,7 +217,15 @@ JNIEXPORT jint JNICALL Java_org_openni_NativeMethods_oniStreamReadFrame fieldID = env->GetFieldID(videoFrameRefCls, "mStride", "I"); env->SetIntField(videoFrameRefObj,fieldID, pOniFrame->stride); + jclass byteOrderCls = env->FindClass("java/nio/ByteOrder"); + jfieldID littleEndianField = env->GetStaticFieldID(byteOrderCls, "LITTLE_ENDIAN", "Ljava/nio/ByteOrder;"); + jobject littleEndian = env->GetStaticObjectField(byteOrderCls, littleEndianField); + + jclass byteBufferCls = env->FindClass("java/nio/ByteBuffer"); + jmethodID orderMethodId = env->GetMethodID(byteBufferCls, "order", "(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;"); + jobject buffer = env->NewDirectByteBuffer(pOniFrame->data, pOniFrame->dataSize); + env->CallObjectMethod(buffer, orderMethodId, littleEndian); fieldID = env->GetFieldID(videoFrameRefCls, "mData", "Ljava/nio/ByteBuffer;"); env->SetObjectField(videoFrameRefObj,fieldID, buffer); @@ -217,11 +243,10 @@ JNIEXPORT jint JNICALL Java_org_openni_NativeMethods_oniStreamReadFrame env->SetObjectField(videoFrameRefObj,fieldID, videoModeObj); SetOutArgObjectValue(env, outArgObj, videoFrameRefObj); - // release this frame. The java object is its own now. + // release this frame. The java object is its owner now. oniFrameRelease(pOniFrame); } - - + return status; } @@ -307,7 +332,7 @@ JNIEXPORT jobject JNICALL Java_org_openni_NativeMethods_oniStreamGetSensorInfo jobject videoModeObj = env->NewObject(videoModeCls, videoModeCtor, videoMode.resolutionX, videoMode.resolutionY, videoMode.fps, (int)videoMode.pixelFormat); - (*env).CallVoidMethod(vectorObj, (*env).GetMethodID(arrayListCls, "add", "(Ljava/lang/Object;)Z"), videoModeObj); + (*env).CallBooleanMethod(vectorObj, (*env).GetMethodID(arrayListCls, "add", "(Ljava/lang/Object;)Z"), videoModeObj); i++; } jclass sensorInfoCls = (*env).FindClass("org/openni/SensorInfo"); @@ -403,7 +428,7 @@ JNIEXPORT jobject JNICALL Java_org_openni_NativeMethods_oniDeviceGetSensorInfo jobject videoModeObj = env->NewObject(videoModeCls, videoModeCtor, videoMode.resolutionX, videoMode.resolutionY, videoMode.fps, (int)videoMode.pixelFormat); - (*env).CallVoidMethod(vectorObj, (*env).GetMethodID(arrayListCls, "add", "(Ljava/lang/Object;)Z"), videoModeObj); + (*env).CallBooleanMethod(vectorObj, (*env).GetMethodID(arrayListCls, "add", "(Ljava/lang/Object;)Z"), videoModeObj); i++; } jclass sensorInfoCls = (*env).FindClass("org/openni/SensorInfo"); @@ -559,45 +584,39 @@ static void ONI_CALLBACK_TYPE deviceConnectedCallback(const OniDeviceInfo* pInfo { JNIEnvSupplier suplier; JNIEnv *env = suplier.GetEnv(); - jclass videoStreamCls = env->FindClass("org/openni/OpenNI"); - jmethodID methodID = env->GetStaticMethodID(videoStreamCls, "deviceConnected", "(Lorg/openni/DeviceInfo;)V"); + jmethodID methodID = env->GetStaticMethodID(g_openNIClass, "deviceConnected", "(Lorg/openni/DeviceInfo;)V"); jobject nameObj = env->NewStringUTF(pInfo->name); jobject uriObj = env->NewStringUTF(pInfo->uri); jobject vendorObj = env->NewStringUTF(pInfo->vendor); - jclass deviceInfoCls = env->FindClass("org/openni/DeviceInfo"); - jobject deviceObj = (*env).NewObject(deviceInfoCls, (*env).GetMethodID(deviceInfoCls, "", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)V"), + jobject deviceObj = (*env).NewObject(g_deviceInfoClass, (*env).GetMethodID(g_deviceInfoClass, "", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)V"), uriObj, vendorObj, nameObj, pInfo->usbVendorId, pInfo->usbProductId); - env->CallStaticVoidMethod(videoStreamCls, methodID, deviceObj); + env->CallStaticVoidMethod(g_openNIClass, methodID, deviceObj); } static void ONI_CALLBACK_TYPE deviceDisconnectedCallback(const OniDeviceInfo* pInfo, void*) { JNIEnvSupplier suplier; JNIEnv *env = suplier.GetEnv(); - jclass videoStreamCls = env->FindClass("org/openni/OpenNI"); - jmethodID methodID = env->GetStaticMethodID(videoStreamCls, "deviceDisconnected", "(Lorg/openni/DeviceInfo;)V"); + jmethodID methodID = env->GetStaticMethodID(g_openNIClass, "deviceDisconnected", "(Lorg/openni/DeviceInfo;)V"); jobject nameObj = env->NewStringUTF(pInfo->name); jobject uriObj = env->NewStringUTF(pInfo->uri); jobject vendorObj = env->NewStringUTF(pInfo->vendor); - jclass deviceInfoCls = env->FindClass("org/openni/DeviceInfo"); - jobject deviceObj = (*env).NewObject(deviceInfoCls, (*env).GetMethodID(deviceInfoCls, "", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)V"), + jobject deviceObj = (*env).NewObject(g_deviceInfoClass, (*env).GetMethodID(g_deviceInfoClass, "", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)V"), uriObj, vendorObj, nameObj, pInfo->usbVendorId, pInfo->usbProductId); - env->CallStaticVoidMethod(videoStreamCls, methodID, deviceObj); + env->CallStaticVoidMethod(g_openNIClass, methodID, deviceObj); } static void ONI_CALLBACK_TYPE deviceStateChangedCallback(const OniDeviceInfo* pInfo, OniDeviceState state, void*) { JNIEnvSupplier suplier; JNIEnv *env = suplier.GetEnv(); - jclass videoStreamCls = env->FindClass("org/openni/OpenNI"); - jmethodID methodID = env->GetStaticMethodID(videoStreamCls, "deviceStateChanged", "(Lorg/openni/DeviceInfo;I)V"); + jmethodID methodID = env->GetStaticMethodID(g_openNIClass, "deviceStateChanged", "(Lorg/openni/DeviceInfo;I)V"); jobject nameObj = env->NewStringUTF(pInfo->name); jobject uriObj = env->NewStringUTF(pInfo->uri); jobject vendorObj = env->NewStringUTF(pInfo->vendor); - jclass deviceInfoCls = env->FindClass("org/openni/DeviceInfo"); - jobject deviceObj = (*env).NewObject(deviceInfoCls, (*env).GetMethodID(deviceInfoCls, "", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)V"), + jobject deviceObj = (*env).NewObject(g_deviceInfoClass, (*env).GetMethodID(g_deviceInfoClass, "", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)V"), uriObj, vendorObj, nameObj, pInfo->usbVendorId, pInfo->usbProductId); - env->CallStaticVoidMethod(videoStreamCls, methodID, deviceObj, state); + env->CallStaticVoidMethod(g_openNIClass, methodID, deviceObj, state); } static OniCallbackHandle callbackHandle = 0; @@ -659,20 +678,20 @@ JNIEXPORT jint JNICALL Java_org_openni_NativeMethods_oniGetDeviceList uriObj, vendorObj, nameObj, m_pDeviceInfos[i].usbVendorId, m_pDeviceInfos[i].usbProductId); jclass vectorCls = (*env).FindClass("java/util/List"); jmethodID methodId = (*env).GetMethodID(vectorCls, "add", "(Ljava/lang/Object;)Z"); - (*env).CallVoidMethod(deviceListObj, methodId, deviceInfObj); - + (*env).CallBooleanMethod(deviceListObj, methodId, deviceInfObj); } } return status; } JNIEXPORT jboolean JNICALL Java_org_openni_NativeMethods_oniWaitForAnyStream - (JNIEnv *env, jclass, jlongArray devicesListArr, jobject outArgObj, jint timeout) + (JNIEnv *env, jclass, jlongArray streamsArray, jobject outArgObj, jint timeout) { - jlong *arr = env->GetLongArrayElements(devicesListArr, JNI_FALSE); - int size = env->GetArrayLength(devicesListArr); + jlong *streams = env->GetLongArrayElements(streamsArray, JNI_FALSE); + int size = env->GetArrayLength(streamsArray); int id = 0; - int rc = oniWaitForAnyStream((OniStreamHandle*)arr, size, &id, timeout); + int rc = oniWaitForAnyStream((OniStreamHandle*)streams, size, &id, timeout); + env->ReleaseLongArrayElements(streamsArray, streams, JNI_ABORT); SetOutArgIntValue(env, outArgObj, id); return rc == ONI_STATUS_OK; } @@ -746,7 +765,50 @@ JNIEXPORT jint JNICALL Java_org_openni_NativeMethods_oniDeviceOpen__Lorg_openni_ JNIEXPORT jint JNICALL Java_org_openni_NativeMethods_oniDeviceClose (JNIEnv *, jclass, jlong deviceHandle) - { - return oniDeviceClose((OniDeviceHandle)deviceHandle); - } +{ + return oniDeviceClose((OniDeviceHandle)deviceHandle); +} + +JNIEXPORT jint JNICALL Java_org_openni_NativeMethods_oniSetLogOutputFolder + (JNIEnv * env, jclass, jstring path) +{ + const char * str = env->GetStringUTFChars(path, JNI_FALSE); + return oniSetLogOutputFolder(str); +} +JNIEXPORT jstring JNICALL Java_org_openni_NativeMethods_oniGetLogFileName + (JNIEnv *env, jclass) +{ + XnChar fileName[XN_FILE_MAX_PATH]; + oniGetLogFileName(fileName, sizeof(fileName)); + return env->NewStringUTF(fileName); +} + +JNIEXPORT jint JNICALL Java_org_openni_NativeMethods_oniSetLogMinSeverity + (JNIEnv *, jclass, jint minSeverity) +{ + return oniSetLogMinSeverity(minSeverity); +} + +JNIEXPORT jint JNICALL Java_org_openni_NativeMethods_oniSetLogConsoleOutput + (JNIEnv *, jclass, jboolean enabled) +{ + return oniSetLogConsoleOutput(enabled); +} + +JNIEXPORT jint JNICALL Java_org_openni_NativeMethods_oniSetLogFileOutput + (JNIEnv *, jclass, jboolean enabled) +{ + return oniSetLogFileOutput(enabled); +} + +JNIEXPORT jint JNICALL Java_org_openni_NativeMethods_oniSetLogAndroidOutput + (JNIEnv *, jclass, jboolean enabled) +{ + (void)(enabled); +#ifdef ANDROID + return oniSetLogAndroidOutput(enabled); +#else + return ONI_STATUS_NOT_SUPPORTED; +#endif +} diff --git a/Wrappers/java/OpenNI.jni/org_openni_NativeMethods.h b/Wrappers/java/jni/org_openni_NativeMethods.h similarity index 92% rename from Wrappers/java/OpenNI.jni/org_openni_NativeMethods.h rename to Wrappers/java/jni/org_openni_NativeMethods.h index 51e92c85..e34225f7 100644 --- a/Wrappers/java/OpenNI.jni/org_openni_NativeMethods.h +++ b/Wrappers/java/jni/org_openni_NativeMethods.h @@ -501,6 +501,54 @@ JNIEXPORT jint JNICALL Java_org_openni_NativeMethods_oniDeviceOpen__Lorg_openni_ JNIEXPORT jint JNICALL Java_org_openni_NativeMethods_oniDeviceClose (JNIEnv *, jclass, jlong); +/* + * Class: org_openni_NativeMethods + * Method: oniSetLogOutputFolder + * Signature: (Ljava/lang/String;)I + */ +JNIEXPORT jint JNICALL Java_org_openni_NativeMethods_oniSetLogOutputFolder + (JNIEnv *, jclass, jstring); + +/* + * Class: org_openni_NativeMethods + * Method: oniGetLogFileName + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_org_openni_NativeMethods_oniGetLogFileName + (JNIEnv *, jclass); + +/* + * Class: org_openni_NativeMethods + * Method: oniSetLogMinSeverity + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_org_openni_NativeMethods_oniSetLogMinSeverity + (JNIEnv *, jclass, jint); + +/* + * Class: org_openni_NativeMethods + * Method: oniSetLogConsoleOutput + * Signature: (Z)I + */ +JNIEXPORT jint JNICALL Java_org_openni_NativeMethods_oniSetLogConsoleOutput + (JNIEnv *, jclass, jboolean); + +/* + * Class: org_openni_NativeMethods + * Method: oniSetLogFileOutput + * Signature: (Z)I + */ +JNIEXPORT jint JNICALL Java_org_openni_NativeMethods_oniSetLogFileOutput + (JNIEnv *, jclass, jboolean); + +/* + * Class: org_openni_NativeMethods + * Method: oniSetLogAndroidOutput + * Signature: (Z)I + */ +JNIEXPORT jint JNICALL Java_org_openni_NativeMethods_oniSetLogAndroidOutput + (JNIEnv *, jclass, jboolean); + #ifdef __cplusplus } #endif diff --git a/Wrappers/java/jni/org_openni_android_OpenNIView.cpp b/Wrappers/java/jni/org_openni_android_OpenNIView.cpp new file mode 100644 index 00000000..c7a5325a --- /dev/null +++ b/Wrappers/java/jni/org_openni_android_OpenNIView.cpp @@ -0,0 +1,439 @@ +/***************************************************************************** +* * +* OpenNI 1.x Alpha * +* Copyright (C) 2012 PrimeSense Ltd. * +* * +* This file is part of OpenNI. * +* * +* Licensed under the Apache License, Version 2.0 (the "License"); * +* you may not use this file except in compliance with the License. * +* You may obtain a copy of the License at * +* * +* http://www.apache.org/licenses/LICENSE-2.0 * +* * +* Unless required by applicable law or agreed to in writing, software * +* distributed under the License is distributed on an "AS IS" BASIS, * +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * +* See the License for the specific language governing permissions and * +* limitations under the License. * +* * +*****************************************************************************/ + +#include "org_openni_android_OpenNIView.h" +#include + +#if (ONI_PLATFORM == ONI_PLATFORM_ANDROID_ARM) + +#define GL_GLEXT_PROTOTYPES +#include +#include + +#define DEBUG 1 + +#if DEBUG && defined(ANDROID) +#include +# define LOGD(x...) __android_log_print(ANDROID_LOG_INFO,"OpenNI-JNI",x) +# define LOGE(x...) __android_log_print(ANDROID_LOG_ERROR,"OpenNI-JNI",x) +#else +# define LOGD(...) do {} while (0) +# define LOGE(...) do {} while (0) +#endif + +using namespace openni; + +static void +throwRuntimeException(JNIEnv *env, const char *message) +{ + jclass exClass; + const char *className = "java/lang/RuntimeException"; + + exClass = env->FindClass(className); + if (!exClass) + return; + + env->ThrowNew(exClass, message); +} + +class OpenNIView +{ +public: + OpenNIView(); + ~OpenNIView(); + + void onSurfaceChanged(int w, int h); + void onSurfaceCreated(); + void update(VideoFrameRef& frame); + void clear(); + void onDraw(); + void setAlpha(unsigned char alpha) { m_alpha = alpha; } + unsigned char getAlpha() const { return m_alpha; } + +private: + void calcDepthHist(VideoFrameRef& frame); + int getClosestPowerOfTwo(int n); + + int m_textureWidth; + int m_textureHeight; + GLuint m_textureId; + unsigned char* m_texture; + unsigned char m_alpha; + int m_viewWidth; + int m_viewHeight; + int *m_histogram; + int m_maxGrayVal; + int m_xres; + int m_yres; + + enum { HISTSIZE = 0xFFFF, }; +}; + +OpenNIView::OpenNIView() : + m_textureWidth(0), m_textureHeight(0), m_textureId(0), m_texture(NULL), m_alpha(255), m_viewWidth(0), + m_viewHeight(0), m_histogram(NULL), m_maxGrayVal(0) +{ +} + +OpenNIView::~OpenNIView() +{ + free(m_histogram); + free(m_texture); +} + +int OpenNIView::getClosestPowerOfTwo(int n) +{ + int m = 2; + while (m < n) + { + m <<= 1; + } + return m; +} + +void YUVtoRGB888(XnUInt8 y, XnUInt8 u, XnUInt8 v, XnUInt8& r, XnUInt8& g, XnUInt8& b) +{ + XnInt32 nC = y - 16; + XnInt16 nD = u - 128; + XnInt16 nE = v - 128; + + nC = nC * 298 + 128; + + r = (XnUInt8)XN_MIN(XN_MAX((nC + 409 * nE) >> 8, 0), 255); + g = (XnUInt8)XN_MIN(XN_MAX((nC - 100 * nD - 208 * nE) >> 8, 0), 255); + b = (XnUInt8)XN_MIN(XN_MAX((nC + 516 * nD ) >> 8, 0), 255); +} + +void OpenNIView::update(VideoFrameRef& frame) +{ + int xres = frame.getVideoMode().getResolutionX(); + int yres = frame.getVideoMode().getResolutionY(); + + if (m_textureWidth < xres || + m_textureHeight < yres) + { + // need to reallocate texture + free(m_texture); + m_textureWidth = getClosestPowerOfTwo(xres); + m_textureHeight = getClosestPowerOfTwo(yres); + int bufSize = 4 * m_textureWidth * m_textureHeight; + m_texture = (unsigned char*)malloc(bufSize); + } + + switch (frame.getVideoMode().getPixelFormat()) + { + case PIXEL_FORMAT_DEPTH_1_MM: + case PIXEL_FORMAT_DEPTH_100_UM: + { + calcDepthHist(frame); + + for (int y = 0; y < yres; ++y) + { + unsigned char* texture = m_texture + y * m_textureWidth * 4; + const OniDepthPixel* pDepth = (const OniDepthPixel*)frame.getData() + y * xres; + for (int x = 0; x < xres; ++x, ++pDepth) + { + int val = m_histogram[*pDepth]; + texture[0] = val; + texture[1] = val; + texture[2] = 0; + texture[3] = m_alpha; + texture += 4; + } + } + } + break; + + case PIXEL_FORMAT_GRAY16: + { + const Grayscale16Pixel* pData = (const Grayscale16Pixel*)frame.getData(); + + // find max val + for (int i = 0; i < frame.getDataSize()/sizeof(Grayscale16Pixel); ++i, ++pData) + { + if (*pData > m_maxGrayVal) + { + m_maxGrayVal = *pData; + } + } + + // and update texture + for (int y = 0; y < yres; ++y) + { + unsigned char* texture = m_texture + y * m_textureWidth * 4; + const Grayscale16Pixel* pData = (const Grayscale16Pixel*)frame.getData() + y * xres; + + for (int x = 0; x < xres; ++x, ++pData) + { + texture[0] = texture[1] = texture[2] = 255.0 * (*pData) / m_maxGrayVal; + texture[3] = m_alpha; + texture += 4; + } + } + } + break; + + case PIXEL_FORMAT_GRAY8: + { + for (int y = 0; y < yres; ++y) + { + unsigned char* texture = m_texture + y * m_textureWidth * 4; + const unsigned char* pData = (const unsigned char*)frame.getData() + y * xres; + + for (int x = 0; x < xres; ++x, ++pData) + { + texture[0] = texture[1] = texture[2] = *pData; + texture[3] = m_alpha; + texture += 4; + } + } + } + break; + + case PIXEL_FORMAT_RGB888: + { + for (int y = 0; y < yres; ++y) + { + unsigned char* texture = m_texture + y * m_textureWidth * 4; + const RGB888Pixel* pData = (const RGB888Pixel*)frame.getData() + y * xres; + + for (int x = 0; x < xres; ++x, ++pData) + { + texture[0] = pData->r; + texture[1] = pData->g; + texture[2] = pData->b; + texture[3] = m_alpha; + texture += 4; + } + } + } + break; + + case PIXEL_FORMAT_YUV422: + { + for (int y = 0; y < yres; ++y) + { + unsigned char* texture = m_texture + y * m_textureWidth * 4; + const YUV422DoublePixel* pData = (const YUV422DoublePixel*)frame.getData() + y * xres/2; + + for (int x = 0; x < xres/2; ++x, ++pData) + { + YUVtoRGB888(pData->y1, pData->u, pData->v, texture[0], texture[1], texture[2]); + texture[3] = m_alpha; + texture += 4; + YUVtoRGB888(pData->y2, pData->u, pData->v, texture[0], texture[1], texture[2]); + texture[3] = m_alpha; + texture += 4; + } + } + } + break; + + case PIXEL_FORMAT_YUYV: + { + for (int y = 0; y < yres; ++y) + { + unsigned char* texture = m_texture + y * m_textureWidth * 4; + const YUYVDoublePixel* pData = (const YUYVDoublePixel*)frame.getData() + y * xres/2; + + for (int x = 0; x < xres/2; ++x, ++pData) + { + YUVtoRGB888(pData->y1, pData->u, pData->v, texture[0], texture[1], texture[2]); + texture[3] = m_alpha; + texture += 4; + YUVtoRGB888(pData->y2, pData->u, pData->v, texture[0], texture[1], texture[2]); + texture[3] = m_alpha; + texture += 4; + } + } + } + break; + + default: + LOGE("Non-supported pixel format: %d", frame.getVideoMode().getPixelFormat()); + } + + m_xres = xres; + m_yres = yres; +} + +void OpenNIView::clear() +{ + memset(m_texture, 0, m_textureWidth * m_textureHeight * 4); +} + +void OpenNIView::calcDepthHist(VideoFrameRef& frame) +{ + unsigned int value = 0; + unsigned int index = 0; + unsigned int x = 0; + unsigned int y = 0; + unsigned int numberOfPoints = 0; + const OniDepthPixel* pDepth = (const OniDepthPixel*)frame.getData(); + + if (m_histogram == NULL) + { + m_histogram = (int*)malloc(HISTSIZE * sizeof(int)); + } + + // Calculate the accumulative histogram + memset(m_histogram, 0, HISTSIZE*sizeof(int)); + + for (int i = 0; i < frame.getDataSize() / sizeof(DepthPixel); ++i, ++pDepth) + { + value = *pDepth; + + if (value != 0) + { + m_histogram[value]++; + numberOfPoints++; + } + } + + for (index = 1; index < HISTSIZE; index++) + { + m_histogram[index] += m_histogram[index - 1]; + } + + if (numberOfPoints != 0) + { + for (index = 1; index < HISTSIZE; index++) + { + m_histogram[index] = (unsigned int)(256 * (1.0f - ((float)m_histogram[index] / numberOfPoints))); + } + } +} + +void OpenNIView::onDraw() +{ + glBindTexture(GL_TEXTURE_2D, m_textureId); + int rect[4] = {0, m_yres, m_xres, -m_yres}; + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, rect); + + glClear(GL_COLOR_BUFFER_BIT); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_textureWidth, m_textureHeight, 0, GL_RGBA, + GL_UNSIGNED_BYTE, m_texture); + + glDrawTexiOES(0, 0, 0, m_viewWidth, m_viewHeight); +} + +void OpenNIView::onSurfaceCreated() +{ + /* Disable these capabilities. */ + static GLuint gCapbilitiesToDisable[] = { + GL_FOG, + GL_LIGHTING, + GL_CULL_FACE, + GL_ALPHA_TEST, + GL_BLEND, + GL_COLOR_LOGIC_OP, + GL_DITHER, + GL_STENCIL_TEST, + GL_DEPTH_TEST, + GL_COLOR_MATERIAL, + 0 + }; + + for (GLuint *capability = gCapbilitiesToDisable; *capability; capability++) + { + glDisable(*capability); + } + + glEnable(GL_TEXTURE_2D); + + glGenTextures(1, &m_textureId); + glBindTexture(GL_TEXTURE_2D, m_textureId); + + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glShadeModel(GL_FLAT); +} + +void OpenNIView::onSurfaceChanged(int w, int h) +{ + m_viewWidth = w; + m_viewHeight = h; +} + +#ifdef __cplusplus +extern "C" { +#endif + +JNIEXPORT jlong JNICALL Java_org_openni_android_OpenNIView_nativeCreate(JNIEnv *, jclass) +{ + return (jlong)new OpenNIView(); +} + +JNIEXPORT void JNICALL Java_org_openni_android_OpenNIView_nativeDestroy(JNIEnv *, jclass, jlong nativePtr) +{ + OpenNIView* pView = (OpenNIView*)nativePtr; + delete pView; +} + +JNIEXPORT void JNICALL Java_org_openni_android_OpenNIView_nativeSetAlphaValue(JNIEnv *, jclass, jlong nativePtr, jint alpha) +{ + OpenNIView* pView = (OpenNIView*)nativePtr; + pView->setAlpha(alpha); +} + +JNIEXPORT jint JNICALL Java_org_openni_android_OpenNIView_nativeGetAlphaValue(JNIEnv *, jclass, jlong nativePtr) +{ + OpenNIView* pView = (OpenNIView*)nativePtr; + return pView->getAlpha(); +} + +JNIEXPORT void JNICALL Java_org_openni_android_OpenNIView_nativeOnSurfaceCreated(JNIEnv *, jclass, jlong nativePtr) +{ + OpenNIView* pView = (OpenNIView*)nativePtr; + pView->onSurfaceCreated(); +} + +JNIEXPORT void JNICALL Java_org_openni_android_OpenNIView_nativeOnSurfaceChanged(JNIEnv *, jclass, jlong nativePtr, jint w, jint h) +{ + OpenNIView* pView = (OpenNIView*)nativePtr; + pView->onSurfaceChanged(w, h); +} + +JNIEXPORT void JNICALL Java_org_openni_android_OpenNIView_nativeUpdate(JNIEnv *, jclass, jlong nativePtr, jlong frameHandle) +{ + OpenNIView* pView = (OpenNIView*)nativePtr; + VideoFrameRef frame; + frame._setFrame((OniFrame*)frameHandle); + pView->update(frame); +} + +JNIEXPORT void JNICALL Java_org_openni_android_OpenNIView_nativeClear(JNIEnv *, jclass, jlong nativePtr) +{ + OpenNIView* pView = (OpenNIView*)nativePtr; + pView->clear(); +} + +JNIEXPORT void JNICALL Java_org_openni_android_OpenNIView_nativeOnDraw(JNIEnv *, jclass, jlong nativePtr) +{ + OpenNIView* pView = (OpenNIView*)nativePtr; + pView->onDraw(); +} + +#ifdef __cplusplus +} +#endif + +#endif // if ANDROID \ No newline at end of file diff --git a/Wrappers/java/jni/org_openni_android_OpenNIView.h b/Wrappers/java/jni/org_openni_android_OpenNIView.h new file mode 100644 index 00000000..828adaca --- /dev/null +++ b/Wrappers/java/jni/org_openni_android_OpenNIView.h @@ -0,0 +1,167 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class org_openni_android_OpenNIView */ + +#ifndef _Included_org_openni_android_OpenNIView +#define _Included_org_openni_android_OpenNIView +#ifdef __cplusplus +extern "C" { +#endif +#undef org_openni_android_OpenNIView_NO_ID +#define org_openni_android_OpenNIView_NO_ID -1L +#undef org_openni_android_OpenNIView_VISIBLE +#define org_openni_android_OpenNIView_VISIBLE 0L +#undef org_openni_android_OpenNIView_INVISIBLE +#define org_openni_android_OpenNIView_INVISIBLE 4L +#undef org_openni_android_OpenNIView_GONE +#define org_openni_android_OpenNIView_GONE 8L +#undef org_openni_android_OpenNIView_DRAWING_CACHE_QUALITY_LOW +#define org_openni_android_OpenNIView_DRAWING_CACHE_QUALITY_LOW 524288L +#undef org_openni_android_OpenNIView_DRAWING_CACHE_QUALITY_HIGH +#define org_openni_android_OpenNIView_DRAWING_CACHE_QUALITY_HIGH 1048576L +#undef org_openni_android_OpenNIView_DRAWING_CACHE_QUALITY_AUTO +#define org_openni_android_OpenNIView_DRAWING_CACHE_QUALITY_AUTO 0L +#undef org_openni_android_OpenNIView_SCROLLBARS_INSIDE_OVERLAY +#define org_openni_android_OpenNIView_SCROLLBARS_INSIDE_OVERLAY 0L +#undef org_openni_android_OpenNIView_SCROLLBARS_INSIDE_INSET +#define org_openni_android_OpenNIView_SCROLLBARS_INSIDE_INSET 16777216L +#undef org_openni_android_OpenNIView_SCROLLBARS_OUTSIDE_OVERLAY +#define org_openni_android_OpenNIView_SCROLLBARS_OUTSIDE_OVERLAY 33554432L +#undef org_openni_android_OpenNIView_SCROLLBARS_OUTSIDE_INSET +#define org_openni_android_OpenNIView_SCROLLBARS_OUTSIDE_INSET 50331648L +#undef org_openni_android_OpenNIView_KEEP_SCREEN_ON +#define org_openni_android_OpenNIView_KEEP_SCREEN_ON 67108864L +#undef org_openni_android_OpenNIView_SOUND_EFFECTS_ENABLED +#define org_openni_android_OpenNIView_SOUND_EFFECTS_ENABLED 134217728L +#undef org_openni_android_OpenNIView_HAPTIC_FEEDBACK_ENABLED +#define org_openni_android_OpenNIView_HAPTIC_FEEDBACK_ENABLED 268435456L +#undef org_openni_android_OpenNIView_FOCUSABLES_ALL +#define org_openni_android_OpenNIView_FOCUSABLES_ALL 0L +#undef org_openni_android_OpenNIView_FOCUSABLES_TOUCH_MODE +#define org_openni_android_OpenNIView_FOCUSABLES_TOUCH_MODE 1L +#undef org_openni_android_OpenNIView_FOCUS_BACKWARD +#define org_openni_android_OpenNIView_FOCUS_BACKWARD 1L +#undef org_openni_android_OpenNIView_FOCUS_FORWARD +#define org_openni_android_OpenNIView_FOCUS_FORWARD 2L +#undef org_openni_android_OpenNIView_FOCUS_LEFT +#define org_openni_android_OpenNIView_FOCUS_LEFT 17L +#undef org_openni_android_OpenNIView_FOCUS_UP +#define org_openni_android_OpenNIView_FOCUS_UP 33L +#undef org_openni_android_OpenNIView_FOCUS_RIGHT +#define org_openni_android_OpenNIView_FOCUS_RIGHT 66L +#undef org_openni_android_OpenNIView_FOCUS_DOWN +#define org_openni_android_OpenNIView_FOCUS_DOWN 130L +#undef org_openni_android_OpenNIView_MEASURED_SIZE_MASK +#define org_openni_android_OpenNIView_MEASURED_SIZE_MASK 16777215L +#undef org_openni_android_OpenNIView_MEASURED_STATE_MASK +#define org_openni_android_OpenNIView_MEASURED_STATE_MASK -16777216L +#undef org_openni_android_OpenNIView_MEASURED_HEIGHT_STATE_SHIFT +#define org_openni_android_OpenNIView_MEASURED_HEIGHT_STATE_SHIFT 16L +#undef org_openni_android_OpenNIView_MEASURED_STATE_TOO_SMALL +#define org_openni_android_OpenNIView_MEASURED_STATE_TOO_SMALL 16777216L +#undef org_openni_android_OpenNIView_OVER_SCROLL_ALWAYS +#define org_openni_android_OpenNIView_OVER_SCROLL_ALWAYS 0L +#undef org_openni_android_OpenNIView_OVER_SCROLL_IF_CONTENT_SCROLLS +#define org_openni_android_OpenNIView_OVER_SCROLL_IF_CONTENT_SCROLLS 1L +#undef org_openni_android_OpenNIView_OVER_SCROLL_NEVER +#define org_openni_android_OpenNIView_OVER_SCROLL_NEVER 2L +#undef org_openni_android_OpenNIView_STATUS_BAR_VISIBLE +#define org_openni_android_OpenNIView_STATUS_BAR_VISIBLE 0L +#undef org_openni_android_OpenNIView_STATUS_BAR_HIDDEN +#define org_openni_android_OpenNIView_STATUS_BAR_HIDDEN 1L +#undef org_openni_android_OpenNIView_SCROLLBAR_POSITION_DEFAULT +#define org_openni_android_OpenNIView_SCROLLBAR_POSITION_DEFAULT 0L +#undef org_openni_android_OpenNIView_SCROLLBAR_POSITION_LEFT +#define org_openni_android_OpenNIView_SCROLLBAR_POSITION_LEFT 1L +#undef org_openni_android_OpenNIView_SCROLLBAR_POSITION_RIGHT +#define org_openni_android_OpenNIView_SCROLLBAR_POSITION_RIGHT 2L +#undef org_openni_android_OpenNIView_LAYER_TYPE_NONE +#define org_openni_android_OpenNIView_LAYER_TYPE_NONE 0L +#undef org_openni_android_OpenNIView_LAYER_TYPE_SOFTWARE +#define org_openni_android_OpenNIView_LAYER_TYPE_SOFTWARE 1L +#undef org_openni_android_OpenNIView_LAYER_TYPE_HARDWARE +#define org_openni_android_OpenNIView_LAYER_TYPE_HARDWARE 2L +#undef org_openni_android_OpenNIView_RENDERMODE_WHEN_DIRTY +#define org_openni_android_OpenNIView_RENDERMODE_WHEN_DIRTY 0L +#undef org_openni_android_OpenNIView_RENDERMODE_CONTINUOUSLY +#define org_openni_android_OpenNIView_RENDERMODE_CONTINUOUSLY 1L +#undef org_openni_android_OpenNIView_DEBUG_CHECK_GL_ERROR +#define org_openni_android_OpenNIView_DEBUG_CHECK_GL_ERROR 1L +#undef org_openni_android_OpenNIView_DEBUG_LOG_GL_CALLS +#define org_openni_android_OpenNIView_DEBUG_LOG_GL_CALLS 2L +/* + * Class: org_openni_android_OpenNIView + * Method: nativeCreate + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_org_openni_android_OpenNIView_nativeCreate + (JNIEnv *, jclass); + +/* + * Class: org_openni_android_OpenNIView + * Method: nativeDestroy + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_org_openni_android_OpenNIView_nativeDestroy + (JNIEnv *, jclass, jlong); + +/* + * Class: org_openni_android_OpenNIView + * Method: nativeSetAlphaValue + * Signature: (JI)V + */ +JNIEXPORT void JNICALL Java_org_openni_android_OpenNIView_nativeSetAlphaValue + (JNIEnv *, jclass, jlong, jint); + +/* + * Class: org_openni_android_OpenNIView + * Method: nativeGetAlphaValue + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_org_openni_android_OpenNIView_nativeGetAlphaValue + (JNIEnv *, jclass, jlong); + +/* + * Class: org_openni_android_OpenNIView + * Method: nativeOnSurfaceCreated + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_org_openni_android_OpenNIView_nativeOnSurfaceCreated + (JNIEnv *, jclass, jlong); + +/* + * Class: org_openni_android_OpenNIView + * Method: nativeOnSurfaceChanged + * Signature: (JII)V + */ +JNIEXPORT void JNICALL Java_org_openni_android_OpenNIView_nativeOnSurfaceChanged + (JNIEnv *, jclass, jlong, jint, jint); + +/* + * Class: org_openni_android_OpenNIView + * Method: nativeUpdate + * Signature: (JJ)V + */ +JNIEXPORT void JNICALL Java_org_openni_android_OpenNIView_nativeUpdate + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_openni_android_OpenNIView + * Method: nativeClear + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_org_openni_android_OpenNIView_nativeClear + (JNIEnv *, jclass, jlong); + +/* + * Class: org_openni_android_OpenNIView + * Method: nativeOnDraw + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_org_openni_android_OpenNIView_nativeOnDraw + (JNIEnv *, jclass, jlong); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/Wrappers/java/jni/org_openni_android_OpenNIView_Renderer.h b/Wrappers/java/jni/org_openni_android_OpenNIView_Renderer.h new file mode 100644 index 00000000..8ad31045 --- /dev/null +++ b/Wrappers/java/jni/org_openni_android_OpenNIView_Renderer.h @@ -0,0 +1,13 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class org_openni_android_OpenNIView_Renderer */ + +#ifndef _Included_org_openni_android_OpenNIView_Renderer +#define _Included_org_openni_android_OpenNIView_Renderer +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/Wrappers/java/proguard-project.txt b/Wrappers/java/proguard-project.txt new file mode 100644 index 00000000..f2fe1559 --- /dev/null +++ b/Wrappers/java/proguard-project.txt @@ -0,0 +1,20 @@ +# To enable ProGuard in your project, edit project.properties +# to define the proguard.config property as described in that file. +# +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in ${sdk.dir}/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the ProGuard +# include property in project.properties. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/Wrappers/java/project.properties b/Wrappers/java/project.properties new file mode 100644 index 00000000..5f6ad43a --- /dev/null +++ b/Wrappers/java/project.properties @@ -0,0 +1,15 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +# Project target. +target=android-12 +android.library=true diff --git a/Wrappers/java/res/.gitignore b/Wrappers/java/res/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/Wrappers/java/OpenNI.java/src/org/openni/CoordinateConverter.java b/Wrappers/java/src/org/openni/CoordinateConverter.java similarity index 100% rename from Wrappers/java/OpenNI.java/src/org/openni/CoordinateConverter.java rename to Wrappers/java/src/org/openni/CoordinateConverter.java diff --git a/Wrappers/java/OpenNI.java/src/org/openni/CropArea.java b/Wrappers/java/src/org/openni/CropArea.java similarity index 100% rename from Wrappers/java/OpenNI.java/src/org/openni/CropArea.java rename to Wrappers/java/src/org/openni/CropArea.java diff --git a/Wrappers/java/OpenNI.java/src/org/openni/Device.java b/Wrappers/java/src/org/openni/Device.java similarity index 100% rename from Wrappers/java/OpenNI.java/src/org/openni/Device.java rename to Wrappers/java/src/org/openni/Device.java diff --git a/Wrappers/java/OpenNI.java/src/org/openni/DeviceInfo.java b/Wrappers/java/src/org/openni/DeviceInfo.java similarity index 100% rename from Wrappers/java/OpenNI.java/src/org/openni/DeviceInfo.java rename to Wrappers/java/src/org/openni/DeviceInfo.java diff --git a/Wrappers/java/OpenNI.java/src/org/openni/ImageRegistrationMode.java b/Wrappers/java/src/org/openni/ImageRegistrationMode.java similarity index 100% rename from Wrappers/java/OpenNI.java/src/org/openni/ImageRegistrationMode.java rename to Wrappers/java/src/org/openni/ImageRegistrationMode.java diff --git a/Wrappers/java/OpenNI.java/src/org/openni/NativeMethods.java b/Wrappers/java/src/org/openni/NativeMethods.java similarity index 95% rename from Wrappers/java/OpenNI.java/src/org/openni/NativeMethods.java rename to Wrappers/java/src/org/openni/NativeMethods.java index 57058aae..0f923d9c 100644 --- a/Wrappers/java/OpenNI.java/src/org/openni/NativeMethods.java +++ b/Wrappers/java/src/org/openni/NativeMethods.java @@ -3,8 +3,6 @@ import java.util.List; import java.lang.RuntimeException; -/* import org.apache.commons.lang.NotImplementedException; */ - class NativeMethods { static private final int STATUS_OK = 0; @@ -189,4 +187,16 @@ static native int oniCoordinateConverterDepthToColor(long depthStream, long colo static native int oniDeviceOpen(Device device); static native int oniDeviceClose(long deviceHandle); + + static native int oniSetLogOutputFolder(String outputFolder); + + static native String oniGetLogFileName(); + + static native int oniSetLogMinSeverity(int nMinSeverity); + + static native int oniSetLogConsoleOutput(boolean bConsoleOutput); + + static native int oniSetLogFileOutput(boolean bConsoleOutput); + + static native int oniSetLogAndroidOutput(boolean bConsoleOutput); } diff --git a/Wrappers/java/OpenNI.java/src/org/openni/OpenNI.java b/Wrappers/java/src/org/openni/OpenNI.java similarity index 87% rename from Wrappers/java/OpenNI.java/src/org/openni/OpenNI.java rename to Wrappers/java/src/org/openni/OpenNI.java index 77b8519a..db62c63f 100644 --- a/Wrappers/java/OpenNI.java/src/org/openni/OpenNI.java +++ b/Wrappers/java/src/org/openni/OpenNI.java @@ -170,10 +170,10 @@ public static List enumerateDevices() { public static int waitForAnyStream(List streams, int timeout) throws TimeoutException { long[] handles = new long[streams.size()]; OutArg readyId = new OutArg(); - Iterator itr = streams.iterator(); + Iterator itr = streams.iterator(); int i = 0; while (itr.hasNext()) { - handles[i] = ((VideoStream) itr.next()).getHandle(); + handles[i] = itr.next().getHandle(); i++; } boolean result = NativeMethods.oniWaitForAnyStream(handles, readyId, timeout); @@ -236,19 +236,67 @@ public static void addDeviceStateChangedListener(DeviceStateChangedListener devi public static void removeDeviceStateChangedListener(DeviceStateChangedListener deviceListener) { mDeviceStateChangedListener.remove(deviceListener); } + + /** + * Set minimum severity for log entries + * + * @param minSeverity Minimum severity to output + */ + public static void setLogMinSeverity(int minSeverity) { + NativeMethods.checkReturnStatus(NativeMethods.oniSetLogMinSeverity(minSeverity)); + } + + /** + * Configures if log entries will be printed to console + * + * @param enabled Whether log entries should be printed to console or not. + */ + public static void setLogConsoleOutput(boolean enabled) { + NativeMethods.checkReturnStatus(NativeMethods.oniSetLogConsoleOutput(enabled)); + } + + /** + * Configures if log entries will be printed to file + * + * @param enabled Whether log entries should be printed to file or not. + */ + public static void setLogFileOutput(boolean enabled) { + NativeMethods.checkReturnStatus(NativeMethods.oniSetLogFileOutput(enabled)); + } + + /** + * Set the output folder for log files (if enabled) + * + * @param path Path to write log files to. + */ + public static void setLogOutputFolder(String path) { + NativeMethods.checkReturnStatus(NativeMethods.oniSetLogOutputFolder(path)); + } + /** + * Configures if log entries will be printed to file + * + * @param enabled Whether log entries should be printed to android log or not. + */ + public static void setLogAndroidOutput(boolean enabled) { + NativeMethods.checkReturnStatus(NativeMethods.oniSetLogAndroidOutput(enabled)); + } + + @SuppressWarnings("unused") /* Called from JNI */ private static void deviceConnected(DeviceInfo deviceInfo) { for (DeviceConnectedListener aDeviceConnectedListener : mDeviceConnectedListener) { aDeviceConnectedListener.onDeviceConnected(deviceInfo); } } + @SuppressWarnings("unused") /* Called from JNI */ private static void deviceDisconnected(DeviceInfo deviceInfo) { for (DeviceDisconnectedListener aDeviceDisconnectedListener : mDeviceDisconnectedListener) { aDeviceDisconnectedListener.onDeviceDisconnected(deviceInfo); } } + @SuppressWarnings("unused") /* Called from JNI */ private static void deviceStateChanged(DeviceInfo deviceInfo, int deviceState) { for (DeviceStateChangedListener aDeviceStateChangedListener : mDeviceStateChangedListener) { aDeviceStateChangedListener.onDeviceStateChanged(deviceInfo, deviceState); diff --git a/Wrappers/java/OpenNI.java/src/org/openni/OutArg.java b/Wrappers/java/src/org/openni/OutArg.java similarity index 100% rename from Wrappers/java/OpenNI.java/src/org/openni/OutArg.java rename to Wrappers/java/src/org/openni/OutArg.java diff --git a/Wrappers/java/OpenNI.java/src/org/openni/PixelFormat.java b/Wrappers/java/src/org/openni/PixelFormat.java similarity index 100% rename from Wrappers/java/OpenNI.java/src/org/openni/PixelFormat.java rename to Wrappers/java/src/org/openni/PixelFormat.java diff --git a/Wrappers/java/OpenNI.java/src/org/openni/PlaybackControl.java b/Wrappers/java/src/org/openni/PlaybackControl.java similarity index 100% rename from Wrappers/java/OpenNI.java/src/org/openni/PlaybackControl.java rename to Wrappers/java/src/org/openni/PlaybackControl.java diff --git a/Wrappers/java/OpenNI.java/src/org/openni/Point2D.java b/Wrappers/java/src/org/openni/Point2D.java similarity index 100% rename from Wrappers/java/OpenNI.java/src/org/openni/Point2D.java rename to Wrappers/java/src/org/openni/Point2D.java diff --git a/Wrappers/java/OpenNI.java/src/org/openni/Point3D.java b/Wrappers/java/src/org/openni/Point3D.java similarity index 100% rename from Wrappers/java/OpenNI.java/src/org/openni/Point3D.java rename to Wrappers/java/src/org/openni/Point3D.java diff --git a/Wrappers/java/OpenNI.java/src/org/openni/Recorder.java b/Wrappers/java/src/org/openni/Recorder.java similarity index 100% rename from Wrappers/java/OpenNI.java/src/org/openni/Recorder.java rename to Wrappers/java/src/org/openni/Recorder.java diff --git a/Wrappers/java/OpenNI.java/src/org/openni/SensorInfo.java b/Wrappers/java/src/org/openni/SensorInfo.java similarity index 100% rename from Wrappers/java/OpenNI.java/src/org/openni/SensorInfo.java rename to Wrappers/java/src/org/openni/SensorInfo.java diff --git a/Wrappers/java/OpenNI.java/src/org/openni/SensorType.java b/Wrappers/java/src/org/openni/SensorType.java similarity index 100% rename from Wrappers/java/OpenNI.java/src/org/openni/SensorType.java rename to Wrappers/java/src/org/openni/SensorType.java diff --git a/Wrappers/java/OpenNI.java/src/org/openni/Version.java b/Wrappers/java/src/org/openni/Version.java similarity index 100% rename from Wrappers/java/OpenNI.java/src/org/openni/Version.java rename to Wrappers/java/src/org/openni/Version.java diff --git a/Wrappers/java/OpenNI.java/src/org/openni/VideoFrameRef.java b/Wrappers/java/src/org/openni/VideoFrameRef.java similarity index 99% rename from Wrappers/java/OpenNI.java/src/org/openni/VideoFrameRef.java rename to Wrappers/java/src/org/openni/VideoFrameRef.java index 9cc07523..7bc6af31 100644 --- a/Wrappers/java/OpenNI.java/src/org/openni/VideoFrameRef.java +++ b/Wrappers/java/src/org/openni/VideoFrameRef.java @@ -160,6 +160,10 @@ public void release() { } } + public long getHandle() { + return mFrameHandle; + } + @Override protected void finalize() throws Throwable { release(); diff --git a/Wrappers/java/OpenNI.java/src/org/openni/VideoMode.java b/Wrappers/java/src/org/openni/VideoMode.java similarity index 79% rename from Wrappers/java/OpenNI.java/src/org/openni/VideoMode.java rename to Wrappers/java/src/org/openni/VideoMode.java index 0e012f0d..a9877482 100644 --- a/Wrappers/java/OpenNI.java/src/org/openni/VideoMode.java +++ b/Wrappers/java/src/org/openni/VideoMode.java @@ -38,6 +38,43 @@ public VideoMode(int resX, int resY, int fps, int pixelFormat) { this.mPixelFormat = PixelFormat.fromNative(pixelFormat); } + /* (non-Javadoc) + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + mFps; + result = prime * result + ((mPixelFormat == null) ? 0 : mPixelFormat.hashCode()); + result = prime * result + mResolutionX; + result = prime * result + mResolutionY; + return result; + } + + /* (non-Javadoc) + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + VideoMode other = (VideoMode) obj; + if (mFps != other.mFps) + return false; + if (mPixelFormat != other.mPixelFormat) + return false; + if (mResolutionX != other.mResolutionX) + return false; + if (mResolutionY != other.mResolutionY) + return false; + return true; + } + /** * Getter function for the pixel format of this VideoMode. * diff --git a/Wrappers/java/src/org/openni/VideoStream.java b/Wrappers/java/src/org/openni/VideoStream.java new file mode 100644 index 00000000..5a66f59b --- /dev/null +++ b/Wrappers/java/src/org/openni/VideoStream.java @@ -0,0 +1 @@ +package org.openni; import java.util.Map; import java.util.HashMap; /** * The {@link VideoStream} object encapsulates a single video stream from a device. Once created, it * is used to start data flow from the device, and to read individual frames of data. This is the * central class used to obtain data in OpenNI. It provides the ability to manually read data in a * polling loop, as well as providing events and a Listener class that can be used to implement * event-driven data acquisition. * * Aside from the video data frames themselves, the class offers a number of functions used for * obtaining information about a {@link VideoStream}. Field of view, available video modes, and * minimum and maximum valid pixel values can all be obtained. * * In addition to obtaining data, the {@link VideoStream} object is used to set all configuration * properties that apply to a specific stream (rather than to an entire device). In particular, it * is used to control cropping, mirroring, and video modes. * * A valid, initialized device that provides the desired stream type is required to create a stream. * * Several video streams can be created to stream data from the same sensor. This is useful if * several components of an application need to read frames separately. * * While some device might allow different streams from the same sensor to have different * configurations, most devices will have a single configuration for the sensor, shared by all * streams. */ public class VideoStream { /** * The {@link CameraSettings} object encapsulates camera setting for a single device. Once * created, it is used to get and set auto exposure and auto white balance modes. */ public class CameraSettings { /** * Set Auto Exposure Enabled for corresponding sensor * * @param enabled boolean value for set and unset auto exposure mode */ public void setAutoExposureEnabled(boolean enabled) { NativeMethods.checkReturnStatus(NativeMethods.oniStreamSetProperty(mVideoStream.getHandle(), NativeMethods.STREAM_PROPERTY_AUTO_EXPOSURE, enabled)); } /** * Set Auto White Balance for corresponding sensor * * @param enabled boolean value for set and unset auto white balance mode */ public void setAutoWhiteBalanceEnabled(boolean enabled) { NativeMethods.checkReturnStatus(NativeMethods.oniStreamSetProperty(mVideoStream.getHandle(), NativeMethods.STREAM_PROPERTY_AUTO_WHITE_BALANCE, enabled)); } /** * Set Auto Exposure Enabled for corresponding sensor * * @return enabled boolean value which define auto exposure mode state */ public boolean getAutoExposureEnabled() { OutArg val = new OutArg(); NativeMethods.oniStreamGetBoolProperty(mVideoStream.getHandle(), NativeMethods.STREAM_PROPERTY_AUTO_EXPOSURE, val); return val.mValue; } /** * Set Auto White Balance Enabled for corresponding sensor * * @return enabled boolean value which define auto white balance mode state */ public boolean getAutoWhiteBalanceEnabled() { OutArg val = new OutArg(); NativeMethods.oniStreamGetBoolProperty(mVideoStream.getHandle(), NativeMethods.STREAM_PROPERTY_AUTO_WHITE_BALANCE, val); return val.mValue; } private CameraSettings(VideoStream videoStream) { this.mVideoStream = videoStream; } final private VideoStream mVideoStream; } /** * The VideoStream::NewFrameListener interface is provided to allow the implementation of event * driven frame reading. To use it, create a class that inherits from it and implement override * the onNewFrame() method. Then, register your created class with an active {@link VideoStream} * using the {@link #addNewFrameListener(org.openni.VideoStream.NewFrameListener)} function. Once * this is done, the event handler function you implemented will be called whenever a new frame * becomes available. You may call {@link org.openni.VideoStream#readFrame()} from within the * event handler. */ public interface NewFrameListener { /** * Derived classes should implement this function to handle new frames. */ public void onFrameReady(VideoStream stream); } /** * Creates a stream of frames from a specific sensor type of a specific device. You must supply a * reference to a Device that supplies the sensor type requested. You can use * {@link org.openni.Device#hasSensor(SensorType)} to check whether a given sensor is available on * your target device before calling create(). * * @param device A reference to the {@link Device} you want to create the stream on. * @param sensorType The type of sensor the stream should produce data from. */ public static VideoStream create(Device device, SensorType sensorType) { VideoStream videoStream = new VideoStream(sensorType); if (mFrameListeners == null) mFrameListeners = new HashMap(); NativeMethods.checkReturnStatus(NativeMethods.oniDeviceCreateStream(device.getHandle(), sensorType.toNative(), videoStream)); return videoStream; } /** * Destroy this stream. This function is currently called automatically by the destructor, but it * is considered a best practice for applications to manually call this function on any * {@link VideoStream} that they call create() for. */ public void destroy() { NativeMethods.oniStreamDestroy(getHandle(), mCallbackHandle); mStreamHandle = 0; } /** * Provides the {@link SensorInfo} object associated with the sensor that is producing this * {@link VideoStream}. * * {@link SensorInfo} is useful primarily as a means of learning which video modes are valid for * this VideoStream. * * @return SensorInfo object associated with the sensor providing this stream. */ public final SensorInfo getSensorInfo() { return NativeMethods.oniStreamGetSensorInfo(getHandle()); } /** * Starts data generation from this video stream. */ public void start() { NativeMethods.checkReturnStatus(NativeMethods.oniStreamStart(getHandle())); } /** * Stops data generation from this video stream. */ public void stop() { NativeMethods.oniStreamStop(getHandle()); } /** * Read the next frame from this video stream, delivered as a {@link VideoFrameRef}. This is the * primary method for manually obtaining frames of video data. If no new frame is available, the * call will block until one is available. To avoid blocking, use * {@link VideoStream.NewFrameListener} to implement an event driven architecture. Another * alternative is to use {@link org.openni.OpenNI#waitForAnyStream(java.util.List, int)} to wait * for new frames from several streams * * @return VideoFrameRef object which hold the data of the new frame. */ public VideoFrameRef readFrame() { OutArg frame = new OutArg(); NativeMethods.checkReturnStatus(NativeMethods.oniStreamReadFrame(getHandle(), frame)); return frame.mValue; } /** * Adds a new Listener to receive this VideoStream onNewFrame event. See * {@link VideoStream.NewFrameListener} for more information on implementing an event driven * frame reading architecture. * * @param streamListener Object which implements {@link VideoStream.NewFrameListener} that will * respond to this event. */ public void addNewFrameListener(NewFrameListener streamListener) { mFrameListeners.put(this, streamListener); } /** * Removes a Listener from this video stream list. The listener removed will no longer receive new * frame events from this stream. * * @param streamListener Object of the listener to be removed. */ public void removeNewFrameListener(NewFrameListener streamListener) { for (Map.Entry pairs : mFrameListeners.entrySet()) { VideoStream videoStream = pairs.getKey(); if (videoStream.getHandle() == mStreamHandle) { if (streamListener.equals(pairs.getValue())) { mFrameListeners.remove(pairs.getKey()); return; } } } } /** * This function return stream handle. * * @return OpenNI stream handle. */ public long getHandle() { return mStreamHandle; } /** * Gets an object through which several camera settings can be configured. * * @return null if the stream doesn't support camera settings. */ public CameraSettings getCameraSettings() { if (NativeMethods.oniStreamIsPropertySupported(getHandle(), NativeMethods.STREAM_PROPERTY_AUTO_EXPOSURE) && NativeMethods.oniStreamIsPropertySupported(getHandle(), NativeMethods.STREAM_PROPERTY_AUTO_WHITE_BALANCE)) { return new CameraSettings(this); } return null; } /** * Get the current video mode information for this video stream. This includes its resolution, fps * and stream format. * * @return Current video mode information for this video stream. */ public final VideoMode getVideoMode() { OutArg videoMode = new OutArg(); NativeMethods.checkReturnStatus(NativeMethods.getVideoMode(getHandle(), videoMode)); return videoMode.mValue; } /** * Changes the current video mode of this stream. Recommended practice is to use * {@link org.openni.Device#getSensorInfo(SensorType)}, and then * {@link org.openni.SensorInfo#getSupportedVideoModes()} to obtain a list of valid video mode * settings for this stream. Then, pass a valid {@link VideoMode} to setVideoMode(VideoMode) to * ensure correct operation. * * @param videoMode Desired new video mode for this stream. returns Status code indicating success * or failure of this operation. */ public void setVideoMode(VideoMode videoMode) { NativeMethods.checkReturnStatus(NativeMethods.setVideoMode(getHandle(), videoMode .getResolutionX(), videoMode.getResolutionY(), videoMode.getFps(), videoMode .getPixelFormat().toNative())); } /** * Provides the maximum possible value for pixels obtained by this stream. This is most useful for * getting the maximum possible value of depth streams. * * @return Maximum possible pixel value. */ public int getMaxPixelValue() { OutArg val = new OutArg(); NativeMethods .oniStreamGetIntProperty(getHandle(), NativeMethods.STREAM_PROPERTY_MAX_VALUE, val); return val.mValue; } /** * Provides the smallest possible value for pixels obtains by this VideoStream. This is most * useful for getting the minimum possible value that will be reported by a depth stream. * * @return Minimum possible pixel value that can come from this stream. */ public int getMinPixelValue() { OutArg val = new OutArg(); NativeMethods.checkReturnStatus(NativeMethods.oniStreamGetIntProperty(getHandle(), NativeMethods.STREAM_PROPERTY_MIN_VALUE, val)); return val.mValue; } /** * Checks whether this stream supports cropping. * * @return true if the stream supports cropping, false if it does not. */ public boolean isCroppingSupported() { return NativeMethods.oniStreamIsPropertySupported(getHandle(), NativeMethods.STREAM_PROPERTY_CROPPING); } /** * Obtains the current cropping settings for this stream. * * @return CropArea CropArea object which encapsulated cropping info. */ public CropArea getCropping() { OutArg xRes = new OutArg(); OutArg yRes = new OutArg(); OutArg w = new OutArg(); OutArg h = new OutArg(); NativeMethods.checkReturnStatus(NativeMethods.getCropping(getHandle(), xRes, yRes, w, h)); return new CropArea(xRes.mValue, yRes.mValue, w.mValue, h.mValue); } /** * Changes the cropping settings for this stream. You can use the {@link #isCroppingSupported()} * function to make sure cropping is supported before calling this function. * * @param cropping CropArea object which set corresponding cropping information. */ public void setCropping(CropArea cropping) { NativeMethods.checkReturnStatus(NativeMethods.setCropping(getHandle(), cropping.getOriginX(), cropping.getOriginY(), cropping.getWidth(), cropping.getHeight())); } /** * Disables cropping. */ public void resetCropping() { NativeMethods.checkReturnStatus(NativeMethods.resetCropping(getHandle())); } /** * Check whether mirroring is currently turned on for this stream. * * @return true if mirroring is currently enabled, false otherwise. */ public boolean getMirroringEnabled() { OutArg val = new OutArg(); NativeMethods.checkReturnStatus(NativeMethods.oniStreamGetBoolProperty(getHandle(), NativeMethods.STREAM_PROPERTY_MIRRORING, val)); return val.mValue; } /** * Enable or disable mirroring for this stream. * * @param isEnabled true to enable mirroring, false to disable it. */ public void setMirroringEnabled(boolean isEnabled) { NativeMethods.checkReturnStatus(NativeMethods.oniStreamSetProperty(getHandle(), NativeMethods.STREAM_PROPERTY_MIRRORING, isEnabled)); } /** * Gets the horizontal field of view of frames received from this stream. * * @return Horizontal field of view, in radians. */ public float getHorizontalFieldOfView() { OutArg val = new OutArg(); NativeMethods.checkReturnStatus(NativeMethods.oniStreamGetFloatProperty(getHandle(), NativeMethods.STREAM_PROPERTY_HORIZONTAL_FOV, val)); return val.mValue; } /** * Gets the vertical field of view of frames received from this stream. * * @return Vertical field of view, in radians. */ public float getVerticalFieldOfView() { OutArg val = new OutArg(); NativeMethods.checkReturnStatus(NativeMethods.oniStreamGetFloatProperty(getHandle(), NativeMethods.STREAM_PROPERTY_VERTICAL_FOV, val)); return val.mValue; } /** * Gets the sensor type for this stream. * * @return sensor type. */ public SensorType getSensorType() { return mSensorType; } private VideoStream(SensorType sensorType) { this.mSensorType = sensorType; } @SuppressWarnings("unused") /* Called from JNI */ private static void onFrameReady(long streamHandle) { for (Map.Entry pairs : mFrameListeners.entrySet()) { VideoStream videoStream = pairs.getKey(); if (videoStream.getHandle() == streamHandle) { pairs.getValue().onFrameReady(videoStream); } } } private final SensorType mSensorType; private static HashMap mFrameListeners; private long mStreamHandle; private long mCallbackHandle; } \ No newline at end of file diff --git a/Wrappers/java/src/org/openni/android/OpenNIHelper.java b/Wrappers/java/src/org/openni/android/OpenNIHelper.java new file mode 100644 index 00000000..baebf072 --- /dev/null +++ b/Wrappers/java/src/org/openni/android/OpenNIHelper.java @@ -0,0 +1,240 @@ +/***************************************************************************** +* * +* OpenNI 2.x Alpha * +* Copyright (C) 2012 PrimeSense Ltd. * +* * +* This file is part of OpenNI. * +* * +* Licensed under the Apache License, Version 2.0 (the "License"); * +* you may not use this file except in compliance with the License. * +* You may obtain a copy of the License at * +* * +* http://www.apache.org/licenses/LICENSE-2.0 * +* * +* Unless required by applicable law or agreed to in writing, software * +* distributed under the License is distributed on an "AS IS" BASIS, * +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * +* See the License for the specific language governing permissions and * +* limitations under the License. * +* * +*****************************************************************************/ +package org.openni.android; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbManager; +import android.util.Log; + +import org.openni.Device; +import org.openni.DeviceInfo; +import org.openni.OpenNI; + +/** + * Provides facilities needed for using OpenNI in Android applications. This class takes care of: + *
    + *
  • Loading of OpenNI native libraries.
  • + *
  • Copying OpenNI configuration and data files that are bundled in the APK as assets.
  • + *
  • Enumerating the connected OpenNI-compliant devices.
  • + *
  • Obtaining access permissions for OpenNI-compliant devices.
  • + *
+ */ +public class OpenNIHelper { + static { + System.loadLibrary("usb"); + System.loadLibrary("OpenNI2"); + System.loadLibrary("OpenNI2.jni"); + } + + private Context mAndroidContext; + private static final String OPENNI_ASSETS_DIR = "openni"; + private String mActionUsbPermission; + private DeviceOpenListener mDeviceOpenListener; + private String mUri; + private static final String TAG = "OpenNINIHelper"; + + /** + * Used for receiving the result of {@link OpenNIHelper#requestDeviceOpen(String uri, DeviceOpenListener listener)}. + */ + public static interface DeviceOpenListener { + /** + * Called when permission to access the device is granted. + * @param device The device for which permission was granted. + */ + public abstract void onDeviceOpened(Device device); + + /** + * Called when permission is access the device is denied. + * @param uri The device for which permission was denied. + */ + public abstract void onDeviceOpenFailed(String uri); + } + + /** + * Constructs an OpenNIHelper object. The constructor also extracts all files saved in {@code assets/openni}, + * to make them accessible to OpenNI. + * @param context a Context object used to access application assets. + */ + public OpenNIHelper(Context context) { + mAndroidContext = context; + + /* + * The configuration files are saved as assets. To make them readable by + * the OpenNI native library, we need to write them to the application + * files directory + */ + try { + for (String fileName : mAndroidContext.getAssets().list(OPENNI_ASSETS_DIR)) { + extractOpenNIAsset(fileName); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + + mActionUsbPermission = context.getPackageName() + ".USB_PERMISSION"; + + IntentFilter filter = new IntentFilter(mActionUsbPermission); + mAndroidContext.registerReceiver(mUsbReceiver, filter); + } + + /** + * Requests opening the specified device. If the device is a USB device, this may result in a + * system dialog being displayed to the user if permission had not already been granted. + * Success or failure is notified via a call the {@link DeviceOpenListener} interface. + * If successful, this grants the caller permission to access the device only until the device is + * disconnected. + * @param uri device to open + * @param listener a listener to be notified about the result. + */ + public void requestDeviceOpen(String uri, DeviceOpenListener listener) { + // TODO: Attach listener to this specific request rather than keep a "global" listener. + // Theoretically, the client may call this method more than once with different listeners. + mDeviceOpenListener = listener; + mUri = uri; + + // check if this is a USB device + UsbDevice usbDevice = getUsbDevice(uri); + + if (usbDevice == null) { + // not a USB device, just open it + openDevice(uri); + } else { + // USB device. request permissions for it + PendingIntent permissionIntent = PendingIntent.getBroadcast(mAndroidContext, 0, new Intent( + mActionUsbPermission), 0); + + UsbManager manager = (UsbManager) mAndroidContext.getSystemService(Context.USB_SERVICE); + + manager.requestPermission(usbDevice, permissionIntent); + // flow will continue in the intent + } + } + + public UsbDevice getUsbDevice(String uri) { + // look for this uri in OpenNI to get its device info + List devices = OpenNI.enumerateDevices(); + Iterator iterator = devices.iterator(); + while (iterator.hasNext()) { + DeviceInfo deviceInfo = iterator.next(); + if (deviceInfo.getUri().compareTo(uri) == 0) { + return getUsbDevice(deviceInfo); + } + } + + return null; + } + + public UsbDevice getUsbDevice(DeviceInfo deviceInfo) { + UsbManager manager = (UsbManager) mAndroidContext.getSystemService(Context.USB_SERVICE); + HashMap deviceList = manager.getDeviceList(); + Iterator iterator = deviceList.values().iterator(); + + // Remove any device that is not known to be OpenNI-compliant from the + // list of USB devices + while (iterator.hasNext()) { + UsbDevice usbDevice = iterator.next(); + + if (usbDevice.getVendorId() == deviceInfo.getUsbVendorId() && usbDevice.getProductId() == deviceInfo.getUsbProductId()) { + return usbDevice; + } + } + + return null; + } + + /** + * Releases the resources used by the helper. + */ + public void shutdown() { + mAndroidContext.unregisterReceiver(mUsbReceiver); + } + + private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + + if (mActionUsbPermission.equals(action)) { + synchronized (this) { + if (mDeviceOpenListener == null) { + return; + } + + UsbDevice device = (UsbDevice) intent + .getParcelableExtra(UsbManager.EXTRA_DEVICE); + if (device == null) { + return; + } + + if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { + // permission granted. open the device + try { + ((UsbManager) mAndroidContext.getSystemService(Context.USB_SERVICE)).openDevice(device); + openDevice(mUri); + } catch (Exception ex) { + Log.e(TAG, "Can't open device though permission was granted: " + ex); + mDeviceOpenListener.onDeviceOpenFailed(mUri); + } + } else { + Log.e(TAG, "Permission denied for device"); + mDeviceOpenListener.onDeviceOpenFailed(mUri); + } + } + } + } + }; + + private void openDevice(String uri) { + Device device = null; + try { + device = Device.open(uri); + mDeviceOpenListener.onDeviceOpened(device); + } catch (Exception ex) { + Log.e(TAG, "Failed to open device:" + ex); + mDeviceOpenListener.onDeviceOpenFailed(uri); + } + } + + private void extractOpenNIAsset(String filename) throws IOException { + InputStream is = mAndroidContext.getAssets().open(OPENNI_ASSETS_DIR + "/" + filename); + + mAndroidContext.deleteFile(filename); + OutputStream os = mAndroidContext.openFileOutput(filename, Context.MODE_PRIVATE); + + byte[] buffer = new byte[is.available()]; + is.read(buffer); + is.close(); + os.write(buffer); + os.close(); + } +} diff --git a/Wrappers/java/src/org/openni/android/OpenNIView.java b/Wrappers/java/src/org/openni/android/OpenNIView.java new file mode 100644 index 00000000..bd41f4d3 --- /dev/null +++ b/Wrappers/java/src/org/openni/android/OpenNIView.java @@ -0,0 +1,128 @@ +package org.openni.android; + +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.opengles.GL10; + +import android.content.Context; +import android.opengl.GLSurfaceView; +import android.util.AttributeSet; + +import org.openni.VideoFrameRef; + +/** + * A View that displays OpenNI streams. + */ +public class OpenNIView extends GLSurfaceView { + + private long mNativePtr = 0; + private Renderer mRenderer; + private int mPrevFrameWidth = 0; + private int mPrevFrameHeight = 0; + + public OpenNIView(Context context) { + super(context); + } + + public OpenNIView(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + private void init() { + if(!isInEditMode()) { + mNativePtr = nativeCreate(); + } + + mRenderer = new Renderer(); + setRenderer(mRenderer); + setRenderMode(RENDERMODE_WHEN_DIRTY); + } + + @Override + protected void finalize() throws Throwable { + if (mNativePtr != 0) { + nativeDestroy(mNativePtr); + mNativePtr = 0; + } + super.finalize(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int frameWidth = mPrevFrameWidth; + int frameHeight = mPrevFrameHeight; + + int width = getDefaultSize(frameWidth, widthMeasureSpec); + int height = getDefaultSize(frameHeight, heightMeasureSpec); + + if (frameWidth > 0 && frameHeight > 0) { + if (frameWidth * height > width * frameHeight) { + height = width * frameHeight / frameWidth; + } else if (frameWidth * height < width * frameHeight) { + width = height * frameWidth / frameHeight; + } + } + setMeasuredDimension(width, height); + } + + public void setAlphaValue(int alpha) { + nativeSetAlphaValue(mNativePtr, alpha); + requestRender(); + } + + public int getAlphaValue() { + return nativeGetAlphaValue(mNativePtr); + } + + /** + * Requests update of the view with an OpenNI frame. + * @param frame The frame to be drawn + */ + synchronized public void update(VideoFrameRef frame) { + nativeUpdate(mNativePtr, frame.getHandle()); + if (mPrevFrameWidth != frame.getVideoMode().getResolutionX() || mPrevFrameHeight != frame.getVideoMode().getResolutionY()) { + mPrevFrameWidth = frame.getVideoMode().getResolutionX(); + mPrevFrameHeight = frame.getVideoMode().getResolutionY(); + post(new Runnable() { + public void run() { + requestLayout(); + } + }); + } + requestRender(); + } + + synchronized public void clear() { + nativeClear(mNativePtr); + requestRender(); + } + + class Renderer implements GLSurfaceView.Renderer { + @Override + public void onSurfaceCreated(GL10 gl, EGLConfig c) { + nativeOnSurfaceCreated(mNativePtr); + } + + @Override + public void onSurfaceChanged(GL10 gl, int w, int h) { + nativeOnSurfaceChanged(mNativePtr, w, h); + } + + @Override + public void onDrawFrame(GL10 gl) { + synchronized (OpenNIView.this) { + nativeOnDraw(mNativePtr); + } + } + } + + private static native long nativeCreate(); + private static native void nativeDestroy(long nativePtr); + private static native void nativeSetAlphaValue(long nativePtr, int alpha); + private static native int nativeGetAlphaValue(long nativePtr); + private static native void nativeOnSurfaceCreated(long nativePtr); + private static native void nativeOnSurfaceChanged(long nativePtr, int w, int h); + private static native void nativeUpdate(long nativePtr, long frameRef); + private static native void nativeClear(long nativePtr); + private static native void nativeOnDraw(long nativePtr); +} \ No newline at end of file From f8b1193205af605439ecc73a7d6959b213f55587 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Mon, 23 Sep 2013 17:45:18 +0300 Subject: [PATCH 055/188] Update version to 2.3.0.7 --- CHANGES.txt | 14 ++++++++++++++ Include/OniVersion.h | 2 +- Packaging/Install/Includes/Variables.wxi | 2 +- Packaging/UpdateVersion.py | 2 +- ReleaseNotes.txt | 4 ++-- 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 214b6b06..a30e3f1c 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -2,13 +2,26 @@ Change Log: ----------- OpenNI 2.3: + - Android support added + - OpenNIHelper class to handle device permissions + - OpenNIView class to allow drawing of VideoFrameRef objects + - SimpleRead and SimpleViewer sample applications + - NiViewer application - Fix pure-C APIs + - Allow providing driver list from config file - Bug Fix: depth/world conversion was wrong when depth is in 100 um format - Adding logs for endpoints bandwidth and FPS - Better handling of cases where device does not report its FOV - NiViewer: - IR emitter on/off is added for both PS1080 and Kinect. - Near mode on/off is added for Kinect (was already there for PS1080) + - Java APIs + - Add log APIs + - Implemented hashCode() and equals() for VideoMode + - Bug Fix: VideoFrameRef.getData() returned ByteBuffer with big endianity, whereas data was with little endianity + - Bug Fix: bad JNI calls in oniGetDeviceList, oniStreamGetSensorInfo and oniDeviceGetSensorInfo. + - Fix callbacks JNI calls + - Bug Fix: memory leak in waitForAnyStream() - Java SimpleViewer - Allow passing file name in command prompt - Add support for IR streams @@ -51,6 +64,7 @@ OpenNI 2.3: - Add Linux prerequisites to release notes - Add release notes and change log to installation - Refactor TestDevice so it can actually be used for testing + - ReleaseVersion script now also creates a full Android package OpenNI 2.2.1: - PS1080: Added a property for reading from all endpoints, regardless of streams diff --git a/Include/OniVersion.h b/Include/OniVersion.h index f2bf4d48..340c5e9c 100644 --- a/Include/OniVersion.h +++ b/Include/OniVersion.h @@ -23,7 +23,7 @@ #define ONI_VERSION_MAJOR 2 #define ONI_VERSION_MINOR 3 #define ONI_VERSION_MAINTENANCE 0 -#define ONI_VERSION_BUILD 6 +#define ONI_VERSION_BUILD 7 /** OpenNI version (in brief string format): "Major.Minor.Maintenance (Build)" */ #define ONI_BRIEF_VERSION_STRING \ diff --git a/Packaging/Install/Includes/Variables.wxi b/Packaging/Install/Includes/Variables.wxi index 826282c4..5e1de510 100644 --- a/Packaging/Install/Includes/Variables.wxi +++ b/Packaging/Install/Includes/Variables.wxi @@ -8,7 +8,7 @@ - + diff --git a/Packaging/UpdateVersion.py b/Packaging/UpdateVersion.py index bc2a9cee..f3c755b5 100755 --- a/Packaging/UpdateVersion.py +++ b/Packaging/UpdateVersion.py @@ -28,7 +28,7 @@ VERSION_MAJOR = 2 VERSION_MINOR = 3 VERSION_MAINTENANCE = 0 -VERSION_BUILD = 6 +VERSION_BUILD = 7 def getVersionString(): return str(VERSION_MAJOR) + "." + str(VERSION_MINOR) + "." + str(VERSION_MAINTENANCE) + "." + str(VERSION_BUILD) diff --git a/ReleaseNotes.txt b/ReleaseNotes.txt index 8087a5dd..c2afaebb 100644 --- a/ReleaseNotes.txt +++ b/ReleaseNotes.txt @@ -1,5 +1,5 @@ -OpenNI 2.3.0 Build 6 -September 16 2013 +OpenNI 2.3.0 Build 7 +September 23 2013 Minimum Requirements: --------------------- From eb87d491e8830c02c5cd0c80d8222b94e1ff601f Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Tue, 24 Sep 2013 08:10:14 +0300 Subject: [PATCH 056/188] Android: build with -j6 --- Wrappers/java/build.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Wrappers/java/build.xml b/Wrappers/java/build.xml index 7d763098..2cdf3f74 100644 --- a/Wrappers/java/build.xml +++ b/Wrappers/java/build.xml @@ -120,7 +120,9 @@ - + + + From 01c91f881033f782e7c09341a0d1830be97c51cd Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Tue, 24 Sep 2013 08:10:29 +0300 Subject: [PATCH 057/188] Android: final tar should be under "Final" dir --- Packaging/ReleaseVersion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packaging/ReleaseVersion.py b/Packaging/ReleaseVersion.py index 9178c5e1..e91f1aff 100755 --- a/Packaging/ReleaseVersion.py +++ b/Packaging/ReleaseVersion.py @@ -155,7 +155,7 @@ def build_android(): harvest = Harvest('..', outputDir, 'Arm', 'Android') harvest.run() - finalFile = outputDir + ".tar" + finalFile = os.path.join(finalDir, outputDir + ".tar") print('Creating archive ' + finalFile) subprocess.check_call(['tar', '-cf', finalFile, outputDir]) From aac9fc906dd89975fa8ffb2b420ccbf54c134a18 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Tue, 24 Sep 2013 08:11:04 +0300 Subject: [PATCH 058/188] Update version to 2.3.0.8. --- Include/OniVersion.h | 2 +- Packaging/Install/Includes/Variables.wxi | 2 +- Packaging/UpdateVersion.py | 2 +- ReleaseNotes.txt | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Include/OniVersion.h b/Include/OniVersion.h index 340c5e9c..76a49aff 100644 --- a/Include/OniVersion.h +++ b/Include/OniVersion.h @@ -23,7 +23,7 @@ #define ONI_VERSION_MAJOR 2 #define ONI_VERSION_MINOR 3 #define ONI_VERSION_MAINTENANCE 0 -#define ONI_VERSION_BUILD 7 +#define ONI_VERSION_BUILD 8 /** OpenNI version (in brief string format): "Major.Minor.Maintenance (Build)" */ #define ONI_BRIEF_VERSION_STRING \ diff --git a/Packaging/Install/Includes/Variables.wxi b/Packaging/Install/Includes/Variables.wxi index 5e1de510..2a676ce7 100644 --- a/Packaging/Install/Includes/Variables.wxi +++ b/Packaging/Install/Includes/Variables.wxi @@ -8,7 +8,7 @@ - + diff --git a/Packaging/UpdateVersion.py b/Packaging/UpdateVersion.py index f3c755b5..bbf728bc 100755 --- a/Packaging/UpdateVersion.py +++ b/Packaging/UpdateVersion.py @@ -28,7 +28,7 @@ VERSION_MAJOR = 2 VERSION_MINOR = 3 VERSION_MAINTENANCE = 0 -VERSION_BUILD = 7 +VERSION_BUILD = 8 def getVersionString(): return str(VERSION_MAJOR) + "." + str(VERSION_MINOR) + "." + str(VERSION_MAINTENANCE) + "." + str(VERSION_BUILD) diff --git a/ReleaseNotes.txt b/ReleaseNotes.txt index c2afaebb..2d8107b5 100644 --- a/ReleaseNotes.txt +++ b/ReleaseNotes.txt @@ -1,5 +1,5 @@ -OpenNI 2.3.0 Build 7 -September 23 2013 +OpenNI 2.3.0 Build 8 +September 24 2013 Minimum Requirements: --------------------- From fc3a4795d7bc7eafa19136bb86d8089b28208881 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Tue, 24 Sep 2013 10:11:44 +0300 Subject: [PATCH 059/188] Update README file --- README | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/README b/README index c91e93f2..530360cc 100644 --- a/README +++ b/README @@ -46,12 +46,7 @@ Linux - JDK 6.0 From: http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u32-downloads-1594644.html Or via apt: - Ubuntu 10.x: - sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner" - sudo apt-get update - sudo apt-get install sun-java6-jdk - Ubuntu 12.x: - sudo apt-get install openjdk-6-jdk + sudo apt-get install openjdk-6-jdk - FreeGLUT3 From: http://freeglut.sourceforge.net/index.php#download Or via apt: @@ -67,8 +62,24 @@ Linux Android ------- -- Android NDK r8d +- Android NDK From: http://developer.android.com/tools/sdk/ndk/index.html#Downloads + You must also define an environment variable called "NDK_HOME" that points to the NDK installation directory. +- Android SDK + From: http://developer.android.com/sdk/index.html#download + You must also define an environment variable called "ANDROID_HOME" that points to the SDK installation directory. +- Ant + On Ubuntu machine: sudo apt-get install ant + For Windows, from: https://code.google.com/p/winant +- JDK 6.0 + For Windows: + From: http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u32-downloads-1594644.html + You must also define an environment variable called "JAVA_HOME" that points to the JDK installation directory. + For example: set JAVA_HOME=c:\Program Files (x86)\Java\jdk1.6.0_32 + For Ubuntu: + From: http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u32-downloads-1594644.html + Or via apt: + sudo apt-get install openjdk-6-jdk Building ======== @@ -78,17 +89,21 @@ Building on Windows: Building on Linux: Run: $ make - + Cross-Compiling for ARM on Linux: The following environment variables should be defined: - ARM_CXX= - ARM_STAGING= Then, run: $ PLATFORM=Arm make + +Building for Android: + - Create a workspace in eclipse + - Import all projects under root directory -Creating OpenNI2 package: - - Go into the directory 'Packaging' - - Run ReleaseVersion.py [x86|x64|arm|android] - NOTE: for android, NDK_ROOT must be defined, pointing to the NDK installation dir. - - Installer will be placed in the 'Final' directory +Creating OpenNI2 Package +======================== +- Go into the directory 'Packaging' +- Run ReleaseVersion.py [x86|x64|Arm|Android] +- Installer will be placed in the 'Final' directory From a11b117325ebdc015038a0a53a9fef2d04d21abd Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Tue, 24 Sep 2013 18:02:02 +0300 Subject: [PATCH 060/188] Remove PS1080 FPS printing (OpenNI now calculates it) --- Source/Drivers/PS1080/Sensor/XnSensorFPS.cpp | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/Source/Drivers/PS1080/Sensor/XnSensorFPS.cpp b/Source/Drivers/PS1080/Sensor/XnSensorFPS.cpp index 379eefa4..1419846d 100644 --- a/Source/Drivers/PS1080/Sensor/XnSensorFPS.cpp +++ b/Source/Drivers/PS1080/Sensor/XnSensorFPS.cpp @@ -38,20 +38,12 @@ XnSensorFPS::XnSensorFPS() : m_nLastPrint(0), m_FramesDump(NULL) { - xnFPSInit(&m_depth, XN_SENSOR_FPS_FRAME_COUNT); - xnFPSInit(&m_color, XN_SENSOR_FPS_FRAME_COUNT); - xnFPSInit(&m_ir, XN_SENSOR_FPS_FRAME_COUNT); - m_FramesDump = xnDumpFileOpen(XN_MASK_SENSOR_FPS, "FramesTimes.csv"); xnDumpFileWriteString(m_FramesDump, "TS,Type,FrameID,FrameTS\n"); } XnSensorFPS::~XnSensorFPS() { - xnFPSFree(&m_depth); - xnFPSFree(&m_color); - xnFPSFree(&m_ir); - xnDumpFileClose(m_FramesDump); } @@ -63,17 +55,5 @@ void XnSensorFPS::Mark(XnFPSData* pFPS, const XnChar* csName, XnUInt32 nFrameID, XnUInt64 nNow; xnOSGetHighResTimeStamp(&nNow); - xnFPSMarkFrame(pFPS, nNow); - xnDumpFileWriteString(m_FramesDump, "%llu,%s,%u,%llu\n", nNow, csName, nFrameID, nTS); - - // get current time in seconds - nNow /= 1000000; - - if (nNow != m_nLastPrint) - { - m_nLastPrint = nNow; - xnLogVerbose(XN_MASK_SENSOR_FPS, "[FPS] Frames - C: %5.2f, D: %5.2f, I: %5.2f", - xnFPSCalc(&m_color), xnFPSCalc(&m_depth), xnFPSCalc(&m_ir)); - } } From 583777c744a79638839ec5f28b7e2062210cf97a Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Sun, 29 Sep 2013 09:06:12 +0300 Subject: [PATCH 061/188] Update README file for Android required SDK --- README | 1 + 1 file changed, 1 insertion(+) diff --git a/README b/README index 530360cc..2b9fd0af 100644 --- a/README +++ b/README @@ -68,6 +68,7 @@ Android - Android SDK From: http://developer.android.com/sdk/index.html#download You must also define an environment variable called "ANDROID_HOME" that points to the SDK installation directory. + Currently requires installing SDK for API level 12 and 18 (via Android SDK Manager) - Ant On Ubuntu machine: sudo apt-get install ant For Windows, from: https://code.google.com/p/winant From 3ea5563987247806f082de7e31c552313c2fbd3c Mon Sep 17 00:00:00 2001 From: Julian Cerruti Date: Wed, 2 Oct 2013 16:47:19 -0300 Subject: [PATCH 062/188] Don't attempt opening devices if none are connected --- .../samples/simpleviewer/SimpleViewerActivity.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Samples/SimpleViewer.Android/src/org/openni/android/samples/simpleviewer/SimpleViewerActivity.java b/Samples/SimpleViewer.Android/src/org/openni/android/samples/simpleviewer/SimpleViewerActivity.java index b4d6e2c1..3fbbdbb3 100644 --- a/Samples/SimpleViewer.Android/src/org/openni/android/samples/simpleviewer/SimpleViewerActivity.java +++ b/Samples/SimpleViewer.Android/src/org/openni/android/samples/simpleviewer/SimpleViewerActivity.java @@ -75,11 +75,12 @@ protected void onResume() { List devices = OpenNI.enumerateDevices(); if (devices.isEmpty()) { showAlertAndExit("No OpenNI-compliant device found."); - } - uri = devices.get(0).getUri(); - - mDeviceOpenPending = true; - mOpenNIHelper.requestDeviceOpen(uri, this); + } else { + uri = devices.get(0).getUri(); + + mDeviceOpenPending = true; + mOpenNIHelper.requestDeviceOpen(uri, this); + } } private void showAlertAndExit(String message) { From a959fb404a71db9af1e5032c3ad8847e7903cf93 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Tue, 6 Aug 2013 19:06:38 +0300 Subject: [PATCH 063/188] OniFile: allow playback of recordings that don't have the cropping property (just assume it's disabled) (cherry picked from commit 19091318890de0e3a921e6677e8b4d3a5d83298a) --- Source/Drivers/OniFile/PlayerStream.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Source/Drivers/OniFile/PlayerStream.cpp b/Source/Drivers/OniFile/PlayerStream.cpp index 9d88be36..2025a806 100644 --- a/Source/Drivers/OniFile/PlayerStream.cpp +++ b/Source/Drivers/OniFile/PlayerStream.cpp @@ -208,13 +208,11 @@ void ONI_CALLBACK_TYPE PlayerStream::OnNewDataCallback(const PlayerSource::NewDa // Set the cropping property. OniCropping cropping; - cropping.enabled = FALSE; int dataSize = sizeof(cropping); rc = pStream->m_pSource->GetProperty(ONI_STREAM_PROPERTY_CROPPING, &cropping, &dataSize); if (rc != ONI_STATUS_OK) { - XN_ASSERT(FALSE); - return; + cropping.enabled = FALSE; } // Allocate new frame and fill it. From 38f8d842bc3710cc29bdef8750ce0601445ee36f Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Tue, 6 Aug 2013 19:24:01 +0300 Subject: [PATCH 064/188] Bug Fix: potential crash when playback restarts (cherry picked from commit 8c2d9ceccefa49d49380ef2307c918056964e817) Conflicts: Source/Drivers/OniFile/PlayerProperties.h --- Source/Drivers/OniFile/PlayerProperties.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Source/Drivers/OniFile/PlayerProperties.h b/Source/Drivers/OniFile/PlayerProperties.h index 7236a4fb..85cf6822 100644 --- a/Source/Drivers/OniFile/PlayerProperties.h +++ b/Source/Drivers/OniFile/PlayerProperties.h @@ -21,7 +21,8 @@ #ifndef __PLAYER_PROPERTIES_H__ #define __PLAYER_PROPERTIES_H__ -#include "XnHash.h" +#include +#include #include "Driver/OniDriverTypes.h" namespace oni_file { @@ -43,6 +44,7 @@ class PlayerProperties OniBool Exists(int propertyId) { + xnl::AutoCSLocker lock(m_cs); if (m_properties.Find(propertyId) != m_properties.End()) { return TRUE; @@ -52,6 +54,8 @@ class PlayerProperties OniStatus GetProperty(int propertyId, void* data, int* pDataSize) const { + xnl::AutoCSLocker lock(m_cs); + // Get the property and make sure it exists. PropertiesHash::ConstIterator iter = m_properties.Find(propertyId); if (iter == m_properties.End()) @@ -69,6 +73,8 @@ class PlayerProperties OniStatus SetProperty(int propertyId, const void* data, int dataSize) { + xnl::AutoCSLocker lock(m_cs); + // Check if property exists. PropertiesHash::Iterator iter = m_properties.Find(propertyId); if (iter != m_properties.End()) @@ -116,6 +122,7 @@ class PlayerProperties XN_DELETE(pBuffer); } + xnl::CriticalSection m_cs; PropertiesHash m_properties; }; From a944edd4b23299a0b795723b4f4ca32588a0a445 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Sun, 29 Sep 2013 16:37:10 +0300 Subject: [PATCH 065/188] Fix compilation warning --- Source/Drivers/PS1080/Sensor/XnSensorFPS.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Drivers/PS1080/Sensor/XnSensorFPS.cpp b/Source/Drivers/PS1080/Sensor/XnSensorFPS.cpp index 1419846d..bb43cc4b 100644 --- a/Source/Drivers/PS1080/Sensor/XnSensorFPS.cpp +++ b/Source/Drivers/PS1080/Sensor/XnSensorFPS.cpp @@ -47,7 +47,7 @@ XnSensorFPS::~XnSensorFPS() xnDumpFileClose(m_FramesDump); } -void XnSensorFPS::Mark(XnFPSData* pFPS, const XnChar* csName, XnUInt32 nFrameID, XnUInt64 nTS) +void XnSensorFPS::Mark(XnFPSData* /*pFPS*/, const XnChar* csName, XnUInt32 nFrameID, XnUInt64 nTS) { if (!xnLogIsEnabled(XN_MASK_SENSOR_FPS, XN_LOG_VERBOSE)) return; From fe966cc29540f5c5e243c591d23809af8d530c29 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Sun, 29 Sep 2013 17:25:57 +0300 Subject: [PATCH 066/188] Update version to 2.3.0.9 --- Include/OniVersion.h | 2 +- Packaging/Install/Includes/Variables.wxi | 2 +- Packaging/UpdateVersion.py | 2 +- ReleaseNotes.txt | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Include/OniVersion.h b/Include/OniVersion.h index 76a49aff..f839037a 100644 --- a/Include/OniVersion.h +++ b/Include/OniVersion.h @@ -23,7 +23,7 @@ #define ONI_VERSION_MAJOR 2 #define ONI_VERSION_MINOR 3 #define ONI_VERSION_MAINTENANCE 0 -#define ONI_VERSION_BUILD 8 +#define ONI_VERSION_BUILD 9 /** OpenNI version (in brief string format): "Major.Minor.Maintenance (Build)" */ #define ONI_BRIEF_VERSION_STRING \ diff --git a/Packaging/Install/Includes/Variables.wxi b/Packaging/Install/Includes/Variables.wxi index 2a676ce7..682338ee 100644 --- a/Packaging/Install/Includes/Variables.wxi +++ b/Packaging/Install/Includes/Variables.wxi @@ -8,7 +8,7 @@ - + diff --git a/Packaging/UpdateVersion.py b/Packaging/UpdateVersion.py index bbf728bc..ba2b7781 100755 --- a/Packaging/UpdateVersion.py +++ b/Packaging/UpdateVersion.py @@ -28,7 +28,7 @@ VERSION_MAJOR = 2 VERSION_MINOR = 3 VERSION_MAINTENANCE = 0 -VERSION_BUILD = 8 +VERSION_BUILD = 9 def getVersionString(): return str(VERSION_MAJOR) + "." + str(VERSION_MINOR) + "." + str(VERSION_MAINTENANCE) + "." + str(VERSION_BUILD) diff --git a/ReleaseNotes.txt b/ReleaseNotes.txt index 2d8107b5..7a9137bb 100644 --- a/ReleaseNotes.txt +++ b/ReleaseNotes.txt @@ -1,5 +1,5 @@ -OpenNI 2.3.0 Build 8 -September 24 2013 +OpenNI 2.3.0 Build 9 +September 29 2013 Minimum Requirements: --------------------- From 4f4849bd2375a08237eb7ce4fe2d74b51fbb4643 Mon Sep 17 00:00:00 2001 From: "oz.magal" Date: Mon, 30 Sep 2013 15:33:15 +0300 Subject: [PATCH 067/188] Merge remote-tracking branch 'origin/AutoRecorder' into develop Conflicts: Config/OpenNI.ini Source/Core/OniContext.cpp --- Config/OpenNI.ini | 3 +- Source/Core/OniContext.cpp | 45 +- Source/Core/OniContext.h | 5 + Source/Core/OniFileRecorder.cpp | 1106 +++++++++++++++++++++++++++ Source/Core/OniFileRecorder.h | 189 +++++ Source/Core/OniRecorder.cpp | 1123 ++-------------------------- Source/Core/OniRecorder.h | 195 +---- Source/Core/OpenNI.vcxproj | 2 + Source/Core/OpenNI.vcxproj.filters | 8 +- 9 files changed, 1423 insertions(+), 1253 deletions(-) create mode 100644 Source/Core/OniFileRecorder.cpp create mode 100644 Source/Core/OniFileRecorder.h diff --git a/Config/OpenNI.ini b/Config/OpenNI.ini index 44c2f57d..5dc0926d 100644 --- a/Config/OpenNI.ini +++ b/Config/OpenNI.ini @@ -7,10 +7,11 @@ LogWriteToAndroidLog=0 [Device] ;Override= +;RecordTo= [Drivers] ; Location of the drivers, relative to OpenNI shared library location. When not provided, "OpenNI2/Drivers" will be used. ;Repository=OpenNI2/Drivers ; List of drivers to load, separated by commas. When not provided, OpenNI will try to load each shared library in Repository. -;List= \ No newline at end of file +;List= diff --git a/Source/Core/OniContext.cpp b/Source/Core/OniContext.cpp index e1f15ed4..93962d5f 100644 --- a/Source/Core/OniContext.cpp +++ b/Source/Core/OniContext.cpp @@ -19,6 +19,7 @@ * * *****************************************************************************/ #include "OniContext.h" +#include "OniFileRecorder.h" #include "OniStreamFrameHolder.h" #include #include @@ -32,7 +33,7 @@ ONI_NAMESPACE_IMPLEMENTATION_BEGIN OniBool Context::s_valid = FALSE; -Context::Context() : m_errorLogger(xnl::ErrorLogger::GetInstance()), m_initializationCounter(0), m_lastFPSPrint(0) +Context::Context() : m_errorLogger(xnl::ErrorLogger::GetInstance()), m_autoRecording(false), m_autoRecordingStarted(false), m_initializationCounter(0), m_lastFPSPrint(0) { m_overrideDevice[0] = '\0'; m_driverRepo[0] = '\0'; @@ -204,6 +205,17 @@ XnStatus Context::configure() xnLogWarning(XN_MASK_ONI_CONTEXT, "Device will be overridden with '%s'", m_overrideDevice); } + XnChar autoRecordingName[XN_FILE_MAX_PATH]; + rc = xnOSReadStringFromINI(strOniConfigurationFile, "Device", "RecordTo", autoRecordingName, XN_FILE_MAX_PATH); + if (rc == XN_STATUS_OK) + { + OniStatus oniRc = recorderOpen(autoRecordingName, &m_autoRecorder); + if (oniRc == ONI_STATUS_OK) + { + m_autoRecording = true; + } + } + XnChar strRepo[XN_FILE_MAX_PATH]; #if XN_PLATFORM != XN_PLATFORM_ANDROID_ARM @@ -630,6 +642,13 @@ OniStatus Context::createStream(OniDeviceHandle device, OniSensorType sensorType m_streams.AddLast(pMyStream); m_cs.Unlock(); + if (m_autoRecording) + { + m_streamsToAutoRecord.Lock(); + m_streamsToAutoRecord.AddLast(*pStream); + m_streamsToAutoRecord.Unlock(); + } + return ONI_STATUS_OK; } @@ -642,6 +661,13 @@ OniStatus Context::streamDestroy(OniStreamHandle stream) return ONI_STATUS_OK; } + if (m_autoRecording) + { + m_streamsToAutoRecord.Lock(); + m_streamsToAutoRecord.Remove(stream); + m_streamsToAutoRecord.Unlock(); + } + VideoStream* pStream = stream->pStream; rc = streamDestroy(pStream); if (rc == ONI_STATUS_OK) @@ -738,6 +764,19 @@ void Context::frameAddRef(OniFrame* pFrame) OniStatus Context::waitForStreams(OniStreamHandle* pStreams, int streamCount, int* pStreamIndex, int timeout) { + if (m_autoRecording && !m_autoRecordingStarted) + { + m_streamsToAutoRecord.Lock(); + for (xnl::List::ConstIterator iter = m_streamsToAutoRecord.Begin(); iter != m_streamsToAutoRecord.End(); ++iter) + { + m_autoRecorder->pRecorder->attachStream(*(*iter)->pStream, true); + } + m_streamsToAutoRecord.Unlock(); + + m_autoRecorder->pRecorder->start(); + m_autoRecordingStarted = true; + } + static const int MAX_WAITED_STREAMS = 50; Device* deviceList[MAX_WAITED_STREAMS]; VideoStream* streamsList[MAX_WAITED_STREAMS]; @@ -1021,7 +1060,9 @@ OniStatus Context::recorderOpen(const char* fileName, OniRecorderHandle* pRecord return ONI_STATUS_ERROR; } // Create the recorder itself. - if (NULL == ((*pRecorder)->pRecorder = XN_NEW(Recorder, m_frameManager, m_errorLogger, *pRecorder))) + (*pRecorder)->pRecorder = XN_NEW(FileRecorder, m_frameManager, m_errorLogger, *pRecorder); + + if (NULL == (*pRecorder)->pRecorder) { XN_DELETE(*pRecorder); return ONI_STATUS_ERROR; diff --git a/Source/Core/OniContext.h b/Source/Core/OniContext.h index 3d915d11..a12bbf28 100644 --- a/Source/Core/OniContext.h +++ b/Source/Core/OniContext.h @@ -135,6 +135,11 @@ class Context xnl::List m_streams; xnl::List m_recorders; + xnl::Lockable > m_streamsToAutoRecord; + XnBool m_autoRecording; + XnBool m_autoRecordingStarted; + OniRecorderHandle m_autoRecorder; + xnl::Hash m_waitingThreads; xnl::CriticalSection m_cs; diff --git a/Source/Core/OniFileRecorder.cpp b/Source/Core/OniFileRecorder.cpp new file mode 100644 index 00000000..55d16810 --- /dev/null +++ b/Source/Core/OniFileRecorder.cpp @@ -0,0 +1,1106 @@ +/***************************************************************************** +* * +* OpenNI 2.x Alpha * +* Copyright (C) 2012 PrimeSense Ltd. * +* * +* This file is part of OpenNI. * +* * +* Licensed under the Apache License, Version 2.0 (the "License"); * +* you may not use this file except in compliance with the License. * +* You may obtain a copy of the License at * +* * +* http://www.apache.org/licenses/LICENSE-2.0 * +* * +* Unless required by applicable law or agreed to in writing, software * +* distributed under the License is distributed on an "AS IS" BASIS, * +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * +* See the License for the specific language governing permissions and * +* limitations under the License. * +* * +*****************************************************************************/ +#include "OniFileRecorder.h" + +#include "XnLockGuard.h" + +#include "OniContext.h" +#include "OniProperties.h" +#include "PS1080.h" +#include "PSLink.h" +#include "FileProperties.h" + +ONI_NAMESPACE_IMPLEMENTATION_BEGIN + +// NOTE: XnLib does not define UINT*_C like macros for some reason... +#define XN_UINT64_C(x) ((x) + (XN_MAX_UINT64 - XN_MAX_UINT64)) +#define XN_UINT32_C(x) ((x) + (XN_MAX_UINT32 - XN_MAX_UINT32)) + +namespace { + +enum PropertyType +{ + PROPERTY_TYPE_GENERAL, + PROPERTY_TYPE_INTEGER, + PROPERTY_TYPE_REAL +}; + +const struct PropertyTable { + XnUInt32 propertyId; + const char* propertyName; + PropertyType propertyType; +} propertyTable[] = { + // PS1080 Properties + { XN_STREAM_PROPERTY_INPUT_FORMAT, "InputFormat" , PROPERTY_TYPE_INTEGER }, + { XN_STREAM_PROPERTY_CROPPING_MODE, "CroppingMode" , PROPERTY_TYPE_INTEGER }, + { XN_STREAM_PROPERTY_WHITE_BALANCE_ENABLED, "WhiteBalancedEnabled", PROPERTY_TYPE_INTEGER }, + { XN_STREAM_PROPERTY_GAIN, "Gain" , PROPERTY_TYPE_INTEGER }, + { XN_STREAM_PROPERTY_HOLE_FILTER, "HoleFilter" , PROPERTY_TYPE_INTEGER }, + { XN_STREAM_PROPERTY_REGISTRATION_TYPE, "RegistrationType" , PROPERTY_TYPE_INTEGER }, + { XN_STREAM_PROPERTY_AGC_BIN, "AGCBin" , PROPERTY_TYPE_GENERAL }, + { XN_STREAM_PROPERTY_CONST_SHIFT, "ConstShift" , PROPERTY_TYPE_INTEGER }, + { XN_STREAM_PROPERTY_PIXEL_SIZE_FACTOR, "PixelSizeFactor" , PROPERTY_TYPE_INTEGER }, + { XN_STREAM_PROPERTY_MAX_SHIFT, "MaxShift" , PROPERTY_TYPE_INTEGER }, + { XN_STREAM_PROPERTY_PARAM_COEFF, "ParamCoeff" , PROPERTY_TYPE_INTEGER }, + { XN_STREAM_PROPERTY_SHIFT_SCALE, "ShiftScale" , PROPERTY_TYPE_INTEGER }, + { XN_STREAM_PROPERTY_S2D_TABLE, "S2D" , PROPERTY_TYPE_GENERAL }, + { XN_STREAM_PROPERTY_D2S_TABLE, "D2S" , PROPERTY_TYPE_GENERAL }, + { XN_STREAM_PROPERTY_ZERO_PLANE_DISTANCE, "ZPD" , PROPERTY_TYPE_INTEGER }, + { XN_STREAM_PROPERTY_ZERO_PLANE_PIXEL_SIZE, "ZPPS" , PROPERTY_TYPE_REAL }, + { XN_STREAM_PROPERTY_EMITTER_DCMOS_DISTANCE, "LDDIS" , PROPERTY_TYPE_REAL }, + { XN_STREAM_PROPERTY_DCMOS_RCMOS_DISTANCE, "DCRCDIS" , PROPERTY_TYPE_REAL }, + { XN_STREAM_PROPERTY_CLOSE_RANGE, "CloseRange" , PROPERTY_TYPE_INTEGER }, + { XN_STREAM_PROPERTY_FAST_ZOOM_CROP, "FastZoomCrop" , PROPERTY_TYPE_INTEGER }, + { XN_STREAM_PROPERTY_PIXEL_REGISTRATION, "PixelRegistration" , PROPERTY_TYPE_GENERAL }, + // PSLink Properties + { LINK_PROP_MAX_SHIFT, "MaxShift", PROPERTY_TYPE_INTEGER}, + { LINK_PROP_ZERO_PLANE_DISTANCE, "ZPD", PROPERTY_TYPE_INTEGER}, + { LINK_PROP_CONST_SHIFT, "ConstShift", PROPERTY_TYPE_INTEGER}, + { LINK_PROP_PARAM_COEFF, "ParamCoeff", PROPERTY_TYPE_INTEGER}, + { LINK_PROP_SHIFT_SCALE, "ShiftScale", PROPERTY_TYPE_INTEGER}, + { LINK_PROP_ZERO_PLANE_PIXEL_SIZE, "ZPPS", PROPERTY_TYPE_REAL}, + { LINK_PROP_EMITTER_DEPTH_CMOS_DISTANCE, "LDDIS", PROPERTY_TYPE_REAL}, + { LINK_PROP_SHIFT_TO_DEPTH_TABLE, "S2D", PROPERTY_TYPE_GENERAL}, + { LINK_PROP_DEPTH_TO_SHIFT_TABLE, "D2S", PROPERTY_TYPE_GENERAL}, + // File Properties + { ONI_FILE_PROPERTY_ORIGINAL_DEVICE, "oniOriginalDevice", PROPERTY_TYPE_GENERAL} +}; + +const XnSizeT propertyTableItemsCount = sizeof(propertyTable) / sizeof(propertyTable[0]); + +} // namespace + +/** + * Is used by Recorder to make it possible to undo failed records. + * + * The usage pattern is: + * + * void Recorder::YourMethod() { + * // Create an undo point. + * Memento undoPoint(this); + * + * // Emit records here. If anything goes wrong - just return from this + * // method. + * + * // If anything went okay, release the undo point, so that nothing will + * // be undone. + * undoPoint.Release(); + * } + * + */ +class FileRecorder::Memento +{ +public: + /** + * Creates a Memento for the current state of the given Recorder. + */ + Memento(FileRecorder* pRecorder) + : m_pRecorder(pRecorder), m_offset(XN_UINT64_C(0)) + { + Reuse(); + } + + /** + * Destroys the Memento and reverts the Recorder back to the remembered state. + * + * @note The undo action will not be done if you have released the Memento. + */ + ~Memento() + { + if (m_needRollback) + { + Undo(); + } + } + + /** + * Releases the Memento. A released memento will not undo. + */ + void Release() + { + m_needRollback = false; + } + + /** + * ReUses the Memento. it will function like a brand-new one. + */ + void Reuse() + { + m_needRollback = true; + + XnStatus status = xnOSTellFile64(m_pRecorder->m_file, &m_offset); + if (status != XN_STATUS_OK) + { + m_pRecorder = NULL; + } + } + + /** + * Explicitly undo emits. Reverts the Recorder back to the remembered state. + */ + void Undo() + { + if (m_pRecorder != NULL) + { + xnOSSeekFile64(m_pRecorder->m_file, XN_OS_SEEK_SET, m_offset); + } + } + + /** + * An easy way to get the current position of the file. (and save for later use) + */ + XnUInt64 GetPosition() + { + return m_offset; + } + + /** + * An easey way to get the current position of the file. (for later use) + */ + void SetPosition(XnUInt64 pos) + { + if (m_pRecorder != NULL) + { + xnOSSeekFile64(m_pRecorder->m_file, XN_OS_SEEK_SET, pos); + } + } + +private: + FileRecorder* m_pRecorder; + XnUInt64 m_offset; + XnBool m_needRollback; +}; + +FileRecorder::FileRecorder(FrameManager& frameManager, xnl::ErrorLogger& errorLogger, OniRecorderHandle handle) : + Recorder(handle), + m_frameManager(frameManager), + m_errorLogger(errorLogger), + m_maxId(0), + m_configurationId(0), + m_propertyPriority(ms_priorityNormal), + m_file(XN_INVALID_FILE_HANDLE) +{ +} + +FileRecorder::~FileRecorder() +{ + stop(); + detachAllStreams(); + send(Message::MESSAGE_TERMINATE); + xnOSWaitForThreadExit(m_thread, XN_WAIT_INFINITE); + xnOSCloseThread(&m_thread); + if (NULL != m_handle) + { + m_handle->pRecorder = NULL; + } +} + +OniStatus FileRecorder::initialize(const char* fileName) +{ + m_fileName = fileName; + + // Probe if we can actually open the file. + XN_FILE_HANDLE fileHandle = XN_INVALID_FILE_HANDLE; + XnStatus status = xnOSOpenFile( + /* file name = */ fileName, + /* open flags = */ XN_OS_FILE_WRITE | XN_OS_FILE_TRUNCATE, + /* out handle = */ &fileHandle); + if (XN_STATUS_OK != status) + { + return ONI_STATUS_ERROR; + } + xnOSCloseFile(&fileHandle); + + m_assembler.initialize(); + + status = xnOSCreateThread(threadMain, this, &m_thread); + if (XN_STATUS_OK != status) + { + return ONI_STATUS_ERROR; + } + + send(Message::MESSAGE_INITIALIZE); + return ONI_STATUS_OK; +} + +OniStatus FileRecorder::attachStream(VideoStream& stream, OniBool allowLossyCompression) +{ + OniStatus rc = Recorder::attachStream(stream, allowLossyCompression); + if (rc == ONI_STATUS_OK) + { + VideoStream* pStream = &stream; + xnl::LockGuard guard(m_streams); + m_streams[pStream].nodeId = ++m_maxId; + m_streams[pStream].pCodec = NULL; + m_streams[pStream].frameId = 0; + m_streams[pStream].allowLossyCompression = allowLossyCompression; + m_streams[pStream].frameId = 0; + m_streams[pStream].lastOutputTimestamp = 0; + m_streams[pStream].lastInputTimestamp = 0; + m_streams[pStream].lastNewDataRecordPosition = 0; + m_streams[pStream].dataIndex.Clear(); + send(Message::MESSAGE_ATTACH, pStream); + } + + return rc; +} + +OniStatus FileRecorder::detachStream(VideoStream& stream) +{ + OniStatus rc = Recorder::detachStream(stream); + if (rc == ONI_STATUS_OK) + { + xnl::LockGuard guard(m_streams); + VideoStream* pStream = &stream; + send(Message::MESSAGE_DETACH, pStream); + } + + return rc; +} + +OniStatus FileRecorder::start() +{ + Recorder::start(); + send(Message::MESSAGE_START); + return ONI_STATUS_OK; +} + +OniStatus FileRecorder::record(VideoStream& stream, OniFrame& aFrame) +{ + if (!m_started) + { + return ONI_STATUS_ERROR; + } + xnl::LockGuard< AttachedStreams > guard(m_streams); + VideoStream* pStream = &stream; + if (m_streams.Find(pStream) == m_streams.End()) + { + return ONI_STATUS_BAD_PARAMETER; + } + OniFrame* pFrame = &aFrame; + m_frameManager.addRef(pFrame); + send(Message::MESSAGE_RECORD, pStream, pFrame); + return ONI_STATUS_OK; +} + +OniStatus FileRecorder::recordStreamProperty( + VideoStream& stream, + int propertyId, + const void* pData, + int dataSize) +{ + xnl::LockGuard< AttachedStreams > guard(m_streams); + VideoStream* pStream = &stream; + if (m_streams.Find(pStream) == m_streams.End()) + { + return ONI_STATUS_BAD_PARAMETER; + } + // The original pData will not be valid after this function ends. + // Free this pointer when soon after handling the PropertyMessage! + void *newPtr = xnOSMalloc(dataSize); + xnOSMemCopy(newPtr, pData, dataSize); + send(Message::MESSAGE_RECORDPROPERTY, pStream, newPtr, propertyId, dataSize, m_propertyPriority); + return ONI_STATUS_OK; +} + +XN_THREAD_PROC FileRecorder::threadMain(XN_THREAD_PARAM pThreadParam) +{ + FileRecorder* pSelf = reinterpret_cast(pThreadParam); + if (NULL != pSelf) + { + pSelf->m_running = TRUE; + while (pSelf->m_running) + { + pSelf->messagePump(); + } + } + XN_THREAD_PROC_RETURN(XN_STATUS_OK); +} + +void FileRecorder::messagePump() +{ + XnStatus nRetVal = XN_STATUS_OK; + Message msg = { Message::MESSAGE_NO_OPERATION, 0, NULL, {NULL}, 0, 0 }; + + { + xnl::LockGuard guard(m_queue); + nRetVal = m_queue.Pop(msg); + } + + if (XN_STATUS_OK == nRetVal) + { + switch (msg.type) + { + case Message::MESSAGE_INITIALIZE: + { + onInitialize(); + } + break; + case Message::MESSAGE_TERMINATE: + { + onTerminate(); + m_running = FALSE; + } + break; + case Message::MESSAGE_ATTACH: + { + xnl::LockGuard streamsGuard(m_streams); + AttachedStreams::Iterator i = m_streams.Find(msg.pStream); + if (i != m_streams.End()) + { + onAttach(i->Value().nodeId, msg.pStream); + } + } + break; + case Message::MESSAGE_DETACH: + { + xnl::LockGuard streamsGuard(m_streams); + AttachedStreams::Iterator i = m_streams.Find(msg.pStream); + if (i != m_streams.End()) + { + onDetach(i->Value().nodeId); + XN_DELETE(m_streams[msg.pStream].pCodec); + m_streams.Remove(msg.pStream); + } + } + break; + case Message::MESSAGE_START: + { + xnl::LockGuard streamsGuard(m_streams); + for (AttachedStreams::Iterator + i = m_streams.Begin(), + e = m_streams.End(); + i != e; ++i) + { + onStart(i->Value().nodeId); + } + m_started = true; + } + break; + case Message::MESSAGE_RECORD: + { + xnl::LockGuard streamsGuard(m_streams); + AttachedStreams::Iterator i = m_streams.Find(msg.pStream); + if (i != m_streams.End()) + { + XnCodecBase* pCodec = m_streams[msg.pStream].pCodec; + XnUInt32 frameId = ++m_frameIds[msg.pStream]; + ++m_streams[msg.pStream].frameId; + XnUInt64 timestamp = 0; + if (frameId > 1) + { + timestamp = m_streams[msg.pStream].lastOutputTimestamp + (msg.pFrame->timestamp - m_streams[msg.pStream].lastInputTimestamp); + } + m_streams[msg.pStream].lastInputTimestamp = msg.pFrame->timestamp; + m_streams[msg.pStream].lastOutputTimestamp = timestamp; + onRecord(i->Value().nodeId, pCodec, msg.pFrame, frameId, timestamp); + m_frameManager.release(msg.pFrame); + } + } + break; + case Message::MESSAGE_RECORDPROPERTY: + { + xnl::LockGuard streamsGuard(m_streams); + AttachedStreams::Iterator i = m_streams.Find(msg.pStream); + if (i != m_streams.End()) + { + onRecordProperty( + i->Value().nodeId, + msg.propertyId, + msg.pData, + msg.dataSize); + } + // free the temporary buffer allocated earlier + xnOSFree((void*)msg.pData); + } + break; + default: + ; + } + } +} + +void FileRecorder::send( + Message::Type type, + VideoStream* pStream, + const void* pData, + XnUInt32 propertyId, + XnSizeT dataSize, + int priority) +{ + Message msg = + { + type, + pStream != NULL ? m_streams[pStream].nodeId : 0, + pStream, + {pData}, + propertyId, + dataSize + }; + xnl::LockGuard guard(m_queue); + m_queue.Push(msg, priority); +} + +void FileRecorder::onInitialize() +{ + XnStatus status = xnOSOpenFile( + /* file name = */ m_fileName.Data(), + /* open flags = */ XN_OS_FILE_WRITE | XN_OS_FILE_TRUNCATE, + /* out handle = */ &m_file); + + if (XN_STATUS_OK == status) + { + FileHeaderData fileHeader = + { + /* identity = */ { 'N', 'I', '1', '0' }, + /* version = */ { 1, 0, 1, 0 }, + /* maxTimeStamp = */ XN_MAX_UINT64, + /* maxNodeId = */ m_maxId, + }; + m_fileHeader = fileHeader; + xnOSWriteFile(m_file, &m_fileHeader, sizeof(m_fileHeader)); + } +} + +// A handy macro, that makes code more readable. +// Usage: +// +// void Recorder::YourMethod() { +// Memento undoPoint(this); +// EMIT(RECORD_END()) /* #1 */ +// EMIT(RECORD_END()) /* #2 */ +// undoPoint.Release(); +// } +// +// This will safely emit RECORD_END into the file, if either of (#1 or #2) +// expressions fail, the undoPoint will revert the file to the state, prior +// to YourMethod execution. +// +#define EMIT(expr) \ + if (ONI_STATUS_OK == (m_assembler.emit_##expr)) \ + { \ + if (ONI_STATUS_OK != m_assembler.serialize(m_file)) \ + { \ + return; \ + } \ + } \ + else \ + { \ + return; \ + } + +#define FIND_ATTACHED_STREAM_INFO(nodeId) \ + AttachedStreamInfo *pInfo = NULL; \ + xnl::LockGuard guard(m_streams); \ + for (AttachedStreams::Iterator \ + i = m_streams.Begin(), e = m_streams.End(); \ + i != e; \ + ++i) \ + { \ + if(i->Value().nodeId == nodeId) \ + { \ + pInfo = &(i->Value()); \ + break; \ + } \ + } + +XnUInt64 FileRecorder::getLastPropertyRecordPos(XnUInt32 nodeId, const char *propName, XnUInt64 newRecordPos) +{ + XnUInt64 pos = 0; + FIND_ATTACHED_STREAM_INFO(nodeId) + if (!pInfo) return 0; + + if (pInfo->lastPropertyRecordPosition.Find(propName) != pInfo->lastPropertyRecordPosition.End()) + { + pos = pInfo->lastPropertyRecordPosition[propName]; + } + pInfo->lastPropertyRecordPosition[propName] = newRecordPos; + return pos; +} + +void FileRecorder::onTerminate() +{ + // Truncate the file to it's last offset, so that undone records + // will not be serialized. + XnUInt64 truncationOffset = XN_UINT64_C(0); + if (XN_STATUS_OK == xnOSTellFile64(m_file, &truncationOffset)) + { + xnOSTruncateFile64(m_file, truncationOffset); + } + + Memento undoPoint(this); + EMIT(RECORD_END()) + undoPoint.Release(); + + // The file header needs being patched, because its maxNodeId field has become + // irrelevant by now. + m_fileHeader.maxNodeId = m_maxId; + xnOSSeekFile64(m_file, XN_OS_SEEK_SET, XN_UINT64_C(0)); + xnOSWriteFile(m_file, &m_fileHeader, sizeof(m_fileHeader)); + + xnOSCloseFile(&m_file); + m_file = XN_INVALID_FILE_HANDLE; +} + +typedef enum XnPixelFormat +{ + XN_PIXEL_FORMAT_RGB24 = 1, + XN_PIXEL_FORMAT_YUV422 = 2, + XN_PIXEL_FORMAT_GRAYSCALE_8_BIT = 3, + XN_PIXEL_FORMAT_GRAYSCALE_16_BIT = 4, + XN_PIXEL_FORMAT_MJPEG = 5, +} XnPixelFormat; + +typedef struct XnSupportedPixelFormats +{ + XnBool m_bRGB24 : 1; + XnBool m_bYUV422 : 1; + XnBool m_bGrayscale8Bit : 1; + XnBool m_bGrayscale16Bit : 1; + XnBool m_bMJPEG : 1; + XnUInt m_nPadding : 3; + XnUInt m_nReserved : 24; +} XnSupportedPixelFormats; + +XnPixelFormat toXnPixelFormat(OniPixelFormat oniFormat) +{ + switch(oniFormat) + { + // Depth + case ONI_PIXEL_FORMAT_DEPTH_1_MM: return XN_PIXEL_FORMAT_GRAYSCALE_16_BIT; + case ONI_PIXEL_FORMAT_DEPTH_100_UM: return XN_PIXEL_FORMAT_GRAYSCALE_16_BIT; + case ONI_PIXEL_FORMAT_SHIFT_9_2: return XN_PIXEL_FORMAT_GRAYSCALE_16_BIT; + case ONI_PIXEL_FORMAT_SHIFT_9_3: return XN_PIXEL_FORMAT_GRAYSCALE_16_BIT; + + // Color + case ONI_PIXEL_FORMAT_RGB888: return XN_PIXEL_FORMAT_RGB24; + case ONI_PIXEL_FORMAT_YUV422: return XN_PIXEL_FORMAT_YUV422; + case ONI_PIXEL_FORMAT_GRAY8: return XN_PIXEL_FORMAT_GRAYSCALE_8_BIT; + case ONI_PIXEL_FORMAT_GRAY16: return XN_PIXEL_FORMAT_GRAYSCALE_16_BIT; + case ONI_PIXEL_FORMAT_JPEG: return XN_PIXEL_FORMAT_MJPEG; + + default: + //not supported by OpenNI 1.x + return XnPixelFormat(0); + } +} + +void fillXnSupportedPixelFormats(XnSupportedPixelFormats &xnSPF, OniPixelFormat oniFormat) +{ + xnOSMemSet(&xnSPF, 0, sizeof(xnSPF)); + switch(toXnPixelFormat(oniFormat)) + { + case XN_PIXEL_FORMAT_RGB24: xnSPF.m_bRGB24 = 1; break; + case XN_PIXEL_FORMAT_YUV422: xnSPF.m_bYUV422 = 1; break; + case XN_PIXEL_FORMAT_GRAYSCALE_8_BIT: xnSPF.m_bGrayscale8Bit = 1; break; + case XN_PIXEL_FORMAT_GRAYSCALE_16_BIT: xnSPF.m_bGrayscale16Bit = 1; break; + case XN_PIXEL_FORMAT_MJPEG: xnSPF.m_bMJPEG = 1; break; + } +} + +void FileRecorder::onAttach(XnUInt32 nodeId, VideoStream* pStream) +{ + if (nodeId == 0 || pStream == NULL) + { + return; + } + const OniSensorInfo* pSensorInfo = pStream->getSensorInfo(); + if (pSensorInfo == NULL) + { + return; + } + + // Assume we'll be using uncompressed codec. + XnUInt32 codecId = ONI_CODEC_UNCOMPRESSED; + + // Applicable for depth streams only. + int maxDepth = XN_MAX_UINT16; + + OniVideoMode curVideoMode; + int size = sizeof(OniVideoMode); + pStream->getProperty(ONI_STREAM_PROPERTY_VIDEO_MODE, &curVideoMode, &size); + + // Guess codec type from video mode format. + switch (curVideoMode.pixelFormat) + { + case ONI_PIXEL_FORMAT_DEPTH_100_UM: + case ONI_PIXEL_FORMAT_DEPTH_1_MM: + { + size = int(sizeof(maxDepth)); + + pStream->getProperty( + ONI_STREAM_PROPERTY_MAX_VALUE, &maxDepth, &size); + + m_streams[pStream].pCodec = XN_NEW( + Xn16zEmbTablesCodec, static_cast(maxDepth)); + + codecId = ONI_CODEC_16Z_EMB_TABLES; + } + break; + case ONI_PIXEL_FORMAT_RGB888: + { + if (m_streams[pStream].allowLossyCompression) + { + m_streams[pStream].pCodec = XN_NEW( + XnJpegCodec, + /* bRGB = */ TRUE, + curVideoMode.resolutionX, + curVideoMode.resolutionY); + + codecId = ONI_CODEC_JPEG; + } + else + { + m_streams[pStream].pCodec = XN_NEW(XnUncompressedCodec); + } + } + break; + default: + m_streams[pStream].pCodec = XN_NEW(XnUncompressedCodec); + break; + } + + // If anything went wrong - fall back to uncompressed format. + if (XN_STATUS_OK != m_streams[pStream].pCodec->Init()) + { + XN_DELETE(m_streams[pStream].pCodec); + m_streams[pStream].pCodec = NULL; + codecId = ONI_CODEC_UNCOMPRESSED; + } + + Memento undoPoint(this); + // save the position of this record so we can override it upon detaching + m_streams[pStream].nodeAddedRecordPosition = undoPoint.GetPosition(); + + EMIT(RECORD_NODE_ADDED( + m_streams[pStream].nodeType = AsNodeType(pSensorInfo->sensorType), + nodeId, + m_streams[pStream].codecId = codecId, + /* numberOfFrames = */ XN_MAX_UINT32, + /* minTimeStamp = */ XN_UINT64_C(0), + /* maxTimeStamp = */ XN_MAX_UINT64, + /* seekTablePosition = */ XN_UINT64_C(0) + )) + undoPoint.Reuse(); + + EMIT(RECORD_GENERAL_PROPERTY( + nodeId, + getLastPropertyRecordPos(nodeId, "oniOriginalDevice", undoPoint.GetPosition()), + "oniOriginalDevice", + pStream->getDevice().getInfo()->name, + sizeof(pStream->getDevice().getInfo()->name) + )); + undoPoint.Reuse(); + + // required data size (for cases where data is larger than video mode) + EMIT(RECORD_INT_PROPERTY( + nodeId, + getLastPropertyRecordPos(nodeId, "oniRequiredFrameSize", undoPoint.GetPosition()), + "oniRequiredFrameSize", + pStream->getRequiredFrameSize() + )); + undoPoint.Reuse(); + + // isGenerating (needed for OpenNI 1.x playback) + EMIT(RECORD_INT_PROPERTY( + nodeId, + getLastPropertyRecordPos(nodeId, "xnIsGenerating", undoPoint.GetPosition()), + "xnIsGenerating", + TRUE + )); + undoPoint.Reuse(); + + // xnDeviceMaxDepth + if (curVideoMode.pixelFormat == ONI_PIXEL_FORMAT_DEPTH_1_MM || + curVideoMode.pixelFormat == ONI_PIXEL_FORMAT_DEPTH_100_UM) + { + EMIT(RECORD_INT_PROPERTY( + nodeId, + getLastPropertyRecordPos(nodeId, "xnDeviceMaxDepth", undoPoint.GetPosition()), + "xnDeviceMaxDepth", + maxDepth + )) + } + undoPoint.Reuse(); + + // xnSupportedMapOutputModesCount + EMIT(RECORD_INT_PROPERTY( + nodeId, + getLastPropertyRecordPos(nodeId, "xnSupportedMapOutputModesCount", undoPoint.GetPosition()), + "xnSupportedMapOutputModesCount", + pSensorInfo->numSupportedVideoModes + )) + undoPoint.Reuse(); + + // xnSupportedMapOutputModes + VideoModeData* pVideoModes = XN_NEW_ARR( + VideoModeData, pSensorInfo->numSupportedVideoModes); + for (int i = 0; i < pSensorInfo->numSupportedVideoModes; ++i) + { + const OniVideoMode& videoMode = pSensorInfo->pSupportedVideoModes[i]; + pVideoModes[i].width = videoMode.resolutionX; + pVideoModes[i].height = videoMode.resolutionY; + pVideoModes[i].fps = videoMode.fps; + } + + EMIT(RECORD_GENERAL_PROPERTY( + nodeId, + getLastPropertyRecordPos(nodeId, "xnSupportedMapOutputModes", undoPoint.GetPosition()), + "xnSupportedMapOutputModes", + pVideoModes, + sizeof(*pVideoModes) * pSensorInfo->numSupportedVideoModes + )) + undoPoint.Reuse(); + + // xnMapOutputMode + VideoModeData curVMD; + curVMD.width = curVideoMode.resolutionX; + curVMD.height = curVideoMode.resolutionY; + curVMD.fps = curVideoMode.fps; + EMIT(RECORD_GENERAL_PROPERTY( + nodeId, + getLastPropertyRecordPos(nodeId, "xnMapOutputMode", undoPoint.GetPosition()), + "xnMapOutputMode", + &curVMD, + sizeof(curVMD) + )) + undoPoint.Reuse(); + + XnPixelFormat pixelFormat = toXnPixelFormat(curVideoMode.pixelFormat); + if (pixelFormat != 0) + { + // xnSupportedPixelFormats + XnSupportedPixelFormats supportedPixelFormats; + fillXnSupportedPixelFormats(supportedPixelFormats, curVideoMode.pixelFormat); + EMIT(RECORD_GENERAL_PROPERTY( + nodeId, + getLastPropertyRecordPos(nodeId, "xnSupportedPixelFormats", undoPoint.GetPosition()), + "xnSupportedPixelFormats", + &supportedPixelFormats, + sizeof(supportedPixelFormats) + )) + undoPoint.Reuse(); + + // xnPixelFormat + EMIT(RECORD_INT_PROPERTY( + nodeId, + getLastPropertyRecordPos(nodeId, "xnPixelFormat", undoPoint.GetPosition()), + "xnPixelFormat", + pixelFormat + )) + undoPoint.Reuse(); + } + + EMIT(RECORD_INT_PROPERTY( + nodeId, + getLastPropertyRecordPos(nodeId, "oniPixelFormat", undoPoint.GetPosition()), + "oniPixelFormat", + curVideoMode.pixelFormat + )) + undoPoint.Reuse(); + + XN_DELETE_ARR(pVideoModes); + + size = sizeof(XnFloat); + float vdummy, hdummy; + if ( pStream->getProperty(ONI_STREAM_PROPERTY_HORIZONTAL_FOV, &hdummy, &size) == ONI_STATUS_OK && + pStream->getProperty(ONI_STREAM_PROPERTY_VERTICAL_FOV, &vdummy, &size) == ONI_STATUS_OK ) + { + // xnFOV + struct XnFieldOfView + { + /** Horizontal Field Of View, in radians. */ + XnDouble fHFOV; + /** Vertical Field Of View, in radians. */ + XnDouble fVFOV; + } fov = {hdummy, vdummy}; + + EMIT(RECORD_GENERAL_PROPERTY( + nodeId, + getLastPropertyRecordPos(nodeId, "xnFOV", undoPoint.GetPosition()), + "xnFOV", + &fov, + sizeof(fov) + )) + undoPoint.Reuse(); + } + + // xnCropping + struct XnCropping + { + /** TRUE if cropping is turned on, FALSE otherwise. */ + XnBool bEnabled; + /** Offset in the X-axis, in pixels. */ + XnUInt16 nXOffset; + /** Offset in the Y-axis, in pixels. */ + XnUInt16 nYOffset; + /** Number of pixels in the X-axis. */ + XnUInt16 nXSize; + /** Number of pixels in the Y-axis. */ + XnUInt16 nYSize; + } xncropping = {0}; + OniCropping cropping; + size = sizeof(OniCropping); + if (pStream->getProperty(ONI_STREAM_PROPERTY_CROPPING, &cropping, &size) == ONI_STATUS_OK) + { + // we support cropping capability + EMIT(RECORD_INT_PROPERTY( + nodeId, + getLastPropertyRecordPos(nodeId, "Cropping", undoPoint.GetPosition()), + "Cropping", + TRUE + )); + + undoPoint.Reuse(); + + xncropping.bEnabled = cropping.enabled; + xncropping.nXOffset = (XnUInt16)cropping.originX; + xncropping.nYOffset = (XnUInt16)cropping.originY; + xncropping.nXSize = (XnUInt16)cropping.width; + xncropping.nYSize = (XnUInt16)cropping.height; + + EMIT(RECORD_GENERAL_PROPERTY( + nodeId, + getLastPropertyRecordPos(nodeId, "xnCropping", undoPoint.GetPosition()), + "xnCropping", + &xncropping, + sizeof(xncropping) + )) + + undoPoint.Reuse(); + } + + OniBool bMirror = FALSE; + size = sizeof(bMirror); + if (pStream->getProperty(ONI_STREAM_PROPERTY_MIRRORING, &bMirror, &size) == ONI_STATUS_OK) + { + // we support mirroring capability + EMIT(RECORD_INT_PROPERTY( + nodeId, + getLastPropertyRecordPos(nodeId, "Mirror", undoPoint.GetPosition()), + "Mirror", + TRUE + )); + + undoPoint.Reuse(); + + // and now tell the mirror state + EMIT(RECORD_INT_PROPERTY( + nodeId, + getLastPropertyRecordPos(nodeId, "xnMirror", undoPoint.GetPosition()), + "xnMirror", + bMirror + )) + + undoPoint.Reuse(); + } + + m_propertyPriority = ms_priorityHigh; + pStream->notifyAllProperties(); + m_propertyPriority = ms_priorityNormal; + undoPoint.Release(); +} + +void FileRecorder::onDetach(XnUInt32 nodeId) +{ + if (nodeId == 0) + { + return; + } + + FIND_ATTACHED_STREAM_INFO(nodeId) + if (!pInfo) return; + + Memento undoPoint(this); + EMIT(RECORD_NODE_REMOVED( + nodeId, + pInfo->nodeAddedRecordPosition + )) + undoPoint.Release(); + + undoPoint.Reuse(); + XnUInt64 nSeekTablePos = undoPoint.GetPosition(); + // write the seek table + EMIT(RECORD_SEEK_TABLE( + nodeId, + pInfo->frameId, + pInfo->dataIndex + )) + + undoPoint.Release(); + + undoPoint.Reuse(); + // Seek to position of node added record + undoPoint.SetPosition(pInfo->nodeAddedRecordPosition); + + // re-write this record, this time with seek data + EMIT(RECORD_NODE_ADDED( + pInfo->nodeType, + nodeId, + pInfo->codecId, + /* numberOfFrames = */ pInfo->frameId, + /* minTimeStamp = */ XN_UINT64_C(0), + /* maxTimeStamp = */ pInfo->lastOutputTimestamp, + /* seekTablePosition = */ nSeekTablePos + )) + undoPoint.Undo(); +} + +void FileRecorder::onStart(XnUInt32 nodeId) +{ + if (0 == nodeId) + { + return; + } + Memento undoPoint(this); + EMIT(RECORD_NODE_STATE_READY( + nodeId + )) + + EMIT(RECORD_NODE_DATA_BEGIN( + nodeId, + /* framesCount = */ XN_MAX_UINT32, + /* maxTimeStamp = */ XN_MAX_UINT64 + )) + undoPoint.Release(); +} + +void FileRecorder::onRecord(XnUInt32 nodeId, XnCodecBase* pCodec, const OniFrame* pFrame, XnUInt32 frameId, XnUInt64 timestamp) +{ + if (0 == nodeId || NULL == pFrame) + { + return; + } + + FIND_ATTACHED_STREAM_INFO(nodeId) + if (!pInfo) return; + + Memento undoPoint(this); + + if (NULL != pCodec) + { + XnUInt32 bufferSize_bytes32 = pFrame->dataSize * 2 + pCodec->GetOverheadSize(); + XnUInt8* buffer = XN_NEW_ARR(XnUInt8, bufferSize_bytes32); + + XnStatus status = pCodec->Compress(reinterpret_cast(pFrame->data), + pFrame->dataSize, buffer, &bufferSize_bytes32); + XnSizeT bufferSize_bytes = bufferSize_bytes32; + if (XN_STATUS_OK == status) + { + EMIT(RECORD_NEW_DATA( + nodeId, + pInfo->lastNewDataRecordPosition, + timestamp, + frameId, + buffer, + bufferSize_bytes)) + } + XN_DELETE_ARR(buffer); + } + else + { + EMIT(RECORD_NEW_DATA( + nodeId, + pInfo->lastNewDataRecordPosition, + pFrame->timestamp, + pFrame->frameIndex, + pFrame->data, + pFrame->dataSize + )) + } + undoPoint.Release(); + // save this record's position as the last one + pInfo->lastNewDataRecordPosition = undoPoint.GetPosition(); + + // write to seek table + DataIndexEntry dataIndexEntry; + dataIndexEntry.nTimestamp = timestamp; + dataIndexEntry.nConfigurationID = m_configurationId; + dataIndexEntry.nSeekPos = undoPoint.GetPosition(); + + pInfo->dataIndex.AddLast(dataIndexEntry); +} + +void FileRecorder::onRecordProperty( + XnUInt32 nodeId, + XnUInt32 propertyId, + const void* pData, + XnSizeT dataSize) +{ + if (0 == nodeId || NULL == pData || 0 == dataSize) + { + return; + } + Memento undoPoint(this); + for (XnSizeT i = 0; i < propertyTableItemsCount; ++i) + { + if (propertyTable[i].propertyId == propertyId) + { + switch (propertyTable[i].propertyType) + { + case PROPERTY_TYPE_INTEGER: + { + uint64_t value = *(uint64_t*)pData; + if (dataSize == sizeof(int)) + { + value = (uint64_t)*(int*)pData; + } + EMIT(RECORD_INT_PROPERTY( + nodeId, + getLastPropertyRecordPos(nodeId, propertyTable[i].propertyName, undoPoint.GetPosition()), + propertyTable[i].propertyName, + value)) + } + break; + case PROPERTY_TYPE_REAL: + { + double value = *(double*)pData; + if (dataSize == sizeof(float)) + { + value = (double)*(float*)pData; + } + EMIT(RECORD_REAL_PROPERTY( + nodeId, + getLastPropertyRecordPos(nodeId, propertyTable[i].propertyName, undoPoint.GetPosition()), + propertyTable[i].propertyName, + value)) + } + break; + case PROPERTY_TYPE_GENERAL: + default: + { + EMIT(RECORD_GENERAL_PROPERTY( + nodeId, + getLastPropertyRecordPos(nodeId, propertyTable[i].propertyName, undoPoint.GetPosition()), + propertyTable[i].propertyName, + pData, + dataSize)) + } + } + } + } + undoPoint.Release(); + + // update the global configurationId + ++m_configurationId; +} + +ONI_NAMESPACE_IMPLEMENTATION_END diff --git a/Source/Core/OniFileRecorder.h b/Source/Core/OniFileRecorder.h new file mode 100644 index 00000000..142260e9 --- /dev/null +++ b/Source/Core/OniFileRecorder.h @@ -0,0 +1,189 @@ +/***************************************************************************** +* * +* OpenNI 2.x Alpha * +* Copyright (C) 2012 PrimeSense Ltd. * +* * +* This file is part of OpenNI. * +* * +* Licensed under the Apache License, Version 2.0 (the "License"); * +* you may not use this file except in compliance with the License. * +* You may obtain a copy of the License at * +* * +* http://www.apache.org/licenses/LICENSE-2.0 * +* * +* Unless required by applicable law or agreed to in writing, software * +* distributed under the License is distributed on an "AS IS" BASIS, * +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * +* See the License for the specific language governing permissions and * +* limitations under the License. * +* * +*****************************************************************************/ +#ifndef OPENNI_ONIFILERECORDER_H_ +#define OPENNI_ONIFILERECORDER_H_ 1 + +#include "XnString.h" +#include "XnPriorityQueue.h" + +// These come from OniFile/Formats +#include "Xn16zEmbTablesCodec.h" +#include "XnJpegCodec.h" +#include "XnUncompressedCodec.h" + +#include "OniRecorder.h" +#include "OniDataRecords.h" + +ONI_NAMESPACE_IMPLEMENTATION_BEGIN + +class FileRecorder : public Recorder +{ +public: + FileRecorder(FrameManager& frameManager, xnl::ErrorLogger& errorLogger, OniRecorderHandle handle = NULL); + ~FileRecorder(); + + OniStatus initialize(const char* fileName); + + OniStatus attachStream(VideoStream& stream, OniBool allowLossyCompression); + OniStatus detachStream(VideoStream& stream); + + virtual OniStatus start(); + + virtual OniStatus record(VideoStream& stream, OniFrame& aFrame); + + virtual OniStatus recordStreamProperty( + VideoStream& stream, + int propertyId, + const void* pData, + int dataSize); + +private: + XN_DISABLE_COPY_AND_ASSIGN(FileRecorder) + + // Messages are sent to Recorder's message loop and executed asynchronously. + // Please note: not all the fields are valid for every message. For example, + // Message::MESSAGE_DETACH relies only upon the nodeId field of the message, other + // fields are invalid and irrelevant for that message. + struct Message + { + enum Type + { + MESSAGE_NO_OPERATION, ///< Does not use any of Message fields. Does nothing. + MESSAGE_INITIALIZE, ///< Does not use any of Message fields. + MESSAGE_TERMINATE, ///< Does not use any of Message fields. + MESSAGE_ATTACH, ///< Uses: nodeId, pStream + MESSAGE_DETACH, ///< Uses: nodeId + MESSAGE_START, ///< Does not use any of Message fields. + MESSAGE_RECORD, ///< Uses: nodeId, pFrame + MESSAGE_RECORDPROPERTY, + } + type; + + XnUInt32 nodeId; + VideoStream* pStream; + union { + const void* pData; + OniFrame* pFrame; + }; + XnUInt32 propertyId; + XnSizeT dataSize; + + }; + + // Used for undo functionality. + class Memento; + friend class Memento; + + // The main function of Recorder's thread. + static XN_THREAD_PROC threadMain(XN_THREAD_PARAM pThreadParam); + + // Obtains the next message from the queue of messages and executes an + // action associated with that message. + void messagePump(); + + // Sends a message to the threadMain. + void send( + Message::Type type, + VideoStream* pStream = NULL, + const void* pData = NULL, + XnUInt32 propertyId = 0u, + XnSizeT dataSize = 0u, + int priority = ms_priorityNormal); + + // Message handlers: + void onInitialize(); + void onTerminate(); + void onAttach(XnUInt32 nodeId, VideoStream* pStream); + void onDetach(XnUInt32 nodeId); + void onStart (XnUInt32 nodeId); + void onRecord(XnUInt32 nodeId, XnCodecBase* pCodec, const OniFrame* pFrame, XnUInt32 frameId, XnUInt64 timestamp); + void onRecordProperty( + XnUInt32 nodeId, + XnUInt32 propertyId, + const void* pData, + XnSizeT dataSize); + + FrameManager& m_frameManager; + + // Error logger. + xnl::ErrorLogger& m_errorLogger; + + // Stores utility information about a stream. Currently the structure is + // pretty simple, but it might evolve in future. + struct AttachedStreamInfo + { + XnUInt32 nodeId; + XnUInt32 frameId; + XnCodecBase* pCodec; + OniBool allowLossyCompression; + XnUInt64 lastInputTimestamp; + XnUInt64 lastOutputTimestamp; + + // needed for overriding the NODE_ADDED record when detaching the stream + XnUInt64 nodeAddedRecordPosition; + XnUInt32 nodeType; + XnUInt32 codecId; + + // needed for keeping track of undoRecordPos field + XnUInt64 lastNewDataRecordPosition; + xnl::Hash + lastPropertyRecordPosition; + + // needed for generating the SeekTable in the end + DataIndexEntryList dataIndex; + }; + + // A map of stream -> stream information. + typedef xnl::Lockable< xnl::Hash > AttachedStreams; + AttachedStreams m_streams; + + // A helper function for the properties' undoRecordPos + XnUInt64 getLastPropertyRecordPos(XnUInt32 nodeId, const char *propName, XnUInt64 newRecordPos); + + // The maximum ID of a stream. This number grows with the every next stream + // attached to this Recorder and never decreases. + XnUInt32 m_maxId; + + // increased any time when a property changes in ANY attached stream, + // to avoid the player seeking with the tables when a configuration has changed. + XnUInt32 m_configurationId; + + // A message queue, used by threadMain and Send(). + typedef xnl::Lockable > MessageQueue; + MessageQueue m_queue; + int m_propertyPriority; + static const int ms_priorityLow = 2; + static const int ms_priorityNormal = 1; + static const int ms_priorityHigh = 0; + + // The Recorder uses RecordAssembler to assemble records correctly and to + // serialize them to a file. + RecordAssembler m_assembler; + + XN_THREAD_HANDLE m_thread; + FileHeaderData m_fileHeader; //< Will be patched during termination. + xnl::String m_fileName; + XN_FILE_HANDLE m_file; +}; + +ONI_NAMESPACE_IMPLEMENTATION_END + +#endif // OPENNI_ONIFILERECORDER_H_ diff --git a/Source/Core/OniRecorder.cpp b/Source/Core/OniRecorder.cpp index 94e1bfa0..45e8933c 100644 --- a/Source/Core/OniRecorder.cpp +++ b/Source/Core/OniRecorder.cpp @@ -22,1116 +22,77 @@ #include "XnLockGuard.h" -// These come from OniFile/Formats: -#include "Xn16zEmbTablesCodec.h" -#include "XnJpegCodec.h" -#include "XnUncompressedCodec.h" - -#include "OniContext.h" -#include "OniProperties.h" -#include "PS1080.h" -#include "PSLink.h" -#include "FileProperties.h" - ONI_NAMESPACE_IMPLEMENTATION_BEGIN -// NOTE: XnLib does not define UINT*_C like macros for some reason... -#define XN_UINT64_C(x) ((x) + (XN_MAX_UINT64 - XN_MAX_UINT64)) -#define XN_UINT32_C(x) ((x) + (XN_MAX_UINT32 - XN_MAX_UINT32)) - -namespace { - -enum PropertyType -{ - PROPERTY_TYPE_GENERAL, - PROPERTY_TYPE_INTEGER, - PROPERTY_TYPE_REAL -}; - -const struct PropertyTable { - XnUInt32 propertyId; - const char* propertyName; - PropertyType propertyType; -} propertyTable[] = { - // PS1080 Properties - { XN_STREAM_PROPERTY_INPUT_FORMAT, "InputFormat" , PROPERTY_TYPE_INTEGER }, - { XN_STREAM_PROPERTY_CROPPING_MODE, "CroppingMode" , PROPERTY_TYPE_INTEGER }, - { XN_STREAM_PROPERTY_WHITE_BALANCE_ENABLED, "WhiteBalancedEnabled", PROPERTY_TYPE_INTEGER }, - { XN_STREAM_PROPERTY_GAIN, "Gain" , PROPERTY_TYPE_INTEGER }, - { XN_STREAM_PROPERTY_HOLE_FILTER, "HoleFilter" , PROPERTY_TYPE_INTEGER }, - { XN_STREAM_PROPERTY_REGISTRATION_TYPE, "RegistrationType" , PROPERTY_TYPE_INTEGER }, - { XN_STREAM_PROPERTY_AGC_BIN, "AGCBin" , PROPERTY_TYPE_GENERAL }, - { XN_STREAM_PROPERTY_CONST_SHIFT, "ConstShift" , PROPERTY_TYPE_INTEGER }, - { XN_STREAM_PROPERTY_PIXEL_SIZE_FACTOR, "PixelSizeFactor" , PROPERTY_TYPE_INTEGER }, - { XN_STREAM_PROPERTY_MAX_SHIFT, "MaxShift" , PROPERTY_TYPE_INTEGER }, - { XN_STREAM_PROPERTY_PARAM_COEFF, "ParamCoeff" , PROPERTY_TYPE_INTEGER }, - { XN_STREAM_PROPERTY_SHIFT_SCALE, "ShiftScale" , PROPERTY_TYPE_INTEGER }, - { XN_STREAM_PROPERTY_S2D_TABLE, "S2D" , PROPERTY_TYPE_GENERAL }, - { XN_STREAM_PROPERTY_D2S_TABLE, "D2S" , PROPERTY_TYPE_GENERAL }, - { XN_STREAM_PROPERTY_ZERO_PLANE_DISTANCE, "ZPD" , PROPERTY_TYPE_INTEGER }, - { XN_STREAM_PROPERTY_ZERO_PLANE_PIXEL_SIZE, "ZPPS" , PROPERTY_TYPE_REAL }, - { XN_STREAM_PROPERTY_EMITTER_DCMOS_DISTANCE, "LDDIS" , PROPERTY_TYPE_REAL }, - { XN_STREAM_PROPERTY_DCMOS_RCMOS_DISTANCE, "DCRCDIS" , PROPERTY_TYPE_REAL }, - { XN_STREAM_PROPERTY_CLOSE_RANGE, "CloseRange" , PROPERTY_TYPE_INTEGER }, - { XN_STREAM_PROPERTY_FAST_ZOOM_CROP, "FastZoomCrop" , PROPERTY_TYPE_INTEGER }, - { XN_STREAM_PROPERTY_PIXEL_REGISTRATION, "PixelRegistration" , PROPERTY_TYPE_GENERAL }, - // PSLink Properties - { LINK_PROP_MAX_SHIFT, "MaxShift", PROPERTY_TYPE_INTEGER}, - { LINK_PROP_ZERO_PLANE_DISTANCE, "ZPD", PROPERTY_TYPE_INTEGER}, - { LINK_PROP_CONST_SHIFT, "ConstShift", PROPERTY_TYPE_INTEGER}, - { LINK_PROP_PARAM_COEFF, "ParamCoeff", PROPERTY_TYPE_INTEGER}, - { LINK_PROP_SHIFT_SCALE, "ShiftScale", PROPERTY_TYPE_INTEGER}, - { LINK_PROP_ZERO_PLANE_PIXEL_SIZE, "ZPPS", PROPERTY_TYPE_REAL}, - { LINK_PROP_EMITTER_DEPTH_CMOS_DISTANCE, "LDDIS", PROPERTY_TYPE_REAL}, - { LINK_PROP_SHIFT_TO_DEPTH_TABLE, "S2D", PROPERTY_TYPE_GENERAL}, - { LINK_PROP_DEPTH_TO_SHIFT_TABLE, "D2S", PROPERTY_TYPE_GENERAL}, - // File Properties - { ONI_FILE_PROPERTY_ORIGINAL_DEVICE, "oniOriginalDevice", PROPERTY_TYPE_GENERAL} -}; - -const XnSizeT propertyTableItemsCount = sizeof(propertyTable) / sizeof(propertyTable[0]); - -} // namespace - -/** - * Is used by Recorder to make it possible to undo failed records. - * - * The usage pattern is: - * - * void Recorder::YourMethod() { - * // Create an undo point. - * Memento undoPoint(this); - * - * // Emit records here. If anything goes wrong - just return from this - * // method. - * - * // If anything went okay, release the undo point, so that nothing will - * // be undone. - * undoPoint.Release(); - * } - * - */ -class Recorder::Memento -{ -public: - /** - * Creates a Memento for the current state of the given Recorder. - */ - Memento(Recorder* pRecorder) - : m_pRecorder(pRecorder), m_offset(XN_UINT64_C(0)) - { - Reuse(); - } - - /** - * Destroys the Memento and reverts the Recorder back to the remembered state. - * - * @note The undo action will not be done if you have released the Memento. - */ - ~Memento() - { - if (m_needRollback) - { - Undo(); - } - } - - /** - * Releases the Memento. A released memento will not undo. - */ - void Release() - { - m_needRollback = false; - } - - /** - * ReUses the Memento. it will function like a brand-new one. - */ - void Reuse() - { - m_needRollback = true; - - XnStatus status = xnOSTellFile64(m_pRecorder->m_file, &m_offset); - if (status != XN_STATUS_OK) - { - m_pRecorder = NULL; - } - } - - /** - * Explicitly undo emits. Reverts the Recorder back to the remembered state. - */ - void Undo() - { - if (m_pRecorder != NULL) - { - xnOSSeekFile64(m_pRecorder->m_file, XN_OS_SEEK_SET, m_offset); - } - } - - /** - * An easy way to get the current position of the file. (and save for later use) - */ - XnUInt64 GetPosition() - { - return m_offset; - } - - /** - * An easey way to get the current position of the file. (for later use) - */ - void SetPosition(XnUInt64 pos) - { - if (m_pRecorder != NULL) - { - xnOSSeekFile64(m_pRecorder->m_file, XN_OS_SEEK_SET, pos); - } - } - -private: - Recorder* m_pRecorder; - XnUInt64 m_offset; - XnBool m_needRollback; -}; - -Recorder::Recorder(FrameManager& frameManager, xnl::ErrorLogger& errorLogger, OniRecorderHandle handle) - : m_frameManager(frameManager), - m_errorLogger(errorLogger), - m_handle(handle), - m_maxId(0), - m_configurationId(0), - m_propertyPriority(ms_priorityNormal), - m_file(XN_INVALID_FILE_HANDLE), - m_running(FALSE), - m_started(FALSE), - m_wasStarted(FALSE) -{ -} +Recorder::Recorder(OniRecorderHandle handle) : m_handle(handle), m_running(FALSE), m_started(FALSE), m_wasStarted(FALSE) +{} Recorder::~Recorder() { - stop(); - detachAllStreams(); - send(Message::MESSAGE_TERMINATE); - xnOSWaitForThreadExit(m_thread, XN_WAIT_INFINITE); - xnOSCloseThread(&m_thread); - if (NULL != m_handle) - { - m_handle->pRecorder = NULL; - } -} - -OniStatus Recorder::initialize(const char* fileName) -{ - m_fileName = fileName; - - // Probe if we can actually open the file. - XN_FILE_HANDLE fileHandle = XN_INVALID_FILE_HANDLE; - XnStatus status = xnOSOpenFile( - /* file name = */ fileName, - /* open flags = */ XN_OS_FILE_WRITE | XN_OS_FILE_TRUNCATE, - /* out handle = */ &fileHandle); - if (XN_STATUS_OK != status) - { - return ONI_STATUS_ERROR; - } - xnOSCloseFile(&fileHandle); - - m_assembler.initialize(); - - status = xnOSCreateThread(threadMain, this, &m_thread); - if (XN_STATUS_OK != status) - { - return ONI_STATUS_ERROR; - } - - send(Message::MESSAGE_INITIALIZE); - return ONI_STATUS_OK; -} - -OniStatus Recorder::attachStream(VideoStream& stream, OniBool allowLossyCompression) -{ - if (m_wasStarted) - { - return ONI_STATUS_ERROR; - } - - xnl::LockGuard guard(m_streams); - VideoStream* pStream = &stream; - if (m_streams.Find(pStream) == m_streams.End()) - { - if (ONI_STATUS_OK == pStream->addRecorder(*this)) - { - m_streams[pStream].nodeId = ++m_maxId; - m_streams[pStream].pCodec = NULL; - m_streams[pStream].allowLossyCompression = allowLossyCompression; - m_streams[pStream].frameId = 0; - m_streams[pStream].lastOutputTimestamp = 0; - m_streams[pStream].lastInputTimestamp = 0; - m_streams[pStream].lastNewDataRecordPosition = 0; - m_streams[pStream].dataIndex.Clear(); - send(Message::MESSAGE_ATTACH, pStream); - return ONI_STATUS_OK; - } - } - return ONI_STATUS_ERROR; + stop(); + detachAllStreams(); } -OniStatus Recorder::detachStream(VideoStream& stream) +OniStatus Recorder::initialize(const char* /*path*/) { - xnl::LockGuard guard(m_streams); - VideoStream* pStream = &stream; - if (m_streams.End() != m_streams.Find(pStream)) - { - stream.removeRecorder(*this); - send(Message::MESSAGE_DETACH, pStream); - return ONI_STATUS_OK; - } - return ONI_STATUS_BAD_PARAMETER; + return ONI_STATUS_OK; } -OniStatus Recorder::detachAllStreams() +OniStatus Recorder::attachStream(VideoStream& stream, OniBool /*allowLossyCompression*/) { - xnl::LockGuard guard(m_streams); - for (AttachedStreams::Iterator - i = m_streams.Begin(), - e = m_streams.End(); - i != e; ++i) - { - detachStream(*i->Key()); - } - return ONI_STATUS_OK; -} - -OniStatus Recorder::start() -{ - m_wasStarted = true; - send(Message::MESSAGE_START); - return ONI_STATUS_OK; -} - -void Recorder::stop() -{ - m_started = false; -} - -OniStatus Recorder::record(VideoStream& stream, OniFrame& aFrame) -{ - if (!m_started) - { - return ONI_STATUS_ERROR; - } - xnl::LockGuard< AttachedStreams > guard(m_streams); - VideoStream* pStream = &stream; - if (m_streams.Find(pStream) == m_streams.End()) - { - return ONI_STATUS_BAD_PARAMETER; - } - OniFrame* pFrame = &aFrame; - m_frameManager.addRef(pFrame); - send(Message::MESSAGE_RECORD, pStream, pFrame); - return ONI_STATUS_OK; -} - -OniStatus Recorder::recordStreamProperty( - VideoStream& stream, - int propertyId, - const void* pData, - int dataSize) -{ - xnl::LockGuard< AttachedStreams > guard(m_streams); - VideoStream* pStream = &stream; - if (m_streams.Find(pStream) == m_streams.End()) - { - return ONI_STATUS_BAD_PARAMETER; - } - // The original pData will not be valid after this function ends. - // Free this pointer when soon after handling the PropertyMessage! - void *newPtr = xnOSMalloc(dataSize); - xnOSMemCopy(newPtr, pData, dataSize); - send(Message::MESSAGE_RECORDPROPERTY, pStream, newPtr, propertyId, dataSize, m_propertyPriority); - return ONI_STATUS_OK; -} - -XN_THREAD_PROC Recorder::threadMain(XN_THREAD_PARAM pThreadParam) -{ - Recorder* pSelf = reinterpret_cast(pThreadParam); - if (NULL != pSelf) - { - pSelf->m_running = TRUE; - while (pSelf->m_running) - { - pSelf->messagePump(); - } - } - XN_THREAD_PROC_RETURN(XN_STATUS_OK); -} - -void Recorder::messagePump() -{ - XnStatus nRetVal = XN_STATUS_OK; - Message msg = { Message::MESSAGE_NO_OPERATION, 0, NULL, {NULL}, 0, 0 }; - + if (m_wasStarted) { - xnl::LockGuard guard(m_queue); - nRetVal = m_queue.Pop(msg); + return ONI_STATUS_ERROR; } - if (XN_STATUS_OK == nRetVal) - { - switch (msg.type) - { - case Message::MESSAGE_INITIALIZE: - { - onInitialize(); - } - break; - case Message::MESSAGE_TERMINATE: - { - onTerminate(); - m_running = FALSE; - } - break; - case Message::MESSAGE_ATTACH: - { - xnl::LockGuard streamsGuard(m_streams); - AttachedStreams::Iterator i = m_streams.Find(msg.pStream); - if (i != m_streams.End()) - { - onAttach(i->Value().nodeId, msg.pStream); - } - } - break; - case Message::MESSAGE_DETACH: - { - xnl::LockGuard streamsGuard(m_streams); - AttachedStreams::Iterator i = m_streams.Find(msg.pStream); - if (i != m_streams.End()) - { - onDetach(i->Value().nodeId); - XN_DELETE(m_streams[msg.pStream].pCodec); - m_streams.Remove(msg.pStream); - } - } - break; - case Message::MESSAGE_START: - { - xnl::LockGuard streamsGuard(m_streams); - for (AttachedStreams::Iterator - i = m_streams.Begin(), - e = m_streams.End(); - i != e; ++i) - { - onStart(i->Value().nodeId); - } - m_started = true; - } - break; - case Message::MESSAGE_RECORD: - { - xnl::LockGuard streamsGuard(m_streams); - AttachedStreams::Iterator i = m_streams.Find(msg.pStream); - if (i != m_streams.End()) - { - XnCodecBase* pCodec = m_streams[msg.pStream].pCodec; - XnUInt32 frameId = ++m_streams[msg.pStream].frameId; - XnUInt64 timestamp = 0; - if (frameId > 1) - { - timestamp = m_streams[msg.pStream].lastOutputTimestamp + (msg.pFrame->timestamp - m_streams[msg.pStream].lastInputTimestamp); - } - m_streams[msg.pStream].lastInputTimestamp = msg.pFrame->timestamp; - m_streams[msg.pStream].lastOutputTimestamp = timestamp; - onRecord(i->Value().nodeId, pCodec, msg.pFrame, frameId, timestamp); - m_frameManager.release(msg.pFrame); - } - } - break; - case Message::MESSAGE_RECORDPROPERTY: - { - xnl::LockGuard streamsGuard(m_streams); - AttachedStreams::Iterator i = m_streams.Find(msg.pStream); - if (i != m_streams.End()) - { - onRecordProperty( - i->Value().nodeId, - msg.propertyId, - msg.pData, - msg.dataSize); - } - // free the temporary buffer allocated earlier - xnOSFree((void*)msg.pData); - } - break; - default: - ; - } - } -} - -void Recorder::send( - Message::Type type, - VideoStream* pStream, - const void* pData, - XnUInt32 propertyId, - XnSizeT dataSize, - int priority) -{ - Message msg = - { - type, - pStream != NULL ? m_streams[pStream].nodeId : 0, - pStream, - {pData}, - propertyId, - dataSize - }; - xnl::LockGuard guard(m_queue); - m_queue.Push(msg, priority); -} - -void Recorder::onInitialize() -{ - XnStatus status = xnOSOpenFile( - /* file name = */ m_fileName.Data(), - /* open flags = */ XN_OS_FILE_WRITE | XN_OS_FILE_TRUNCATE, - /* out handle = */ &m_file); - - if (XN_STATUS_OK == status) - { - FileHeaderData fileHeader = - { - /* identity = */ { 'N', 'I', '1', '0' }, - /* version = */ { 1, 0, 1, 0 }, - /* maxTimeStamp = */ XN_MAX_UINT64, - /* maxNodeId = */ m_maxId, - }; - m_fileHeader = fileHeader; - xnOSWriteFile(m_file, &m_fileHeader, sizeof(m_fileHeader)); - } -} - -// A handy macro, that makes code more readable. -// Usage: -// -// void Recorder::YourMethod() { -// Memento undoPoint(this); -// EMIT(RECORD_END()) /* #1 */ -// EMIT(RECORD_END()) /* #2 */ -// undoPoint.Release(); -// } -// -// This will safely emit RECORD_END into the file, if either of (#1 or #2) -// expressions fail, the undoPoint will revert the file to the state, prior -// to YourMethod execution. -// -#define EMIT(expr) \ - if (ONI_STATUS_OK == (m_assembler.emit_##expr)) \ - { \ - if (ONI_STATUS_OK != m_assembler.serialize(m_file)) \ - { \ - return; \ - } \ - } \ - else \ - { \ - return; \ - } - -#define FIND_ATTACHED_STREAM_INFO(nodeId) \ - AttachedStreamInfo *pInfo = NULL; \ - xnl::LockGuard guard(m_streams); \ - for (AttachedStreams::Iterator \ - i = m_streams.Begin(), e = m_streams.End(); \ - i != e; \ - ++i) \ - { \ - if(i->Value().nodeId == nodeId) \ - { \ - pInfo = &(i->Value()); \ - break; \ - } \ - } - -XnUInt64 Recorder::getLastPropertyRecordPos(XnUInt32 nodeId, const char *propName, XnUInt64 newRecordPos) -{ - XnUInt64 pos = 0; - FIND_ATTACHED_STREAM_INFO(nodeId) - if (!pInfo) return 0; - - if (pInfo->lastPropertyRecordPosition.Find(propName) != pInfo->lastPropertyRecordPosition.End()) - { - pos = pInfo->lastPropertyRecordPosition[propName]; - } - pInfo->lastPropertyRecordPosition[propName] = newRecordPos; - return pos; -} - -void Recorder::onTerminate() -{ - // Truncate the file to it's last offset, so that undone records - // will not be serialized. - XnUInt64 truncationOffset = XN_UINT64_C(0); - if (XN_STATUS_OK == xnOSTellFile64(m_file, &truncationOffset)) - { - xnOSTruncateFile64(m_file, truncationOffset); - } - - Memento undoPoint(this); - EMIT(RECORD_END()) - undoPoint.Release(); - - // The file header needs being patched, because its maxNodeId field has become - // irrelevant by now. - m_fileHeader.maxNodeId = m_maxId; - xnOSSeekFile64(m_file, XN_OS_SEEK_SET, XN_UINT64_C(0)); - xnOSWriteFile(m_file, &m_fileHeader, sizeof(m_fileHeader)); - - xnOSCloseFile(&m_file); - m_file = XN_INVALID_FILE_HANDLE; -} - -typedef enum XnPixelFormat -{ - XN_PIXEL_FORMAT_RGB24 = 1, - XN_PIXEL_FORMAT_YUV422 = 2, - XN_PIXEL_FORMAT_GRAYSCALE_8_BIT = 3, - XN_PIXEL_FORMAT_GRAYSCALE_16_BIT = 4, - XN_PIXEL_FORMAT_MJPEG = 5, -} XnPixelFormat; - -typedef struct XnSupportedPixelFormats -{ - XnBool m_bRGB24 : 1; - XnBool m_bYUV422 : 1; - XnBool m_bGrayscale8Bit : 1; - XnBool m_bGrayscale16Bit : 1; - XnBool m_bMJPEG : 1; - XnUInt m_nPadding : 3; - XnUInt m_nReserved : 24; -} XnSupportedPixelFormats; - -XnPixelFormat toXnPixelFormat(OniPixelFormat oniFormat) -{ - switch(oniFormat) - { - // Depth - case ONI_PIXEL_FORMAT_DEPTH_1_MM: return XN_PIXEL_FORMAT_GRAYSCALE_16_BIT; - case ONI_PIXEL_FORMAT_DEPTH_100_UM: return XN_PIXEL_FORMAT_GRAYSCALE_16_BIT; - case ONI_PIXEL_FORMAT_SHIFT_9_2: return XN_PIXEL_FORMAT_GRAYSCALE_16_BIT; - case ONI_PIXEL_FORMAT_SHIFT_9_3: return XN_PIXEL_FORMAT_GRAYSCALE_16_BIT; - - // Color - case ONI_PIXEL_FORMAT_RGB888: return XN_PIXEL_FORMAT_RGB24; - case ONI_PIXEL_FORMAT_YUV422: return XN_PIXEL_FORMAT_YUV422; - case ONI_PIXEL_FORMAT_GRAY8: return XN_PIXEL_FORMAT_GRAYSCALE_8_BIT; - case ONI_PIXEL_FORMAT_GRAY16: return XN_PIXEL_FORMAT_GRAYSCALE_16_BIT; - case ONI_PIXEL_FORMAT_JPEG: return XN_PIXEL_FORMAT_MJPEG; - - default: - //not supported by OpenNI 1.x - return XnPixelFormat(0); - } -} - -void fillXnSupportedPixelFormats(XnSupportedPixelFormats &xnSPF, OniPixelFormat oniFormat) -{ - xnOSMemSet(&xnSPF, 0, sizeof(xnSPF)); - switch(toXnPixelFormat(oniFormat)) - { - case XN_PIXEL_FORMAT_RGB24: xnSPF.m_bRGB24 = 1; break; - case XN_PIXEL_FORMAT_YUV422: xnSPF.m_bYUV422 = 1; break; - case XN_PIXEL_FORMAT_GRAYSCALE_8_BIT: xnSPF.m_bGrayscale8Bit = 1; break; - case XN_PIXEL_FORMAT_GRAYSCALE_16_BIT: xnSPF.m_bGrayscale16Bit = 1; break; - case XN_PIXEL_FORMAT_MJPEG: xnSPF.m_bMJPEG = 1; break; - } -} - -void Recorder::onAttach(XnUInt32 nodeId, VideoStream* pStream) -{ - if (nodeId == 0 || pStream == NULL) - { - return; - } - const OniSensorInfo* pSensorInfo = pStream->getSensorInfo(); - if (pSensorInfo == NULL) - { - return; - } - - // Assume we'll be using uncompressed codec. - XnUInt32 codecId = ONI_CODEC_UNCOMPRESSED; - - // Applicable for depth streams only. - int maxDepth = XN_MAX_UINT16; - - OniVideoMode curVideoMode; - int size = sizeof(OniVideoMode); - pStream->getProperty(ONI_STREAM_PROPERTY_VIDEO_MODE, &curVideoMode, &size); - - // Guess codec type from video mode format. - switch (curVideoMode.pixelFormat) - { - case ONI_PIXEL_FORMAT_DEPTH_100_UM: - case ONI_PIXEL_FORMAT_DEPTH_1_MM: - { - size = int(sizeof(maxDepth)); - - pStream->getProperty( - ONI_STREAM_PROPERTY_MAX_VALUE, &maxDepth, &size); - - m_streams[pStream].pCodec = XN_NEW( - Xn16zEmbTablesCodec, static_cast(maxDepth)); - - codecId = ONI_CODEC_16Z_EMB_TABLES; - } - break; - case ONI_PIXEL_FORMAT_RGB888: - { - if (m_streams[pStream].allowLossyCompression) - { - m_streams[pStream].pCodec = XN_NEW( - XnJpegCodec, - /* bRGB = */ TRUE, - curVideoMode.resolutionX, - curVideoMode.resolutionY); - - codecId = ONI_CODEC_JPEG; - } - else - { - m_streams[pStream].pCodec = XN_NEW(XnUncompressedCodec); - } - } - break; - default: - m_streams[pStream].pCodec = XN_NEW(XnUncompressedCodec); - break; - } - - // If anything went wrong - fall back to uncompressed format. - if (XN_STATUS_OK != m_streams[pStream].pCodec->Init()) - { - XN_DELETE(m_streams[pStream].pCodec); - m_streams[pStream].pCodec = NULL; - codecId = ONI_CODEC_UNCOMPRESSED; - } - - Memento undoPoint(this); - // save the position of this record so we can override it upon detaching - m_streams[pStream].nodeAddedRecordPosition = undoPoint.GetPosition(); - - EMIT(RECORD_NODE_ADDED( - m_streams[pStream].nodeType = AsNodeType(pSensorInfo->sensorType), - nodeId, - m_streams[pStream].codecId = codecId, - /* numberOfFrames = */ XN_MAX_UINT32, - /* minTimeStamp = */ XN_UINT64_C(0), - /* maxTimeStamp = */ XN_MAX_UINT64, - /* seekTablePosition = */ XN_UINT64_C(0) - )) - undoPoint.Reuse(); - - EMIT(RECORD_GENERAL_PROPERTY( - nodeId, - getLastPropertyRecordPos(nodeId, "oniOriginalDevice", undoPoint.GetPosition()), - "oniOriginalDevice", - pStream->getDevice().getInfo()->name, - sizeof(pStream->getDevice().getInfo()->name) - )); - undoPoint.Reuse(); - - // required data size (for cases where data is larger than video mode) - EMIT(RECORD_INT_PROPERTY( - nodeId, - getLastPropertyRecordPos(nodeId, "oniRequiredFrameSize", undoPoint.GetPosition()), - "oniRequiredFrameSize", - pStream->getRequiredFrameSize() - )); - undoPoint.Reuse(); - - // isGenerating (needed for OpenNI 1.x playback) - EMIT(RECORD_INT_PROPERTY( - nodeId, - getLastPropertyRecordPos(nodeId, "xnIsGenerating", undoPoint.GetPosition()), - "xnIsGenerating", - TRUE - )); - undoPoint.Reuse(); - - // xnDeviceMaxDepth - if (curVideoMode.pixelFormat == ONI_PIXEL_FORMAT_DEPTH_1_MM || - curVideoMode.pixelFormat == ONI_PIXEL_FORMAT_DEPTH_100_UM) - { - EMIT(RECORD_INT_PROPERTY( - nodeId, - getLastPropertyRecordPos(nodeId, "xnDeviceMaxDepth", undoPoint.GetPosition()), - "xnDeviceMaxDepth", - maxDepth - )) - } - undoPoint.Reuse(); - - // xnSupportedMapOutputModesCount - EMIT(RECORD_INT_PROPERTY( - nodeId, - getLastPropertyRecordPos(nodeId, "xnSupportedMapOutputModesCount", undoPoint.GetPosition()), - "xnSupportedMapOutputModesCount", - pSensorInfo->numSupportedVideoModes - )) - undoPoint.Reuse(); - - // xnSupportedMapOutputModes - VideoModeData* pVideoModes = XN_NEW_ARR( - VideoModeData, pSensorInfo->numSupportedVideoModes); - for (int i = 0; i < pSensorInfo->numSupportedVideoModes; ++i) - { - const OniVideoMode& videoMode = pSensorInfo->pSupportedVideoModes[i]; - pVideoModes[i].width = videoMode.resolutionX; - pVideoModes[i].height = videoMode.resolutionY; - pVideoModes[i].fps = videoMode.fps; - } - - EMIT(RECORD_GENERAL_PROPERTY( - nodeId, - getLastPropertyRecordPos(nodeId, "xnSupportedMapOutputModes", undoPoint.GetPosition()), - "xnSupportedMapOutputModes", - pVideoModes, - sizeof(*pVideoModes) * pSensorInfo->numSupportedVideoModes - )) - undoPoint.Reuse(); - - // xnMapOutputMode - VideoModeData curVMD; - curVMD.width = curVideoMode.resolutionX; - curVMD.height = curVideoMode.resolutionY; - curVMD.fps = curVideoMode.fps; - EMIT(RECORD_GENERAL_PROPERTY( - nodeId, - getLastPropertyRecordPos(nodeId, "xnMapOutputMode", undoPoint.GetPosition()), - "xnMapOutputMode", - &curVMD, - sizeof(curVMD) - )) - undoPoint.Reuse(); - - XnPixelFormat pixelFormat = toXnPixelFormat(curVideoMode.pixelFormat); - if (pixelFormat != 0) + xnl::LockGuard guard(m_frameIds); + VideoStream* pStream = &stream; + if (m_frameIds.Find(pStream) == m_frameIds.End()) { - // xnSupportedPixelFormats - XnSupportedPixelFormats supportedPixelFormats; - fillXnSupportedPixelFormats(supportedPixelFormats, curVideoMode.pixelFormat); - EMIT(RECORD_GENERAL_PROPERTY( - nodeId, - getLastPropertyRecordPos(nodeId, "xnSupportedPixelFormats", undoPoint.GetPosition()), - "xnSupportedPixelFormats", - &supportedPixelFormats, - sizeof(supportedPixelFormats) - )) - undoPoint.Reuse(); - - // xnPixelFormat - EMIT(RECORD_INT_PROPERTY( - nodeId, - getLastPropertyRecordPos(nodeId, "xnPixelFormat", undoPoint.GetPosition()), - "xnPixelFormat", - pixelFormat - )) - undoPoint.Reuse(); - } - - EMIT(RECORD_INT_PROPERTY( - nodeId, - getLastPropertyRecordPos(nodeId, "oniPixelFormat", undoPoint.GetPosition()), - "oniPixelFormat", - curVideoMode.pixelFormat - )) - undoPoint.Reuse(); - - XN_DELETE_ARR(pVideoModes); - - size = sizeof(XnFloat); - float vdummy, hdummy; - if ( pStream->getProperty(ONI_STREAM_PROPERTY_HORIZONTAL_FOV, &hdummy, &size) == ONI_STATUS_OK && - pStream->getProperty(ONI_STREAM_PROPERTY_VERTICAL_FOV, &vdummy, &size) == ONI_STATUS_OK ) - { - // xnFOV - struct XnFieldOfView + if (ONI_STATUS_OK == pStream->addRecorder(*this)) { - /** Horizontal Field Of View, in radians. */ - XnDouble fHFOV; - /** Vertical Field Of View, in radians. */ - XnDouble fVFOV; - } fov = {hdummy, vdummy}; - - EMIT(RECORD_GENERAL_PROPERTY( - nodeId, - getLastPropertyRecordPos(nodeId, "xnFOV", undoPoint.GetPosition()), - "xnFOV", - &fov, - sizeof(fov) - )) - undoPoint.Reuse(); - } - - // xnCropping - struct XnCropping - { - /** TRUE if cropping is turned on, FALSE otherwise. */ - XnBool bEnabled; - /** Offset in the X-axis, in pixels. */ - XnUInt16 nXOffset; - /** Offset in the Y-axis, in pixels. */ - XnUInt16 nYOffset; - /** Number of pixels in the X-axis. */ - XnUInt16 nXSize; - /** Number of pixels in the Y-axis. */ - XnUInt16 nYSize; - } xncropping = {0}; - OniCropping cropping; - size = sizeof(OniCropping); - if (pStream->getProperty(ONI_STREAM_PROPERTY_CROPPING, &cropping, &size) == ONI_STATUS_OK) - { - // we support cropping capability - EMIT(RECORD_INT_PROPERTY( - nodeId, - getLastPropertyRecordPos(nodeId, "Cropping", undoPoint.GetPosition()), - "Cropping", - TRUE - )); - - undoPoint.Reuse(); - - xncropping.bEnabled = cropping.enabled; - xncropping.nXOffset = (XnUInt16)cropping.originX; - xncropping.nYOffset = (XnUInt16)cropping.originY; - xncropping.nXSize = (XnUInt16)cropping.width; - xncropping.nYSize = (XnUInt16)cropping.height; - - EMIT(RECORD_GENERAL_PROPERTY( - nodeId, - getLastPropertyRecordPos(nodeId, "xnCropping", undoPoint.GetPosition()), - "xnCropping", - &xncropping, - sizeof(xncropping) - )) - - undoPoint.Reuse(); - } - - OniBool bMirror = FALSE; - size = sizeof(bMirror); - if (pStream->getProperty(ONI_STREAM_PROPERTY_MIRRORING, &bMirror, &size) == ONI_STATUS_OK) - { - // we support mirroring capability - EMIT(RECORD_INT_PROPERTY( - nodeId, - getLastPropertyRecordPos(nodeId, "Mirror", undoPoint.GetPosition()), - "Mirror", - TRUE - )); - - undoPoint.Reuse(); - - // and now tell the mirror state - EMIT(RECORD_INT_PROPERTY( - nodeId, - getLastPropertyRecordPos(nodeId, "xnMirror", undoPoint.GetPosition()), - "xnMirror", - bMirror - )) - - undoPoint.Reuse(); + m_frameIds[pStream] = 0; + return ONI_STATUS_OK; + } } - - m_propertyPriority = ms_priorityHigh; - pStream->notifyAllProperties(); - m_propertyPriority = ms_priorityNormal; - undoPoint.Release(); + return ONI_STATUS_ERROR; } -void Recorder::onDetach(XnUInt32 nodeId) +OniStatus Recorder::detachStream(VideoStream& stream) { - if (nodeId == 0) - { - return; - } - - FIND_ATTACHED_STREAM_INFO(nodeId) - if (!pInfo) return; - - Memento undoPoint(this); - EMIT(RECORD_NODE_REMOVED( - nodeId, - pInfo->nodeAddedRecordPosition - )) - undoPoint.Release(); - - undoPoint.Reuse(); - XnUInt64 nSeekTablePos = undoPoint.GetPosition(); - // write the seek table - EMIT(RECORD_SEEK_TABLE( - nodeId, - pInfo->frameId, - pInfo->dataIndex - )) - - undoPoint.Release(); - - undoPoint.Reuse(); - // Seek to position of node added record - undoPoint.SetPosition(pInfo->nodeAddedRecordPosition); - - // re-write this record, this time with seek data - EMIT(RECORD_NODE_ADDED( - pInfo->nodeType, - nodeId, - pInfo->codecId, - /* numberOfFrames = */ pInfo->frameId, - /* minTimeStamp = */ XN_UINT64_C(0), - /* maxTimeStamp = */ pInfo->lastOutputTimestamp, - /* seekTablePosition = */ nSeekTablePos - )) - undoPoint.Undo(); + xnl::LockGuard guard(m_frameIds); + VideoStream* pStream = &stream; + if (m_frameIds.End() != m_frameIds.Find(pStream)) + { + stream.removeRecorder(*this); + m_frameIds.Remove(pStream); + return ONI_STATUS_OK; + } + return ONI_STATUS_BAD_PARAMETER; } -void Recorder::onStart(XnUInt32 nodeId) +OniStatus Recorder::detachAllStreams() { - if (0 == nodeId) - { - return; - } - Memento undoPoint(this); - EMIT(RECORD_NODE_STATE_READY( - nodeId - )) - - EMIT(RECORD_NODE_DATA_BEGIN( - nodeId, - /* framesCount = */ XN_MAX_UINT32, - /* maxTimeStamp = */ XN_MAX_UINT64 - )) - undoPoint.Release(); + xnl::LockGuard guard(m_frameIds); + for (StreamFrameIDList::Iterator + i = m_frameIds.Begin(), + e = m_frameIds.End(); + i != e; ++i) + { + detachStream(*i->Key()); + } + return ONI_STATUS_OK; } -void Recorder::onRecord(XnUInt32 nodeId, XnCodecBase* pCodec, const OniFrame* pFrame, XnUInt32 frameId, XnUInt64 timestamp) +OniStatus Recorder::start() { - if (0 == nodeId || NULL == pFrame) - { - return; - } - - FIND_ATTACHED_STREAM_INFO(nodeId) - if (!pInfo) return; - - Memento undoPoint(this); - - if (NULL != pCodec) - { - XnUInt32 bufferSize_bytes32 = pFrame->dataSize * 2 + pCodec->GetOverheadSize(); - XnUInt8* buffer = XN_NEW_ARR(XnUInt8, bufferSize_bytes32); - - XnStatus status = pCodec->Compress(reinterpret_cast(pFrame->data), - pFrame->dataSize, buffer, &bufferSize_bytes32); - XnSizeT bufferSize_bytes = bufferSize_bytes32; - if (XN_STATUS_OK == status) - { - EMIT(RECORD_NEW_DATA( - nodeId, - pInfo->lastNewDataRecordPosition, - timestamp, - frameId, - buffer, - bufferSize_bytes)) - } - XN_DELETE_ARR(buffer); - } - else - { - EMIT(RECORD_NEW_DATA( - nodeId, - pInfo->lastNewDataRecordPosition, - pFrame->timestamp, - pFrame->frameIndex, - pFrame->data, - pFrame->dataSize - )) - } - undoPoint.Release(); - // save this record's position as the last one - pInfo->lastNewDataRecordPosition = undoPoint.GetPosition(); - - // write to seek table - DataIndexEntry dataIndexEntry; - dataIndexEntry.nTimestamp = timestamp; - dataIndexEntry.nConfigurationID = m_configurationId; - dataIndexEntry.nSeekPos = undoPoint.GetPosition(); - - pInfo->dataIndex.AddLast(dataIndexEntry); + m_wasStarted = true; + return ONI_STATUS_OK; } -void Recorder::onRecordProperty( - XnUInt32 nodeId, - XnUInt32 propertyId, - const void* pData, - XnSizeT dataSize) +void Recorder::stop() { - if (0 == nodeId || NULL == pData || 0 == dataSize) - { - return; - } - Memento undoPoint(this); - for (XnSizeT i = 0; i < propertyTableItemsCount; ++i) - { - if (propertyTable[i].propertyId == propertyId) - { - switch (propertyTable[i].propertyType) - { - case PROPERTY_TYPE_INTEGER: - { - uint64_t value = *(uint64_t*)pData; - if (dataSize == sizeof(int)) - { - value = (uint64_t)*(int*)pData; - } - EMIT(RECORD_INT_PROPERTY( - nodeId, - getLastPropertyRecordPos(nodeId, propertyTable[i].propertyName, undoPoint.GetPosition()), - propertyTable[i].propertyName, - value)) - } - break; - case PROPERTY_TYPE_REAL: - { - double value = *(double*)pData; - if (dataSize == sizeof(float)) - { - value = (double)*(float*)pData; - } - EMIT(RECORD_REAL_PROPERTY( - nodeId, - getLastPropertyRecordPos(nodeId, propertyTable[i].propertyName, undoPoint.GetPosition()), - propertyTable[i].propertyName, - value)) - } - break; - case PROPERTY_TYPE_GENERAL: - default: - { - EMIT(RECORD_GENERAL_PROPERTY( - nodeId, - getLastPropertyRecordPos(nodeId, propertyTable[i].propertyName, undoPoint.GetPosition()), - propertyTable[i].propertyName, - pData, - dataSize)) - } - } - } - } - undoPoint.Release(); - - // update the global configurationId - ++m_configurationId; + m_started = false; } ONI_NAMESPACE_IMPLEMENTATION_END diff --git a/Source/Core/OniRecorder.h b/Source/Core/OniRecorder.h index 082e1758..87df810e 100644 --- a/Source/Core/OniRecorder.h +++ b/Source/Core/OniRecorder.h @@ -21,29 +21,12 @@ #ifndef OPENNI_ONIRECORDER_H_ #define OPENNI_ONIRECORDER_H_ 1 -#include "XnErrorLogger.h" -#include "XnLockable.h" -#include "XnString.h" -#include "XnPriorityQueue.h" - -// These come from OniFile/Formats -#include "Xn16zEmbTablesCodec.h" -#include "XnJpegCodec.h" -#include "XnUncompressedCodec.h" - -#include "OniCommon.h" -#include "OniFrameManager.h" -#include "OniDataRecords.h" #include "OniStream.h" -#include "OniCTypes.h" ONI_NAMESPACE_IMPLEMENTATION_BEGIN class VideoStream; -/** - * The private implementation of a recorder. - */ class Recorder { public: @@ -52,29 +35,29 @@ class Recorder * @note The newly constructed recorder becomes the owner of the handle. * @note The handle might be NULL. */ - Recorder(FrameManager& frameManager, xnl::ErrorLogger& errorLogger, OniRecorderHandle handle = NULL); + Recorder(OniRecorderHandle handle = NULL); /** * Destroys the recorder and stops recording if needed. */ - ~Recorder(); + virtual ~Recorder(); /** * Initializes the recorder. * @param fileName The file that will store the recording. */ - OniStatus initialize(const char* fileName); + virtual OniStatus initialize(const char* path); /** * Attaches a stream to the recorder. Can not be done if Start() has been * called at least once. */ - OniStatus attachStream(VideoStream& stream, OniBool allowLossyCompression); + virtual OniStatus attachStream(VideoStream& stream, OniBool allowLossyCompression); /** * Detaches a stream from the recorder. */ - OniStatus detachStream(VideoStream& stream); + virtual OniStatus detachStream(VideoStream& stream); /** * Detaches all streams from the recorder. @@ -86,164 +69,40 @@ class Recorder * @note There's a known side effect related to AttachStream(Stream&). * @see AttachStream(Stream&) */ - OniStatus start(); + virtual OniStatus start(); /** * Stops recording. */ - void stop(); + virtual void stop(); /** * Records a frame into the given stream. */ - OniStatus record(VideoStream& stream, OniFrame& aFrame); + virtual OniStatus record(VideoStream& stream, OniFrame& aFrame) = 0; /** * */ - OniStatus recordStreamProperty( - VideoStream& stream, - int propertyId, - const void* pData, - int dataSize); - -private: - XN_DISABLE_COPY_AND_ASSIGN(Recorder) - - // Messages are sent to Recorder's message loop and executed asynchronously. - // Please note: not all the fields are valid for every message. For example, - // Message::MESSAGE_DETACH relies only upon the nodeId field of the message, other - // fields are invalid and irrelevant for that message. - struct Message - { - enum Type - { - MESSAGE_NO_OPERATION, ///< Does not use any of Message fields. Does nothing. - MESSAGE_INITIALIZE, ///< Does not use any of Message fields. - MESSAGE_TERMINATE, ///< Does not use any of Message fields. - MESSAGE_ATTACH, ///< Uses: nodeId, pStream - MESSAGE_DETACH, ///< Uses: nodeId - MESSAGE_START, ///< Does not use any of Message fields. - MESSAGE_RECORD, ///< Uses: nodeId, pFrame - MESSAGE_RECORDPROPERTY, - } - type; - - XnUInt32 nodeId; - VideoStream* pStream; - union { - const void* pData; - OniFrame* pFrame; - }; - XnUInt32 propertyId; - XnSizeT dataSize; - - }; - - // Used for undo functionality. - class Memento; - friend class Memento; - - // The main function of Recorder's thread. - static XN_THREAD_PROC threadMain(XN_THREAD_PARAM pThreadParam); - - // Obtains the next message from the queue of messages and executes an - // action associated with that message. - void messagePump(); - - // Sends a message to the threadMain. - void send( - Message::Type type, - VideoStream* pStream = NULL, - const void* pData = NULL, - XnUInt32 propertyId = 0u, - XnSizeT dataSize = 0u, - int priority = ms_priorityNormal); - - // Message handlers: - void onInitialize(); - void onTerminate(); - void onAttach(XnUInt32 nodeId, VideoStream* pStream); - void onDetach(XnUInt32 nodeId); - void onStart (XnUInt32 nodeId); - void onRecord(XnUInt32 nodeId, XnCodecBase* pCodec, const OniFrame* pFrame, XnUInt32 frameId, XnUInt64 timestamp); - void onRecordProperty( - XnUInt32 nodeId, - XnUInt32 propertyId, - const void* pData, - XnSizeT dataSize); - - FrameManager& m_frameManager; - - // Error logger. - xnl::ErrorLogger& m_errorLogger; - - // There's a 1:1 mapping between a Recorder object and a handle to that object. - // The Recorder object owns its handle. - OniRecorderHandle m_handle; - - // Stores utility information about a stream. Currently the structure is - // pretty simple, but it might evolve in future. - struct AttachedStreamInfo - { - XnUInt32 nodeId; - XnUInt32 frameId; - XnCodecBase* pCodec; - OniBool allowLossyCompression; - XnUInt64 lastInputTimestamp; - XnUInt64 lastOutputTimestamp; - - // needed for overriding the NODE_ADDED record when detaching the stream - XnUInt64 nodeAddedRecordPosition; - XnUInt32 nodeType; - XnUInt32 codecId; - - // needed for keeping track of undoRecordPos field - XnUInt64 lastNewDataRecordPosition; - xnl::Hash - lastPropertyRecordPosition; - - // needed for generating the SeekTable in the end - DataIndexEntryList dataIndex; - }; - - // A map of stream -> stream information. - typedef xnl::Lockable< xnl::Hash > AttachedStreams; - AttachedStreams m_streams; - - // A helper function for the properties' undoRecordPos - XnUInt64 getLastPropertyRecordPos(XnUInt32 nodeId, const char *propName, XnUInt64 newRecordPos); - - // The maximum ID of a stream. This number grows with the every next stream - // attached to this Recorder and never decreases. - XnUInt32 m_maxId; - - // increased any time when a property changes in ANY attached stream, - // to avoid the player seeking with the tables when a configuration has changed. - XnUInt32 m_configurationId; - - // A message queue, used by threadMain and Send(). - typedef xnl::Lockable > MessageQueue; - MessageQueue m_queue; - int m_propertyPriority; - static const int ms_priorityLow = 2; - static const int ms_priorityNormal = 1; - static const int ms_priorityHigh = 0; - - // The Recorder uses RecordAssembler to assemble records correctly and to - // serialize them to a file. - RecordAssembler m_assembler; - - XN_THREAD_HANDLE m_thread; - FileHeaderData m_fileHeader; //< Will be patched during termination. - xnl::String m_fileName; - XN_FILE_HANDLE m_file; - XnBool m_running; //< TRUE whenever the threadMain is running. - XnBool m_started; //< TRUE whenever the recorder has started. - XnBool m_wasStarted; //< TRUE if the recorder has been started once. - -// Get rid of macros: -#undef ONI_DISABLE_COPY_AND_ASSIGN + virtual OniStatus recordStreamProperty( + VideoStream& stream, + int propertyId, + const void* pData, + int dataSize) = 0; + +protected: + // There's a 1:1 mapping between a Recorder object and a handle to that object. + // The Recorder object owns its handle. + OniRecorderHandle m_handle; + + // A map of stream -> stream information. + typedef xnl::Lockable< xnl::Hash > StreamFrameIDList; + StreamFrameIDList m_frameIds; + + XnBool m_running; //< TRUE whenever the threadMain is running. + XnBool m_started; //< TRUE whenever the recorder has started. + XnBool m_wasStarted; //< TRUE if the recorder has been started once. + }; ONI_NAMESPACE_IMPLEMENTATION_END diff --git a/Source/Core/OpenNI.vcxproj b/Source/Core/OpenNI.vcxproj index 40c3f9ef..4d775170 100644 --- a/Source/Core/OpenNI.vcxproj +++ b/Source/Core/OpenNI.vcxproj @@ -207,6 +207,7 @@ + @@ -685,6 +686,7 @@ + diff --git a/Source/Core/OpenNI.vcxproj.filters b/Source/Core/OpenNI.vcxproj.filters index e31de03d..fbfbce6b 100644 --- a/Source/Core/OpenNI.vcxproj.filters +++ b/Source/Core/OpenNI.vcxproj.filters @@ -97,6 +97,9 @@ Header files + + Header files +
@@ -305,6 +308,9 @@ Source files + + Source files + @@ -319,4 +325,4 @@ Resources - + \ No newline at end of file From 6478002f8873bee580658249fee73debd742e72a Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Tue, 1 Oct 2013 10:50:47 +0300 Subject: [PATCH 068/188] OniFile: Fix a potential deadlock if calling stop() immediately after a repeat occurred. (Used this opportunity to order up all uses of locks in this driver) --- Source/Drivers/OniFile/PlayerDevice.cpp | 139 +++++++----------------- Source/Drivers/OniFile/PlayerDevice.h | 6 - Source/Drivers/OniFile/PlayerSource.cpp | 3 + Source/Drivers/OniFile/PlayerSource.h | 2 + Source/Drivers/OniFile/PlayerStream.cpp | 21 +--- Source/Drivers/OniFile/PlayerStream.h | 4 - 6 files changed, 51 insertions(+), 124 deletions(-) diff --git a/Source/Drivers/OniFile/PlayerDevice.cpp b/Source/Drivers/OniFile/PlayerDevice.cpp index d3f43372..d4544c75 100644 --- a/Source/Drivers/OniFile/PlayerDevice.cpp +++ b/Source/Drivers/OniFile/PlayerDevice.cpp @@ -109,7 +109,7 @@ static PropertyEntry PSLinkPropertyList[] = PlayerDevice::PlayerDevice(const xnl::String& filePath) : m_filePath(filePath), m_fileHandle(0), m_threadHandle(NULL), m_running(FALSE), m_isSeeking(FALSE), m_dPlaybackSpeed(1.0), m_nStartTimestamp(0), m_nStartTime(0), m_bHasTimeReference(FALSE), - m_bRepeat(TRUE), m_player(filePath.Data()), m_driverEOFCallback(NULL), m_driverCookie(NULL), m_bStreamsLocked(FALSE) + m_bRepeat(TRUE), m_player(filePath.Data()), m_driverEOFCallback(NULL), m_driverCookie(NULL) { xnOSMemSet(m_originalDevice, 0, sizeof(m_originalDevice)); // Create the events. @@ -218,7 +218,7 @@ void PlayerDevice::close() m_player.Destroy(); // Delete all the sources and streams. - Lock(); + xnl::AutoCSLocker lock(m_cs); while (m_streams.Begin() != m_streams.End()) { PlayerStream* pStream = *m_streams.Begin(); @@ -230,12 +230,11 @@ void PlayerDevice::close() m_sources.Remove(pSource); XN_DELETE(pSource); } - Unlock(); } OniStatus PlayerDevice::getSensorInfoList(OniSensorInfo** pSources, int* numSources) { - Lock(); + xnl::AutoCSLocker lock(m_cs); // Update source count. *numSources = (int)m_sources.Size(); @@ -248,25 +247,25 @@ OniStatus PlayerDevice::getSensorInfoList(OniSensorInfo** pSources, int* numSour xnOSMemCopy(&(*pSources)[i], (*iter)->GetInfo(), sizeof(OniSensorInfo)); } - Unlock(); - return ONI_STATUS_OK; } driver::StreamBase* PlayerDevice::createStream(OniSensorType sensorType) { // Find the requested source. - Lock(); PlayerSource* pSource = NULL; - for (SourceList::Iterator iter = m_sources.Begin(); iter != m_sources.End(); ++iter) + { - if ((*iter)->GetInfo()->sensorType == sensorType) + xnl::AutoCSLocker lock(m_cs); + for (SourceList::Iterator iter = m_sources.Begin(); iter != m_sources.End(); ++iter) { - pSource = (*iter); - break; + if ((*iter)->GetInfo()->sensorType == sensorType) + { + pSource = (*iter); + break; + } } } - Unlock(); // Check if source was found. if (pSource == NULL) @@ -289,12 +288,10 @@ driver::StreamBase* PlayerDevice::createStream(OniSensorType sensorType) return NULL; } - Lock(); - + xnl::AutoCSLocker lock(m_cs); XnStatus xnrc = m_streams.AddLast(pStream); if (xnrc != XN_STATUS_OK) { - Unlock(); XN_DELETE(pStream); return NULL; } @@ -306,7 +303,6 @@ driver::StreamBase* PlayerDevice::createStream(OniSensorType sensorType) if (rc != ONI_STATUS_OK) { m_streams.Remove(pStream); - Unlock(); XN_DELETE(pStream); return NULL; } @@ -317,18 +313,16 @@ driver::StreamBase* PlayerDevice::createStream(OniSensorType sensorType) if (rc != ONI_STATUS_OK) { m_streams.Remove(pStream); - Unlock(); XN_DELETE(pStream); return NULL; } - Unlock(); - return pStream; } void PlayerDevice::destroyStream(oni::driver::StreamBase* pStream) { + xnl::AutoCSLocker lock(m_cs); m_streams.Remove((PlayerStream*)pStream); XN_DELETE(pStream); } @@ -376,9 +370,8 @@ OniStatus PlayerDevice::getProperty(int propertyId, void* data, int* pDataSize) else { // Get the property. - Lock(); + xnl::AutoCSLocker lock(m_cs); rc = m_properties.GetProperty(propertyId, data, pDataSize); - Unlock(); } return rc; @@ -419,9 +412,8 @@ OniStatus PlayerDevice::setProperty(int propertyId, const void* data, int dataSi else { // Set the property. - Lock(); + xnl::AutoCSLocker lock(m_cs); rc = m_properties.SetProperty(propertyId, data, dataSize); - Unlock(); } return rc; @@ -478,7 +470,7 @@ OniBool PlayerDevice::isCommandSupported(int commandId) PlayerSource* PlayerDevice::FindSource(const XnChar* strNodeName) { - Lock(); + xnl::AutoCSLocker lock(m_cs); // Find the relevant source. for (SourceList::Iterator iter = m_sources.Begin(); iter != m_sources.End(); ++iter) @@ -486,13 +478,10 @@ PlayerSource* PlayerDevice::FindSource(const XnChar* strNodeName) if (strcmp((*iter)->GetNodeName(), strNodeName) == 0) { PlayerSource* pSource = *iter; - Unlock(); return pSource; } } - Unlock(); - return NULL; } @@ -501,20 +490,19 @@ void PlayerDevice::SleepToTimestamp(XnUInt64 nTimeStamp) XnUInt64 nNow; xnOSGetHighResTimeStamp(&nNow); - m_cs.Lock(); - XnBool bHasTimeReference = TRUE; - if (!m_bHasTimeReference /*&& (nTimeStamp <= m_nStartTimestamp)*/) { - m_nStartTimestamp = nTimeStamp; - m_nStartTime = nNow; + xnl::AutoCSLocker lock(m_cs); + if (!m_bHasTimeReference /*&& (nTimeStamp <= m_nStartTimestamp)*/) + { + m_nStartTimestamp = nTimeStamp; + m_nStartTime = nNow; - m_bHasTimeReference = TRUE; - bHasTimeReference = FALSE; + m_bHasTimeReference = TRUE; + bHasTimeReference = FALSE; + } } - m_cs.Unlock(); - if (bHasTimeReference && (m_dPlaybackSpeed > 0.0f)) { // check this data timestamp compared to when we started @@ -542,20 +530,6 @@ void PlayerDevice::SleepToTimestamp(XnUInt64 nTimeStamp) } } -void PlayerDevice::LockStreams(bool toLock) -{ - for (StreamList::Iterator iter = m_streams.Begin(); iter != m_streams.End(); iter++) - { - PlayerStream* pStream = *iter; - if(toLock) - pStream->Lock(); - else - pStream->Unlock(); - } - - m_bStreamsLocked = toLock; -} - void PlayerDevice::MainLoop() { m_running = true; @@ -635,9 +609,8 @@ void ONI_CALLBACK_TYPE PlayerDevice::ReadyForDataCallback(const PlayerStream::Re void ONI_CALLBACK_TYPE PlayerDevice::StreamDestroyCallback(const PlayerStream::DestroyEventArgs& destroyEventArgs, void* pCookie) { PlayerDevice* pThis = (PlayerDevice*)(pCookie); - pThis->Lock(); + xnl::AutoCSLocker lock(pThis->m_cs); pThis->m_streams.Remove(destroyEventArgs.pStream); - pThis->Unlock(); } XnStatus XN_CALLBACK_TYPE PlayerDevice::OnNodeAdded(void* pCookie, const XnChar* strNodeName, XnProductionNodeType type, XnCodecID /*compression*/, XnUInt32 nNumberOfFrames) @@ -672,9 +645,8 @@ XnStatus XN_CALLBACK_TYPE PlayerDevice::OnNodeAdded(void* pCookie, const XnChar* pSource->SetProperty(ONI_STREAM_PROPERTY_NUMBER_OF_FRAMES, &nNumberOfFrames, sizeof(int)); // Add the source. - pThis->Lock(); + xnl::AutoCSLocker lock(pThis->m_cs); pThis->m_sources.AddLast(pSource); - pThis->Unlock(); } break; @@ -694,21 +666,7 @@ XnStatus XN_CALLBACK_TYPE PlayerDevice::OnNodeAdded(void* pCookie, const XnChar* XnStatus XN_CALLBACK_TYPE PlayerDevice::OnNodeRemoved(void* /*pCookie*/, const XnChar* /*strNodeName*/) { - /*PlayerDevice* pThis = (PlayerDevice*)pCookie; - - // Remove the source. - pThis->Lock(); - PlayerSource* pSource = pThis->FindSource(strNodeName); - if (pSource != NULL) - { - pThis->m_sources.Remove(pSource); - XN_DELETE(pSource); - } - pThis->Unlock(); - - return (pSource != NULL) ? XN_STATUS_OK : XN_STATUS_NO_MATCH;*/ - - // Do not remove the node. + // Do not remove the node (sensors can't disappear) return XN_STATUS_OK; } @@ -719,7 +677,6 @@ XnStatus XN_CALLBACK_TYPE PlayerDevice::OnNodeIntPropChanged(void* pCookie, cons OniStatus rc; // Find the source. - pThis->Lock(); PlayerSource* pSource = pThis->FindSource(strNodeName); if (pSource != NULL) { @@ -816,7 +773,6 @@ XnStatus XN_CALLBACK_TYPE PlayerDevice::OnNodeIntPropChanged(void* pCookie, cons nRetVal = pThis->AddPrivateProperty(pSource, strPropName, sizeof(nValue), &nValue); } } - pThis->Unlock(); return nRetVal; } @@ -827,13 +783,11 @@ XnStatus XN_CALLBACK_TYPE PlayerDevice::OnNodeRealPropChanged(void* pCookie, con XnStatus nRetVal = XN_STATUS_OK; // Find the source. - pThis->Lock(); PlayerSource* pSource = pThis->FindSource(strNodeName); if (pSource != NULL) { nRetVal = pThis->AddPrivateProperty(pSource, strPropName, sizeof(dValue), &dValue); } - pThis->Unlock(); return nRetVal; } @@ -844,13 +798,11 @@ XnStatus XN_CALLBACK_TYPE PlayerDevice::OnNodeStringPropChanged(void* pCookie, c XnStatus nRetVal = XN_STATUS_OK; // Find the source. - pThis->Lock(); PlayerSource* pSource = pThis->FindSource(strNodeName); if (pSource != NULL) { nRetVal = pThis->AddPrivateProperty(pSource, strPropName, (XnUInt32)strlen(strValue)+1, strValue); } - pThis->Unlock(); return nRetVal; } @@ -862,7 +814,6 @@ XnStatus XN_CALLBACK_TYPE PlayerDevice::OnNodeGeneralPropChanged(void* pCookie, OniStatus rc; // Find the source. - pThis->Lock(); PlayerSource* pSource = pThis->FindSource(strNodeName); if (pSource != NULL) { @@ -983,7 +934,6 @@ XnStatus XN_CALLBACK_TYPE PlayerDevice::OnNodeGeneralPropChanged(void* pCookie, nRetVal = pThis->AddPrivateProperty(pSource, strPropName, nBufferSize, pBuffer); } } - pThis->Unlock(); return nRetVal; } @@ -1015,29 +965,26 @@ XnStatus XN_CALLBACK_TYPE PlayerDevice::OnNodeNewData(void* pCookie, const XnCha { // Check if any stream is ready to receive the frames. // NOTE: all the streams have a local 'last frame' buffer, so worst case other streams on source will buffer the frame. - pThis->Lock(); - hasStreams = FALSE; - for (StreamList::Iterator iter = pThis->m_streams.Begin(); iter != pThis->m_streams.End(); iter++) { - PlayerStream* pStream = *iter; - if (pStream->GetSource() == pSource) + xnl::AutoCSLocker lock(pThis->m_cs); + hasStreams = FALSE; + for (StreamList::Iterator iter = pThis->m_streams.Begin(); iter != pThis->m_streams.End(); iter++) { - hasStreams = TRUE; - ready = TRUE; - break; + PlayerStream* pStream = *iter; + if (pStream->GetSource() == pSource) + { + hasStreams = TRUE; + ready = TRUE; + break; + } } } - pThis->Unlock(); // If no ready device found, wait for ready for data event. if (hasStreams) { if (ready) { - // If we have locked streams (due to reset), unlock them. - if(pThis->m_bStreamsLocked) - pThis->LockStreams(false); - // Check if waiting for manual trigger (playback speed is zero). if (pThis->m_dPlaybackSpeed == XN_PLAYBACK_SPEED_MANUAL) { @@ -1076,20 +1023,16 @@ void XN_CALLBACK_TYPE PlayerDevice::OnEndOfFileReached(void* pCookie) { // Reset time reference for all streams. PlayerDevice* pThis = (PlayerDevice*)pCookie; - pThis->Lock(); - pThis->m_bHasTimeReference = FALSE; - pThis->Unlock(); + { + xnl::AutoCSLocker lock(pThis->m_cs); + pThis->m_bHasTimeReference = FALSE; + } // Notify the driver in case the player has finished playing (no-rewind) if (pThis->isPlayerEOF()) { pThis->TriggerDriverEOFCallback(); } - //Lock the streams until new data will arrive - else - { - pThis->LockStreams(true); - } } XnStatus PlayerDevice::AddPrivateProperty(PlayerSource* pSource, const XnChar* strPropName, XnUInt32 nBufferSize, const void* pBuffer) diff --git a/Source/Drivers/OniFile/PlayerDevice.h b/Source/Drivers/OniFile/PlayerDevice.h index 069cf402..1595ee6a 100644 --- a/Source/Drivers/OniFile/PlayerDevice.h +++ b/Source/Drivers/OniFile/PlayerDevice.h @@ -84,10 +84,6 @@ class PlayerDevice : public oni::driver::DeviceBase const char* getOriginalDevice() {return m_originalDevice;} protected: - - void Lock() { m_cs.Lock(); } - void Unlock() { m_cs.Unlock(); } - PlayerSource* FindSource(const XnChar* strNodeName); // Wake up when timestamp is valid. @@ -103,7 +99,6 @@ class PlayerDevice : public oni::driver::DeviceBase } Seek; void MainLoop(); - void LockStreams(bool toLock); static XN_THREAD_PROC ThreadProc(XN_THREAD_PARAM pThreadParam); @@ -181,7 +176,6 @@ class PlayerDevice : public oni::driver::DeviceBase // List of streams. typedef xnl::List StreamList; StreamList m_streams; - bool m_bStreamsLocked; // Internal event for stream ready for data. xnl::OSEvent m_readyForDataInternalEvent; diff --git a/Source/Drivers/OniFile/PlayerSource.cpp b/Source/Drivers/OniFile/PlayerSource.cpp index 747cc7af..0b530467 100644 --- a/Source/Drivers/OniFile/PlayerSource.cpp +++ b/Source/Drivers/OniFile/PlayerSource.cpp @@ -44,6 +44,7 @@ PlayerSource::~PlayerSource() /// Return the source info associated with the source. OniSensorInfo* PlayerSource::GetInfo() { + xnl::AutoCSLocker lock(m_cs); return &m_sourceInfo; } @@ -55,12 +56,14 @@ const XnChar* PlayerSource::GetNodeName() /// Get property. OniStatus PlayerSource::GetProperty(int propertyId, void* data, int* pDataSize) { + xnl::AutoCSLocker lock(m_cs); return m_properties.GetProperty(propertyId, data, pDataSize); } /// Set property. OniStatus PlayerSource::SetProperty(int propertyId, const void* data, int dataSize) { + xnl::AutoCSLocker lock(m_cs); if (propertyId == ONI_STREAM_PROPERTY_VIDEO_MODE) { if(m_sourceInfo.numSupportedVideoModes == 0) diff --git a/Source/Drivers/OniFile/PlayerSource.h b/Source/Drivers/OniFile/PlayerSource.h index a8552759..5f6a88b7 100644 --- a/Source/Drivers/OniFile/PlayerSource.h +++ b/Source/Drivers/OniFile/PlayerSource.h @@ -104,6 +104,8 @@ class PlayerSource NewDataEvent m_newDataEvent; int m_requiredFrameSize; + + xnl::CriticalSection m_cs; }; } // namespace oni_files_player diff --git a/Source/Drivers/OniFile/PlayerStream.cpp b/Source/Drivers/OniFile/PlayerStream.cpp index 2025a806..aed55426 100644 --- a/Source/Drivers/OniFile/PlayerStream.cpp +++ b/Source/Drivers/OniFile/PlayerStream.cpp @@ -77,19 +77,17 @@ void PlayerStream::destroy() OniStatus PlayerStream::start() { - m_cs.Lock(); + xnl::AutoCSLocker lock(m_cs); m_isStarted = true; m_requiredFrameSize = getRequiredFrameSize(); - m_cs.Unlock(); return ONI_STATUS_OK; } void PlayerStream::stop() { - m_cs.Lock(); + xnl::AutoCSLocker lock(m_cs); m_isStarted = false; - m_cs.Unlock(); } PlayerSource* PlayerStream::GetSource() @@ -100,13 +98,12 @@ PlayerSource* PlayerStream::GetSource() OniStatus PlayerStream::getProperty(int propertyId, void* pData, int* pDataSize) { // Check if the property exists. - m_cs.Lock(); + xnl::AutoCSLocker lock(m_cs); OniStatus rc = m_properties.GetProperty(propertyId, pData, pDataSize); if (rc != ONI_STATUS_OK) { rc = m_pSource->GetProperty(propertyId, pData, pDataSize); } - m_cs.Unlock(); return rc; } @@ -267,6 +264,7 @@ void ONI_CALLBACK_TYPE PlayerStream::OnNewDataCallback(const PlayerSource::NewDa int PlayerStream::getRequiredFrameSize() { + xnl::AutoCSLocker lock(m_cs); int requiredFrameSize = m_pSource->GetRequiredFrameSize(); if (requiredFrameSize == 0) { @@ -277,18 +275,9 @@ int PlayerStream::getRequiredFrameSize() return requiredFrameSize; } -void PlayerStream::Lock() -{ - m_cs.Lock(); -} - -void PlayerStream::Unlock() -{ - m_cs.Unlock(); -} - void PlayerStream::notifyAllProperties() { + xnl::AutoCSLocker lock(m_cs); raisePropertyChanged(ONI_FILE_PROPERTY_ORIGINAL_DEVICE, m_pDevice->getOriginalDevice(), ONI_MAX_STR); for (PlayerProperties::PropertiesHash::ConstIterator property = m_properties.Begin(); diff --git a/Source/Drivers/OniFile/PlayerStream.h b/Source/Drivers/OniFile/PlayerStream.h index b273b5ed..b3cfa24c 100644 --- a/Source/Drivers/OniFile/PlayerStream.h +++ b/Source/Drivers/OniFile/PlayerStream.h @@ -100,10 +100,6 @@ class PlayerStream : public oni::driver::StreamBase // Unregister from 'destroy' event. void UnregisterDestroyEvent(OniCallbackHandle handle); - //Used to prevent any access to the stream while it is being modified externally (by a device, for example) - void Lock(); - void Unlock(); - void notifyAllProperties(); private: void destroy(); From d6ac837387d2ff568b3123127801262dd0814f90 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Tue, 1 Oct 2013 17:28:46 +0300 Subject: [PATCH 069/188] Bug Fix: potential crash when closing recorder (created corrupt files) --- Source/Core/OniRecorder.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Source/Core/OniRecorder.cpp b/Source/Core/OniRecorder.cpp index 45e8933c..682145f3 100644 --- a/Source/Core/OniRecorder.cpp +++ b/Source/Core/OniRecorder.cpp @@ -74,13 +74,11 @@ OniStatus Recorder::detachStream(VideoStream& stream) OniStatus Recorder::detachAllStreams() { xnl::LockGuard guard(m_frameIds); - for (StreamFrameIDList::Iterator - i = m_frameIds.Begin(), - e = m_frameIds.End(); - i != e; ++i) + while (!m_frameIds.IsEmpty()) { - detachStream(*i->Key()); + detachStream(*m_frameIds.Begin()->Key()); } + return ONI_STATUS_OK; } From e18b7da7b35ae84efd8fdbaf3de8ba55edbfaa70 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Mon, 7 Oct 2013 13:09:52 +0300 Subject: [PATCH 070/188] Remove GL Header usage --- Source/Tools/NiViewer/NiViewer.cpp | 57 +- ThirdParty/GL/glh/glh_array.h | 274 -- ThirdParty/GL/glh/glh_convenience.h | 209 - ThirdParty/GL/glh/glh_cube_map.h | 347 -- ThirdParty/GL/glh/glh_extensions.h | 297 -- ThirdParty/GL/glh/glh_genext.h | 5379 ------------------------- ThirdParty/GL/glh/glh_glut.h | 861 ---- ThirdParty/GL/glh/glh_glut2.h | 667 --- ThirdParty/GL/glh/glh_glut_callfunc.h | 85 - ThirdParty/GL/glh/glh_glut_replay.h | 292 -- ThirdParty/GL/glh/glh_glut_text.h | 195 - ThirdParty/GL/glh/glh_interactors.h | 213 - ThirdParty/GL/glh/glh_linear.h | 1617 -------- ThirdParty/GL/glh/glh_mipmaps.h | 157 - ThirdParty/GL/glh/glh_obs.h | 636 --- ThirdParty/GL/glh/glh_text.h | 197 - 16 files changed, 15 insertions(+), 11468 deletions(-) delete mode 100644 ThirdParty/GL/glh/glh_array.h delete mode 100644 ThirdParty/GL/glh/glh_convenience.h delete mode 100644 ThirdParty/GL/glh/glh_cube_map.h delete mode 100644 ThirdParty/GL/glh/glh_extensions.h delete mode 100644 ThirdParty/GL/glh/glh_genext.h delete mode 100644 ThirdParty/GL/glh/glh_glut.h delete mode 100644 ThirdParty/GL/glh/glh_glut2.h delete mode 100644 ThirdParty/GL/glh/glh_glut_callfunc.h delete mode 100644 ThirdParty/GL/glh/glh_glut_replay.h delete mode 100644 ThirdParty/GL/glh/glh_glut_text.h delete mode 100644 ThirdParty/GL/glh/glh_interactors.h delete mode 100644 ThirdParty/GL/glh/glh_linear.h delete mode 100644 ThirdParty/GL/glh/glh_mipmaps.h delete mode 100644 ThirdParty/GL/glh/glh_obs.h delete mode 100644 ThirdParty/GL/glh/glh_text.h diff --git a/Source/Tools/NiViewer/NiViewer.cpp b/Source/Tools/NiViewer/NiViewer.cpp index 3ae6c5a5..6947b039 100644 --- a/Source/Tools/NiViewer/NiViewer.cpp +++ b/Source/Tools/NiViewer/NiViewer.cpp @@ -43,20 +43,6 @@ // R - Increase the maximum depth cutoff by 50. // ESC - exit. -// -------------------------------- -// Includes -// -------------------------------- -// #include -// -// #if (XN_PLATFORM == XN_PLATFORM_LINUX_X86 || XN_PLATFORM == XN_PLATFORM_LINUX_ARM) -// #define UNIX -// #define GLX_GLXEXT_LEGACY -// #endif -// -// #if (XN_PLATFORM == XN_PLATFORM_MACOSX) -// #define MACOS -// #endif - // Undeprecate CRT functions #ifndef _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE 1 @@ -67,19 +53,8 @@ #include "OpenNI.h" #include "XnLib.h" -#define GLH_EXT_SINGLE_FILE -#if (ONI_PLATFORM == ONI_PLATFORM_WIN32) -#pragma warning(push, 3) -#endif -#include -#include -#if (ONI_PLATFORM == ONI_PLATFORM_WIN32) -#pragma warning(pop) -#endif - -using namespace glh; +#include -// #include #include "Capture.h" #include "Draw.h" #include "Keyboard.h" @@ -117,9 +92,6 @@ bool g_bPause = false; bool g_bStep = false; bool g_bShutdown = false; -glut_perspective_reshaper reshaper; -glut_callbacks cb; - IntPair mouseLocation; IntPair windowSize; @@ -166,6 +138,14 @@ void keyboardSpecialCallback(int key, int /*x*/, int /*y*/) void reshapeCallback(int width, int height) { + glViewport(0, 0, width, height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + gluPerspective(20, (GLdouble)width / height, 1, 1); + + glMatrixMode(GL_MODELVIEW); + windowSize.X = width; windowSize.Y = height; windowReshaped(width, height); @@ -695,18 +675,6 @@ int main(int argc, char **argv) // audioInit(); captureInit(); - reshaper.zNear = 1; - reshaper.zFar = 100; - glut_add_interactor(&reshaper); - - cb.mouse_function = mouseCallback; - cb.motion_function = motionCallback; - cb.passive_motion_function = motionCallback; - cb.keyboard_function = keyboardCallback; - cb.special_function = keyboardSpecialCallback; - cb.reshape_function = reshapeCallback; - glut_add_interactor(&cb); - glutInit(&argc, argv); glutInitDisplayString("stencil double rgb"); glutInitWindowSize(WIN_SIZE_X, WIN_SIZE_Y); @@ -716,7 +684,12 @@ int main(int argc, char **argv) init_opengl(); - glut_helpers_initialize(); + glutMouseFunc(mouseCallback); + glutMotionFunc(motionCallback); + glutPassiveMotionFunc(motionCallback); + glutKeyboardFunc(keyboardCallback); + glutSpecialFunc(keyboardSpecialCallback); + glutReshapeFunc(reshapeCallback); glutIdleFunc(idleCallback); glutDisplayFunc(drawFrame); diff --git a/ThirdParty/GL/glh/glh_array.h b/ThirdParty/GL/glh/glh_array.h deleted file mode 100644 index f1dc986e..00000000 --- a/ThirdParty/GL/glh/glh_array.h +++ /dev/null @@ -1,274 +0,0 @@ -/* - glh - is a platform-indepenedent C++ OpenGL helper library - - Copyright (c) 2000 Cass Everitt - Copyright (c) 2000 NVIDIA Corporation - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - * Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - * The names of contributors to this software may not be used - to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - Cass Everitt - cass@r3.nu -*/ - -// Simple array template. -// Copyright (c) Cass W. Everitt 1999 -// Copyright (c) NVIDIA 2000 - -#ifndef _GLH_ARRAY_H_ -#define _GLH_ARRAY_H_ - -namespace glh -{ - // - // Template for array2 - // - - template class array2 - { - public: - typedef T value_type; - - array2(int width=1, int height=1) - { - w = width; - h = height; - data = new T [w * h]; - clear(T()); - } - - array2(const array2 & t) - { - w = h = 0; - data=0; - (*this) = t; - } - - // intentionally non-virtual - ~array2() { delete [] data; } - - const array2 & operator = (const array2 & t) - { - if(w != t.w || h != t.h) set_size(t.w, t.h); - int sz = w * h; - for(int i = 0; i < sz; i++) data[i] = t.data[i]; - return *this; - } - - - void set_size(int width, int height) - - { - - if(w == width && h == height) return; - - delete [] data; - - w = width; - - h = height; - - data = new T [w * h]; - - } - - - T & operator () (int i, int j) - { return data[i + j * w]; } - - const T & operator () (int i, int j) const - { return data[i + j * w]; } - - - int get_width() const { return w; } - - int get_height() const { return h; } - - void clear(const T & val) - { - int sz = w * h; - for(int i = 0; i < sz; i++) data[i] = val; - } - - - void copy(const array2 & src, int i_offset = 0, int j_offset = 0, - int width = 0, int height = 0) - - { - - int io = i_offset; - - int jo = j_offset; - - if(width == 0) width = src.get_width(); - - if(height == 0) height = src.get_height(); - - if(io + width > w) return; - - if(jo + height > h) return; - - for(int i=0; i < width; i++) - - for(int j=0; j < height; j++) - - (*this)(io+i, jo+j) = src(i,j); - - } - - - - T * get_pointer() { return data; } - - const T * get_pointer() const { return data; } - private: - - int w, h; - T * data; - }; - - // - // Template for array3 - // - - template class array3 - { - public: - typedef T value_type; - - array3(int width=1, int height=1, int depth=1) - { - w = width; - h = height; - d = depth; - data = new T [w * h * d]; - clear(T()); - } - - array3(const array3 & t) - { - w = h = d = 0; - data=0; - (*this) = t; - } - - // intentionally non-virtual - ~array3() { delete [] data; } - - const array3 & operator = (const array3 & t) - { - if(w != t.w || h != t.h || d != t.d) - set_size(t.w, t.h, t.d); - int sz = w * h * d; - for(int i = 0; i < sz; i++) - data[i] = t.data[i]; - return *this; - } - - - void set_size(int width, int height, int depth) - - { - if(w == width && h == height && d == depth) - return; - - delete [] data; - - w = width; - h = height; - d = depth; - - data = new T [w * h * d]; - } - - - T & operator () (int i, int j, int k) - { return data[i + j * w + k * w * h]; } - - const T & operator () (int i, int j, int k) const - { return data[i + j * w + k * w * h]; } - - - int get_width() const - { return w; } - - int get_height() const - { return h; } - - int get_depth() const - { return d; } - - void clear(const T & val) - { - int sz = w * h * d; - for(int i = 0; i < sz; i++) - data[i] = val; - } - - - void copy(const array3 & src, - int i_offset = 0, int j_offset = 0, int k_offset = 0, - int width = 0, int height = 0, int depth = 0) - { - - int io = i_offset; - int jo = j_offset; - int ko = k_offset; - - if(width == 0) - width = src.get_width(); - if(height == 0) - height = src.get_height(); - if(depth == 0) - depth = src.get_depth(); - - if(io + width > w || jo + height > h || ko + depth > d) - return; - - for(int i=0; i < width; i++) - for(int j=0; j < height; j++) - for(int k=0; k < depth; k++) - (*this)(io+i, jo+j, ko+k) = src(i,j,k); - } - - - - T * get_pointer() - { return data; } - - const T * get_pointer() const - { return data; } - - private: - int w, h, d; - T * data; - }; // template class array3 -} // namespace glh -#endif diff --git a/ThirdParty/GL/glh/glh_convenience.h b/ThirdParty/GL/glh/glh_convenience.h deleted file mode 100644 index 9dae8c90..00000000 --- a/ThirdParty/GL/glh/glh_convenience.h +++ /dev/null @@ -1,209 +0,0 @@ -/* - glh - is a platform-indepenedent C++ OpenGL helper library - - - Copyright (c) 2000 Cass Everitt - Copyright (c) 2000 NVIDIA Corporation - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - * Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - * The names of contributors to this software may not be used - to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - - Cass Everitt - cass@r3.nu -*/ - -#ifndef GLH_CONVENIENCE_H -#define GLH_CONVENIENCE_H - -// Convenience methods for using glh_linear objects -// with opengl... - - - -// debugging hack... -#include - -using namespace std; - -#ifdef MACOS -#include -#else -#include -#endif - -#include -#include - - -namespace glh -{ - - // matrix helpers - - inline matrix4f get_matrix(GLenum matrix) - { - GLfloat m[16]; - glGetFloatv(matrix, m); - return matrix4f(m); - } - - // transform helpers - - inline void glh_rotate(const quaternionf & r) - { - float angle; - vec3f axis; - r.get_value(axis, angle); - glRotatef(to_degrees(angle), axis.v[0], axis.v[1], axis.v[2]); - } - - // inverse of camera_lookat - inline matrix4f object_lookat(const vec3f & from, const vec3f & to, const vec3f & Up) - { - vec3f look = to - from; - look.normalize(); - vec3f up(Up); - up -= look * look.dot(up); - up.normalize(); - - quaternionf r(vec3f(0,0,-1), vec3f(0,1,0), look, up); - matrix4f m; - r.get_value(m); - m.set_translate(from); - return m; - } - - - // inverse of object_lookat - inline matrix4f camera_lookat(const vec3f & eye, const vec3f & lookpoint, const vec3f & Up) - { - vec3f look = lookpoint - eye; - look.normalize(); - vec3f up(Up); - up -= look * look.dot(up); - up.normalize(); - - matrix4f t; - t.set_translate(-eye); - - quaternionf r(vec3f(0,0,-1), vec3f(0,1,0), look, up); - r.invert(); - matrix4f rm; - r.get_value(rm); - return rm*t; - } - - - inline matrix4f frustum(float left, float right, - float bottom, float top, - float zNear, float zFar) - { - matrix4f m; - m.make_identity(); - - m(0,0) = (2*zNear) / (right - left); - m(0,2) = (right + left) / (right - left); - - m(1,1) = (2*zNear) / (top - bottom); - m(1,2) = (top + bottom) / (top - bottom); - - m(2,2) = -(zFar + zNear) / (zFar - zNear); - m(2,3) = -2*zFar*zNear / (zFar - zNear); - - m(3,2) = -1; - m(3,3) = 0; - - return m; - } - - inline matrix4f frustum_inverse(float left, float right, - float bottom, float top, - float zNear, float zFar) - { - matrix4f m; - m.make_identity(); - - m(0,0) = (right - left) / (2 * zNear); - m(0,3) = (right + left) / (2 * zNear); - - m(1,1) = (top - bottom) / (2 * zNear); - m(1,3) = (top + bottom) / (2 * zNear); - - m(2,2) = 0; - m(2,3) = -1; - - m(3,2) = -(zFar - zNear) / (2 * zFar * zNear); - m(3,3) = (zFar + zNear) / (2 * zFar * zNear); - - return m; - } - - inline matrix4f perspective(float fovy, float aspect, float zNear, float zFar) - { - double tangent = tan(to_radians(fovy/2.0f)); - float y = (float)tangent * zNear; - float x = aspect * y; - return frustum(-x, x, -y, y, zNear, zFar); - } - - inline matrix4f perspective_inverse(float fovy, float aspect, float zNear, float zFar) - { - double tangent = tan(to_radians(fovy/2.0f)); - float y = (float)tangent * zNear; - float x = aspect * y; - return frustum_inverse(-x, x, -y, y, zNear, zFar); - } - - - - // are these names ok? - - inline void set_texgen_planes(GLenum plane_type, const matrix4f & m) - { - GLenum coord[] = {GL_S, GL_T, GL_R, GL_Q }; - for(int i = 0; i < 4; i++) - { - vec4f row; - m.get_row(i,row); - glTexGenfv(coord[i], plane_type, row.v); - } - } - - // handy for register combiners - inline vec3f range_compress(const vec3f & v) - { vec3f vret(v); vret *= .5f; vret += .5f; return vret; } - - inline vec3f range_uncompress(const vec3f & v) - { vec3f vret(v); vret -= .5f; vret *= 2.f; return vret; } - -} // namespace glh - -#endif diff --git a/ThirdParty/GL/glh/glh_cube_map.h b/ThirdParty/GL/glh/glh_cube_map.h deleted file mode 100644 index cacf3341..00000000 --- a/ThirdParty/GL/glh/glh_cube_map.h +++ /dev/null @@ -1,347 +0,0 @@ -/* - glh - is a platform-indepenedent C++ OpenGL helper library - - - Copyright (c) 2000 Cass Everitt - Copyright (c) 2000 NVIDIA Corporation - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - * Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - * The names of contributors to this software may not be used - to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - - Cass Everitt - cass@r3.nu -*/ - -// some helper classes for making -// and using cube maps - -#ifndef GLH_CUBE_MAP_H -#define GLH_CUBE_MAP_H - -#ifdef MACOS -#include -#else -#include -#endif - -#include -#include -#include - -namespace glh -{ - -# ifdef GL_ARB_texture_cube_map -# define GLH_CUBE_MAP_POSITIVE_X GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB -# define GLH_CUBE_MAP_POSITIVE_Y GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB -# define GLH_CUBE_MAP_POSITIVE_Z GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB -# define GLH_CUBE_MAP_NEGATIVE_X GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB -# define GLH_CUBE_MAP_NEGATIVE_Y GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB -# define GLH_CUBE_MAP_NEGATIVE_Z GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB -# elif GL_EXT_texture_cube_map -# define GLH_CUBE_MAP_POSITIVE_X GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT -# define GLH_CUBE_MAP_POSITIVE_Y GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT -# define GLH_CUBE_MAP_POSITIVE_Z GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT -# define GLH_CUBE_MAP_NEGATIVE_X GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT -# define GLH_CUBE_MAP_NEGATIVE_Y GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT -# define GLH_CUBE_MAP_NEGATIVE_Z GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT -# endif - -# if GL_EXT_texture_cube_map || GL_ARB_texture_cube_map - // make a cube map from a functor - template - void make_cube_map(FunctionOfDirection & f, GLenum internal_format, - int size, int level = 0) - { - typedef typename FunctionOfDirection::Type Type; - int components = f.components; - GLenum type = f.type; - GLenum format = f.format; - Type * image = new Type[size*size*components]; - Type * ip; - - float offset = .5; - float delta = 1; - float halfsize = size/2.f; - vec3f v; - - // positive x image - { - ip = image; - for(int j = 0; j < size; j++) - { - for(int i=0; i < size; i++) - { - v[2] = -(i*delta + offset - halfsize); - v[1] = -(j*delta + offset - halfsize); - v[0] = halfsize; - v.normalize(); - f(v, ip); - ip += components; - } - } - glTexImage2D(GLH_CUBE_MAP_POSITIVE_X, - level, internal_format, size, size, 0, format, type, image); - } - // negative x image - { - ip = image; - for(int j = 0; j < size; j++) - { - for(int i=0; i < size; i++) - { - v[2] = (i*delta + offset - halfsize); - v[1] = -(j*delta + offset - halfsize); - v[0] = -halfsize; - v.normalize(); - f(v, ip); - ip += components; - } - } - glTexImage2D(GLH_CUBE_MAP_NEGATIVE_X, - level, internal_format, size, size, 0, format, type, image); - } - - // positive y image - { - ip = image; - for(int j = 0; j < size; j++) - { - for(int i=0; i < size; i++) - { - v[0] = (i*delta + offset - halfsize); - v[2] = (j*delta + offset - halfsize); - v[1] = halfsize; - v.normalize(); - f(v, ip); - ip += components; - } - } - glTexImage2D(GLH_CUBE_MAP_POSITIVE_Y, - level, internal_format, size, size, 0, format, type, image); - } - // negative y image - { - ip = image; - for(int j = 0; j < size; j++) - { - for(int i=0; i < size; i++) - { - v[0] = (i*delta + offset - halfsize); - v[2] = -(j*delta + offset - halfsize); - v[1] = -halfsize; - v.normalize(); - f(v, ip); - ip += components; - } - } - glTexImage2D(GLH_CUBE_MAP_NEGATIVE_Y, - level, internal_format, size, size, 0, format, type, image); - } - - // positive z image - { - ip = image; - for(int j = 0; j < size; j++) - { - for(int i=0; i < size; i++) - { - v[0] = (i*delta + offset - halfsize); - v[1] = -(j*delta + offset - halfsize); - v[2] = halfsize; - v.normalize(); - f(v, ip); - ip += components; - } - } - glTexImage2D(GLH_CUBE_MAP_POSITIVE_Z, - level, internal_format, size, size, 0, format, type, image); - } - // negative z image - { - ip = image; - for(int j = 0; j < size; j++) - { - for(int i=0; i < size; i++) - { - v[0] = -(i*delta + offset - halfsize); - v[1] = -(j*delta + offset - halfsize); - v[2] = -halfsize; - v.normalize(); - f(v, ip); - ip += components; - } - } - glTexImage2D(GLH_CUBE_MAP_NEGATIVE_Z, - level, internal_format, size, size, 0, format, type, image); - } - delete [] image; - } -# endif - - struct normalize_vector - { - typedef GLfloat Type; - int components; - GLenum type; - GLenum format; - normalize_vector() : components(3), type(GL_FLOAT), format(GL_RGB) {} - - void operator() (const vec3f & v, Type * t) - { - vec3f v2 = v; - v2 *= .5; - v2 += .5; - t[0] = v2[0]; - t[1] = v2[1]; - t[2] = v2[2]; - } - }; - - struct cube_map_unextended - { - cube_map_unextended() : - POSITIVE_X(0), NEGATIVE_X(1), - POSITIVE_Y(2), NEGATIVE_Y(3), - POSITIVE_Z(4), NEGATIVE_Z(5), - lightnum(GL_LIGHT0), angle(90.0) - {} - - // angle is > 90 degrees because we need a border to cull with - void set_angle(GLint width) - { angle = to_degrees((float)atan2(width/2.0f, width/2.0f-1.0f)) * 2.0f; } - - - void cull_for_projection(int i) - { - GLfloat plane[6][4] = - { - { 1, 0, 0, 0 }, - {-1, 0, 0, 0 }, - { 0, 1, 0, 0 }, - { 0,-1, 0, 0 }, - { 0, 0, 1, 0 }, - { 0, 0,-1, 0 } - }; - //glClipPlane(GL_CLIP_PLANE0, plane[i]); - glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 90); - glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, plane[i]); - } - - void cull_for_reflection(int i) - { - GLfloat dir[6][4] = - { - { 1, 0, 0, 0 }, - {-1, 0, 0, 0 }, - { 0, 1, 0, 0 }, - { 0,-1, 0, 0 }, - { 0, 0, 1, 0 }, - { 0, 0,-1, 0 } - }; - glLightfv(GL_LIGHT0, GL_POSITION, dir[i]); - } - - matrix4f get_matrix(int cubeface) - { - matrix4f m; - m = perspective((float)angle, 1.0f, 0.5f, 1.5f); - switch(cubeface) - { - case 0: - m *= camera_lookat(vec3f(0,0,0), vec3f( 1, 0, 0), vec3f(0,-1, 0)); - return m; - case 1: - m *= camera_lookat(vec3f(0,0,0), vec3f(-1, 0, 0), vec3f(0,-1, 0)); - return m; - case 2: - m *= camera_lookat(vec3f(0,0,0), vec3f( 0, 1, 0), vec3f(0, 0, 1)); - return m; - case 3: - m *= camera_lookat(vec3f(0,0,0), vec3f( 0,-1, 0), vec3f(0, 0,-1)); - return m; - case 4: - m *= camera_lookat(vec3f(0,0,0), vec3f( 0, 0, 1), vec3f(0,-1, 0)); - return m; - case 5: - m *= camera_lookat(vec3f(0,0,0), vec3f( 0, 0,-1), vec3f(0,-1, 0)); - return m; - default: - return matrix4f(); - } - } - - matrix4f get_matrix_inverse(int cubeface) - { - matrix4f m; - switch(cubeface) - { - case 0: - m = object_lookat(vec3f(0,0,0), vec3f( 1, 0, 0), vec3f(0,-1, 0)); - break; - case 1: - m = object_lookat(vec3f(0,0,0), vec3f(-1, 0, 0), vec3f(0,-1, 0)); - break; - case 2: - m = object_lookat(vec3f(0,0,0), vec3f( 0, 1, 0), vec3f(0, 0, 1)); - break; - case 3: - m = object_lookat(vec3f(0,0,0), vec3f( 0,-1, 0), vec3f(0, 0,-1)); - break; - case 4: - m = object_lookat(vec3f(0,0,0), vec3f( 0, 0, 1), vec3f(0,-1, 0)); - break; - case 5: - m = object_lookat(vec3f(0,0,0), vec3f( 0, 0,-1), vec3f(0,-1, 0)); - break; - default: - break; - } - return m * perspective_inverse((float)angle, 1.0f, 0.5f, 1.5f); - } - const int POSITIVE_X; - const int NEGATIVE_X; - const int POSITIVE_Y; - const int NEGATIVE_Y; - const int POSITIVE_Z; - const int NEGATIVE_Z; - - GLenum lightnum; - tex_object_2D face[6]; - double angle; - - matrix4f rotation; - - }; - -} // namespace glh -#endif - diff --git a/ThirdParty/GL/glh/glh_extensions.h b/ThirdParty/GL/glh/glh_extensions.h deleted file mode 100644 index 00a4abc9..00000000 --- a/ThirdParty/GL/glh/glh_extensions.h +++ /dev/null @@ -1,297 +0,0 @@ -// Comments: -// -// The trick with GLH_EXT_SINGLE_FILE is that you need to have it defined in -// exactly one cpp file because it piggy-backs the function implementations in -// the header. You don't want multiple implementations defined or the linker -// gets mad, but one file must have the implementations in it or the linker -// gets mad for different reasons. -// -// The goal was to avoid having this helper require a separate cpp file. One -// thing you could do is just have a glh_extensions.cpp that did -// -// #define GLH_EXT_SINGLE_FILE -// #include -// -// and make it the only file that ever defines GLH_EXT_SINGLE_FILE. - -#ifndef GLH_EXTENSIONS -#define GLH_EXTENSIONS - -#include -#include -#include - - -#if defined(WIN32) -# include -#endif - -#if _MSC_VER > 1500 -# include -#endif - -#ifdef MACOS -#include -#else -#include -#endif - -#ifdef WIN32 -# include -#endif - -#define CHECK_MEMORY(ptr) \ - if (NULL == ptr) { \ - printf("Error allocating memory in file %s, line %d\n", __FILE__, __LINE__); \ - exit(-1); \ - } - -#ifdef GLH_EXT_SINGLE_FILE -# define GLH_EXTENSIONS_SINGLE_FILE // have to do this because glh_genext.h unsets GLH_EXT_SINGLE_FILE -#endif - -#if (defined(WIN32) || defined(UNIX)) -#include "glh_genext.h" -#elif defined(MACOS) -#include -#else -#include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef GLH_EXTENSIONS_SINGLE_FILE -static char *unsupportedExts = NULL; -static char *sysExts = NULL; -#ifndef GL_SHADER_CONSISTENT_NV -#define GL_SHADER_CONSISTENT_NV 0x86DD -#endif -#ifndef GL_TEXTURE_SHADER_NV -#define GL_TEXTURE_SHADER_NV 0x86DE -#endif -#ifndef GL_SHADER_OPERATION_NV -#define GL_SHADER_OPERATION_NV 0x86DF -#endif - -static int ExtensionExists(const char* extName, const char* sysExts) -{ - char *padExtName = (char*)malloc(strlen(extName) + 2); - strcat(strcpy(padExtName, extName), " "); - - if (0 == strcmp(extName, "GL_VERSION_1_2")) { - const char *version = (const char*)glGetString(GL_VERSION); - if (strstr(version, "1.0") == version || strstr(version, "1.1") == version) { - return GL_FALSE; - } else { - return GL_TRUE; - } - } - if (0 == strcmp(extName, "GL_VERSION_1_3")) { - const char *version = (const char*)glGetString(GL_VERSION); - if (strstr(version, "1.0") == version || - strstr(version, "1.1") == version || - strstr(version, "1.2") == version) { - return GL_FALSE; - } else { - return GL_TRUE; - } - } - if (0 == strcmp(extName, "GL_VERSION_1_4")) { - const char *version = (const char*)glGetString(GL_VERSION); - if (strstr(version, "1.0") == version || - strstr(version, "1.1") == version || - strstr(version, "1.2") == version || - strstr(version, "1.3") == version) { - return GL_FALSE; - } else { - return GL_TRUE; - } - } - if (0 == strcmp(extName, "GL_VERSION_1_5")) { - const char *version = (const char*)glGetString(GL_VERSION); - if (strstr(version, "1.0") == version || - strstr(version, "1.1") == version || - strstr(version, "1.2") == version || - strstr(version, "1.3") == version || - strstr(version, "1.4") == version) { - return GL_FALSE; - } else { - return GL_TRUE; - } - } - if (strstr(sysExts, padExtName)) { - free(padExtName); - return GL_TRUE; - } else { - free(padExtName); - return GL_FALSE; - } -} - -static const char* EatWhiteSpace(const char *str) -{ - for (; *str && (' ' == *str || '\t' == *str || '\n' == *str); str++); - return str; -} - -static const char* EatNonWhiteSpace(const char *str) -{ - for (; *str && (' ' != *str && '\t' != *str && '\n' != *str); str++); - return str; -} - -#if _MSC_VER > 1500 -// Suppress VS warning on using strdup -#pragma warning(disable: 4996) -#endif -int glh_init_extensions(const char *origReqExts) -{ - // Length of requested extensions string - size_t reqExtsLen; - char *reqExts; - // Ptr for individual extensions within reqExts - char *reqExt; - int success = GL_TRUE; - // build space-padded extension string - if (NULL == sysExts) { - const char *extensions = (const char*)glGetString(GL_EXTENSIONS); - size_t sysExtsLen = strlen(extensions); - const char *winsys_extensions = ""; - size_t winsysExtsLen = 0; -#if defined(WIN32) - { - PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB = 0; - wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)wglGetProcAddress("wglGetExtensionsStringARB"); - if(wglGetExtensionsStringARB) - { - winsys_extensions = wglGetExtensionsStringARB(wglGetCurrentDC()); - winsysExtsLen = strlen(winsys_extensions); - } - } -#elif defined(UNIX) - { - - winsys_extensions = glXQueryExtensionsString (glXGetCurrentDisplay(),DefaultScreen(glXGetCurrentDisplay())) ; - winsysExtsLen = strlen (winsys_extensions); - } -#endif - // Add 2 bytes, one for padding space, one for terminating NULL - sysExts = (char*)malloc(sysExtsLen + winsysExtsLen + 3); - CHECK_MEMORY(sysExts); - strcpy(sysExts, extensions); - sysExts[sysExtsLen] = ' '; - sysExts[sysExtsLen + 1] = 0; - strcat(sysExts, winsys_extensions); - sysExts[sysExtsLen + 1 + winsysExtsLen] = ' '; - sysExts[sysExtsLen + 1 + winsysExtsLen + 1] = 0; - } - - if (NULL == origReqExts) - return GL_TRUE; - reqExts = strdup(origReqExts); - reqExtsLen = strlen(reqExts); - if (NULL == unsupportedExts) { - unsupportedExts = (char*)malloc(reqExtsLen + 2); - } else if (reqExtsLen > strlen(unsupportedExts)) { - unsupportedExts = (char*)realloc(unsupportedExts, reqExtsLen + 2); - } - CHECK_MEMORY(unsupportedExts); - *unsupportedExts = 0; - - // Parse requested extension list - for (reqExt = reqExts; - (reqExt = (char*)EatWhiteSpace(reqExt)) != NULL && *reqExt; - reqExt = (char*)EatNonWhiteSpace(reqExt)) - { - char *extEnd = (char*)EatNonWhiteSpace(reqExt); - char saveChar = *extEnd; - *extEnd = (char)0; - -#if (defined(WIN32) || defined(UNIX)) - if (!ExtensionExists(reqExt, sysExts) || !glh_init_extension(reqExt)) { -#elif defined(MACOS) - if (!ExtensionExists(reqExt, sysExts)) { // don't try to get function pointers if on MacOS -#endif - // add reqExt to end of unsupportedExts - strcat(unsupportedExts, reqExt); - strcat(unsupportedExts, " "); - success = GL_FALSE; - } - *extEnd = saveChar; - } - free(reqExts); - return success; -} -#if _MSC_VER > 1500 -#pragma warning(default: 4996) -#endif - -const char* glh_get_unsupported_extensions() -{ - return (const char*)unsupportedExts; -} - -void glh_shutdown_extensions() -{ - if (unsupportedExts) - { - free(unsupportedExts); - unsupportedExts = NULL; - } - if (sysExts) - { - free(sysExts); - sysExts = NULL; - } -} - -int glh_extension_supported(const char *extension) -{ - static const GLubyte *extensions = NULL; - const GLubyte *start; - GLubyte *where, *terminator; - - // Extension names should not have spaces. - where = (GLubyte *) strchr(extension, ' '); - if (where || *extension == '\0') - return 0; - - if (!extensions) - extensions = glGetString(GL_EXTENSIONS); - - // It takes a bit of care to be fool-proof about parsing the - // OpenGL extensions string. Don't be fooled by sub-strings, - // etc. - start = extensions; - for (;;) - { - where = (GLubyte *) strstr((const char *) start, extension); - if (!where) - break; - terminator = where + strlen(extension); - if (where == start || *(where - 1) == ' ') - { - if (*terminator == ' ' || *terminator == '\0') - { - return 1; - } - } - start = terminator; - } - return 0; -} - -#else -int glh_init_extensions(const char *origReqExts); -const char* glh_get_unsupported_extensions(); -void glh_shutdown_extensions(); -int glh_extension_supported(const char *extension); -#endif /* GLH_EXT_SINGLE_FILE */ - -#ifdef __cplusplus -} -#endif - -#endif /* GLH_EXTENSIONS */ diff --git a/ThirdParty/GL/glh/glh_genext.h b/ThirdParty/GL/glh/glh_genext.h deleted file mode 100644 index 275c61d4..00000000 --- a/ThirdParty/GL/glh/glh_genext.h +++ /dev/null @@ -1,5379 +0,0 @@ -/* File generated by extgen.cpp -- do not modify */ -#ifndef GLH_GENEXT_H -#define GLH_GENEXT_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#if defined(WIN32) -# include -# define GLH_EXT_GET_PROC_ADDRESS(p) wglGetProcAddress(p) -#elif defined(UNIX) -# include -# include -# include -# define GLH_EXT_GET_PROC_ADDRESS(p) glXGetProcAddressARB( (const GLubyte *) p) -#endif - -#ifdef GLH_EXT_SINGLE_FILE -# define GLH_EXTERN -# define GLH_INITIALIZER = 0 -#else -# define GLH_EXTERN extern -# define GLH_INITIALIZER -#endif - -#define GLH__PREPROCESSOR_GYMNASTICS2(a,b) a##b -#define GLH__PREPROCESSOR_GYMNASTICS(a,b) GLH__PREPROCESSOR_GYMNASTICS2(a,b) - -#ifndef _WIN32 -#define GLH_EXT_PREFIX _ -#endif -#ifndef GLH_EXT_PREFIX -# define GLH_EXT_NAME(a) a -#else -# define GLH_EXT_NAME(a) GLH__PREPROCESSOR_GYMNASTICS(GLH_EXT_PREFIX,a) -#endif - -#ifndef _WIN32 -# ifndef GLH_CORE_PREFIX -# define GLH_CORE_PREFIX _ -# endif -#endif - -#ifndef GLH_CORE_PREFIX -# define GLH_CORE_NAME(a) a -#else -# define GLH_CORE_NAME(a) GLH__PREPROCESSOR_GYMNASTICS(GLH_CORE_PREFIX,a) -#endif - -#ifdef _WIN32 -#if defined(GL_VERSION_1_2) || defined(GL_VERSION_1_3) || defined(GL_VERSION_1_4) || defined(GL_VERSION_1_5) - /* These routines are prefixed by the preprocessor constant - GLH_CORE_PREFIX to avoid colliding with the OpenGL 1.1 namespace. */ - GLH_EXTERN PFNGLBLENDCOLORPROC GLH_CORE_NAME(glBlendColor) GLH_INITIALIZER; - GLH_EXTERN PFNGLBLENDEQUATIONPROC GLH_CORE_NAME(glBlendEquation) GLH_INITIALIZER; - GLH_EXTERN PFNGLDRAWRANGEELEMENTSPROC GLH_CORE_NAME(glDrawRangeElements) GLH_INITIALIZER; - GLH_EXTERN PFNGLTEXIMAGE3DPROC GLH_CORE_NAME(glTexImage3D) GLH_INITIALIZER; - GLH_EXTERN PFNGLTEXSUBIMAGE3DPROC GLH_CORE_NAME(glTexSubImage3D) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOPYTEXSUBIMAGE3DPROC GLH_CORE_NAME(glCopyTexSubImage3D) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD1DPROC GLH_CORE_NAME(glMultiTexCoord1d) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD1DVPROC GLH_CORE_NAME(glMultiTexCoord1dv) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD1FPROC GLH_CORE_NAME(glMultiTexCoord1f) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD1FVPROC GLH_CORE_NAME(glMultiTexCoord1fv) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD1IPROC GLH_CORE_NAME(glMultiTexCoord1i) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD1IVPROC GLH_CORE_NAME(glMultiTexCoord1iv) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD1SPROC GLH_CORE_NAME(glMultiTexCoord1s) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD1SVPROC GLH_CORE_NAME(glMultiTexCoord1sv) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2DPROC GLH_CORE_NAME(glMultiTexCoord2d) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2DVPROC GLH_CORE_NAME(glMultiTexCoord2dv) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2FPROC GLH_CORE_NAME(glMultiTexCoord2f) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2FVPROC GLH_CORE_NAME(glMultiTexCoord2fv) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2IPROC GLH_CORE_NAME(glMultiTexCoord2i) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2IVPROC GLH_CORE_NAME(glMultiTexCoord2iv) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2SPROC GLH_CORE_NAME(glMultiTexCoord2s) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2SVPROC GLH_CORE_NAME(glMultiTexCoord2sv) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3DPROC GLH_CORE_NAME(glMultiTexCoord3d) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3DVPROC GLH_CORE_NAME(glMultiTexCoord3dv) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3FPROC GLH_CORE_NAME(glMultiTexCoord3f) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3FVPROC GLH_CORE_NAME(glMultiTexCoord3fv) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3IPROC GLH_CORE_NAME(glMultiTexCoord3i) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3IVPROC GLH_CORE_NAME(glMultiTexCoord3iv) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3SPROC GLH_CORE_NAME(glMultiTexCoord3s) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3SVPROC GLH_CORE_NAME(glMultiTexCoord3sv) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4DPROC GLH_CORE_NAME(glMultiTexCoord4d) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4DVPROC GLH_CORE_NAME(glMultiTexCoord4dv) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4FPROC GLH_CORE_NAME(glMultiTexCoord4f) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4FVPROC GLH_CORE_NAME(glMultiTexCoord4fv) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4IPROC GLH_CORE_NAME(glMultiTexCoord4i) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4IVPROC GLH_CORE_NAME(glMultiTexCoord4iv) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4SPROC GLH_CORE_NAME(glMultiTexCoord4s) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4SVPROC GLH_CORE_NAME(glMultiTexCoord4sv) GLH_INITIALIZER; - GLH_EXTERN PFNGLACTIVETEXTUREPROC GLH_CORE_NAME(glActiveTexture) GLH_INITIALIZER; - GLH_EXTERN PFNGLCLIENTACTIVETEXTUREPROC GLH_CORE_NAME(glClientActiveTexture) GLH_INITIALIZER; -#endif -#endif - -#ifdef _WIN32 -#if defined(GL_VERSION_1_3) || defined(GL_VERSION_1_4) || defined(GL_VERSION_1_5) - /* These routines are prefixed by the preprocessor constant - GLH_CORE_PREFIX to avoid colliding with the OpenGL 1.1 namespace. */ - GLH_EXTERN PFNGLCOMPRESSEDTEXIMAGE3DPROC GLH_CORE_NAME(glCompressedTexImage3D) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMPRESSEDTEXIMAGE2DPROC GLH_CORE_NAME(glCompressedTexImage2D) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMPRESSEDTEXIMAGE1DPROC GLH_CORE_NAME(glCompressedTexImage1D) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC GLH_CORE_NAME(glCompressedTexSubImage3D) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC GLH_CORE_NAME(glCompressedTexSubImage2D) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC GLH_CORE_NAME(glCompressedTexSubImage1D) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETCOMPRESSEDTEXIMAGEPROC GLH_CORE_NAME(glGetCompressedTexImage) GLH_INITIALIZER; - GLH_EXTERN PFNGLSAMPLECOVERAGEPROC GLH_CORE_NAME(glSampleCoverage) GLH_INITIALIZER; - GLH_EXTERN PFNGLLOADTRANSPOSEMATRIXFPROC GLH_CORE_NAME(glLoadTransposeMatrixf) GLH_INITIALIZER; - GLH_EXTERN PFNGLLOADTRANSPOSEMATRIXDPROC GLH_CORE_NAME(glLoadTransposeMatrixd) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTTRANSPOSEMATRIXFPROC GLH_CORE_NAME(glMultTransposeMatrixf) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTTRANSPOSEMATRIXDPROC GLH_CORE_NAME(glMultTransposeMatrixd) GLH_INITIALIZER; -#endif -#endif - -#ifdef _WIN32 -#if defined(GL_VERSION_1_4) || defined(GL_VERSION_1_5) - /* These routines are prefixed by the preprocessor constant - GLH_CORE_PREFIX to avoid colliding with the OpenGL 1.1 namespace. */ - GLH_EXTERN PFNGLMULTIDRAWARRAYSPROC GLH_CORE_NAME(glMultiDrawArrays) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTIDRAWELEMENTSPROC GLH_CORE_NAME(glMultiDrawElements) GLH_INITIALIZER; - GLH_EXTERN PFNGLPOINTPARAMETERFPROC GLH_CORE_NAME(glPointParameterf) GLH_INITIALIZER; - GLH_EXTERN PFNGLPOINTPARAMETERFVPROC GLH_CORE_NAME(glPointParameterfv) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3BPROC GLH_CORE_NAME(glSecondaryColor3b) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3BVPROC GLH_CORE_NAME(glSecondaryColor3bv) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3DPROC GLH_CORE_NAME(glSecondaryColor3d) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3DVPROC GLH_CORE_NAME(glSecondaryColor3dv) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3FPROC GLH_CORE_NAME(glSecondaryColor3f) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3FVPROC GLH_CORE_NAME(glSecondaryColor3fv) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3IPROC GLH_CORE_NAME(glSecondaryColor3i) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3IVPROC GLH_CORE_NAME(glSecondaryColor3iv) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3SPROC GLH_CORE_NAME(glSecondaryColor3s) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3SVPROC GLH_CORE_NAME(glSecondaryColor3sv) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3UBPROC GLH_CORE_NAME(glSecondaryColor3ub) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3UBVPROC GLH_CORE_NAME(glSecondaryColor3ubv) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3UIPROC GLH_CORE_NAME(glSecondaryColor3ui) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3UIVPROC GLH_CORE_NAME(glSecondaryColor3uiv) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3USPROC GLH_CORE_NAME(glSecondaryColor3us) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3USVPROC GLH_CORE_NAME(glSecondaryColor3usv) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLORPOINTERPROC GLH_CORE_NAME(glSecondaryColorPointer) GLH_INITIALIZER; - GLH_EXTERN PFNGLBLENDFUNCSEPARATEPROC GLH_CORE_NAME(glBlendFuncSeparate) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS2DPROC GLH_CORE_NAME(glWindowPos2d) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS2FPROC GLH_CORE_NAME(glWindowPos2f) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS2IPROC GLH_CORE_NAME(glWindowPos2i) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS2SPROC GLH_CORE_NAME(glWindowPos2s) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS2DVPROC GLH_CORE_NAME(glWindowPos2dv) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS2FVPROC GLH_CORE_NAME(glWindowPos2fv) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS2IVPROC GLH_CORE_NAME(glWindowPos2iv) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS2SVPROC GLH_CORE_NAME(glWindowPos2sv) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS3DPROC GLH_CORE_NAME(glWindowPos3d) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS3FPROC GLH_CORE_NAME(glWindowPos3f) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS3IPROC GLH_CORE_NAME(glWindowPos3i) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS3SPROC GLH_CORE_NAME(glWindowPos3s) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS3DVPROC GLH_CORE_NAME(glWindowPos3dv) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS3FVPROC GLH_CORE_NAME(glWindowPos3fv) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS3IVPROC GLH_CORE_NAME(glWindowPos3iv) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS3SVPROC GLH_CORE_NAME(glWindowPos3sv) GLH_INITIALIZER; -#endif -#endif - -#ifdef _WIN32 -#if defined(GL_VERSION_1_5) - /* These routines are prefixed by the preprocessor constant - GLH_CORE_PREFIX to avoid colliding with the OpenGL 1.1 namespace. */ - GLH_EXTERN PFNGLGENQUERIESPROC GLH_CORE_NAME(glGenQueries) GLH_INITIALIZER; - GLH_EXTERN PFNGLDELETEQUERIESPROC GLH_CORE_NAME(glDeleteQueries) GLH_INITIALIZER; - GLH_EXTERN PFNGLISQUERYPROC GLH_CORE_NAME(glIsQuery) GLH_INITIALIZER; - GLH_EXTERN PFNGLBEGINQUERYPROC GLH_CORE_NAME(glBeginQuery) GLH_INITIALIZER; - GLH_EXTERN PFNGLENDQUERYPROC GLH_CORE_NAME(glEndQuery) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETQUERYIVPROC GLH_CORE_NAME(glGetQueryiv) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETQUERYOBJECTIVPROC GLH_CORE_NAME(glGetQueryObjectiv) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETQUERYOBJECTUIVPROC GLH_CORE_NAME(glGetQueryObjectuiv) GLH_INITIALIZER; - GLH_EXTERN PFNGLBINDBUFFERPROC GLH_CORE_NAME(glBindBuffer) GLH_INITIALIZER; - GLH_EXTERN PFNGLDELETEBUFFERSPROC GLH_CORE_NAME(glDeleteBuffers) GLH_INITIALIZER; - GLH_EXTERN PFNGLGENBUFFERSPROC GLH_CORE_NAME(glGenBuffers) GLH_INITIALIZER; - GLH_EXTERN PFNGLISBUFFERPROC GLH_CORE_NAME(glIsBuffer) GLH_INITIALIZER; - GLH_EXTERN PFNGLBUFFERDATAPROC GLH_CORE_NAME(glBufferData) GLH_INITIALIZER; - GLH_EXTERN PFNGLBUFFERSUBDATAPROC GLH_CORE_NAME(glBufferSubData) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETBUFFERSUBDATAPROC GLH_CORE_NAME(glGetBufferSubData) GLH_INITIALIZER; - GLH_EXTERN PFNGLMAPBUFFERPROC GLH_CORE_NAME(glMapBuffer) GLH_INITIALIZER; - GLH_EXTERN PFNGLUNMAPBUFFERPROC GLH_CORE_NAME(glUnmapBuffer) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETBUFFERPARAMETERIVPROC GLH_CORE_NAME(glGetBufferParameteriv) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETBUFFERPOINTERVPROC GLH_CORE_NAME(glGetBufferPointerv) GLH_INITIALIZER; -#endif -#endif - -#ifdef GL_ARB_depth_texture -#endif - -#ifdef GL_ARB_fragment_program -#endif - -#ifdef GL_ARB_fragment_program_shadow -#endif - -#ifdef GL_ARB_fragment_shader -#endif - -#ifdef GL_ARB_matrix_palette -#endif - -#ifdef GL_ARB_multisample -#endif - -#ifdef GL_ARB_multitexture - GLH_EXTERN PFNGLMULTITEXCOORD1DARBPROC GLH_EXT_NAME(glMultiTexCoord1dARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD1DVARBPROC GLH_EXT_NAME(glMultiTexCoord1dvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD1FARBPROC GLH_EXT_NAME(glMultiTexCoord1fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD1FVARBPROC GLH_EXT_NAME(glMultiTexCoord1fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD1IARBPROC GLH_EXT_NAME(glMultiTexCoord1iARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD1IVARBPROC GLH_EXT_NAME(glMultiTexCoord1ivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD1SARBPROC GLH_EXT_NAME(glMultiTexCoord1sARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD1SVARBPROC GLH_EXT_NAME(glMultiTexCoord1svARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2DARBPROC GLH_EXT_NAME(glMultiTexCoord2dARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2DVARBPROC GLH_EXT_NAME(glMultiTexCoord2dvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2FARBPROC GLH_EXT_NAME(glMultiTexCoord2fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2FVARBPROC GLH_EXT_NAME(glMultiTexCoord2fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2IARBPROC GLH_EXT_NAME(glMultiTexCoord2iARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2IVARBPROC GLH_EXT_NAME(glMultiTexCoord2ivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2SARBPROC GLH_EXT_NAME(glMultiTexCoord2sARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2SVARBPROC GLH_EXT_NAME(glMultiTexCoord2svARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3DARBPROC GLH_EXT_NAME(glMultiTexCoord3dARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3DVARBPROC GLH_EXT_NAME(glMultiTexCoord3dvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3FARBPROC GLH_EXT_NAME(glMultiTexCoord3fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3FVARBPROC GLH_EXT_NAME(glMultiTexCoord3fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3IARBPROC GLH_EXT_NAME(glMultiTexCoord3iARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3IVARBPROC GLH_EXT_NAME(glMultiTexCoord3ivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3SARBPROC GLH_EXT_NAME(glMultiTexCoord3sARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3SVARBPROC GLH_EXT_NAME(glMultiTexCoord3svARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4DARBPROC GLH_EXT_NAME(glMultiTexCoord4dARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4DVARBPROC GLH_EXT_NAME(glMultiTexCoord4dvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4FARBPROC GLH_EXT_NAME(glMultiTexCoord4fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4FVARBPROC GLH_EXT_NAME(glMultiTexCoord4fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4IARBPROC GLH_EXT_NAME(glMultiTexCoord4iARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4IVARBPROC GLH_EXT_NAME(glMultiTexCoord4ivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4SARBPROC GLH_EXT_NAME(glMultiTexCoord4sARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4SVARBPROC GLH_EXT_NAME(glMultiTexCoord4svARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLACTIVETEXTUREARBPROC GLH_EXT_NAME(glActiveTextureARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLCLIENTACTIVETEXTUREARBPROC GLH_EXT_NAME(glClientActiveTextureARB) GLH_INITIALIZER; -#endif - -#ifdef GL_ARB_occlusion_query - GLH_EXTERN PFNGLGENQUERIESARBPROC GLH_EXT_NAME(glGenQueriesARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLDELETEQUERIESARBPROC GLH_EXT_NAME(glDeleteQueriesARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLISQUERYARBPROC GLH_EXT_NAME(glIsQueryARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLBEGINQUERYARBPROC GLH_EXT_NAME(glBeginQueryARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLENDQUERYARBPROC GLH_EXT_NAME(glEndQueryARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETQUERYIVARBPROC GLH_EXT_NAME(glGetQueryivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETQUERYOBJECTIVARBPROC GLH_EXT_NAME(glGetQueryObjectivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETQUERYOBJECTUIVARBPROC GLH_EXT_NAME(glGetQueryObjectuivARB) GLH_INITIALIZER; -#endif - -#ifdef GL_ARB_point_parameters - GLH_EXTERN PFNGLPOINTPARAMETERFARBPROC GLH_EXT_NAME(glPointParameterfARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLPOINTPARAMETERFVARBPROC GLH_EXT_NAME(glPointParameterfvARB) GLH_INITIALIZER; -#endif - -#ifdef GL_ARB_point_sprite -#endif - -#ifdef GL_ARB_shader_objects - GLH_EXTERN PFNGLDELETEOBJECTARBPROC GLH_EXT_NAME(glDeleteObjectARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETHANDLEARBPROC GLH_EXT_NAME(glGetHandleARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLDETACHOBJECTARBPROC GLH_EXT_NAME(glDetachObjectARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLCREATESHADEROBJECTARBPROC GLH_EXT_NAME(glCreateShaderObjectARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLSHADERSOURCEARBPROC GLH_EXT_NAME(glShaderSourceARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMPILESHADERARBPROC GLH_EXT_NAME(glCompileShaderARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLCREATEPROGRAMOBJECTARBPROC GLH_EXT_NAME(glCreateProgramObjectARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLATTACHOBJECTARBPROC GLH_EXT_NAME(glAttachObjectARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLLINKPROGRAMARBPROC GLH_EXT_NAME(glLinkProgramARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLUSEPROGRAMOBJECTARBPROC GLH_EXT_NAME(glUseProgramObjectARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVALIDATEPROGRAMARBPROC GLH_EXT_NAME(glValidateProgramARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLUNIFORM1FARBPROC GLH_EXT_NAME(glUniform1fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLUNIFORM2FARBPROC GLH_EXT_NAME(glUniform2fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLUNIFORM3FARBPROC GLH_EXT_NAME(glUniform3fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLUNIFORM4FARBPROC GLH_EXT_NAME(glUniform4fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLUNIFORM1IARBPROC GLH_EXT_NAME(glUniform1iARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLUNIFORM2IARBPROC GLH_EXT_NAME(glUniform2iARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLUNIFORM3IARBPROC GLH_EXT_NAME(glUniform3iARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLUNIFORM4IARBPROC GLH_EXT_NAME(glUniform4iARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLUNIFORM1FVARBPROC GLH_EXT_NAME(glUniform1fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLUNIFORM2FVARBPROC GLH_EXT_NAME(glUniform2fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLUNIFORM3FVARBPROC GLH_EXT_NAME(glUniform3fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLUNIFORM4FVARBPROC GLH_EXT_NAME(glUniform4fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLUNIFORM1IVARBPROC GLH_EXT_NAME(glUniform1ivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLUNIFORM2IVARBPROC GLH_EXT_NAME(glUniform2ivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLUNIFORM3IVARBPROC GLH_EXT_NAME(glUniform3ivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLUNIFORM4IVARBPROC GLH_EXT_NAME(glUniform4ivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLUNIFORMMATRIX2FVARBPROC GLH_EXT_NAME(glUniformMatrix2fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLUNIFORMMATRIX3FVARBPROC GLH_EXT_NAME(glUniformMatrix3fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLUNIFORMMATRIX4FVARBPROC GLH_EXT_NAME(glUniformMatrix4fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETOBJECTPARAMETERFVARBPROC GLH_EXT_NAME(glGetObjectParameterfvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETOBJECTPARAMETERIVARBPROC GLH_EXT_NAME(glGetObjectParameterivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETINFOLOGARBPROC GLH_EXT_NAME(glGetInfoLogARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETATTACHEDOBJECTSARBPROC GLH_EXT_NAME(glGetAttachedObjectsARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETUNIFORMLOCATIONARBPROC GLH_EXT_NAME(glGetUniformLocationARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETACTIVEUNIFORMARBPROC GLH_EXT_NAME(glGetActiveUniformARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETUNIFORMFVARBPROC GLH_EXT_NAME(glGetUniformfvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETUNIFORMIVARBPROC GLH_EXT_NAME(glGetUniformivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETSHADERSOURCEARBPROC GLH_EXT_NAME(glGetShaderSourceARB) GLH_INITIALIZER; -#endif - -#ifdef GL_ARB_shadow -#endif - -#ifdef GL_ARB_shadow_ambient -#endif - -#ifdef GL_ARB_texture_border_clamp -#endif - -#ifdef GL_ARB_texture_compression - GLH_EXTERN PFNGLCOMPRESSEDTEXIMAGE3DARBPROC GLH_EXT_NAME(glCompressedTexImage3DARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMPRESSEDTEXIMAGE2DARBPROC GLH_EXT_NAME(glCompressedTexImage2DARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMPRESSEDTEXIMAGE1DARBPROC GLH_EXT_NAME(glCompressedTexImage1DARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC GLH_EXT_NAME(glCompressedTexSubImage3DARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC GLH_EXT_NAME(glCompressedTexSubImage2DARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC GLH_EXT_NAME(glCompressedTexSubImage1DARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETCOMPRESSEDTEXIMAGEARBPROC GLH_EXT_NAME(glGetCompressedTexImageARB) GLH_INITIALIZER; -#endif - -#ifdef GL_ARB_texture_cube_map -#endif - -#ifdef GL_ARB_texture_env_add -#endif - -#ifdef GL_ARB_texture_env_combine -#endif - -#ifdef GL_ARB_texture_env_dot3 -#endif - -#ifdef GL_ARB_texture_mirrored_repeat -#endif - -#ifdef GL_ARB_texture_non_power_of_two -#endif - -#ifdef GL_ARB_texture_rectangle -#endif - -#ifdef GL_ARB_transpose_matrix - GLH_EXTERN PFNGLLOADTRANSPOSEMATRIXFARBPROC GLH_EXT_NAME(glLoadTransposeMatrixfARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLLOADTRANSPOSEMATRIXDARBPROC GLH_EXT_NAME(glLoadTransposeMatrixdARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTTRANSPOSEMATRIXFARBPROC GLH_EXT_NAME(glMultTransposeMatrixfARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTTRANSPOSEMATRIXDARBPROC GLH_EXT_NAME(glMultTransposeMatrixdARB) GLH_INITIALIZER; -#endif - -#ifdef GL_ARB_vertex_buffer_object - GLH_EXTERN PFNGLBINDBUFFERARBPROC GLH_EXT_NAME(glBindBufferARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLDELETEBUFFERSARBPROC GLH_EXT_NAME(glDeleteBuffersARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGENBUFFERSARBPROC GLH_EXT_NAME(glGenBuffersARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLISBUFFERARBPROC GLH_EXT_NAME(glIsBufferARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLBUFFERDATAARBPROC GLH_EXT_NAME(glBufferDataARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLBUFFERSUBDATAARBPROC GLH_EXT_NAME(glBufferSubDataARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETBUFFERSUBDATAARBPROC GLH_EXT_NAME(glGetBufferSubDataARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMAPBUFFERARBPROC GLH_EXT_NAME(glMapBufferARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLUNMAPBUFFERARBPROC GLH_EXT_NAME(glUnmapBufferARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETBUFFERPARAMETERIVARBPROC GLH_EXT_NAME(glGetBufferParameterivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETBUFFERPOINTERVARBPROC GLH_EXT_NAME(glGetBufferPointervARB) GLH_INITIALIZER; -#endif - -#ifdef GL_ARB_vertex_program - GLH_EXTERN PFNGLVERTEXATTRIB1SARBPROC GLH_EXT_NAME(glVertexAttrib1sARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB1FARBPROC GLH_EXT_NAME(glVertexAttrib1fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB1DARBPROC GLH_EXT_NAME(glVertexAttrib1dARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2SARBPROC GLH_EXT_NAME(glVertexAttrib2sARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2FARBPROC GLH_EXT_NAME(glVertexAttrib2fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2DARBPROC GLH_EXT_NAME(glVertexAttrib2dARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3SARBPROC GLH_EXT_NAME(glVertexAttrib3sARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3FARBPROC GLH_EXT_NAME(glVertexAttrib3fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3DARBPROC GLH_EXT_NAME(glVertexAttrib3dARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4SARBPROC GLH_EXT_NAME(glVertexAttrib4sARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4FARBPROC GLH_EXT_NAME(glVertexAttrib4fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4DARBPROC GLH_EXT_NAME(glVertexAttrib4dARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4NUBARBPROC GLH_EXT_NAME(glVertexAttrib4NubARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB1SVARBPROC GLH_EXT_NAME(glVertexAttrib1svARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB1FVARBPROC GLH_EXT_NAME(glVertexAttrib1fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB1DVARBPROC GLH_EXT_NAME(glVertexAttrib1dvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2SVARBPROC GLH_EXT_NAME(glVertexAttrib2svARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2FVARBPROC GLH_EXT_NAME(glVertexAttrib2fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2DVARBPROC GLH_EXT_NAME(glVertexAttrib2dvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3SVARBPROC GLH_EXT_NAME(glVertexAttrib3svARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3FVARBPROC GLH_EXT_NAME(glVertexAttrib3fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3DVARBPROC GLH_EXT_NAME(glVertexAttrib3dvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4BVARBPROC GLH_EXT_NAME(glVertexAttrib4bvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4SVARBPROC GLH_EXT_NAME(glVertexAttrib4svARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4IVARBPROC GLH_EXT_NAME(glVertexAttrib4ivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4UBVARBPROC GLH_EXT_NAME(glVertexAttrib4ubvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4USVARBPROC GLH_EXT_NAME(glVertexAttrib4usvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4UIVARBPROC GLH_EXT_NAME(glVertexAttrib4uivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4FVARBPROC GLH_EXT_NAME(glVertexAttrib4fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4DVARBPROC GLH_EXT_NAME(glVertexAttrib4dvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4NBVARBPROC GLH_EXT_NAME(glVertexAttrib4NbvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4NSVARBPROC GLH_EXT_NAME(glVertexAttrib4NsvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4NIVARBPROC GLH_EXT_NAME(glVertexAttrib4NivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4NUBVARBPROC GLH_EXT_NAME(glVertexAttrib4NubvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4NUSVARBPROC GLH_EXT_NAME(glVertexAttrib4NusvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4NUIVARBPROC GLH_EXT_NAME(glVertexAttrib4NuivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBPOINTERARBPROC GLH_EXT_NAME(glVertexAttribPointerARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLENABLEVERTEXATTRIBARRAYARBPROC GLH_EXT_NAME(glEnableVertexAttribArrayARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLDISABLEVERTEXATTRIBARRAYARBPROC GLH_EXT_NAME(glDisableVertexAttribArrayARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMSTRINGARBPROC GLH_EXT_NAME(glProgramStringARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLBINDPROGRAMARBPROC GLH_EXT_NAME(glBindProgramARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLDELETEPROGRAMSARBPROC GLH_EXT_NAME(glDeleteProgramsARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGENPROGRAMSARBPROC GLH_EXT_NAME(glGenProgramsARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMENVPARAMETER4DARBPROC GLH_EXT_NAME(glProgramEnvParameter4dARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMENVPARAMETER4DVARBPROC GLH_EXT_NAME(glProgramEnvParameter4dvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMENVPARAMETER4FARBPROC GLH_EXT_NAME(glProgramEnvParameter4fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMENVPARAMETER4FVARBPROC GLH_EXT_NAME(glProgramEnvParameter4fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMLOCALPARAMETER4DARBPROC GLH_EXT_NAME(glProgramLocalParameter4dARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMLOCALPARAMETER4DVARBPROC GLH_EXT_NAME(glProgramLocalParameter4dvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMLOCALPARAMETER4FARBPROC GLH_EXT_NAME(glProgramLocalParameter4fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMLOCALPARAMETER4FVARBPROC GLH_EXT_NAME(glProgramLocalParameter4fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETPROGRAMENVPARAMETERDVARBPROC GLH_EXT_NAME(glGetProgramEnvParameterdvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETPROGRAMENVPARAMETERFVARBPROC GLH_EXT_NAME(glGetProgramEnvParameterfvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC GLH_EXT_NAME(glGetProgramLocalParameterdvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC GLH_EXT_NAME(glGetProgramLocalParameterfvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETPROGRAMIVARBPROC GLH_EXT_NAME(glGetProgramivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETPROGRAMSTRINGARBPROC GLH_EXT_NAME(glGetProgramStringARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETVERTEXATTRIBDVARBPROC GLH_EXT_NAME(glGetVertexAttribdvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETVERTEXATTRIBFVARBPROC GLH_EXT_NAME(glGetVertexAttribfvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETVERTEXATTRIBIVARBPROC GLH_EXT_NAME(glGetVertexAttribivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETVERTEXATTRIBPOINTERVARBPROC GLH_EXT_NAME(glGetVertexAttribPointervARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLISPROGRAMARBPROC GLH_EXT_NAME(glIsProgramARB) GLH_INITIALIZER; -#endif - -#ifdef GL_ARB_vertex_shader - GLH_EXTERN PFNGLBINDATTRIBLOCATIONARBPROC GLH_EXT_NAME(glBindAttribLocationARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETACTIVEATTRIBARBPROC GLH_EXT_NAME(glGetActiveAttribARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETATTRIBLOCATIONARBPROC GLH_EXT_NAME(glGetAttribLocationARB) GLH_INITIALIZER; -#endif - -#ifdef GL_ARB_window_pos - GLH_EXTERN PFNGLWINDOWPOS2DARBPROC GLH_EXT_NAME(glWindowPos2dARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS2FARBPROC GLH_EXT_NAME(glWindowPos2fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS2IARBPROC GLH_EXT_NAME(glWindowPos2iARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS2SARBPROC GLH_EXT_NAME(glWindowPos2sARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS2DVARBPROC GLH_EXT_NAME(glWindowPos2dvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS2FVARBPROC GLH_EXT_NAME(glWindowPos2fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS2IVARBPROC GLH_EXT_NAME(glWindowPos2ivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS2SVARBPROC GLH_EXT_NAME(glWindowPos2svARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS3DARBPROC GLH_EXT_NAME(glWindowPos3dARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS3FARBPROC GLH_EXT_NAME(glWindowPos3fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS3IARBPROC GLH_EXT_NAME(glWindowPos3iARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS3SARBPROC GLH_EXT_NAME(glWindowPos3sARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS3DVARBPROC GLH_EXT_NAME(glWindowPos3dvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS3FVARBPROC GLH_EXT_NAME(glWindowPos3fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS3IVARBPROC GLH_EXT_NAME(glWindowPos3ivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLWINDOWPOS3SVARBPROC GLH_EXT_NAME(glWindowPos3svARB) GLH_INITIALIZER; -#endif - -#ifdef GL_ATI_draw_buffers - GLH_EXTERN PFNGLDRAWBUFFERSATIPROC GLH_EXT_NAME(glDrawBuffersATI) GLH_INITIALIZER; -#endif - -#ifdef GL_ATI_texture_float -#endif - -#ifdef GL_EXT_abgr -#endif - -#ifdef GL_EXT_bgra -#endif - -#ifdef GL_EXT_blend_color - GLH_EXTERN PFNGLBLENDCOLOREXTPROC GLH_EXT_NAME(glBlendColorEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_blend_equation_separate - GLH_EXTERN PFNGLBLENDEQUATIONSEPARATEEXTPROC GLH_EXT_NAME(glBlendEquationSeparateEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_blend_func_separate - GLH_EXTERN PFNGLBLENDFUNCSEPARATEEXTPROC GLH_EXT_NAME(glBlendFuncSeparateEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_blend_minmax - GLH_EXTERN PFNGLBLENDEQUATIONEXTPROC GLH_EXT_NAME(glBlendEquationEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_blend_subtract -#endif - -#ifdef GL_EXT_Cg_shader -#endif - -#ifdef GL_EXT_compiled_vertex_array - GLH_EXTERN PFNGLLOCKARRAYSEXTPROC GLH_EXT_NAME(glLockArraysEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLUNLOCKARRAYSEXTPROC GLH_EXT_NAME(glUnlockArraysEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_depth_bounds_test - GLH_EXTERN PFNGLDEPTHBOUNDSEXTPROC GLH_EXT_NAME(glDepthBoundsEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_draw_range_elements -#endif - -#ifdef GL_EXT_fog_coord - GLH_EXTERN PFNGLFOGCOORDDEXTPROC GLH_EXT_NAME(glFogCoorddEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLFOGCOORDDVEXTPROC GLH_EXT_NAME(glFogCoorddvEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLFOGCOORDFEXTPROC GLH_EXT_NAME(glFogCoordfEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLFOGCOORDFVEXTPROC GLH_EXT_NAME(glFogCoordfvEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLFOGCOORDPOINTEREXTPROC GLH_EXT_NAME(glFogCoordPointerEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_framebuffer_object - GLH_EXTERN PFNGLISRENDERBUFFEREXTPROC GLH_EXT_NAME(glIsRenderbufferEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLBINDRENDERBUFFEREXTPROC GLH_EXT_NAME(glBindRenderbufferEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLDELETERENDERBUFFERSEXTPROC GLH_EXT_NAME(glDeleteRenderbuffersEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLGENRENDERBUFFERSEXTPROC GLH_EXT_NAME(glGenRenderbuffersEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLRENDERBUFFERSTORAGEEXTPROC GLH_EXT_NAME(glRenderbufferStorageEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC GLH_EXT_NAME(glGetRenderbufferParameterivEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLISFRAMEBUFFEREXTPROC GLH_EXT_NAME(glIsFramebufferEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLBINDFRAMEBUFFEREXTPROC GLH_EXT_NAME(glBindFramebufferEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLDELETEFRAMEBUFFERSEXTPROC GLH_EXT_NAME(glDeleteFramebuffersEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLGENFRAMEBUFFERSEXTPROC GLH_EXT_NAME(glGenFramebuffersEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC GLH_EXT_NAME(glCheckFramebufferStatusEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLFRAMEBUFFERTEXTURE1DEXTPROC GLH_EXT_NAME(glFramebufferTexture1DEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLFRAMEBUFFERTEXTURE2DEXTPROC GLH_EXT_NAME(glFramebufferTexture2DEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLFRAMEBUFFERTEXTURE3DEXTPROC GLH_EXT_NAME(glFramebufferTexture3DEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC GLH_EXT_NAME(glFramebufferRenderbufferEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC GLH_EXT_NAME(glGetFramebufferAttachmentParameterivEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLGENERATEMIPMAPEXTPROC GLH_EXT_NAME(glGenerateMipmapEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_multi_draw_arrays - GLH_EXTERN PFNGLMULTIDRAWARRAYSEXTPROC GLH_EXT_NAME(glMultiDrawArraysEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTIDRAWELEMENTSEXTPROC GLH_EXT_NAME(glMultiDrawElementsEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_light_max_exponent -#endif - -#ifdef GL_EXT_packed_pixels -#endif - -#ifdef GL_EXT_paletted_texture - GLH_EXTERN PFNGLCOLORSUBTABLEEXTPROC GLH_EXT_NAME(glColorSubTableEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOLORTABLEEXTPROC GLH_EXT_NAME(glColorTableEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETCOLORTABLEEXTPROC GLH_EXT_NAME(glGetColorTableEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETCOLORTABLEPARAMETERFVEXTPROC GLH_EXT_NAME(glGetColorTableParameterfvEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETCOLORTABLEPARAMETERIVEXTPROC GLH_EXT_NAME(glGetColorTableParameterivEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_pixel_buffer_object -#endif - -#ifdef GL_EXT_point_parameters - GLH_EXTERN PFNGLPOINTPARAMETERFEXTPROC GLH_EXT_NAME(glPointParameterfEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLPOINTPARAMETERFVEXTPROC GLH_EXT_NAME(glPointParameterfvEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_rescale_normal -#endif - -#ifdef GL_EXT_secondary_color - GLH_EXTERN PFNGLSECONDARYCOLOR3BEXTPROC GLH_EXT_NAME(glSecondaryColor3bEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3BVEXTPROC GLH_EXT_NAME(glSecondaryColor3bvEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3DEXTPROC GLH_EXT_NAME(glSecondaryColor3dEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3DVEXTPROC GLH_EXT_NAME(glSecondaryColor3dvEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3FEXTPROC GLH_EXT_NAME(glSecondaryColor3fEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3FVEXTPROC GLH_EXT_NAME(glSecondaryColor3fvEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3IEXTPROC GLH_EXT_NAME(glSecondaryColor3iEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3IVEXTPROC GLH_EXT_NAME(glSecondaryColor3ivEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3SEXTPROC GLH_EXT_NAME(glSecondaryColor3sEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3SVEXTPROC GLH_EXT_NAME(glSecondaryColor3svEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3UBEXTPROC GLH_EXT_NAME(glSecondaryColor3ubEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3UBVEXTPROC GLH_EXT_NAME(glSecondaryColor3ubvEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3UIEXTPROC GLH_EXT_NAME(glSecondaryColor3uiEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3UIVEXTPROC GLH_EXT_NAME(glSecondaryColor3uivEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3USEXTPROC GLH_EXT_NAME(glSecondaryColor3usEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3USVEXTPROC GLH_EXT_NAME(glSecondaryColor3usvEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLORPOINTEREXTPROC GLH_EXT_NAME(glSecondaryColorPointerEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_separate_specular_color -#endif - -#ifdef GL_EXT_shadow_funcs -#endif - -#ifdef GL_EXT_shared_texture_palette -#endif - -#ifdef GL_EXT_stencil_two_side - GLH_EXTERN PFNGLACTIVESTENCILFACEEXTPROC GLH_EXT_NAME(glActiveStencilFaceEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_stencil_wrap -#endif - -#ifdef GL_EXT_texture_compression_s3tc -#endif - -#ifdef GL_EXT_texture_cube_map -#endif - -#ifdef GL_EXT_texture_edge_clamp -#endif - -#ifdef GL_EXT_texture_env_add -#endif - -#ifdef GL_EXT_texture_env_combine -#endif - -#ifdef GL_EXT_texture_env_dot3 -#endif - -#ifdef GL_EXT_texture_filter_anisotropic -#endif - -#ifdef GL_EXT_texture_lod_bias -#endif - -#ifdef GL_EXT_texture_object - GLH_EXTERN PFNGLARETEXTURESRESIDENTEXTPROC GLH_EXT_NAME(glAreTexturesResidentEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLBINDTEXTUREEXTPROC GLH_EXT_NAME(glBindTextureEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLDELETETEXTURESEXTPROC GLH_EXT_NAME(glDeleteTexturesEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLGENTEXTURESEXTPROC GLH_EXT_NAME(glGenTexturesEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLISTEXTUREEXTPROC GLH_EXT_NAME(glIsTextureEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLPRIORITIZETEXTURESEXTPROC GLH_EXT_NAME(glPrioritizeTexturesEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_texture_rectangle -#endif - -#ifdef GL_EXT_texture3D - GLH_EXTERN PFNGLTEXIMAGE3DEXTPROC GLH_EXT_NAME(glTexImage3DEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_vertex_array - GLH_EXTERN PFNGLARRAYELEMENTEXTPROC GLH_EXT_NAME(glArrayElementEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOLORPOINTEREXTPROC GLH_EXT_NAME(glColorPointerEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLEDGEFLAGPOINTEREXTPROC GLH_EXT_NAME(glEdgeFlagPointerEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETPOINTERVEXTPROC GLH_EXT_NAME(glGetPointervEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLINDEXPOINTEREXTPROC GLH_EXT_NAME(glIndexPointerEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLNORMALPOINTEREXTPROC GLH_EXT_NAME(glNormalPointerEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLTEXCOORDPOINTEREXTPROC GLH_EXT_NAME(glTexCoordPointerEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXPOINTEREXTPROC GLH_EXT_NAME(glVertexPointerEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLDRAWARRAYSEXTPROC GLH_EXT_NAME(glDrawArraysEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_vertex_weighting - GLH_EXTERN PFNGLVERTEXWEIGHTFEXTPROC GLH_EXT_NAME(glVertexWeightfEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXWEIGHTFVEXTPROC GLH_EXT_NAME(glVertexWeightfvEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXWEIGHTPOINTEREXTPROC GLH_EXT_NAME(glVertexWeightPointerEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_HP_occlusion_test -#endif - -#ifdef GL_IBM_texture_mirrored_repeat -#endif - -#ifdef GL_NV_blend_square -#endif - -#ifdef GL_NV_copy_depth_to_color -#endif - -#ifdef GL_NV_depth_clamp -#endif - -#ifdef GL_NV_element_array - GLH_EXTERN PFNGLELEMENTPOINTERNVPROC GLH_EXT_NAME(glElementPointerNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLDRAWELEMENTARRAYNVPROC GLH_EXT_NAME(glDrawElementArrayNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLDRAWRANGEELEMENTARRAYNVPROC GLH_EXT_NAME(glDrawRangeElementArrayNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTIDRAWELEMENTARRAYNVPROC GLH_EXT_NAME(glMultiDrawElementArrayNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTIDRAWRANGEELEMENTARRAYNVPROC GLH_EXT_NAME(glMultiDrawRangeElementArrayNV) GLH_INITIALIZER; -#endif - -#ifdef GL_NV_fence - GLH_EXTERN PFNGLGENFENCESNVPROC GLH_EXT_NAME(glGenFencesNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLDELETEFENCESNVPROC GLH_EXT_NAME(glDeleteFencesNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLSETFENCENVPROC GLH_EXT_NAME(glSetFenceNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLTESTFENCENVPROC GLH_EXT_NAME(glTestFenceNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLFINISHFENCENVPROC GLH_EXT_NAME(glFinishFenceNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLISFENCENVPROC GLH_EXT_NAME(glIsFenceNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETFENCEIVNVPROC GLH_EXT_NAME(glGetFenceivNV) GLH_INITIALIZER; -#endif - -#ifdef GL_NV_float_buffer -#endif - -#ifdef GL_NV_fog_distance -#endif - -#ifdef GL_NV_fragment_program - GLH_EXTERN PFNGLPROGRAMNAMEDPARAMETER4FNVPROC GLH_EXT_NAME(glProgramNamedParameter4fNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMNAMEDPARAMETER4DNVPROC GLH_EXT_NAME(glProgramNamedParameter4dNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC GLH_EXT_NAME(glProgramNamedParameter4fvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC GLH_EXT_NAME(glProgramNamedParameter4dvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC GLH_EXT_NAME(glGetProgramNamedParameterfvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC GLH_EXT_NAME(glGetProgramNamedParameterdvNV) GLH_INITIALIZER; -#endif - -#ifdef GL_NV_fragment_program2 -#endif - -#ifdef GL_NV_half_float - GLH_EXTERN PFNGLVERTEX2HNVPROC GLH_EXT_NAME(glVertex2hNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEX2HVNVPROC GLH_EXT_NAME(glVertex2hvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEX3HNVPROC GLH_EXT_NAME(glVertex3hNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEX3HVNVPROC GLH_EXT_NAME(glVertex3hvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEX4HNVPROC GLH_EXT_NAME(glVertex4hNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEX4HVNVPROC GLH_EXT_NAME(glVertex4hvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLNORMAL3HNVPROC GLH_EXT_NAME(glNormal3hNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLNORMAL3HVNVPROC GLH_EXT_NAME(glNormal3hvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOLOR3HNVPROC GLH_EXT_NAME(glColor3hNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOLOR3HVNVPROC GLH_EXT_NAME(glColor3hvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOLOR4HNVPROC GLH_EXT_NAME(glColor4hNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOLOR4HVNVPROC GLH_EXT_NAME(glColor4hvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLTEXCOORD1HNVPROC GLH_EXT_NAME(glTexCoord1hNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLTEXCOORD1HVNVPROC GLH_EXT_NAME(glTexCoord1hvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLTEXCOORD2HNVPROC GLH_EXT_NAME(glTexCoord2hNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLTEXCOORD2HVNVPROC GLH_EXT_NAME(glTexCoord2hvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLTEXCOORD3HNVPROC GLH_EXT_NAME(glTexCoord3hNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLTEXCOORD3HVNVPROC GLH_EXT_NAME(glTexCoord3hvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLTEXCOORD4HNVPROC GLH_EXT_NAME(glTexCoord4hNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLTEXCOORD4HVNVPROC GLH_EXT_NAME(glTexCoord4hvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD1HNVPROC GLH_EXT_NAME(glMultiTexCoord1hNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD1HVNVPROC GLH_EXT_NAME(glMultiTexCoord1hvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2HNVPROC GLH_EXT_NAME(glMultiTexCoord2hNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2HVNVPROC GLH_EXT_NAME(glMultiTexCoord2hvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3HNVPROC GLH_EXT_NAME(glMultiTexCoord3hNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3HVNVPROC GLH_EXT_NAME(glMultiTexCoord3hvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4HNVPROC GLH_EXT_NAME(glMultiTexCoord4hNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4HVNVPROC GLH_EXT_NAME(glMultiTexCoord4hvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLFOGCOORDHNVPROC GLH_EXT_NAME(glFogCoordhNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLFOGCOORDHVNVPROC GLH_EXT_NAME(glFogCoordhvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3HNVPROC GLH_EXT_NAME(glSecondaryColor3hNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3HVNVPROC GLH_EXT_NAME(glSecondaryColor3hvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB1HNVPROC GLH_EXT_NAME(glVertexAttrib1hNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB1HVNVPROC GLH_EXT_NAME(glVertexAttrib1hvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2HNVPROC GLH_EXT_NAME(glVertexAttrib2hNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2HVNVPROC GLH_EXT_NAME(glVertexAttrib2hvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3HNVPROC GLH_EXT_NAME(glVertexAttrib3hNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3HVNVPROC GLH_EXT_NAME(glVertexAttrib3hvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4HNVPROC GLH_EXT_NAME(glVertexAttrib4hNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4HVNVPROC GLH_EXT_NAME(glVertexAttrib4hvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS1HVNVPROC GLH_EXT_NAME(glVertexAttribs1hvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS2HVNVPROC GLH_EXT_NAME(glVertexAttribs2hvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS3HVNVPROC GLH_EXT_NAME(glVertexAttribs3hvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS4HVNVPROC GLH_EXT_NAME(glVertexAttribs4hvNV) GLH_INITIALIZER; -#endif - -#ifdef GL_NV_light_max_exponent -#endif - -#ifdef GL_NV_multisample_filter_hint -#endif - -#ifdef GL_NV_occlusion_query - GLH_EXTERN PFNGLGENOCCLUSIONQUERIESNVPROC GLH_EXT_NAME(glGenOcclusionQueriesNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLDELETEOCCLUSIONQUERIESNVPROC GLH_EXT_NAME(glDeleteOcclusionQueriesNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLISOCCLUSIONQUERYNVPROC GLH_EXT_NAME(glIsOcclusionQueryNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLBEGINOCCLUSIONQUERYNVPROC GLH_EXT_NAME(glBeginOcclusionQueryNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLENDOCCLUSIONQUERYNVPROC GLH_EXT_NAME(glEndOcclusionQueryNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETOCCLUSIONQUERYIVNVPROC GLH_EXT_NAME(glGetOcclusionQueryivNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETOCCLUSIONQUERYUIVNVPROC GLH_EXT_NAME(glGetOcclusionQueryuivNV) GLH_INITIALIZER; -#endif - -#ifdef GL_NV_packed_depth_stencil -#endif - -#ifdef GL_NV_pixel_buffer_object -#endif - -#ifdef GL_NV_pixel_data_range - GLH_EXTERN PFNGLPIXELDATARANGENVPROC GLH_EXT_NAME(glPixelDataRangeNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLFLUSHPIXELDATARANGENVPROC GLH_EXT_NAME(glFlushPixelDataRangeNV) GLH_INITIALIZER; -#endif - -#ifdef GL_NV_point_sprite - GLH_EXTERN PFNGLPOINTPARAMETERINVPROC GLH_EXT_NAME(glPointParameteriNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLPOINTPARAMETERIVNVPROC GLH_EXT_NAME(glPointParameterivNV) GLH_INITIALIZER; -#endif - -#ifdef GL_NV_primitive_restart - GLH_EXTERN PFNGLPRIMITIVERESTARTNVPROC GLH_EXT_NAME(glPrimitiveRestartNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLPRIMITIVERESTARTINDEXNVPROC GLH_EXT_NAME(glPrimitiveRestartIndexNV) GLH_INITIALIZER; -#endif - -#ifdef GL_NV_register_combiners - GLH_EXTERN PFNGLCOMBINERPARAMETERFVNVPROC GLH_EXT_NAME(glCombinerParameterfvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMBINERPARAMETERFNVPROC GLH_EXT_NAME(glCombinerParameterfNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMBINERPARAMETERIVNVPROC GLH_EXT_NAME(glCombinerParameterivNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMBINERPARAMETERINVPROC GLH_EXT_NAME(glCombinerParameteriNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMBINERINPUTNVPROC GLH_EXT_NAME(glCombinerInputNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMBINEROUTPUTNVPROC GLH_EXT_NAME(glCombinerOutputNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLFINALCOMBINERINPUTNVPROC GLH_EXT_NAME(glFinalCombinerInputNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC GLH_EXT_NAME(glGetCombinerInputParameterfvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC GLH_EXT_NAME(glGetCombinerInputParameterivNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC GLH_EXT_NAME(glGetCombinerOutputParameterfvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC GLH_EXT_NAME(glGetCombinerOutputParameterivNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC GLH_EXT_NAME(glGetFinalCombinerInputParameterfvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC GLH_EXT_NAME(glGetFinalCombinerInputParameterivNV) GLH_INITIALIZER; -#endif - -#ifdef GL_NV_register_combiners2 - GLH_EXTERN PFNGLCOMBINERSTAGEPARAMETERFVNVPROC GLH_EXT_NAME(glCombinerStageParameterfvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC GLH_EXT_NAME(glGetCombinerStageParameterfvNV) GLH_INITIALIZER; -#endif - -#ifdef GL_NV_stencil_two_side - GLH_EXTERN PFNGLACTIVESTENCILFACENVPROC GLH_EXT_NAME(glActiveStencilFaceNV) GLH_INITIALIZER; -#endif - -#ifdef GL_NV_texgen_reflection -#endif - -#ifdef GL_NV_texture_compression_vtc -#endif - -#ifdef GL_NV_texture_env_combine4 -#endif - -#ifdef GL_NV_texture_expand_normal -#endif - -#ifdef GL_NV_texture_rectangle -#endif - -#ifdef GL_NV_texture_shader -#endif - -#ifdef GL_NV_texture_shader2 -#endif - -#ifdef GL_NV_texture_shader3 -#endif - -#ifdef GL_NV_vertex_array_range - GLH_EXTERN PFNGLFLUSHVERTEXARRAYRANGENVPROC GLH_EXT_NAME(glFlushVertexArrayRangeNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXARRAYRANGENVPROC GLH_EXT_NAME(glVertexArrayRangeNV) GLH_INITIALIZER; -# ifdef _WIN32 - GLH_EXTERN PFNWGLALLOCATEMEMORYNVPROC GLH_EXT_NAME(wglAllocateMemoryNV) GLH_INITIALIZER; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXTERN PFNGLXALLOCATEMEMORYNVPROC GLH_EXT_NAME(glXAllocateMemoryNV) GLH_INITIALIZER; -# endif -# ifdef _WIN32 - GLH_EXTERN PFNWGLFREEMEMORYNVPROC GLH_EXT_NAME(wglFreeMemoryNV) GLH_INITIALIZER; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXTERN PFNGLXFREEMEMORYNVPROC GLH_EXT_NAME(glXFreeMemoryNV) GLH_INITIALIZER; -# endif -#endif - -#ifdef GL_NV_vertex_array_range2 -#endif - -#ifdef GL_NV_vertex_program - GLH_EXTERN PFNGLAREPROGRAMSRESIDENTNVPROC GLH_EXT_NAME(glAreProgramsResidentNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLBINDPROGRAMNVPROC GLH_EXT_NAME(glBindProgramNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLDELETEPROGRAMSNVPROC GLH_EXT_NAME(glDeleteProgramsNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLEXECUTEPROGRAMNVPROC GLH_EXT_NAME(glExecuteProgramNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGENPROGRAMSNVPROC GLH_EXT_NAME(glGenProgramsNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETPROGRAMPARAMETERDVNVPROC GLH_EXT_NAME(glGetProgramParameterdvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETPROGRAMPARAMETERFVNVPROC GLH_EXT_NAME(glGetProgramParameterfvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETPROGRAMIVNVPROC GLH_EXT_NAME(glGetProgramivNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETPROGRAMSTRINGNVPROC GLH_EXT_NAME(glGetProgramStringNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETTRACKMATRIXIVNVPROC GLH_EXT_NAME(glGetTrackMatrixivNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETVERTEXATTRIBDVNVPROC GLH_EXT_NAME(glGetVertexAttribdvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETVERTEXATTRIBFVNVPROC GLH_EXT_NAME(glGetVertexAttribfvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETVERTEXATTRIBIVNVPROC GLH_EXT_NAME(glGetVertexAttribivNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETVERTEXATTRIBPOINTERVNVPROC GLH_EXT_NAME(glGetVertexAttribPointervNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLISPROGRAMNVPROC GLH_EXT_NAME(glIsProgramNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLLOADPROGRAMNVPROC GLH_EXT_NAME(glLoadProgramNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMPARAMETER4DNVPROC GLH_EXT_NAME(glProgramParameter4dNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMPARAMETER4DVNVPROC GLH_EXT_NAME(glProgramParameter4dvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMPARAMETER4FNVPROC GLH_EXT_NAME(glProgramParameter4fNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMPARAMETER4FVNVPROC GLH_EXT_NAME(glProgramParameter4fvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMPARAMETERS4DVNVPROC GLH_EXT_NAME(glProgramParameters4dvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMPARAMETERS4FVNVPROC GLH_EXT_NAME(glProgramParameters4fvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLREQUESTRESIDENTPROGRAMSNVPROC GLH_EXT_NAME(glRequestResidentProgramsNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLTRACKMATRIXNVPROC GLH_EXT_NAME(glTrackMatrixNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBPOINTERNVPROC GLH_EXT_NAME(glVertexAttribPointerNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB1DNVPROC GLH_EXT_NAME(glVertexAttrib1dNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB1DVNVPROC GLH_EXT_NAME(glVertexAttrib1dvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB1FNVPROC GLH_EXT_NAME(glVertexAttrib1fNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB1FVNVPROC GLH_EXT_NAME(glVertexAttrib1fvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB1SNVPROC GLH_EXT_NAME(glVertexAttrib1sNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB1SVNVPROC GLH_EXT_NAME(glVertexAttrib1svNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2DNVPROC GLH_EXT_NAME(glVertexAttrib2dNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2DVNVPROC GLH_EXT_NAME(glVertexAttrib2dvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2FNVPROC GLH_EXT_NAME(glVertexAttrib2fNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2FVNVPROC GLH_EXT_NAME(glVertexAttrib2fvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2SNVPROC GLH_EXT_NAME(glVertexAttrib2sNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2SVNVPROC GLH_EXT_NAME(glVertexAttrib2svNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3DNVPROC GLH_EXT_NAME(glVertexAttrib3dNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3DVNVPROC GLH_EXT_NAME(glVertexAttrib3dvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3FNVPROC GLH_EXT_NAME(glVertexAttrib3fNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3FVNVPROC GLH_EXT_NAME(glVertexAttrib3fvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3SNVPROC GLH_EXT_NAME(glVertexAttrib3sNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3SVNVPROC GLH_EXT_NAME(glVertexAttrib3svNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4DNVPROC GLH_EXT_NAME(glVertexAttrib4dNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4DVNVPROC GLH_EXT_NAME(glVertexAttrib4dvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4FNVPROC GLH_EXT_NAME(glVertexAttrib4fNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4FVNVPROC GLH_EXT_NAME(glVertexAttrib4fvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4SNVPROC GLH_EXT_NAME(glVertexAttrib4sNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4SVNVPROC GLH_EXT_NAME(glVertexAttrib4svNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4UBVNVPROC GLH_EXT_NAME(glVertexAttrib4ubvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS1DVNVPROC GLH_EXT_NAME(glVertexAttribs1dvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS1FVNVPROC GLH_EXT_NAME(glVertexAttribs1fvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS1SVNVPROC GLH_EXT_NAME(glVertexAttribs1svNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS2DVNVPROC GLH_EXT_NAME(glVertexAttribs2dvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS2FVNVPROC GLH_EXT_NAME(glVertexAttribs2fvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS2SVNVPROC GLH_EXT_NAME(glVertexAttribs2svNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS3DVNVPROC GLH_EXT_NAME(glVertexAttribs3dvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS3FVNVPROC GLH_EXT_NAME(glVertexAttribs3fvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS3SVNVPROC GLH_EXT_NAME(glVertexAttribs3svNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS4DVNVPROC GLH_EXT_NAME(glVertexAttribs4dvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS4FVNVPROC GLH_EXT_NAME(glVertexAttribs4fvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS4SVNVPROC GLH_EXT_NAME(glVertexAttribs4svNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS4UBVNVPROC GLH_EXT_NAME(glVertexAttribs4ubvNV) GLH_INITIALIZER; -#endif - -#ifdef GL_NV_vertex_program1_1 -#endif - -#ifdef GL_NV_vertex_program2 -#endif - -#ifdef GL_NV_vertex_program2_option -#endif - -#ifdef GL_NV_vertex_program3 -#endif - -#ifdef GL_SGIS_generate_mipmap -#endif - -#ifdef GL_SGIS_texture_lod -#endif - -#ifdef GL_SGIX_depth_texture -#endif - -#ifdef GL_SGIX_shadow -#endif - -#ifdef GL_WIN_swap_hint - GLH_EXTERN PFNGLADDSWAPHINTRECTWINPROC GLH_EXT_NAME(glAddSwapHintRectWIN) GLH_INITIALIZER; -#endif - -#ifdef WGL_ARB_buffer_region -# ifdef _WIN32 - GLH_EXTERN PFNWGLCREATEBUFFERREGIONARBPROC GLH_EXT_NAME(wglCreateBufferRegionARB) GLH_INITIALIZER; -# endif -# ifdef _WIN32 - GLH_EXTERN PFNWGLDELETEBUFFERREGIONARBPROC GLH_EXT_NAME(wglDeleteBufferRegionARB) GLH_INITIALIZER; -# endif -# ifdef _WIN32 - GLH_EXTERN PFNWGLSAVEBUFFERREGIONARBPROC GLH_EXT_NAME(wglSaveBufferRegionARB) GLH_INITIALIZER; -# endif -# ifdef _WIN32 - GLH_EXTERN PFNWGLRESTOREBUFFERREGIONARBPROC GLH_EXT_NAME(wglRestoreBufferRegionARB) GLH_INITIALIZER; -# endif -#endif - -#ifdef WGL_ARB_extensions_string -# ifdef _WIN32 - GLH_EXTERN PFNWGLGETEXTENSIONSSTRINGARBPROC GLH_EXT_NAME(wglGetExtensionsStringARB) GLH_INITIALIZER; -# endif -#endif - -#ifdef WGL_ARB_pbuffer -# ifdef _WIN32 - GLH_EXTERN PFNWGLCREATEPBUFFERARBPROC GLH_EXT_NAME(wglCreatePbufferARB) GLH_INITIALIZER; -# endif -# ifdef _WIN32 - GLH_EXTERN PFNWGLGETPBUFFERDCARBPROC GLH_EXT_NAME(wglGetPbufferDCARB) GLH_INITIALIZER; -# endif -# ifdef _WIN32 - GLH_EXTERN PFNWGLRELEASEPBUFFERDCARBPROC GLH_EXT_NAME(wglReleasePbufferDCARB) GLH_INITIALIZER; -# endif -# ifdef _WIN32 - GLH_EXTERN PFNWGLDESTROYPBUFFERARBPROC GLH_EXT_NAME(wglDestroyPbufferARB) GLH_INITIALIZER; -# endif -# ifdef _WIN32 - GLH_EXTERN PFNWGLQUERYPBUFFERARBPROC GLH_EXT_NAME(wglQueryPbufferARB) GLH_INITIALIZER; -# endif -#endif - -#ifdef WGL_ARB_pixel_format -# ifdef _WIN32 - GLH_EXTERN PFNWGLGETPIXELFORMATATTRIBIVARBPROC GLH_EXT_NAME(wglGetPixelFormatAttribivARB) GLH_INITIALIZER; -# endif -# ifdef _WIN32 - GLH_EXTERN PFNWGLGETPIXELFORMATATTRIBFVARBPROC GLH_EXT_NAME(wglGetPixelFormatAttribfvARB) GLH_INITIALIZER; -# endif -# ifdef _WIN32 - GLH_EXTERN PFNWGLCHOOSEPIXELFORMATARBPROC GLH_EXT_NAME(wglChoosePixelFormatARB) GLH_INITIALIZER; -# endif -#endif - -#ifdef WGL_ARB_render_texture -# ifdef _WIN32 - GLH_EXTERN PFNWGLBINDTEXIMAGEARBPROC GLH_EXT_NAME(wglBindTexImageARB) GLH_INITIALIZER; -# endif -# ifdef _WIN32 - GLH_EXTERN PFNWGLRELEASETEXIMAGEARBPROC GLH_EXT_NAME(wglReleaseTexImageARB) GLH_INITIALIZER; -# endif -# ifdef _WIN32 - GLH_EXTERN PFNWGLSETPBUFFERATTRIBARBPROC GLH_EXT_NAME(wglSetPbufferAttribARB) GLH_INITIALIZER; -# endif -#endif - -#ifdef WGL_ATI_pixel_format_float -#endif - -#ifdef WGL_EXT_extensions_string -# ifdef _WIN32 - GLH_EXTERN PFNWGLGETEXTENSIONSSTRINGEXTPROC GLH_EXT_NAME(wglGetExtensionsStringEXT) GLH_INITIALIZER; -# endif -#endif - -#ifdef WGL_EXT_swap_control -# ifdef _WIN32 - GLH_EXTERN PFNWGLSWAPINTERVALEXTPROC GLH_EXT_NAME(wglSwapIntervalEXT) GLH_INITIALIZER; -# endif -# ifdef _WIN32 - GLH_EXTERN PFNWGLGETSWAPINTERVALEXTPROC GLH_EXT_NAME(wglGetSwapIntervalEXT) GLH_INITIALIZER; -# endif -#endif - -#ifdef WGL_NV_float_buffer -#endif - -#ifdef WGL_NV_render_depth_texture -#endif - -#ifdef WGL_NV_render_texture_rectangle -#endif - -#ifdef GLX_NV_float_buffer -#endif - -#ifdef GL_NVX_conditional_render - GLH_EXTERN PFNGLBEGINCONDITIONALRENDERNVXPROC GLH_EXT_NAME(glBeginConditionalRenderNVX) GLH_INITIALIZER; - GLH_EXTERN PFNGLENDCONDITIONALRENDERNVXPROC GLH_EXT_NAME(glEndConditionalRenderNVX) GLH_INITIALIZER; -#endif - -#ifdef GLX_SGIX_pbuffer -# ifdef GLX_VERSION_1_3 - GLH_EXTERN PFNGLXCREATEGLXPBUFFERSGIXPROC GLH_EXT_NAME(glXCreateGLXPbufferSGIX) GLH_INITIALIZER; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXTERN PFNGLXDESTROYGLXPBUFFERSGIXPROC GLH_EXT_NAME(glXDestroyGLXPbufferSGIX) GLH_INITIALIZER; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXTERN PFNGLXQUERYGLXPBUFFERSGIXPROC GLH_EXT_NAME(glXQueryGLXPbufferSGIX) GLH_INITIALIZER; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXTERN PFNGLXSELECTEVENTSGIXPROC GLH_EXT_NAME(glXSelectEventSGIX) GLH_INITIALIZER; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXTERN PFNGLXGETSELECTEDEVENTSGIXPROC GLH_EXT_NAME(glXGetSelectedEventSGIX) GLH_INITIALIZER; -# endif -#endif - -#ifdef GLX_SGIX_fbconfig -# ifdef GLX_VERSION_1_3 - GLH_EXTERN PFNGLXGETFBCONFIGATTRIBSGIXPROC GLH_EXT_NAME(glXGetFBConfigAttribSGIX) GLH_INITIALIZER; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXTERN PFNGLXCHOOSEFBCONFIGSGIXPROC GLH_EXT_NAME(glXChooseFBConfigSGIX) GLH_INITIALIZER; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXTERN PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC GLH_EXT_NAME(glXCreateGLXPixmapWithConfigSGIX) GLH_INITIALIZER; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXTERN PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC GLH_EXT_NAME(glXCreateContextWithConfigSGIX) GLH_INITIALIZER; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXTERN PFNGLXGETVISUALFROMFBCONFIGSGIXPROC GLH_EXT_NAME(glXGetVisualFromFBConfigSGIX) GLH_INITIALIZER; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXTERN PFNGLXGETFBCONFIGFROMVISUALSGIXPROC GLH_EXT_NAME(glXGetFBConfigFromVisualSGIX) GLH_INITIALIZER; -# endif -#endif - - -#ifdef GLH_EXT_SINGLE_FILE - -int glh_init_extension(const char* extension) -{ - if (NULL == extension) - return GL_FALSE; - -#ifndef _WIN32 - if (0 == strcmp(extension, "GL_VERSION_1_2") || 0 == strcmp(extension, "GL_VERSION_1_3") || 0 == strcmp(extension, "GL_VERSION_1_4") || 0 == strcmp(extension, "GL_VERSION_1_5")) - return GL_TRUE; -#endif - -#ifdef _WIN32 -#if defined(GL_VERSION_1_2) || defined(GL_VERSION_1_3) || defined(GL_VERSION_1_4) || defined(GL_VERSION_1_5) - if (0 == strcmp(extension, "GL_VERSION_1_2")) { - GLH_CORE_NAME(glBlendColor) = (PFNGLBLENDCOLORPROC)GLH_EXT_GET_PROC_ADDRESS("glBlendColor"); - if (NULL == GLH_CORE_NAME(glBlendColor)) - return GL_FALSE; - GLH_CORE_NAME(glBlendEquation) = (PFNGLBLENDEQUATIONPROC)GLH_EXT_GET_PROC_ADDRESS("glBlendEquation"); - if (NULL == GLH_CORE_NAME(glBlendEquation)) - return GL_FALSE; - GLH_CORE_NAME(glDrawRangeElements) = (PFNGLDRAWRANGEELEMENTSPROC)GLH_EXT_GET_PROC_ADDRESS("glDrawRangeElements"); - if (NULL == GLH_CORE_NAME(glDrawRangeElements)) - return GL_FALSE; - GLH_CORE_NAME(glTexImage3D) = (PFNGLTEXIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glTexImage3D"); - if (NULL == GLH_CORE_NAME(glTexImage3D)) - return GL_FALSE; - GLH_CORE_NAME(glTexSubImage3D) = (PFNGLTEXSUBIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glTexSubImage3D"); - if (NULL == GLH_CORE_NAME(glTexSubImage3D)) - return GL_FALSE; - GLH_CORE_NAME(glCopyTexSubImage3D) = (PFNGLCOPYTEXSUBIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glCopyTexSubImage3D"); - if (NULL == GLH_CORE_NAME(glCopyTexSubImage3D)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1d) = (PFNGLMULTITEXCOORD1DPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1d"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1d)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1dv) = (PFNGLMULTITEXCOORD1DVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1dv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1dv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1f) = (PFNGLMULTITEXCOORD1FPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1f"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1f)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1fv) = (PFNGLMULTITEXCOORD1FVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1fv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1fv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1i) = (PFNGLMULTITEXCOORD1IPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1i"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1i)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1iv) = (PFNGLMULTITEXCOORD1IVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1iv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1iv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1s) = (PFNGLMULTITEXCOORD1SPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1s"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1s)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1sv) = (PFNGLMULTITEXCOORD1SVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1sv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1sv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2d) = (PFNGLMULTITEXCOORD2DPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2d"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2d)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2dv) = (PFNGLMULTITEXCOORD2DVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2dv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2dv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2f) = (PFNGLMULTITEXCOORD2FPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2f"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2f)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2fv) = (PFNGLMULTITEXCOORD2FVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2fv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2fv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2i) = (PFNGLMULTITEXCOORD2IPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2i"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2i)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2iv) = (PFNGLMULTITEXCOORD2IVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2iv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2iv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2s) = (PFNGLMULTITEXCOORD2SPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2s"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2s)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2sv) = (PFNGLMULTITEXCOORD2SVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2sv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2sv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3d) = (PFNGLMULTITEXCOORD3DPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3d"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3d)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3dv) = (PFNGLMULTITEXCOORD3DVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3dv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3dv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3f) = (PFNGLMULTITEXCOORD3FPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3f"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3f)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3fv) = (PFNGLMULTITEXCOORD3FVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3fv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3fv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3i) = (PFNGLMULTITEXCOORD3IPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3i"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3i)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3iv) = (PFNGLMULTITEXCOORD3IVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3iv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3iv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3s) = (PFNGLMULTITEXCOORD3SPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3s"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3s)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3sv) = (PFNGLMULTITEXCOORD3SVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3sv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3sv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4d) = (PFNGLMULTITEXCOORD4DPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4d"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4d)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4dv) = (PFNGLMULTITEXCOORD4DVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4dv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4dv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4f) = (PFNGLMULTITEXCOORD4FPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4f"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4f)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4fv) = (PFNGLMULTITEXCOORD4FVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4fv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4fv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4i) = (PFNGLMULTITEXCOORD4IPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4i"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4i)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4iv) = (PFNGLMULTITEXCOORD4IVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4iv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4iv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4s) = (PFNGLMULTITEXCOORD4SPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4s"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4s)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4sv) = (PFNGLMULTITEXCOORD4SVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4sv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4sv)) - return GL_FALSE; - GLH_CORE_NAME(glActiveTexture) = (PFNGLACTIVETEXTUREPROC)GLH_EXT_GET_PROC_ADDRESS("glActiveTexture"); - if (NULL == GLH_CORE_NAME(glActiveTexture)) - return GL_FALSE; - GLH_CORE_NAME(glClientActiveTexture) = (PFNGLCLIENTACTIVETEXTUREPROC)GLH_EXT_GET_PROC_ADDRESS("glClientActiveTexture"); - if (NULL == GLH_CORE_NAME(glClientActiveTexture)) - return GL_FALSE; - - return GL_TRUE; - } -#endif -#endif - -#ifdef _WIN32 -#if defined(GL_VERSION_1_3) || defined(GL_VERSION_1_4) || defined(GL_VERSION_1_5) - if (0 == strcmp(extension, "GL_VERSION_1_3")) { - GLH_CORE_NAME(glBlendColor) = (PFNGLBLENDCOLORPROC)GLH_EXT_GET_PROC_ADDRESS("glBlendColor"); - if (NULL == GLH_CORE_NAME(glBlendColor)) - return GL_FALSE; - GLH_CORE_NAME(glBlendEquation) = (PFNGLBLENDEQUATIONPROC)GLH_EXT_GET_PROC_ADDRESS("glBlendEquation"); - if (NULL == GLH_CORE_NAME(glBlendEquation)) - return GL_FALSE; - GLH_CORE_NAME(glDrawRangeElements) = (PFNGLDRAWRANGEELEMENTSPROC)GLH_EXT_GET_PROC_ADDRESS("glDrawRangeElements"); - if (NULL == GLH_CORE_NAME(glDrawRangeElements)) - return GL_FALSE; - GLH_CORE_NAME(glTexImage3D) = (PFNGLTEXIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glTexImage3D"); - if (NULL == GLH_CORE_NAME(glTexImage3D)) - return GL_FALSE; - GLH_CORE_NAME(glTexSubImage3D) = (PFNGLTEXSUBIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glTexSubImage3D"); - if (NULL == GLH_CORE_NAME(glTexSubImage3D)) - return GL_FALSE; - GLH_CORE_NAME(glCopyTexSubImage3D) = (PFNGLCOPYTEXSUBIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glCopyTexSubImage3D"); - if (NULL == GLH_CORE_NAME(glCopyTexSubImage3D)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1d) = (PFNGLMULTITEXCOORD1DPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1d"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1d)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1dv) = (PFNGLMULTITEXCOORD1DVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1dv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1dv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1f) = (PFNGLMULTITEXCOORD1FPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1f"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1f)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1fv) = (PFNGLMULTITEXCOORD1FVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1fv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1fv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1i) = (PFNGLMULTITEXCOORD1IPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1i"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1i)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1iv) = (PFNGLMULTITEXCOORD1IVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1iv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1iv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1s) = (PFNGLMULTITEXCOORD1SPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1s"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1s)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1sv) = (PFNGLMULTITEXCOORD1SVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1sv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1sv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2d) = (PFNGLMULTITEXCOORD2DPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2d"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2d)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2dv) = (PFNGLMULTITEXCOORD2DVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2dv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2dv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2f) = (PFNGLMULTITEXCOORD2FPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2f"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2f)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2fv) = (PFNGLMULTITEXCOORD2FVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2fv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2fv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2i) = (PFNGLMULTITEXCOORD2IPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2i"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2i)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2iv) = (PFNGLMULTITEXCOORD2IVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2iv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2iv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2s) = (PFNGLMULTITEXCOORD2SPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2s"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2s)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2sv) = (PFNGLMULTITEXCOORD2SVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2sv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2sv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3d) = (PFNGLMULTITEXCOORD3DPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3d"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3d)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3dv) = (PFNGLMULTITEXCOORD3DVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3dv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3dv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3f) = (PFNGLMULTITEXCOORD3FPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3f"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3f)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3fv) = (PFNGLMULTITEXCOORD3FVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3fv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3fv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3i) = (PFNGLMULTITEXCOORD3IPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3i"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3i)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3iv) = (PFNGLMULTITEXCOORD3IVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3iv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3iv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3s) = (PFNGLMULTITEXCOORD3SPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3s"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3s)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3sv) = (PFNGLMULTITEXCOORD3SVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3sv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3sv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4d) = (PFNGLMULTITEXCOORD4DPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4d"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4d)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4dv) = (PFNGLMULTITEXCOORD4DVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4dv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4dv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4f) = (PFNGLMULTITEXCOORD4FPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4f"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4f)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4fv) = (PFNGLMULTITEXCOORD4FVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4fv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4fv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4i) = (PFNGLMULTITEXCOORD4IPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4i"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4i)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4iv) = (PFNGLMULTITEXCOORD4IVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4iv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4iv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4s) = (PFNGLMULTITEXCOORD4SPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4s"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4s)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4sv) = (PFNGLMULTITEXCOORD4SVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4sv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4sv)) - return GL_FALSE; - GLH_CORE_NAME(glActiveTexture) = (PFNGLACTIVETEXTUREPROC)GLH_EXT_GET_PROC_ADDRESS("glActiveTexture"); - if (NULL == GLH_CORE_NAME(glActiveTexture)) - return GL_FALSE; - GLH_CORE_NAME(glClientActiveTexture) = (PFNGLCLIENTACTIVETEXTUREPROC)GLH_EXT_GET_PROC_ADDRESS("glClientActiveTexture"); - if (NULL == GLH_CORE_NAME(glClientActiveTexture)) - return GL_FALSE; - GLH_CORE_NAME(glCompressedTexImage3D) = (PFNGLCOMPRESSEDTEXIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexImage3D"); - if (NULL == GLH_CORE_NAME(glCompressedTexImage3D)) - return GL_FALSE; - GLH_CORE_NAME(glCompressedTexImage2D) = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexImage2D"); - if (NULL == GLH_CORE_NAME(glCompressedTexImage2D)) - return GL_FALSE; - GLH_CORE_NAME(glCompressedTexImage1D) = (PFNGLCOMPRESSEDTEXIMAGE1DPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexImage1D"); - if (NULL == GLH_CORE_NAME(glCompressedTexImage1D)) - return GL_FALSE; - GLH_CORE_NAME(glCompressedTexSubImage3D) = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexSubImage3D"); - if (NULL == GLH_CORE_NAME(glCompressedTexSubImage3D)) - return GL_FALSE; - GLH_CORE_NAME(glCompressedTexSubImage2D) = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexSubImage2D"); - if (NULL == GLH_CORE_NAME(glCompressedTexSubImage2D)) - return GL_FALSE; - GLH_CORE_NAME(glCompressedTexSubImage1D) = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexSubImage1D"); - if (NULL == GLH_CORE_NAME(glCompressedTexSubImage1D)) - return GL_FALSE; - GLH_CORE_NAME(glGetCompressedTexImage) = (PFNGLGETCOMPRESSEDTEXIMAGEPROC)GLH_EXT_GET_PROC_ADDRESS("glGetCompressedTexImage"); - if (NULL == GLH_CORE_NAME(glGetCompressedTexImage)) - return GL_FALSE; - GLH_CORE_NAME(glSampleCoverage) = (PFNGLSAMPLECOVERAGEPROC)GLH_EXT_GET_PROC_ADDRESS("glSampleCoverage"); - if (NULL == GLH_CORE_NAME(glSampleCoverage)) - return GL_FALSE; - GLH_CORE_NAME(glLoadTransposeMatrixf) = (PFNGLLOADTRANSPOSEMATRIXFPROC)GLH_EXT_GET_PROC_ADDRESS("glLoadTransposeMatrixf"); - if (NULL == GLH_CORE_NAME(glLoadTransposeMatrixf)) - return GL_FALSE; - GLH_CORE_NAME(glLoadTransposeMatrixd) = (PFNGLLOADTRANSPOSEMATRIXDPROC)GLH_EXT_GET_PROC_ADDRESS("glLoadTransposeMatrixd"); - if (NULL == GLH_CORE_NAME(glLoadTransposeMatrixd)) - return GL_FALSE; - GLH_CORE_NAME(glMultTransposeMatrixf) = (PFNGLMULTTRANSPOSEMATRIXFPROC)GLH_EXT_GET_PROC_ADDRESS("glMultTransposeMatrixf"); - if (NULL == GLH_CORE_NAME(glMultTransposeMatrixf)) - return GL_FALSE; - GLH_CORE_NAME(glMultTransposeMatrixd) = (PFNGLMULTTRANSPOSEMATRIXDPROC)GLH_EXT_GET_PROC_ADDRESS("glMultTransposeMatrixd"); - if (NULL == GLH_CORE_NAME(glMultTransposeMatrixd)) - return GL_FALSE; - - return GL_TRUE; - } -#endif -#endif - -#ifdef _WIN32 -#if defined(GL_VERSION_1_4) || defined(GL_VERSION_1_5) - if (0 == strcmp(extension, "GL_VERSION_1_4")) { - GLH_CORE_NAME(glBlendColor) = (PFNGLBLENDCOLORPROC)GLH_EXT_GET_PROC_ADDRESS("glBlendColor"); - if (NULL == GLH_CORE_NAME(glBlendColor)) - return GL_FALSE; - GLH_CORE_NAME(glBlendEquation) = (PFNGLBLENDEQUATIONPROC)GLH_EXT_GET_PROC_ADDRESS("glBlendEquation"); - if (NULL == GLH_CORE_NAME(glBlendEquation)) - return GL_FALSE; - GLH_CORE_NAME(glDrawRangeElements) = (PFNGLDRAWRANGEELEMENTSPROC)GLH_EXT_GET_PROC_ADDRESS("glDrawRangeElements"); - if (NULL == GLH_CORE_NAME(glDrawRangeElements)) - return GL_FALSE; - GLH_CORE_NAME(glTexImage3D) = (PFNGLTEXIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glTexImage3D"); - if (NULL == GLH_CORE_NAME(glTexImage3D)) - return GL_FALSE; - GLH_CORE_NAME(glTexSubImage3D) = (PFNGLTEXSUBIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glTexSubImage3D"); - if (NULL == GLH_CORE_NAME(glTexSubImage3D)) - return GL_FALSE; - GLH_CORE_NAME(glCopyTexSubImage3D) = (PFNGLCOPYTEXSUBIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glCopyTexSubImage3D"); - if (NULL == GLH_CORE_NAME(glCopyTexSubImage3D)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1d) = (PFNGLMULTITEXCOORD1DPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1d"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1d)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1dv) = (PFNGLMULTITEXCOORD1DVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1dv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1dv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1f) = (PFNGLMULTITEXCOORD1FPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1f"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1f)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1fv) = (PFNGLMULTITEXCOORD1FVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1fv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1fv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1i) = (PFNGLMULTITEXCOORD1IPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1i"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1i)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1iv) = (PFNGLMULTITEXCOORD1IVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1iv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1iv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1s) = (PFNGLMULTITEXCOORD1SPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1s"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1s)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1sv) = (PFNGLMULTITEXCOORD1SVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1sv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1sv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2d) = (PFNGLMULTITEXCOORD2DPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2d"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2d)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2dv) = (PFNGLMULTITEXCOORD2DVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2dv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2dv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2f) = (PFNGLMULTITEXCOORD2FPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2f"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2f)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2fv) = (PFNGLMULTITEXCOORD2FVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2fv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2fv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2i) = (PFNGLMULTITEXCOORD2IPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2i"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2i)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2iv) = (PFNGLMULTITEXCOORD2IVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2iv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2iv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2s) = (PFNGLMULTITEXCOORD2SPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2s"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2s)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2sv) = (PFNGLMULTITEXCOORD2SVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2sv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2sv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3d) = (PFNGLMULTITEXCOORD3DPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3d"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3d)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3dv) = (PFNGLMULTITEXCOORD3DVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3dv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3dv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3f) = (PFNGLMULTITEXCOORD3FPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3f"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3f)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3fv) = (PFNGLMULTITEXCOORD3FVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3fv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3fv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3i) = (PFNGLMULTITEXCOORD3IPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3i"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3i)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3iv) = (PFNGLMULTITEXCOORD3IVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3iv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3iv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3s) = (PFNGLMULTITEXCOORD3SPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3s"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3s)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3sv) = (PFNGLMULTITEXCOORD3SVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3sv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3sv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4d) = (PFNGLMULTITEXCOORD4DPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4d"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4d)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4dv) = (PFNGLMULTITEXCOORD4DVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4dv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4dv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4f) = (PFNGLMULTITEXCOORD4FPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4f"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4f)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4fv) = (PFNGLMULTITEXCOORD4FVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4fv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4fv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4i) = (PFNGLMULTITEXCOORD4IPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4i"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4i)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4iv) = (PFNGLMULTITEXCOORD4IVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4iv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4iv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4s) = (PFNGLMULTITEXCOORD4SPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4s"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4s)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4sv) = (PFNGLMULTITEXCOORD4SVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4sv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4sv)) - return GL_FALSE; - GLH_CORE_NAME(glActiveTexture) = (PFNGLACTIVETEXTUREPROC)GLH_EXT_GET_PROC_ADDRESS("glActiveTexture"); - if (NULL == GLH_CORE_NAME(glActiveTexture)) - return GL_FALSE; - GLH_CORE_NAME(glClientActiveTexture) = (PFNGLCLIENTACTIVETEXTUREPROC)GLH_EXT_GET_PROC_ADDRESS("glClientActiveTexture"); - if (NULL == GLH_CORE_NAME(glClientActiveTexture)) - return GL_FALSE; - GLH_CORE_NAME(glCompressedTexImage3D) = (PFNGLCOMPRESSEDTEXIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexImage3D"); - if (NULL == GLH_CORE_NAME(glCompressedTexImage3D)) - return GL_FALSE; - GLH_CORE_NAME(glCompressedTexImage2D) = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexImage2D"); - if (NULL == GLH_CORE_NAME(glCompressedTexImage2D)) - return GL_FALSE; - GLH_CORE_NAME(glCompressedTexImage1D) = (PFNGLCOMPRESSEDTEXIMAGE1DPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexImage1D"); - if (NULL == GLH_CORE_NAME(glCompressedTexImage1D)) - return GL_FALSE; - GLH_CORE_NAME(glCompressedTexSubImage3D) = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexSubImage3D"); - if (NULL == GLH_CORE_NAME(glCompressedTexSubImage3D)) - return GL_FALSE; - GLH_CORE_NAME(glCompressedTexSubImage2D) = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexSubImage2D"); - if (NULL == GLH_CORE_NAME(glCompressedTexSubImage2D)) - return GL_FALSE; - GLH_CORE_NAME(glCompressedTexSubImage1D) = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexSubImage1D"); - if (NULL == GLH_CORE_NAME(glCompressedTexSubImage1D)) - return GL_FALSE; - GLH_CORE_NAME(glGetCompressedTexImage) = (PFNGLGETCOMPRESSEDTEXIMAGEPROC)GLH_EXT_GET_PROC_ADDRESS("glGetCompressedTexImage"); - if (NULL == GLH_CORE_NAME(glGetCompressedTexImage)) - return GL_FALSE; - GLH_CORE_NAME(glSampleCoverage) = (PFNGLSAMPLECOVERAGEPROC)GLH_EXT_GET_PROC_ADDRESS("glSampleCoverage"); - if (NULL == GLH_CORE_NAME(glSampleCoverage)) - return GL_FALSE; - GLH_CORE_NAME(glLoadTransposeMatrixf) = (PFNGLLOADTRANSPOSEMATRIXFPROC)GLH_EXT_GET_PROC_ADDRESS("glLoadTransposeMatrixf"); - if (NULL == GLH_CORE_NAME(glLoadTransposeMatrixf)) - return GL_FALSE; - GLH_CORE_NAME(glLoadTransposeMatrixd) = (PFNGLLOADTRANSPOSEMATRIXDPROC)GLH_EXT_GET_PROC_ADDRESS("glLoadTransposeMatrixd"); - if (NULL == GLH_CORE_NAME(glLoadTransposeMatrixd)) - return GL_FALSE; - GLH_CORE_NAME(glMultTransposeMatrixf) = (PFNGLMULTTRANSPOSEMATRIXFPROC)GLH_EXT_GET_PROC_ADDRESS("glMultTransposeMatrixf"); - if (NULL == GLH_CORE_NAME(glMultTransposeMatrixf)) - return GL_FALSE; - GLH_CORE_NAME(glMultTransposeMatrixd) = (PFNGLMULTTRANSPOSEMATRIXDPROC)GLH_EXT_GET_PROC_ADDRESS("glMultTransposeMatrixd"); - if (NULL == GLH_CORE_NAME(glMultTransposeMatrixd)) - return GL_FALSE; - GLH_CORE_NAME(glMultiDrawArrays) = (PFNGLMULTIDRAWARRAYSPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiDrawArrays"); - if (NULL == GLH_CORE_NAME(glMultiDrawArrays)) - return GL_FALSE; - GLH_CORE_NAME(glMultiDrawElements) = (PFNGLMULTIDRAWELEMENTSPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiDrawElements"); - if (NULL == GLH_CORE_NAME(glMultiDrawElements)) - return GL_FALSE; - GLH_CORE_NAME(glPointParameterf) = (PFNGLPOINTPARAMETERFPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameterf"); - if (NULL == GLH_CORE_NAME(glPointParameterf)) - return GL_FALSE; - GLH_CORE_NAME(glPointParameterfv) = (PFNGLPOINTPARAMETERFVPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameterfv"); - if (NULL == GLH_CORE_NAME(glPointParameterfv)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3b) = (PFNGLSECONDARYCOLOR3BPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3b"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3b)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3bv) = (PFNGLSECONDARYCOLOR3BVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3bv"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3bv)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3d) = (PFNGLSECONDARYCOLOR3DPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3d"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3d)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3dv) = (PFNGLSECONDARYCOLOR3DVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3dv"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3dv)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3f) = (PFNGLSECONDARYCOLOR3FPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3f"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3f)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3fv) = (PFNGLSECONDARYCOLOR3FVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3fv"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3fv)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3i) = (PFNGLSECONDARYCOLOR3IPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3i"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3i)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3iv) = (PFNGLSECONDARYCOLOR3IVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3iv"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3iv)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3s) = (PFNGLSECONDARYCOLOR3SPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3s"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3s)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3sv) = (PFNGLSECONDARYCOLOR3SVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3sv"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3sv)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3ub) = (PFNGLSECONDARYCOLOR3UBPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3ub"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3ub)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3ubv) = (PFNGLSECONDARYCOLOR3UBVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3ubv"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3ubv)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3ui) = (PFNGLSECONDARYCOLOR3UIPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3ui"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3ui)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3uiv) = (PFNGLSECONDARYCOLOR3UIVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3uiv"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3uiv)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3us) = (PFNGLSECONDARYCOLOR3USPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3us"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3us)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3usv) = (PFNGLSECONDARYCOLOR3USVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3usv"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3usv)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColorPointer) = (PFNGLSECONDARYCOLORPOINTERPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColorPointer"); - if (NULL == GLH_CORE_NAME(glSecondaryColorPointer)) - return GL_FALSE; - GLH_CORE_NAME(glBlendFuncSeparate) = (PFNGLBLENDFUNCSEPARATEPROC)GLH_EXT_GET_PROC_ADDRESS("glBlendFuncSeparate"); - if (NULL == GLH_CORE_NAME(glBlendFuncSeparate)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos2d) = (PFNGLWINDOWPOS2DPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2d"); - if (NULL == GLH_CORE_NAME(glWindowPos2d)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos2f) = (PFNGLWINDOWPOS2FPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2f"); - if (NULL == GLH_CORE_NAME(glWindowPos2f)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos2i) = (PFNGLWINDOWPOS2IPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2i"); - if (NULL == GLH_CORE_NAME(glWindowPos2i)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos2s) = (PFNGLWINDOWPOS2SPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2s"); - if (NULL == GLH_CORE_NAME(glWindowPos2s)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos2dv) = (PFNGLWINDOWPOS2DVPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2dv"); - if (NULL == GLH_CORE_NAME(glWindowPos2dv)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos2fv) = (PFNGLWINDOWPOS2FVPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2fv"); - if (NULL == GLH_CORE_NAME(glWindowPos2fv)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos2iv) = (PFNGLWINDOWPOS2IVPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2iv"); - if (NULL == GLH_CORE_NAME(glWindowPos2iv)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos2sv) = (PFNGLWINDOWPOS2SVPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2sv"); - if (NULL == GLH_CORE_NAME(glWindowPos2sv)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos3d) = (PFNGLWINDOWPOS3DPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3d"); - if (NULL == GLH_CORE_NAME(glWindowPos3d)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos3f) = (PFNGLWINDOWPOS3FPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3f"); - if (NULL == GLH_CORE_NAME(glWindowPos3f)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos3i) = (PFNGLWINDOWPOS3IPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3i"); - if (NULL == GLH_CORE_NAME(glWindowPos3i)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos3s) = (PFNGLWINDOWPOS3SPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3s"); - if (NULL == GLH_CORE_NAME(glWindowPos3s)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos3dv) = (PFNGLWINDOWPOS3DVPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3dv"); - if (NULL == GLH_CORE_NAME(glWindowPos3dv)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos3fv) = (PFNGLWINDOWPOS3FVPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3fv"); - if (NULL == GLH_CORE_NAME(glWindowPos3fv)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos3iv) = (PFNGLWINDOWPOS3IVPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3iv"); - if (NULL == GLH_CORE_NAME(glWindowPos3iv)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos3sv) = (PFNGLWINDOWPOS3SVPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3sv"); - if (NULL == GLH_CORE_NAME(glWindowPos3sv)) - return GL_FALSE; - - return GL_TRUE; - } -#endif -#endif - -#ifdef _WIN32 -#if defined(GL_VERSION_1_5) - if (0 == strcmp(extension, "GL_VERSION_1_5")) { - GLH_CORE_NAME(glBlendColor) = (PFNGLBLENDCOLORPROC)GLH_EXT_GET_PROC_ADDRESS("glBlendColor"); - if (NULL == GLH_CORE_NAME(glBlendColor)) - return GL_FALSE; - GLH_CORE_NAME(glBlendEquation) = (PFNGLBLENDEQUATIONPROC)GLH_EXT_GET_PROC_ADDRESS("glBlendEquation"); - if (NULL == GLH_CORE_NAME(glBlendEquation)) - return GL_FALSE; - GLH_CORE_NAME(glDrawRangeElements) = (PFNGLDRAWRANGEELEMENTSPROC)GLH_EXT_GET_PROC_ADDRESS("glDrawRangeElements"); - if (NULL == GLH_CORE_NAME(glDrawRangeElements)) - return GL_FALSE; - GLH_CORE_NAME(glTexImage3D) = (PFNGLTEXIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glTexImage3D"); - if (NULL == GLH_CORE_NAME(glTexImage3D)) - return GL_FALSE; - GLH_CORE_NAME(glTexSubImage3D) = (PFNGLTEXSUBIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glTexSubImage3D"); - if (NULL == GLH_CORE_NAME(glTexSubImage3D)) - return GL_FALSE; - GLH_CORE_NAME(glCopyTexSubImage3D) = (PFNGLCOPYTEXSUBIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glCopyTexSubImage3D"); - if (NULL == GLH_CORE_NAME(glCopyTexSubImage3D)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1d) = (PFNGLMULTITEXCOORD1DPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1d"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1d)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1dv) = (PFNGLMULTITEXCOORD1DVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1dv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1dv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1f) = (PFNGLMULTITEXCOORD1FPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1f"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1f)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1fv) = (PFNGLMULTITEXCOORD1FVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1fv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1fv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1i) = (PFNGLMULTITEXCOORD1IPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1i"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1i)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1iv) = (PFNGLMULTITEXCOORD1IVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1iv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1iv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1s) = (PFNGLMULTITEXCOORD1SPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1s"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1s)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord1sv) = (PFNGLMULTITEXCOORD1SVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1sv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord1sv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2d) = (PFNGLMULTITEXCOORD2DPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2d"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2d)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2dv) = (PFNGLMULTITEXCOORD2DVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2dv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2dv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2f) = (PFNGLMULTITEXCOORD2FPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2f"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2f)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2fv) = (PFNGLMULTITEXCOORD2FVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2fv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2fv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2i) = (PFNGLMULTITEXCOORD2IPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2i"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2i)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2iv) = (PFNGLMULTITEXCOORD2IVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2iv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2iv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2s) = (PFNGLMULTITEXCOORD2SPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2s"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2s)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord2sv) = (PFNGLMULTITEXCOORD2SVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2sv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord2sv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3d) = (PFNGLMULTITEXCOORD3DPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3d"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3d)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3dv) = (PFNGLMULTITEXCOORD3DVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3dv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3dv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3f) = (PFNGLMULTITEXCOORD3FPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3f"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3f)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3fv) = (PFNGLMULTITEXCOORD3FVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3fv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3fv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3i) = (PFNGLMULTITEXCOORD3IPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3i"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3i)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3iv) = (PFNGLMULTITEXCOORD3IVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3iv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3iv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3s) = (PFNGLMULTITEXCOORD3SPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3s"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3s)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord3sv) = (PFNGLMULTITEXCOORD3SVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3sv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord3sv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4d) = (PFNGLMULTITEXCOORD4DPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4d"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4d)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4dv) = (PFNGLMULTITEXCOORD4DVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4dv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4dv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4f) = (PFNGLMULTITEXCOORD4FPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4f"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4f)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4fv) = (PFNGLMULTITEXCOORD4FVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4fv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4fv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4i) = (PFNGLMULTITEXCOORD4IPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4i"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4i)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4iv) = (PFNGLMULTITEXCOORD4IVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4iv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4iv)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4s) = (PFNGLMULTITEXCOORD4SPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4s"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4s)) - return GL_FALSE; - GLH_CORE_NAME(glMultiTexCoord4sv) = (PFNGLMULTITEXCOORD4SVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4sv"); - if (NULL == GLH_CORE_NAME(glMultiTexCoord4sv)) - return GL_FALSE; - GLH_CORE_NAME(glActiveTexture) = (PFNGLACTIVETEXTUREPROC)GLH_EXT_GET_PROC_ADDRESS("glActiveTexture"); - if (NULL == GLH_CORE_NAME(glActiveTexture)) - return GL_FALSE; - GLH_CORE_NAME(glClientActiveTexture) = (PFNGLCLIENTACTIVETEXTUREPROC)GLH_EXT_GET_PROC_ADDRESS("glClientActiveTexture"); - if (NULL == GLH_CORE_NAME(glClientActiveTexture)) - return GL_FALSE; - GLH_CORE_NAME(glCompressedTexImage3D) = (PFNGLCOMPRESSEDTEXIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexImage3D"); - if (NULL == GLH_CORE_NAME(glCompressedTexImage3D)) - return GL_FALSE; - GLH_CORE_NAME(glCompressedTexImage2D) = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexImage2D"); - if (NULL == GLH_CORE_NAME(glCompressedTexImage2D)) - return GL_FALSE; - GLH_CORE_NAME(glCompressedTexImage1D) = (PFNGLCOMPRESSEDTEXIMAGE1DPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexImage1D"); - if (NULL == GLH_CORE_NAME(glCompressedTexImage1D)) - return GL_FALSE; - GLH_CORE_NAME(glCompressedTexSubImage3D) = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexSubImage3D"); - if (NULL == GLH_CORE_NAME(glCompressedTexSubImage3D)) - return GL_FALSE; - GLH_CORE_NAME(glCompressedTexSubImage2D) = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexSubImage2D"); - if (NULL == GLH_CORE_NAME(glCompressedTexSubImage2D)) - return GL_FALSE; - GLH_CORE_NAME(glCompressedTexSubImage1D) = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexSubImage1D"); - if (NULL == GLH_CORE_NAME(glCompressedTexSubImage1D)) - return GL_FALSE; - GLH_CORE_NAME(glGetCompressedTexImage) = (PFNGLGETCOMPRESSEDTEXIMAGEPROC)GLH_EXT_GET_PROC_ADDRESS("glGetCompressedTexImage"); - if (NULL == GLH_CORE_NAME(glGetCompressedTexImage)) - return GL_FALSE; - GLH_CORE_NAME(glSampleCoverage) = (PFNGLSAMPLECOVERAGEPROC)GLH_EXT_GET_PROC_ADDRESS("glSampleCoverage"); - if (NULL == GLH_CORE_NAME(glSampleCoverage)) - return GL_FALSE; - GLH_CORE_NAME(glLoadTransposeMatrixf) = (PFNGLLOADTRANSPOSEMATRIXFPROC)GLH_EXT_GET_PROC_ADDRESS("glLoadTransposeMatrixf"); - if (NULL == GLH_CORE_NAME(glLoadTransposeMatrixf)) - return GL_FALSE; - GLH_CORE_NAME(glLoadTransposeMatrixd) = (PFNGLLOADTRANSPOSEMATRIXDPROC)GLH_EXT_GET_PROC_ADDRESS("glLoadTransposeMatrixd"); - if (NULL == GLH_CORE_NAME(glLoadTransposeMatrixd)) - return GL_FALSE; - GLH_CORE_NAME(glMultTransposeMatrixf) = (PFNGLMULTTRANSPOSEMATRIXFPROC)GLH_EXT_GET_PROC_ADDRESS("glMultTransposeMatrixf"); - if (NULL == GLH_CORE_NAME(glMultTransposeMatrixf)) - return GL_FALSE; - GLH_CORE_NAME(glMultTransposeMatrixd) = (PFNGLMULTTRANSPOSEMATRIXDPROC)GLH_EXT_GET_PROC_ADDRESS("glMultTransposeMatrixd"); - if (NULL == GLH_CORE_NAME(glMultTransposeMatrixd)) - return GL_FALSE; - GLH_CORE_NAME(glMultiDrawArrays) = (PFNGLMULTIDRAWARRAYSPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiDrawArrays"); - if (NULL == GLH_CORE_NAME(glMultiDrawArrays)) - return GL_FALSE; - GLH_CORE_NAME(glMultiDrawElements) = (PFNGLMULTIDRAWELEMENTSPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiDrawElements"); - if (NULL == GLH_CORE_NAME(glMultiDrawElements)) - return GL_FALSE; - GLH_CORE_NAME(glPointParameterf) = (PFNGLPOINTPARAMETERFPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameterf"); - if (NULL == GLH_CORE_NAME(glPointParameterf)) - return GL_FALSE; - GLH_CORE_NAME(glPointParameterfv) = (PFNGLPOINTPARAMETERFVPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameterfv"); - if (NULL == GLH_CORE_NAME(glPointParameterfv)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3b) = (PFNGLSECONDARYCOLOR3BPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3b"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3b)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3bv) = (PFNGLSECONDARYCOLOR3BVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3bv"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3bv)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3d) = (PFNGLSECONDARYCOLOR3DPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3d"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3d)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3dv) = (PFNGLSECONDARYCOLOR3DVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3dv"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3dv)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3f) = (PFNGLSECONDARYCOLOR3FPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3f"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3f)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3fv) = (PFNGLSECONDARYCOLOR3FVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3fv"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3fv)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3i) = (PFNGLSECONDARYCOLOR3IPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3i"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3i)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3iv) = (PFNGLSECONDARYCOLOR3IVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3iv"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3iv)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3s) = (PFNGLSECONDARYCOLOR3SPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3s"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3s)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3sv) = (PFNGLSECONDARYCOLOR3SVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3sv"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3sv)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3ub) = (PFNGLSECONDARYCOLOR3UBPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3ub"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3ub)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3ubv) = (PFNGLSECONDARYCOLOR3UBVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3ubv"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3ubv)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3ui) = (PFNGLSECONDARYCOLOR3UIPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3ui"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3ui)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3uiv) = (PFNGLSECONDARYCOLOR3UIVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3uiv"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3uiv)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3us) = (PFNGLSECONDARYCOLOR3USPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3us"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3us)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColor3usv) = (PFNGLSECONDARYCOLOR3USVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3usv"); - if (NULL == GLH_CORE_NAME(glSecondaryColor3usv)) - return GL_FALSE; - GLH_CORE_NAME(glSecondaryColorPointer) = (PFNGLSECONDARYCOLORPOINTERPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColorPointer"); - if (NULL == GLH_CORE_NAME(glSecondaryColorPointer)) - return GL_FALSE; - GLH_CORE_NAME(glBlendFuncSeparate) = (PFNGLBLENDFUNCSEPARATEPROC)GLH_EXT_GET_PROC_ADDRESS("glBlendFuncSeparate"); - if (NULL == GLH_CORE_NAME(glBlendFuncSeparate)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos2d) = (PFNGLWINDOWPOS2DPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2d"); - if (NULL == GLH_CORE_NAME(glWindowPos2d)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos2f) = (PFNGLWINDOWPOS2FPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2f"); - if (NULL == GLH_CORE_NAME(glWindowPos2f)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos2i) = (PFNGLWINDOWPOS2IPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2i"); - if (NULL == GLH_CORE_NAME(glWindowPos2i)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos2s) = (PFNGLWINDOWPOS2SPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2s"); - if (NULL == GLH_CORE_NAME(glWindowPos2s)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos2dv) = (PFNGLWINDOWPOS2DVPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2dv"); - if (NULL == GLH_CORE_NAME(glWindowPos2dv)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos2fv) = (PFNGLWINDOWPOS2FVPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2fv"); - if (NULL == GLH_CORE_NAME(glWindowPos2fv)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos2iv) = (PFNGLWINDOWPOS2IVPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2iv"); - if (NULL == GLH_CORE_NAME(glWindowPos2iv)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos2sv) = (PFNGLWINDOWPOS2SVPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2sv"); - if (NULL == GLH_CORE_NAME(glWindowPos2sv)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos3d) = (PFNGLWINDOWPOS3DPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3d"); - if (NULL == GLH_CORE_NAME(glWindowPos3d)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos3f) = (PFNGLWINDOWPOS3FPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3f"); - if (NULL == GLH_CORE_NAME(glWindowPos3f)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos3i) = (PFNGLWINDOWPOS3IPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3i"); - if (NULL == GLH_CORE_NAME(glWindowPos3i)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos3s) = (PFNGLWINDOWPOS3SPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3s"); - if (NULL == GLH_CORE_NAME(glWindowPos3s)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos3dv) = (PFNGLWINDOWPOS3DVPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3dv"); - if (NULL == GLH_CORE_NAME(glWindowPos3dv)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos3fv) = (PFNGLWINDOWPOS3FVPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3fv"); - if (NULL == GLH_CORE_NAME(glWindowPos3fv)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos3iv) = (PFNGLWINDOWPOS3IVPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3iv"); - if (NULL == GLH_CORE_NAME(glWindowPos3iv)) - return GL_FALSE; - GLH_CORE_NAME(glWindowPos3sv) = (PFNGLWINDOWPOS3SVPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3sv"); - if (NULL == GLH_CORE_NAME(glWindowPos3sv)) - return GL_FALSE; - GLH_CORE_NAME(glGenQueries) = (PFNGLGENQUERIESPROC)GLH_EXT_GET_PROC_ADDRESS("glGenQueries"); - if (NULL == GLH_CORE_NAME(glGenQueries)) - return GL_FALSE; - GLH_CORE_NAME(glDeleteQueries) = (PFNGLDELETEQUERIESPROC)GLH_EXT_GET_PROC_ADDRESS("glDeleteQueries"); - if (NULL == GLH_CORE_NAME(glDeleteQueries)) - return GL_FALSE; - GLH_CORE_NAME(glIsQuery) = (PFNGLISQUERYPROC)GLH_EXT_GET_PROC_ADDRESS("glIsQuery"); - if (NULL == GLH_CORE_NAME(glIsQuery)) - return GL_FALSE; - GLH_CORE_NAME(glBeginQuery) = (PFNGLBEGINQUERYPROC)GLH_EXT_GET_PROC_ADDRESS("glBeginQuery"); - if (NULL == GLH_CORE_NAME(glBeginQuery)) - return GL_FALSE; - GLH_CORE_NAME(glEndQuery) = (PFNGLENDQUERYPROC)GLH_EXT_GET_PROC_ADDRESS("glEndQuery"); - if (NULL == GLH_CORE_NAME(glEndQuery)) - return GL_FALSE; - GLH_CORE_NAME(glGetQueryiv) = (PFNGLGETQUERYIVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetQueryiv"); - if (NULL == GLH_CORE_NAME(glGetQueryiv)) - return GL_FALSE; - GLH_CORE_NAME(glGetQueryObjectiv) = (PFNGLGETQUERYOBJECTIVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetQueryObjectiv"); - if (NULL == GLH_CORE_NAME(glGetQueryObjectiv)) - return GL_FALSE; - GLH_CORE_NAME(glGetQueryObjectuiv) = (PFNGLGETQUERYOBJECTUIVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetQueryObjectuiv"); - if (NULL == GLH_CORE_NAME(glGetQueryObjectuiv)) - return GL_FALSE; - GLH_CORE_NAME(glBindBuffer) = (PFNGLBINDBUFFERPROC)GLH_EXT_GET_PROC_ADDRESS("glBindBuffer"); - if (NULL == GLH_CORE_NAME(glBindBuffer)) - return GL_FALSE; - GLH_CORE_NAME(glDeleteBuffers) = (PFNGLDELETEBUFFERSPROC)GLH_EXT_GET_PROC_ADDRESS("glDeleteBuffers"); - if (NULL == GLH_CORE_NAME(glDeleteBuffers)) - return GL_FALSE; - GLH_CORE_NAME(glGenBuffers) = (PFNGLGENBUFFERSPROC)GLH_EXT_GET_PROC_ADDRESS("glGenBuffers"); - if (NULL == GLH_CORE_NAME(glGenBuffers)) - return GL_FALSE; - GLH_CORE_NAME(glIsBuffer) = (PFNGLISBUFFERPROC)GLH_EXT_GET_PROC_ADDRESS("glIsBuffer"); - if (NULL == GLH_CORE_NAME(glIsBuffer)) - return GL_FALSE; - GLH_CORE_NAME(glBufferData) = (PFNGLBUFFERDATAPROC)GLH_EXT_GET_PROC_ADDRESS("glBufferData"); - if (NULL == GLH_CORE_NAME(glBufferData)) - return GL_FALSE; - GLH_CORE_NAME(glBufferSubData) = (PFNGLBUFFERSUBDATAPROC)GLH_EXT_GET_PROC_ADDRESS("glBufferSubData"); - if (NULL == GLH_CORE_NAME(glBufferSubData)) - return GL_FALSE; - GLH_CORE_NAME(glGetBufferSubData) = (PFNGLGETBUFFERSUBDATAPROC)GLH_EXT_GET_PROC_ADDRESS("glGetBufferSubData"); - if (NULL == GLH_CORE_NAME(glGetBufferSubData)) - return GL_FALSE; - GLH_CORE_NAME(glMapBuffer) = (PFNGLMAPBUFFERPROC)GLH_EXT_GET_PROC_ADDRESS("glMapBuffer"); - if (NULL == GLH_CORE_NAME(glMapBuffer)) - return GL_FALSE; - GLH_CORE_NAME(glUnmapBuffer) = (PFNGLUNMAPBUFFERPROC)GLH_EXT_GET_PROC_ADDRESS("glUnmapBuffer"); - if (NULL == GLH_CORE_NAME(glUnmapBuffer)) - return GL_FALSE; - GLH_CORE_NAME(glGetBufferParameteriv) = (PFNGLGETBUFFERPARAMETERIVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetBufferParameteriv"); - if (NULL == GLH_CORE_NAME(glGetBufferParameteriv)) - return GL_FALSE; - GLH_CORE_NAME(glGetBufferPointerv) = (PFNGLGETBUFFERPOINTERVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetBufferPointerv"); - if (NULL == GLH_CORE_NAME(glGetBufferPointerv)) - return GL_FALSE; - - return GL_TRUE; - } -#endif -#endif - -#ifdef GL_ARB_depth_texture - if (0 == strcmp(extension, "GL_ARB_depth_texture")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_fragment_program - if (0 == strcmp(extension, "GL_ARB_fragment_program")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_fragment_program_shadow - if (0 == strcmp(extension, "GL_ARB_fragment_program_shadow")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_fragment_shader - if (0 == strcmp(extension, "GL_ARB_fragment_shader")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_matrix_palette - if (0 == strcmp(extension, "GL_ARB_matrix_palette")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_multisample - if (0 == strcmp(extension, "GL_ARB_multisample")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_multitexture - if (0 == strcmp(extension, "GL_ARB_multitexture")) { - GLH_EXT_NAME(glMultiTexCoord1dARB) = (PFNGLMULTITEXCOORD1DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1dARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord1dARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord1dvARB) = (PFNGLMULTITEXCOORD1DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1dvARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord1dvARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord1fARB) = (PFNGLMULTITEXCOORD1FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1fARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord1fARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord1fvARB) = (PFNGLMULTITEXCOORD1FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1fvARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord1fvARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord1iARB) = (PFNGLMULTITEXCOORD1IARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1iARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord1iARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord1ivARB) = (PFNGLMULTITEXCOORD1IVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1ivARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord1ivARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord1sARB) = (PFNGLMULTITEXCOORD1SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1sARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord1sARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord1svARB) = (PFNGLMULTITEXCOORD1SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1svARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord1svARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord2dARB) = (PFNGLMULTITEXCOORD2DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2dARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord2dARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord2dvARB) = (PFNGLMULTITEXCOORD2DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2dvARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord2dvARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord2fARB) = (PFNGLMULTITEXCOORD2FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2fARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord2fARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord2fvARB) = (PFNGLMULTITEXCOORD2FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2fvARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord2fvARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord2iARB) = (PFNGLMULTITEXCOORD2IARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2iARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord2iARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord2ivARB) = (PFNGLMULTITEXCOORD2IVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2ivARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord2ivARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord2sARB) = (PFNGLMULTITEXCOORD2SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2sARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord2sARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord2svARB) = (PFNGLMULTITEXCOORD2SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2svARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord2svARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord3dARB) = (PFNGLMULTITEXCOORD3DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3dARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord3dARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord3dvARB) = (PFNGLMULTITEXCOORD3DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3dvARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord3dvARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord3fARB) = (PFNGLMULTITEXCOORD3FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3fARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord3fARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord3fvARB) = (PFNGLMULTITEXCOORD3FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3fvARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord3fvARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord3iARB) = (PFNGLMULTITEXCOORD3IARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3iARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord3iARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord3ivARB) = (PFNGLMULTITEXCOORD3IVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3ivARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord3ivARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord3sARB) = (PFNGLMULTITEXCOORD3SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3sARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord3sARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord3svARB) = (PFNGLMULTITEXCOORD3SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3svARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord3svARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord4dARB) = (PFNGLMULTITEXCOORD4DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4dARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord4dARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord4dvARB) = (PFNGLMULTITEXCOORD4DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4dvARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord4dvARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord4fARB) = (PFNGLMULTITEXCOORD4FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4fARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord4fARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord4fvARB) = (PFNGLMULTITEXCOORD4FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4fvARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord4fvARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord4iARB) = (PFNGLMULTITEXCOORD4IARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4iARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord4iARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord4ivARB) = (PFNGLMULTITEXCOORD4IVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4ivARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord4ivARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord4sARB) = (PFNGLMULTITEXCOORD4SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4sARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord4sARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord4svARB) = (PFNGLMULTITEXCOORD4SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4svARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord4svARB)) - return GL_FALSE; - GLH_EXT_NAME(glActiveTextureARB) = (PFNGLACTIVETEXTUREARBPROC)GLH_EXT_GET_PROC_ADDRESS("glActiveTextureARB"); - if (NULL == GLH_EXT_NAME(glActiveTextureARB)) - return GL_FALSE; - GLH_EXT_NAME(glClientActiveTextureARB) = (PFNGLCLIENTACTIVETEXTUREARBPROC)GLH_EXT_GET_PROC_ADDRESS("glClientActiveTextureARB"); - if (NULL == GLH_EXT_NAME(glClientActiveTextureARB)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_occlusion_query - if (0 == strcmp(extension, "GL_ARB_occlusion_query")) { - GLH_EXT_NAME(glGenQueriesARB) = (PFNGLGENQUERIESARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGenQueriesARB"); - if (NULL == GLH_EXT_NAME(glGenQueriesARB)) - return GL_FALSE; - GLH_EXT_NAME(glDeleteQueriesARB) = (PFNGLDELETEQUERIESARBPROC)GLH_EXT_GET_PROC_ADDRESS("glDeleteQueriesARB"); - if (NULL == GLH_EXT_NAME(glDeleteQueriesARB)) - return GL_FALSE; - GLH_EXT_NAME(glIsQueryARB) = (PFNGLISQUERYARBPROC)GLH_EXT_GET_PROC_ADDRESS("glIsQueryARB"); - if (NULL == GLH_EXT_NAME(glIsQueryARB)) - return GL_FALSE; - GLH_EXT_NAME(glBeginQueryARB) = (PFNGLBEGINQUERYARBPROC)GLH_EXT_GET_PROC_ADDRESS("glBeginQueryARB"); - if (NULL == GLH_EXT_NAME(glBeginQueryARB)) - return GL_FALSE; - GLH_EXT_NAME(glEndQueryARB) = (PFNGLENDQUERYARBPROC)GLH_EXT_GET_PROC_ADDRESS("glEndQueryARB"); - if (NULL == GLH_EXT_NAME(glEndQueryARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetQueryivARB) = (PFNGLGETQUERYIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetQueryivARB"); - if (NULL == GLH_EXT_NAME(glGetQueryivARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetQueryObjectivARB) = (PFNGLGETQUERYOBJECTIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetQueryObjectivARB"); - if (NULL == GLH_EXT_NAME(glGetQueryObjectivARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetQueryObjectuivARB) = (PFNGLGETQUERYOBJECTUIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetQueryObjectuivARB"); - if (NULL == GLH_EXT_NAME(glGetQueryObjectuivARB)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_point_parameters - if (0 == strcmp(extension, "GL_ARB_point_parameters")) { - GLH_EXT_NAME(glPointParameterfARB) = (PFNGLPOINTPARAMETERFARBPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameterfARB"); - if (NULL == GLH_EXT_NAME(glPointParameterfARB)) - return GL_FALSE; - GLH_EXT_NAME(glPointParameterfvARB) = (PFNGLPOINTPARAMETERFVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameterfvARB"); - if (NULL == GLH_EXT_NAME(glPointParameterfvARB)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_point_sprite - if (0 == strcmp(extension, "GL_ARB_point_sprite")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_shader_objects - if (0 == strcmp(extension, "GL_ARB_shader_objects")) { - GLH_EXT_NAME(glDeleteObjectARB) = (PFNGLDELETEOBJECTARBPROC)GLH_EXT_GET_PROC_ADDRESS("glDeleteObjectARB"); - if (NULL == GLH_EXT_NAME(glDeleteObjectARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetHandleARB) = (PFNGLGETHANDLEARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetHandleARB"); - if (NULL == GLH_EXT_NAME(glGetHandleARB)) - return GL_FALSE; - GLH_EXT_NAME(glDetachObjectARB) = (PFNGLDETACHOBJECTARBPROC)GLH_EXT_GET_PROC_ADDRESS("glDetachObjectARB"); - if (NULL == GLH_EXT_NAME(glDetachObjectARB)) - return GL_FALSE; - GLH_EXT_NAME(glCreateShaderObjectARB) = (PFNGLCREATESHADEROBJECTARBPROC)GLH_EXT_GET_PROC_ADDRESS("glCreateShaderObjectARB"); - if (NULL == GLH_EXT_NAME(glCreateShaderObjectARB)) - return GL_FALSE; - GLH_EXT_NAME(glShaderSourceARB) = (PFNGLSHADERSOURCEARBPROC)GLH_EXT_GET_PROC_ADDRESS("glShaderSourceARB"); - if (NULL == GLH_EXT_NAME(glShaderSourceARB)) - return GL_FALSE; - GLH_EXT_NAME(glCompileShaderARB) = (PFNGLCOMPILESHADERARBPROC)GLH_EXT_GET_PROC_ADDRESS("glCompileShaderARB"); - if (NULL == GLH_EXT_NAME(glCompileShaderARB)) - return GL_FALSE; - GLH_EXT_NAME(glCreateProgramObjectARB) = (PFNGLCREATEPROGRAMOBJECTARBPROC)GLH_EXT_GET_PROC_ADDRESS("glCreateProgramObjectARB"); - if (NULL == GLH_EXT_NAME(glCreateProgramObjectARB)) - return GL_FALSE; - GLH_EXT_NAME(glAttachObjectARB) = (PFNGLATTACHOBJECTARBPROC)GLH_EXT_GET_PROC_ADDRESS("glAttachObjectARB"); - if (NULL == GLH_EXT_NAME(glAttachObjectARB)) - return GL_FALSE; - GLH_EXT_NAME(glLinkProgramARB) = (PFNGLLINKPROGRAMARBPROC)GLH_EXT_GET_PROC_ADDRESS("glLinkProgramARB"); - if (NULL == GLH_EXT_NAME(glLinkProgramARB)) - return GL_FALSE; - GLH_EXT_NAME(glUseProgramObjectARB) = (PFNGLUSEPROGRAMOBJECTARBPROC)GLH_EXT_GET_PROC_ADDRESS("glUseProgramObjectARB"); - if (NULL == GLH_EXT_NAME(glUseProgramObjectARB)) - return GL_FALSE; - GLH_EXT_NAME(glValidateProgramARB) = (PFNGLVALIDATEPROGRAMARBPROC)GLH_EXT_GET_PROC_ADDRESS("glValidateProgramARB"); - if (NULL == GLH_EXT_NAME(glValidateProgramARB)) - return GL_FALSE; - GLH_EXT_NAME(glUniform1fARB) = (PFNGLUNIFORM1FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glUniform1fARB"); - if (NULL == GLH_EXT_NAME(glUniform1fARB)) - return GL_FALSE; - GLH_EXT_NAME(glUniform2fARB) = (PFNGLUNIFORM2FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glUniform2fARB"); - if (NULL == GLH_EXT_NAME(glUniform2fARB)) - return GL_FALSE; - GLH_EXT_NAME(glUniform3fARB) = (PFNGLUNIFORM3FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glUniform3fARB"); - if (NULL == GLH_EXT_NAME(glUniform3fARB)) - return GL_FALSE; - GLH_EXT_NAME(glUniform4fARB) = (PFNGLUNIFORM4FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glUniform4fARB"); - if (NULL == GLH_EXT_NAME(glUniform4fARB)) - return GL_FALSE; - GLH_EXT_NAME(glUniform1iARB) = (PFNGLUNIFORM1IARBPROC)GLH_EXT_GET_PROC_ADDRESS("glUniform1iARB"); - if (NULL == GLH_EXT_NAME(glUniform1iARB)) - return GL_FALSE; - GLH_EXT_NAME(glUniform2iARB) = (PFNGLUNIFORM2IARBPROC)GLH_EXT_GET_PROC_ADDRESS("glUniform2iARB"); - if (NULL == GLH_EXT_NAME(glUniform2iARB)) - return GL_FALSE; - GLH_EXT_NAME(glUniform3iARB) = (PFNGLUNIFORM3IARBPROC)GLH_EXT_GET_PROC_ADDRESS("glUniform3iARB"); - if (NULL == GLH_EXT_NAME(glUniform3iARB)) - return GL_FALSE; - GLH_EXT_NAME(glUniform4iARB) = (PFNGLUNIFORM4IARBPROC)GLH_EXT_GET_PROC_ADDRESS("glUniform4iARB"); - if (NULL == GLH_EXT_NAME(glUniform4iARB)) - return GL_FALSE; - GLH_EXT_NAME(glUniform1fvARB) = (PFNGLUNIFORM1FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glUniform1fvARB"); - if (NULL == GLH_EXT_NAME(glUniform1fvARB)) - return GL_FALSE; - GLH_EXT_NAME(glUniform2fvARB) = (PFNGLUNIFORM2FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glUniform2fvARB"); - if (NULL == GLH_EXT_NAME(glUniform2fvARB)) - return GL_FALSE; - GLH_EXT_NAME(glUniform3fvARB) = (PFNGLUNIFORM3FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glUniform3fvARB"); - if (NULL == GLH_EXT_NAME(glUniform3fvARB)) - return GL_FALSE; - GLH_EXT_NAME(glUniform4fvARB) = (PFNGLUNIFORM4FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glUniform4fvARB"); - if (NULL == GLH_EXT_NAME(glUniform4fvARB)) - return GL_FALSE; - GLH_EXT_NAME(glUniform1ivARB) = (PFNGLUNIFORM1IVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glUniform1ivARB"); - if (NULL == GLH_EXT_NAME(glUniform1ivARB)) - return GL_FALSE; - GLH_EXT_NAME(glUniform2ivARB) = (PFNGLUNIFORM2IVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glUniform2ivARB"); - if (NULL == GLH_EXT_NAME(glUniform2ivARB)) - return GL_FALSE; - GLH_EXT_NAME(glUniform3ivARB) = (PFNGLUNIFORM3IVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glUniform3ivARB"); - if (NULL == GLH_EXT_NAME(glUniform3ivARB)) - return GL_FALSE; - GLH_EXT_NAME(glUniform4ivARB) = (PFNGLUNIFORM4IVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glUniform4ivARB"); - if (NULL == GLH_EXT_NAME(glUniform4ivARB)) - return GL_FALSE; - GLH_EXT_NAME(glUniformMatrix2fvARB) = (PFNGLUNIFORMMATRIX2FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glUniformMatrix2fvARB"); - if (NULL == GLH_EXT_NAME(glUniformMatrix2fvARB)) - return GL_FALSE; - GLH_EXT_NAME(glUniformMatrix3fvARB) = (PFNGLUNIFORMMATRIX3FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glUniformMatrix3fvARB"); - if (NULL == GLH_EXT_NAME(glUniformMatrix3fvARB)) - return GL_FALSE; - GLH_EXT_NAME(glUniformMatrix4fvARB) = (PFNGLUNIFORMMATRIX4FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glUniformMatrix4fvARB"); - if (NULL == GLH_EXT_NAME(glUniformMatrix4fvARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetObjectParameterfvARB) = (PFNGLGETOBJECTPARAMETERFVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetObjectParameterfvARB"); - if (NULL == GLH_EXT_NAME(glGetObjectParameterfvARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetObjectParameterivARB) = (PFNGLGETOBJECTPARAMETERIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetObjectParameterivARB"); - if (NULL == GLH_EXT_NAME(glGetObjectParameterivARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetInfoLogARB) = (PFNGLGETINFOLOGARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetInfoLogARB"); - if (NULL == GLH_EXT_NAME(glGetInfoLogARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetAttachedObjectsARB) = (PFNGLGETATTACHEDOBJECTSARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetAttachedObjectsARB"); - if (NULL == GLH_EXT_NAME(glGetAttachedObjectsARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetUniformLocationARB) = (PFNGLGETUNIFORMLOCATIONARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetUniformLocationARB"); - if (NULL == GLH_EXT_NAME(glGetUniformLocationARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetActiveUniformARB) = (PFNGLGETACTIVEUNIFORMARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetActiveUniformARB"); - if (NULL == GLH_EXT_NAME(glGetActiveUniformARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetUniformfvARB) = (PFNGLGETUNIFORMFVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetUniformfvARB"); - if (NULL == GLH_EXT_NAME(glGetUniformfvARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetUniformivARB) = (PFNGLGETUNIFORMIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetUniformivARB"); - if (NULL == GLH_EXT_NAME(glGetUniformivARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetShaderSourceARB) = (PFNGLGETSHADERSOURCEARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetShaderSourceARB"); - if (NULL == GLH_EXT_NAME(glGetShaderSourceARB)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_shadow - if (0 == strcmp(extension, "GL_ARB_shadow")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_shadow_ambient - if (0 == strcmp(extension, "GL_ARB_shadow_ambient")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_texture_border_clamp - if (0 == strcmp(extension, "GL_ARB_texture_border_clamp")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_texture_compression - if (0 == strcmp(extension, "GL_ARB_texture_compression")) { - GLH_EXT_NAME(glCompressedTexImage3DARB) = (PFNGLCOMPRESSEDTEXIMAGE3DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexImage3DARB"); - if (NULL == GLH_EXT_NAME(glCompressedTexImage3DARB)) - return GL_FALSE; - GLH_EXT_NAME(glCompressedTexImage2DARB) = (PFNGLCOMPRESSEDTEXIMAGE2DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexImage2DARB"); - if (NULL == GLH_EXT_NAME(glCompressedTexImage2DARB)) - return GL_FALSE; - GLH_EXT_NAME(glCompressedTexImage1DARB) = (PFNGLCOMPRESSEDTEXIMAGE1DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexImage1DARB"); - if (NULL == GLH_EXT_NAME(glCompressedTexImage1DARB)) - return GL_FALSE; - GLH_EXT_NAME(glCompressedTexSubImage3DARB) = (PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexSubImage3DARB"); - if (NULL == GLH_EXT_NAME(glCompressedTexSubImage3DARB)) - return GL_FALSE; - GLH_EXT_NAME(glCompressedTexSubImage2DARB) = (PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexSubImage2DARB"); - if (NULL == GLH_EXT_NAME(glCompressedTexSubImage2DARB)) - return GL_FALSE; - GLH_EXT_NAME(glCompressedTexSubImage1DARB) = (PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexSubImage1DARB"); - if (NULL == GLH_EXT_NAME(glCompressedTexSubImage1DARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetCompressedTexImageARB) = (PFNGLGETCOMPRESSEDTEXIMAGEARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetCompressedTexImageARB"); - if (NULL == GLH_EXT_NAME(glGetCompressedTexImageARB)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_texture_cube_map - if (0 == strcmp(extension, "GL_ARB_texture_cube_map")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_texture_env_add - if (0 == strcmp(extension, "GL_ARB_texture_env_add")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_texture_env_combine - if (0 == strcmp(extension, "GL_ARB_texture_env_combine")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_texture_env_dot3 - if (0 == strcmp(extension, "GL_ARB_texture_env_dot3")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_texture_mirrored_repeat - if (0 == strcmp(extension, "GL_ARB_texture_mirrored_repeat")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_texture_non_power_of_two - if (0 == strcmp(extension, "GL_ARB_texture_non_power_of_two")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_texture_rectangle - if (0 == strcmp(extension, "GL_ARB_texture_rectangle")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_transpose_matrix - if (0 == strcmp(extension, "GL_ARB_transpose_matrix")) { - GLH_EXT_NAME(glLoadTransposeMatrixfARB) = (PFNGLLOADTRANSPOSEMATRIXFARBPROC)GLH_EXT_GET_PROC_ADDRESS("glLoadTransposeMatrixfARB"); - if (NULL == GLH_EXT_NAME(glLoadTransposeMatrixfARB)) - return GL_FALSE; - GLH_EXT_NAME(glLoadTransposeMatrixdARB) = (PFNGLLOADTRANSPOSEMATRIXDARBPROC)GLH_EXT_GET_PROC_ADDRESS("glLoadTransposeMatrixdARB"); - if (NULL == GLH_EXT_NAME(glLoadTransposeMatrixdARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultTransposeMatrixfARB) = (PFNGLMULTTRANSPOSEMATRIXFARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultTransposeMatrixfARB"); - if (NULL == GLH_EXT_NAME(glMultTransposeMatrixfARB)) - return GL_FALSE; - GLH_EXT_NAME(glMultTransposeMatrixdARB) = (PFNGLMULTTRANSPOSEMATRIXDARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultTransposeMatrixdARB"); - if (NULL == GLH_EXT_NAME(glMultTransposeMatrixdARB)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_vertex_buffer_object - if (0 == strcmp(extension, "GL_ARB_vertex_buffer_object")) { - GLH_EXT_NAME(glBindBufferARB) = (PFNGLBINDBUFFERARBPROC)GLH_EXT_GET_PROC_ADDRESS("glBindBufferARB"); - if (NULL == GLH_EXT_NAME(glBindBufferARB)) - return GL_FALSE; - GLH_EXT_NAME(glDeleteBuffersARB) = (PFNGLDELETEBUFFERSARBPROC)GLH_EXT_GET_PROC_ADDRESS("glDeleteBuffersARB"); - if (NULL == GLH_EXT_NAME(glDeleteBuffersARB)) - return GL_FALSE; - GLH_EXT_NAME(glGenBuffersARB) = (PFNGLGENBUFFERSARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGenBuffersARB"); - if (NULL == GLH_EXT_NAME(glGenBuffersARB)) - return GL_FALSE; - GLH_EXT_NAME(glIsBufferARB) = (PFNGLISBUFFERARBPROC)GLH_EXT_GET_PROC_ADDRESS("glIsBufferARB"); - if (NULL == GLH_EXT_NAME(glIsBufferARB)) - return GL_FALSE; - GLH_EXT_NAME(glBufferDataARB) = (PFNGLBUFFERDATAARBPROC)GLH_EXT_GET_PROC_ADDRESS("glBufferDataARB"); - if (NULL == GLH_EXT_NAME(glBufferDataARB)) - return GL_FALSE; - GLH_EXT_NAME(glBufferSubDataARB) = (PFNGLBUFFERSUBDATAARBPROC)GLH_EXT_GET_PROC_ADDRESS("glBufferSubDataARB"); - if (NULL == GLH_EXT_NAME(glBufferSubDataARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetBufferSubDataARB) = (PFNGLGETBUFFERSUBDATAARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetBufferSubDataARB"); - if (NULL == GLH_EXT_NAME(glGetBufferSubDataARB)) - return GL_FALSE; - GLH_EXT_NAME(glMapBufferARB) = (PFNGLMAPBUFFERARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMapBufferARB"); - if (NULL == GLH_EXT_NAME(glMapBufferARB)) - return GL_FALSE; - GLH_EXT_NAME(glUnmapBufferARB) = (PFNGLUNMAPBUFFERARBPROC)GLH_EXT_GET_PROC_ADDRESS("glUnmapBufferARB"); - if (NULL == GLH_EXT_NAME(glUnmapBufferARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetBufferParameterivARB) = (PFNGLGETBUFFERPARAMETERIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetBufferParameterivARB"); - if (NULL == GLH_EXT_NAME(glGetBufferParameterivARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetBufferPointervARB) = (PFNGLGETBUFFERPOINTERVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetBufferPointervARB"); - if (NULL == GLH_EXT_NAME(glGetBufferPointervARB)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_vertex_program - if (0 == strcmp(extension, "GL_ARB_vertex_program")) { - GLH_EXT_NAME(glVertexAttrib1sARB) = (PFNGLVERTEXATTRIB1SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1sARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1sARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib1fARB) = (PFNGLVERTEXATTRIB1FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1fARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1fARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib1dARB) = (PFNGLVERTEXATTRIB1DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1dARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1dARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib2sARB) = (PFNGLVERTEXATTRIB2SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2sARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2sARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib2fARB) = (PFNGLVERTEXATTRIB2FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2fARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2fARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib2dARB) = (PFNGLVERTEXATTRIB2DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2dARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2dARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib3sARB) = (PFNGLVERTEXATTRIB3SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3sARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3sARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib3fARB) = (PFNGLVERTEXATTRIB3FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3fARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3fARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib3dARB) = (PFNGLVERTEXATTRIB3DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3dARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3dARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4sARB) = (PFNGLVERTEXATTRIB4SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4sARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4sARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4fARB) = (PFNGLVERTEXATTRIB4FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4fARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4fARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4dARB) = (PFNGLVERTEXATTRIB4DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4dARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4dARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4NubARB) = (PFNGLVERTEXATTRIB4NUBARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4NubARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4NubARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib1svARB) = (PFNGLVERTEXATTRIB1SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1svARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1svARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib1fvARB) = (PFNGLVERTEXATTRIB1FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1fvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1fvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib1dvARB) = (PFNGLVERTEXATTRIB1DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1dvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1dvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib2svARB) = (PFNGLVERTEXATTRIB2SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2svARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2svARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib2fvARB) = (PFNGLVERTEXATTRIB2FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2fvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2fvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib2dvARB) = (PFNGLVERTEXATTRIB2DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2dvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2dvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib3svARB) = (PFNGLVERTEXATTRIB3SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3svARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3svARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib3fvARB) = (PFNGLVERTEXATTRIB3FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3fvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3fvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib3dvARB) = (PFNGLVERTEXATTRIB3DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3dvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3dvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4bvARB) = (PFNGLVERTEXATTRIB4BVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4bvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4bvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4svARB) = (PFNGLVERTEXATTRIB4SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4svARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4svARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4ivARB) = (PFNGLVERTEXATTRIB4IVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4ivARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4ivARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4ubvARB) = (PFNGLVERTEXATTRIB4UBVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4ubvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4ubvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4usvARB) = (PFNGLVERTEXATTRIB4USVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4usvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4usvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4uivARB) = (PFNGLVERTEXATTRIB4UIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4uivARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4uivARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4fvARB) = (PFNGLVERTEXATTRIB4FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4fvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4fvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4dvARB) = (PFNGLVERTEXATTRIB4DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4dvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4dvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4NbvARB) = (PFNGLVERTEXATTRIB4NBVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4NbvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4NbvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4NsvARB) = (PFNGLVERTEXATTRIB4NSVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4NsvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4NsvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4NivARB) = (PFNGLVERTEXATTRIB4NIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4NivARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4NivARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4NubvARB) = (PFNGLVERTEXATTRIB4NUBVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4NubvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4NubvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4NusvARB) = (PFNGLVERTEXATTRIB4NUSVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4NusvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4NusvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4NuivARB) = (PFNGLVERTEXATTRIB4NUIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4NuivARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4NuivARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttribPointerARB) = (PFNGLVERTEXATTRIBPOINTERARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribPointerARB"); - if (NULL == GLH_EXT_NAME(glVertexAttribPointerARB)) - return GL_FALSE; - GLH_EXT_NAME(glEnableVertexAttribArrayARB) = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)GLH_EXT_GET_PROC_ADDRESS("glEnableVertexAttribArrayARB"); - if (NULL == GLH_EXT_NAME(glEnableVertexAttribArrayARB)) - return GL_FALSE; - GLH_EXT_NAME(glDisableVertexAttribArrayARB) = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)GLH_EXT_GET_PROC_ADDRESS("glDisableVertexAttribArrayARB"); - if (NULL == GLH_EXT_NAME(glDisableVertexAttribArrayARB)) - return GL_FALSE; - GLH_EXT_NAME(glProgramStringARB) = (PFNGLPROGRAMSTRINGARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramStringARB"); - if (NULL == GLH_EXT_NAME(glProgramStringARB)) - return GL_FALSE; - GLH_EXT_NAME(glBindProgramARB) = (PFNGLBINDPROGRAMARBPROC)GLH_EXT_GET_PROC_ADDRESS("glBindProgramARB"); - if (NULL == GLH_EXT_NAME(glBindProgramARB)) - return GL_FALSE; - GLH_EXT_NAME(glDeleteProgramsARB) = (PFNGLDELETEPROGRAMSARBPROC)GLH_EXT_GET_PROC_ADDRESS("glDeleteProgramsARB"); - if (NULL == GLH_EXT_NAME(glDeleteProgramsARB)) - return GL_FALSE; - GLH_EXT_NAME(glGenProgramsARB) = (PFNGLGENPROGRAMSARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGenProgramsARB"); - if (NULL == GLH_EXT_NAME(glGenProgramsARB)) - return GL_FALSE; - GLH_EXT_NAME(glProgramEnvParameter4dARB) = (PFNGLPROGRAMENVPARAMETER4DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramEnvParameter4dARB"); - if (NULL == GLH_EXT_NAME(glProgramEnvParameter4dARB)) - return GL_FALSE; - GLH_EXT_NAME(glProgramEnvParameter4dvARB) = (PFNGLPROGRAMENVPARAMETER4DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramEnvParameter4dvARB"); - if (NULL == GLH_EXT_NAME(glProgramEnvParameter4dvARB)) - return GL_FALSE; - GLH_EXT_NAME(glProgramEnvParameter4fARB) = (PFNGLPROGRAMENVPARAMETER4FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramEnvParameter4fARB"); - if (NULL == GLH_EXT_NAME(glProgramEnvParameter4fARB)) - return GL_FALSE; - GLH_EXT_NAME(glProgramEnvParameter4fvARB) = (PFNGLPROGRAMENVPARAMETER4FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramEnvParameter4fvARB"); - if (NULL == GLH_EXT_NAME(glProgramEnvParameter4fvARB)) - return GL_FALSE; - GLH_EXT_NAME(glProgramLocalParameter4dARB) = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramLocalParameter4dARB"); - if (NULL == GLH_EXT_NAME(glProgramLocalParameter4dARB)) - return GL_FALSE; - GLH_EXT_NAME(glProgramLocalParameter4dvARB) = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramLocalParameter4dvARB"); - if (NULL == GLH_EXT_NAME(glProgramLocalParameter4dvARB)) - return GL_FALSE; - GLH_EXT_NAME(glProgramLocalParameter4fARB) = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramLocalParameter4fARB"); - if (NULL == GLH_EXT_NAME(glProgramLocalParameter4fARB)) - return GL_FALSE; - GLH_EXT_NAME(glProgramLocalParameter4fvARB) = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramLocalParameter4fvARB"); - if (NULL == GLH_EXT_NAME(glProgramLocalParameter4fvARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetProgramEnvParameterdvARB) = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramEnvParameterdvARB"); - if (NULL == GLH_EXT_NAME(glGetProgramEnvParameterdvARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetProgramEnvParameterfvARB) = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramEnvParameterfvARB"); - if (NULL == GLH_EXT_NAME(glGetProgramEnvParameterfvARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetProgramLocalParameterdvARB) = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramLocalParameterdvARB"); - if (NULL == GLH_EXT_NAME(glGetProgramLocalParameterdvARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetProgramLocalParameterfvARB) = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramLocalParameterfvARB"); - if (NULL == GLH_EXT_NAME(glGetProgramLocalParameterfvARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetProgramivARB) = (PFNGLGETPROGRAMIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramivARB"); - if (NULL == GLH_EXT_NAME(glGetProgramivARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetProgramStringARB) = (PFNGLGETPROGRAMSTRINGARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramStringARB"); - if (NULL == GLH_EXT_NAME(glGetProgramStringARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetVertexAttribdvARB) = (PFNGLGETVERTEXATTRIBDVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribdvARB"); - if (NULL == GLH_EXT_NAME(glGetVertexAttribdvARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetVertexAttribfvARB) = (PFNGLGETVERTEXATTRIBFVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribfvARB"); - if (NULL == GLH_EXT_NAME(glGetVertexAttribfvARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetVertexAttribivARB) = (PFNGLGETVERTEXATTRIBIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribivARB"); - if (NULL == GLH_EXT_NAME(glGetVertexAttribivARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetVertexAttribPointervARB) = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribPointervARB"); - if (NULL == GLH_EXT_NAME(glGetVertexAttribPointervARB)) - return GL_FALSE; - GLH_EXT_NAME(glIsProgramARB) = (PFNGLISPROGRAMARBPROC)GLH_EXT_GET_PROC_ADDRESS("glIsProgramARB"); - if (NULL == GLH_EXT_NAME(glIsProgramARB)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_vertex_shader - if (0 == strcmp(extension, "GL_ARB_vertex_shader")) { - GLH_EXT_NAME(glBindAttribLocationARB) = (PFNGLBINDATTRIBLOCATIONARBPROC)GLH_EXT_GET_PROC_ADDRESS("glBindAttribLocationARB"); - if (NULL == GLH_EXT_NAME(glBindAttribLocationARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetActiveAttribARB) = (PFNGLGETACTIVEATTRIBARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetActiveAttribARB"); - if (NULL == GLH_EXT_NAME(glGetActiveAttribARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetAttribLocationARB) = (PFNGLGETATTRIBLOCATIONARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetAttribLocationARB"); - if (NULL == GLH_EXT_NAME(glGetAttribLocationARB)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_ARB_window_pos - if (0 == strcmp(extension, "GL_ARB_window_pos")) { - GLH_EXT_NAME(glWindowPos2dARB) = (PFNGLWINDOWPOS2DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2dARB"); - if (NULL == GLH_EXT_NAME(glWindowPos2dARB)) - return GL_FALSE; - GLH_EXT_NAME(glWindowPos2fARB) = (PFNGLWINDOWPOS2FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2fARB"); - if (NULL == GLH_EXT_NAME(glWindowPos2fARB)) - return GL_FALSE; - GLH_EXT_NAME(glWindowPos2iARB) = (PFNGLWINDOWPOS2IARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2iARB"); - if (NULL == GLH_EXT_NAME(glWindowPos2iARB)) - return GL_FALSE; - GLH_EXT_NAME(glWindowPos2sARB) = (PFNGLWINDOWPOS2SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2sARB"); - if (NULL == GLH_EXT_NAME(glWindowPos2sARB)) - return GL_FALSE; - GLH_EXT_NAME(glWindowPos2dvARB) = (PFNGLWINDOWPOS2DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2dvARB"); - if (NULL == GLH_EXT_NAME(glWindowPos2dvARB)) - return GL_FALSE; - GLH_EXT_NAME(glWindowPos2fvARB) = (PFNGLWINDOWPOS2FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2fvARB"); - if (NULL == GLH_EXT_NAME(glWindowPos2fvARB)) - return GL_FALSE; - GLH_EXT_NAME(glWindowPos2ivARB) = (PFNGLWINDOWPOS2IVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2ivARB"); - if (NULL == GLH_EXT_NAME(glWindowPos2ivARB)) - return GL_FALSE; - GLH_EXT_NAME(glWindowPos2svARB) = (PFNGLWINDOWPOS2SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2svARB"); - if (NULL == GLH_EXT_NAME(glWindowPos2svARB)) - return GL_FALSE; - GLH_EXT_NAME(glWindowPos3dARB) = (PFNGLWINDOWPOS3DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3dARB"); - if (NULL == GLH_EXT_NAME(glWindowPos3dARB)) - return GL_FALSE; - GLH_EXT_NAME(glWindowPos3fARB) = (PFNGLWINDOWPOS3FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3fARB"); - if (NULL == GLH_EXT_NAME(glWindowPos3fARB)) - return GL_FALSE; - GLH_EXT_NAME(glWindowPos3iARB) = (PFNGLWINDOWPOS3IARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3iARB"); - if (NULL == GLH_EXT_NAME(glWindowPos3iARB)) - return GL_FALSE; - GLH_EXT_NAME(glWindowPos3sARB) = (PFNGLWINDOWPOS3SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3sARB"); - if (NULL == GLH_EXT_NAME(glWindowPos3sARB)) - return GL_FALSE; - GLH_EXT_NAME(glWindowPos3dvARB) = (PFNGLWINDOWPOS3DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3dvARB"); - if (NULL == GLH_EXT_NAME(glWindowPos3dvARB)) - return GL_FALSE; - GLH_EXT_NAME(glWindowPos3fvARB) = (PFNGLWINDOWPOS3FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3fvARB"); - if (NULL == GLH_EXT_NAME(glWindowPos3fvARB)) - return GL_FALSE; - GLH_EXT_NAME(glWindowPos3ivARB) = (PFNGLWINDOWPOS3IVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3ivARB"); - if (NULL == GLH_EXT_NAME(glWindowPos3ivARB)) - return GL_FALSE; - GLH_EXT_NAME(glWindowPos3svARB) = (PFNGLWINDOWPOS3SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3svARB"); - if (NULL == GLH_EXT_NAME(glWindowPos3svARB)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_ATI_draw_buffers - if (0 == strcmp(extension, "GL_ATI_draw_buffers")) { - GLH_EXT_NAME(glDrawBuffersATI) = (PFNGLDRAWBUFFERSATIPROC)GLH_EXT_GET_PROC_ADDRESS("glDrawBuffersATI"); - if (NULL == GLH_EXT_NAME(glDrawBuffersATI)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_ATI_texture_float - if (0 == strcmp(extension, "GL_ATI_texture_float")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_abgr - if (0 == strcmp(extension, "GL_EXT_abgr")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_bgra - if (0 == strcmp(extension, "GL_EXT_bgra")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_blend_color - if (0 == strcmp(extension, "GL_EXT_blend_color")) { - GLH_EXT_NAME(glBlendColorEXT) = (PFNGLBLENDCOLOREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glBlendColorEXT"); - if (NULL == GLH_EXT_NAME(glBlendColorEXT)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_blend_equation_separate - if (0 == strcmp(extension, "GL_EXT_blend_equation_separate")) { - GLH_EXT_NAME(glBlendEquationSeparateEXT) = (PFNGLBLENDEQUATIONSEPARATEEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glBlendEquationSeparateEXT"); - if (NULL == GLH_EXT_NAME(glBlendEquationSeparateEXT)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_blend_func_separate - if (0 == strcmp(extension, "GL_EXT_blend_func_separate")) { - GLH_EXT_NAME(glBlendFuncSeparateEXT) = (PFNGLBLENDFUNCSEPARATEEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glBlendFuncSeparateEXT"); - if (NULL == GLH_EXT_NAME(glBlendFuncSeparateEXT)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_blend_minmax - if (0 == strcmp(extension, "GL_EXT_blend_minmax")) { - GLH_EXT_NAME(glBlendEquationEXT) = (PFNGLBLENDEQUATIONEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glBlendEquationEXT"); - if (NULL == GLH_EXT_NAME(glBlendEquationEXT)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_blend_subtract - if (0 == strcmp(extension, "GL_EXT_blend_subtract")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_Cg_shader - if (0 == strcmp(extension, "GL_EXT_Cg_shader")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_compiled_vertex_array - if (0 == strcmp(extension, "GL_EXT_compiled_vertex_array")) { - GLH_EXT_NAME(glLockArraysEXT) = (PFNGLLOCKARRAYSEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glLockArraysEXT"); - if (NULL == GLH_EXT_NAME(glLockArraysEXT)) - return GL_FALSE; - GLH_EXT_NAME(glUnlockArraysEXT) = (PFNGLUNLOCKARRAYSEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glUnlockArraysEXT"); - if (NULL == GLH_EXT_NAME(glUnlockArraysEXT)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_depth_bounds_test - if (0 == strcmp(extension, "GL_EXT_depth_bounds_test")) { - GLH_EXT_NAME(glDepthBoundsEXT) = (PFNGLDEPTHBOUNDSEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glDepthBoundsEXT"); - if (NULL == GLH_EXT_NAME(glDepthBoundsEXT)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_draw_range_elements - if (0 == strcmp(extension, "GL_EXT_draw_range_elements")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_fog_coord - if (0 == strcmp(extension, "GL_EXT_fog_coord")) { - GLH_EXT_NAME(glFogCoorddEXT) = (PFNGLFOGCOORDDEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glFogCoorddEXT"); - if (NULL == GLH_EXT_NAME(glFogCoorddEXT)) - return GL_FALSE; - GLH_EXT_NAME(glFogCoorddvEXT) = (PFNGLFOGCOORDDVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glFogCoorddvEXT"); - if (NULL == GLH_EXT_NAME(glFogCoorddvEXT)) - return GL_FALSE; - GLH_EXT_NAME(glFogCoordfEXT) = (PFNGLFOGCOORDFEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glFogCoordfEXT"); - if (NULL == GLH_EXT_NAME(glFogCoordfEXT)) - return GL_FALSE; - GLH_EXT_NAME(glFogCoordfvEXT) = (PFNGLFOGCOORDFVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glFogCoordfvEXT"); - if (NULL == GLH_EXT_NAME(glFogCoordfvEXT)) - return GL_FALSE; - GLH_EXT_NAME(glFogCoordPointerEXT) = (PFNGLFOGCOORDPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glFogCoordPointerEXT"); - if (NULL == GLH_EXT_NAME(glFogCoordPointerEXT)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_framebuffer_object - if (0 == strcmp(extension, "GL_EXT_framebuffer_object")) { - GLH_EXT_NAME(glIsRenderbufferEXT) = (PFNGLISRENDERBUFFEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glIsRenderbufferEXT"); - if (NULL == GLH_EXT_NAME(glIsRenderbufferEXT)) - return GL_FALSE; - GLH_EXT_NAME(glBindRenderbufferEXT) = (PFNGLBINDRENDERBUFFEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glBindRenderbufferEXT"); - if (NULL == GLH_EXT_NAME(glBindRenderbufferEXT)) - return GL_FALSE; - GLH_EXT_NAME(glDeleteRenderbuffersEXT) = (PFNGLDELETERENDERBUFFERSEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glDeleteRenderbuffersEXT"); - if (NULL == GLH_EXT_NAME(glDeleteRenderbuffersEXT)) - return GL_FALSE; - GLH_EXT_NAME(glGenRenderbuffersEXT) = (PFNGLGENRENDERBUFFERSEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glGenRenderbuffersEXT"); - if (NULL == GLH_EXT_NAME(glGenRenderbuffersEXT)) - return GL_FALSE; - GLH_EXT_NAME(glRenderbufferStorageEXT) = (PFNGLRENDERBUFFERSTORAGEEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glRenderbufferStorageEXT"); - if (NULL == GLH_EXT_NAME(glRenderbufferStorageEXT)) - return GL_FALSE; - GLH_EXT_NAME(glGetRenderbufferParameterivEXT) = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glGetRenderbufferParameterivEXT"); - if (NULL == GLH_EXT_NAME(glGetRenderbufferParameterivEXT)) - return GL_FALSE; - GLH_EXT_NAME(glIsFramebufferEXT) = (PFNGLISFRAMEBUFFEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glIsFramebufferEXT"); - if (NULL == GLH_EXT_NAME(glIsFramebufferEXT)) - return GL_FALSE; - GLH_EXT_NAME(glBindFramebufferEXT) = (PFNGLBINDFRAMEBUFFEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glBindFramebufferEXT"); - if (NULL == GLH_EXT_NAME(glBindFramebufferEXT)) - return GL_FALSE; - GLH_EXT_NAME(glDeleteFramebuffersEXT) = (PFNGLDELETEFRAMEBUFFERSEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glDeleteFramebuffersEXT"); - if (NULL == GLH_EXT_NAME(glDeleteFramebuffersEXT)) - return GL_FALSE; - GLH_EXT_NAME(glGenFramebuffersEXT) = (PFNGLGENFRAMEBUFFERSEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glGenFramebuffersEXT"); - if (NULL == GLH_EXT_NAME(glGenFramebuffersEXT)) - return GL_FALSE; - GLH_EXT_NAME(glCheckFramebufferStatusEXT) = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glCheckFramebufferStatusEXT"); - if (NULL == GLH_EXT_NAME(glCheckFramebufferStatusEXT)) - return GL_FALSE; - GLH_EXT_NAME(glFramebufferTexture1DEXT) = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture1DEXT"); - if (NULL == GLH_EXT_NAME(glFramebufferTexture1DEXT)) - return GL_FALSE; - GLH_EXT_NAME(glFramebufferTexture2DEXT) = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture2DEXT"); - if (NULL == GLH_EXT_NAME(glFramebufferTexture2DEXT)) - return GL_FALSE; - GLH_EXT_NAME(glFramebufferTexture3DEXT) = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture3DEXT"); - if (NULL == GLH_EXT_NAME(glFramebufferTexture3DEXT)) - return GL_FALSE; - GLH_EXT_NAME(glFramebufferRenderbufferEXT) = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glFramebufferRenderbufferEXT"); - if (NULL == GLH_EXT_NAME(glFramebufferRenderbufferEXT)) - return GL_FALSE; - GLH_EXT_NAME(glGetFramebufferAttachmentParameterivEXT) = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glGetFramebufferAttachmentParameterivEXT"); - if (NULL == GLH_EXT_NAME(glGetFramebufferAttachmentParameterivEXT)) - return GL_FALSE; - GLH_EXT_NAME(glGenerateMipmapEXT) = (PFNGLGENERATEMIPMAPEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glGenerateMipmapEXT"); - if (NULL == GLH_EXT_NAME(glGenerateMipmapEXT)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_multi_draw_arrays - if (0 == strcmp(extension, "GL_EXT_multi_draw_arrays")) { - GLH_EXT_NAME(glMultiDrawArraysEXT) = (PFNGLMULTIDRAWARRAYSEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiDrawArraysEXT"); - if (NULL == GLH_EXT_NAME(glMultiDrawArraysEXT)) - return GL_FALSE; - GLH_EXT_NAME(glMultiDrawElementsEXT) = (PFNGLMULTIDRAWELEMENTSEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiDrawElementsEXT"); - if (NULL == GLH_EXT_NAME(glMultiDrawElementsEXT)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_light_max_exponent - if (0 == strcmp(extension, "GL_EXT_light_max_exponent")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_packed_pixels - if (0 == strcmp(extension, "GL_EXT_packed_pixels")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_paletted_texture - if (0 == strcmp(extension, "GL_EXT_paletted_texture")) { - GLH_EXT_NAME(glColorSubTableEXT) = (PFNGLCOLORSUBTABLEEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glColorSubTableEXT"); - if (NULL == GLH_EXT_NAME(glColorSubTableEXT)) - return GL_FALSE; - GLH_EXT_NAME(glColorTableEXT) = (PFNGLCOLORTABLEEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glColorTableEXT"); - if (NULL == GLH_EXT_NAME(glColorTableEXT)) - return GL_FALSE; - GLH_EXT_NAME(glGetColorTableEXT) = (PFNGLGETCOLORTABLEEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glGetColorTableEXT"); - if (NULL == GLH_EXT_NAME(glGetColorTableEXT)) - return GL_FALSE; - GLH_EXT_NAME(glGetColorTableParameterfvEXT) = (PFNGLGETCOLORTABLEPARAMETERFVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glGetColorTableParameterfvEXT"); - if (NULL == GLH_EXT_NAME(glGetColorTableParameterfvEXT)) - return GL_FALSE; - GLH_EXT_NAME(glGetColorTableParameterivEXT) = (PFNGLGETCOLORTABLEPARAMETERIVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glGetColorTableParameterivEXT"); - if (NULL == GLH_EXT_NAME(glGetColorTableParameterivEXT)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_pixel_buffer_object - if (0 == strcmp(extension, "GL_EXT_pixel_buffer_object")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_point_parameters - if (0 == strcmp(extension, "GL_EXT_point_parameters")) { - GLH_EXT_NAME(glPointParameterfEXT) = (PFNGLPOINTPARAMETERFEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameterfEXT"); - if (NULL == GLH_EXT_NAME(glPointParameterfEXT)) - return GL_FALSE; - GLH_EXT_NAME(glPointParameterfvEXT) = (PFNGLPOINTPARAMETERFVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameterfvEXT"); - if (NULL == GLH_EXT_NAME(glPointParameterfvEXT)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_rescale_normal - if (0 == strcmp(extension, "GL_EXT_rescale_normal")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_secondary_color - if (0 == strcmp(extension, "GL_EXT_secondary_color")) { - GLH_EXT_NAME(glSecondaryColor3bEXT) = (PFNGLSECONDARYCOLOR3BEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3bEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3bEXT)) - return GL_FALSE; - GLH_EXT_NAME(glSecondaryColor3bvEXT) = (PFNGLSECONDARYCOLOR3BVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3bvEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3bvEXT)) - return GL_FALSE; - GLH_EXT_NAME(glSecondaryColor3dEXT) = (PFNGLSECONDARYCOLOR3DEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3dEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3dEXT)) - return GL_FALSE; - GLH_EXT_NAME(glSecondaryColor3dvEXT) = (PFNGLSECONDARYCOLOR3DVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3dvEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3dvEXT)) - return GL_FALSE; - GLH_EXT_NAME(glSecondaryColor3fEXT) = (PFNGLSECONDARYCOLOR3FEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3fEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3fEXT)) - return GL_FALSE; - GLH_EXT_NAME(glSecondaryColor3fvEXT) = (PFNGLSECONDARYCOLOR3FVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3fvEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3fvEXT)) - return GL_FALSE; - GLH_EXT_NAME(glSecondaryColor3iEXT) = (PFNGLSECONDARYCOLOR3IEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3iEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3iEXT)) - return GL_FALSE; - GLH_EXT_NAME(glSecondaryColor3ivEXT) = (PFNGLSECONDARYCOLOR3IVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3ivEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3ivEXT)) - return GL_FALSE; - GLH_EXT_NAME(glSecondaryColor3sEXT) = (PFNGLSECONDARYCOLOR3SEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3sEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3sEXT)) - return GL_FALSE; - GLH_EXT_NAME(glSecondaryColor3svEXT) = (PFNGLSECONDARYCOLOR3SVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3svEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3svEXT)) - return GL_FALSE; - GLH_EXT_NAME(glSecondaryColor3ubEXT) = (PFNGLSECONDARYCOLOR3UBEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3ubEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3ubEXT)) - return GL_FALSE; - GLH_EXT_NAME(glSecondaryColor3ubvEXT) = (PFNGLSECONDARYCOLOR3UBVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3ubvEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3ubvEXT)) - return GL_FALSE; - GLH_EXT_NAME(glSecondaryColor3uiEXT) = (PFNGLSECONDARYCOLOR3UIEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3uiEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3uiEXT)) - return GL_FALSE; - GLH_EXT_NAME(glSecondaryColor3uivEXT) = (PFNGLSECONDARYCOLOR3UIVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3uivEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3uivEXT)) - return GL_FALSE; - GLH_EXT_NAME(glSecondaryColor3usEXT) = (PFNGLSECONDARYCOLOR3USEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3usEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3usEXT)) - return GL_FALSE; - GLH_EXT_NAME(glSecondaryColor3usvEXT) = (PFNGLSECONDARYCOLOR3USVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3usvEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3usvEXT)) - return GL_FALSE; - GLH_EXT_NAME(glSecondaryColorPointerEXT) = (PFNGLSECONDARYCOLORPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColorPointerEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColorPointerEXT)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_separate_specular_color - if (0 == strcmp(extension, "GL_EXT_separate_specular_color")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_shadow_funcs - if (0 == strcmp(extension, "GL_EXT_shadow_funcs")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_shared_texture_palette - if (0 == strcmp(extension, "GL_EXT_shared_texture_palette")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_stencil_two_side - if (0 == strcmp(extension, "GL_EXT_stencil_two_side")) { - GLH_EXT_NAME(glActiveStencilFaceEXT) = (PFNGLACTIVESTENCILFACEEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glActiveStencilFaceEXT"); - if (NULL == GLH_EXT_NAME(glActiveStencilFaceEXT)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_stencil_wrap - if (0 == strcmp(extension, "GL_EXT_stencil_wrap")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_texture_compression_s3tc - if (0 == strcmp(extension, "GL_EXT_texture_compression_s3tc")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_texture_cube_map - if (0 == strcmp(extension, "GL_EXT_texture_cube_map")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_texture_edge_clamp - if (0 == strcmp(extension, "GL_EXT_texture_edge_clamp")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_texture_env_add - if (0 == strcmp(extension, "GL_EXT_texture_env_add")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_texture_env_combine - if (0 == strcmp(extension, "GL_EXT_texture_env_combine")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_texture_env_dot3 - if (0 == strcmp(extension, "GL_EXT_texture_env_dot3")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_texture_filter_anisotropic - if (0 == strcmp(extension, "GL_EXT_texture_filter_anisotropic")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_texture_lod_bias - if (0 == strcmp(extension, "GL_EXT_texture_lod_bias")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_texture_object - if (0 == strcmp(extension, "GL_EXT_texture_object")) { - GLH_EXT_NAME(glAreTexturesResidentEXT) = (PFNGLARETEXTURESRESIDENTEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glAreTexturesResidentEXT"); - if (NULL == GLH_EXT_NAME(glAreTexturesResidentEXT)) - return GL_FALSE; - GLH_EXT_NAME(glBindTextureEXT) = (PFNGLBINDTEXTUREEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glBindTextureEXT"); - if (NULL == GLH_EXT_NAME(glBindTextureEXT)) - return GL_FALSE; - GLH_EXT_NAME(glDeleteTexturesEXT) = (PFNGLDELETETEXTURESEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glDeleteTexturesEXT"); - if (NULL == GLH_EXT_NAME(glDeleteTexturesEXT)) - return GL_FALSE; - GLH_EXT_NAME(glGenTexturesEXT) = (PFNGLGENTEXTURESEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glGenTexturesEXT"); - if (NULL == GLH_EXT_NAME(glGenTexturesEXT)) - return GL_FALSE; - GLH_EXT_NAME(glIsTextureEXT) = (PFNGLISTEXTUREEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glIsTextureEXT"); - if (NULL == GLH_EXT_NAME(glIsTextureEXT)) - return GL_FALSE; - GLH_EXT_NAME(glPrioritizeTexturesEXT) = (PFNGLPRIORITIZETEXTURESEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glPrioritizeTexturesEXT"); - if (NULL == GLH_EXT_NAME(glPrioritizeTexturesEXT)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_texture_rectangle - if (0 == strcmp(extension, "GL_EXT_texture_rectangle")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_texture3D - if (0 == strcmp(extension, "GL_EXT_texture3D")) { - GLH_EXT_NAME(glTexImage3DEXT) = (PFNGLTEXIMAGE3DEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glTexImage3DEXT"); - if (NULL == GLH_EXT_NAME(glTexImage3DEXT)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_vertex_array - if (0 == strcmp(extension, "GL_EXT_vertex_array")) { - GLH_EXT_NAME(glArrayElementEXT) = (PFNGLARRAYELEMENTEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glArrayElementEXT"); - if (NULL == GLH_EXT_NAME(glArrayElementEXT)) - return GL_FALSE; - GLH_EXT_NAME(glColorPointerEXT) = (PFNGLCOLORPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glColorPointerEXT"); - if (NULL == GLH_EXT_NAME(glColorPointerEXT)) - return GL_FALSE; - GLH_EXT_NAME(glEdgeFlagPointerEXT) = (PFNGLEDGEFLAGPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glEdgeFlagPointerEXT"); - if (NULL == GLH_EXT_NAME(glEdgeFlagPointerEXT)) - return GL_FALSE; - GLH_EXT_NAME(glGetPointervEXT) = (PFNGLGETPOINTERVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glGetPointervEXT"); - if (NULL == GLH_EXT_NAME(glGetPointervEXT)) - return GL_FALSE; - GLH_EXT_NAME(glIndexPointerEXT) = (PFNGLINDEXPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glIndexPointerEXT"); - if (NULL == GLH_EXT_NAME(glIndexPointerEXT)) - return GL_FALSE; - GLH_EXT_NAME(glNormalPointerEXT) = (PFNGLNORMALPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glNormalPointerEXT"); - if (NULL == GLH_EXT_NAME(glNormalPointerEXT)) - return GL_FALSE; - GLH_EXT_NAME(glTexCoordPointerEXT) = (PFNGLTEXCOORDPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glTexCoordPointerEXT"); - if (NULL == GLH_EXT_NAME(glTexCoordPointerEXT)) - return GL_FALSE; - GLH_EXT_NAME(glVertexPointerEXT) = (PFNGLVERTEXPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexPointerEXT"); - if (NULL == GLH_EXT_NAME(glVertexPointerEXT)) - return GL_FALSE; - GLH_EXT_NAME(glDrawArraysEXT) = (PFNGLDRAWARRAYSEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glDrawArraysEXT"); - if (NULL == GLH_EXT_NAME(glDrawArraysEXT)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_EXT_vertex_weighting - if (0 == strcmp(extension, "GL_EXT_vertex_weighting")) { - GLH_EXT_NAME(glVertexWeightfEXT) = (PFNGLVERTEXWEIGHTFEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexWeightfEXT"); - if (NULL == GLH_EXT_NAME(glVertexWeightfEXT)) - return GL_FALSE; - GLH_EXT_NAME(glVertexWeightfvEXT) = (PFNGLVERTEXWEIGHTFVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexWeightfvEXT"); - if (NULL == GLH_EXT_NAME(glVertexWeightfvEXT)) - return GL_FALSE; - GLH_EXT_NAME(glVertexWeightPointerEXT) = (PFNGLVERTEXWEIGHTPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexWeightPointerEXT"); - if (NULL == GLH_EXT_NAME(glVertexWeightPointerEXT)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_HP_occlusion_test - if (0 == strcmp(extension, "GL_HP_occlusion_test")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_IBM_texture_mirrored_repeat - if (0 == strcmp(extension, "GL_IBM_texture_mirrored_repeat")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_blend_square - if (0 == strcmp(extension, "GL_NV_blend_square")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_copy_depth_to_color - if (0 == strcmp(extension, "GL_NV_copy_depth_to_color")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_depth_clamp - if (0 == strcmp(extension, "GL_NV_depth_clamp")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_element_array - if (0 == strcmp(extension, "GL_NV_element_array")) { - GLH_EXT_NAME(glElementPointerNV) = (PFNGLELEMENTPOINTERNVPROC)GLH_EXT_GET_PROC_ADDRESS("glElementPointerNV"); - if (NULL == GLH_EXT_NAME(glElementPointerNV)) - return GL_FALSE; - GLH_EXT_NAME(glDrawElementArrayNV) = (PFNGLDRAWELEMENTARRAYNVPROC)GLH_EXT_GET_PROC_ADDRESS("glDrawElementArrayNV"); - if (NULL == GLH_EXT_NAME(glDrawElementArrayNV)) - return GL_FALSE; - GLH_EXT_NAME(glDrawRangeElementArrayNV) = (PFNGLDRAWRANGEELEMENTARRAYNVPROC)GLH_EXT_GET_PROC_ADDRESS("glDrawRangeElementArrayNV"); - if (NULL == GLH_EXT_NAME(glDrawRangeElementArrayNV)) - return GL_FALSE; - GLH_EXT_NAME(glMultiDrawElementArrayNV) = (PFNGLMULTIDRAWELEMENTARRAYNVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiDrawElementArrayNV"); - if (NULL == GLH_EXT_NAME(glMultiDrawElementArrayNV)) - return GL_FALSE; - GLH_EXT_NAME(glMultiDrawRangeElementArrayNV) = (PFNGLMULTIDRAWRANGEELEMENTARRAYNVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiDrawRangeElementArrayNV"); - if (NULL == GLH_EXT_NAME(glMultiDrawRangeElementArrayNV)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_fence - if (0 == strcmp(extension, "GL_NV_fence")) { - GLH_EXT_NAME(glGenFencesNV) = (PFNGLGENFENCESNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGenFencesNV"); - if (NULL == GLH_EXT_NAME(glGenFencesNV)) - return GL_FALSE; - GLH_EXT_NAME(glDeleteFencesNV) = (PFNGLDELETEFENCESNVPROC)GLH_EXT_GET_PROC_ADDRESS("glDeleteFencesNV"); - if (NULL == GLH_EXT_NAME(glDeleteFencesNV)) - return GL_FALSE; - GLH_EXT_NAME(glSetFenceNV) = (PFNGLSETFENCENVPROC)GLH_EXT_GET_PROC_ADDRESS("glSetFenceNV"); - if (NULL == GLH_EXT_NAME(glSetFenceNV)) - return GL_FALSE; - GLH_EXT_NAME(glTestFenceNV) = (PFNGLTESTFENCENVPROC)GLH_EXT_GET_PROC_ADDRESS("glTestFenceNV"); - if (NULL == GLH_EXT_NAME(glTestFenceNV)) - return GL_FALSE; - GLH_EXT_NAME(glFinishFenceNV) = (PFNGLFINISHFENCENVPROC)GLH_EXT_GET_PROC_ADDRESS("glFinishFenceNV"); - if (NULL == GLH_EXT_NAME(glFinishFenceNV)) - return GL_FALSE; - GLH_EXT_NAME(glIsFenceNV) = (PFNGLISFENCENVPROC)GLH_EXT_GET_PROC_ADDRESS("glIsFenceNV"); - if (NULL == GLH_EXT_NAME(glIsFenceNV)) - return GL_FALSE; - GLH_EXT_NAME(glGetFenceivNV) = (PFNGLGETFENCEIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetFenceivNV"); - if (NULL == GLH_EXT_NAME(glGetFenceivNV)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_float_buffer - if (0 == strcmp(extension, "GL_NV_float_buffer")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_fog_distance - if (0 == strcmp(extension, "GL_NV_fog_distance")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_fragment_program - if (0 == strcmp(extension, "GL_NV_fragment_program")) { - GLH_EXT_NAME(glProgramNamedParameter4fNV) = (PFNGLPROGRAMNAMEDPARAMETER4FNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramNamedParameter4fNV"); - if (NULL == GLH_EXT_NAME(glProgramNamedParameter4fNV)) - return GL_FALSE; - GLH_EXT_NAME(glProgramNamedParameter4dNV) = (PFNGLPROGRAMNAMEDPARAMETER4DNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramNamedParameter4dNV"); - if (NULL == GLH_EXT_NAME(glProgramNamedParameter4dNV)) - return GL_FALSE; - GLH_EXT_NAME(glProgramNamedParameter4fvNV) = (PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramNamedParameter4fvNV"); - if (NULL == GLH_EXT_NAME(glProgramNamedParameter4fvNV)) - return GL_FALSE; - GLH_EXT_NAME(glProgramNamedParameter4dvNV) = (PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramNamedParameter4dvNV"); - if (NULL == GLH_EXT_NAME(glProgramNamedParameter4dvNV)) - return GL_FALSE; - GLH_EXT_NAME(glGetProgramNamedParameterfvNV) = (PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramNamedParameterfvNV"); - if (NULL == GLH_EXT_NAME(glGetProgramNamedParameterfvNV)) - return GL_FALSE; - GLH_EXT_NAME(glGetProgramNamedParameterdvNV) = (PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramNamedParameterdvNV"); - if (NULL == GLH_EXT_NAME(glGetProgramNamedParameterdvNV)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_fragment_program2 - if (0 == strcmp(extension, "GL_NV_fragment_program2")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_half_float - if (0 == strcmp(extension, "GL_NV_half_float")) { - GLH_EXT_NAME(glVertex2hNV) = (PFNGLVERTEX2HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertex2hNV"); - if (NULL == GLH_EXT_NAME(glVertex2hNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertex2hvNV) = (PFNGLVERTEX2HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertex2hvNV"); - if (NULL == GLH_EXT_NAME(glVertex2hvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertex3hNV) = (PFNGLVERTEX3HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertex3hNV"); - if (NULL == GLH_EXT_NAME(glVertex3hNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertex3hvNV) = (PFNGLVERTEX3HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertex3hvNV"); - if (NULL == GLH_EXT_NAME(glVertex3hvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertex4hNV) = (PFNGLVERTEX4HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertex4hNV"); - if (NULL == GLH_EXT_NAME(glVertex4hNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertex4hvNV) = (PFNGLVERTEX4HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertex4hvNV"); - if (NULL == GLH_EXT_NAME(glVertex4hvNV)) - return GL_FALSE; - GLH_EXT_NAME(glNormal3hNV) = (PFNGLNORMAL3HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glNormal3hNV"); - if (NULL == GLH_EXT_NAME(glNormal3hNV)) - return GL_FALSE; - GLH_EXT_NAME(glNormal3hvNV) = (PFNGLNORMAL3HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glNormal3hvNV"); - if (NULL == GLH_EXT_NAME(glNormal3hvNV)) - return GL_FALSE; - GLH_EXT_NAME(glColor3hNV) = (PFNGLCOLOR3HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glColor3hNV"); - if (NULL == GLH_EXT_NAME(glColor3hNV)) - return GL_FALSE; - GLH_EXT_NAME(glColor3hvNV) = (PFNGLCOLOR3HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glColor3hvNV"); - if (NULL == GLH_EXT_NAME(glColor3hvNV)) - return GL_FALSE; - GLH_EXT_NAME(glColor4hNV) = (PFNGLCOLOR4HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glColor4hNV"); - if (NULL == GLH_EXT_NAME(glColor4hNV)) - return GL_FALSE; - GLH_EXT_NAME(glColor4hvNV) = (PFNGLCOLOR4HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glColor4hvNV"); - if (NULL == GLH_EXT_NAME(glColor4hvNV)) - return GL_FALSE; - GLH_EXT_NAME(glTexCoord1hNV) = (PFNGLTEXCOORD1HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glTexCoord1hNV"); - if (NULL == GLH_EXT_NAME(glTexCoord1hNV)) - return GL_FALSE; - GLH_EXT_NAME(glTexCoord1hvNV) = (PFNGLTEXCOORD1HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glTexCoord1hvNV"); - if (NULL == GLH_EXT_NAME(glTexCoord1hvNV)) - return GL_FALSE; - GLH_EXT_NAME(glTexCoord2hNV) = (PFNGLTEXCOORD2HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glTexCoord2hNV"); - if (NULL == GLH_EXT_NAME(glTexCoord2hNV)) - return GL_FALSE; - GLH_EXT_NAME(glTexCoord2hvNV) = (PFNGLTEXCOORD2HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glTexCoord2hvNV"); - if (NULL == GLH_EXT_NAME(glTexCoord2hvNV)) - return GL_FALSE; - GLH_EXT_NAME(glTexCoord3hNV) = (PFNGLTEXCOORD3HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glTexCoord3hNV"); - if (NULL == GLH_EXT_NAME(glTexCoord3hNV)) - return GL_FALSE; - GLH_EXT_NAME(glTexCoord3hvNV) = (PFNGLTEXCOORD3HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glTexCoord3hvNV"); - if (NULL == GLH_EXT_NAME(glTexCoord3hvNV)) - return GL_FALSE; - GLH_EXT_NAME(glTexCoord4hNV) = (PFNGLTEXCOORD4HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glTexCoord4hNV"); - if (NULL == GLH_EXT_NAME(glTexCoord4hNV)) - return GL_FALSE; - GLH_EXT_NAME(glTexCoord4hvNV) = (PFNGLTEXCOORD4HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glTexCoord4hvNV"); - if (NULL == GLH_EXT_NAME(glTexCoord4hvNV)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord1hNV) = (PFNGLMULTITEXCOORD1HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1hNV"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord1hNV)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord1hvNV) = (PFNGLMULTITEXCOORD1HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1hvNV"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord1hvNV)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord2hNV) = (PFNGLMULTITEXCOORD2HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2hNV"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord2hNV)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord2hvNV) = (PFNGLMULTITEXCOORD2HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2hvNV"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord2hvNV)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord3hNV) = (PFNGLMULTITEXCOORD3HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3hNV"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord3hNV)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord3hvNV) = (PFNGLMULTITEXCOORD3HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3hvNV"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord3hvNV)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord4hNV) = (PFNGLMULTITEXCOORD4HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4hNV"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord4hNV)) - return GL_FALSE; - GLH_EXT_NAME(glMultiTexCoord4hvNV) = (PFNGLMULTITEXCOORD4HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4hvNV"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord4hvNV)) - return GL_FALSE; - GLH_EXT_NAME(glFogCoordhNV) = (PFNGLFOGCOORDHNVPROC)GLH_EXT_GET_PROC_ADDRESS("glFogCoordhNV"); - if (NULL == GLH_EXT_NAME(glFogCoordhNV)) - return GL_FALSE; - GLH_EXT_NAME(glFogCoordhvNV) = (PFNGLFOGCOORDHVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glFogCoordhvNV"); - if (NULL == GLH_EXT_NAME(glFogCoordhvNV)) - return GL_FALSE; - GLH_EXT_NAME(glSecondaryColor3hNV) = (PFNGLSECONDARYCOLOR3HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3hNV"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3hNV)) - return GL_FALSE; - GLH_EXT_NAME(glSecondaryColor3hvNV) = (PFNGLSECONDARYCOLOR3HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3hvNV"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3hvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib1hNV) = (PFNGLVERTEXATTRIB1HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1hNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1hNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib1hvNV) = (PFNGLVERTEXATTRIB1HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1hvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1hvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib2hNV) = (PFNGLVERTEXATTRIB2HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2hNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2hNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib2hvNV) = (PFNGLVERTEXATTRIB2HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2hvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2hvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib3hNV) = (PFNGLVERTEXATTRIB3HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3hNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3hNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib3hvNV) = (PFNGLVERTEXATTRIB3HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3hvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3hvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4hNV) = (PFNGLVERTEXATTRIB4HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4hNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4hNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4hvNV) = (PFNGLVERTEXATTRIB4HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4hvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4hvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttribs1hvNV) = (PFNGLVERTEXATTRIBS1HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs1hvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs1hvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttribs2hvNV) = (PFNGLVERTEXATTRIBS2HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs2hvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs2hvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttribs3hvNV) = (PFNGLVERTEXATTRIBS3HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs3hvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs3hvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttribs4hvNV) = (PFNGLVERTEXATTRIBS4HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs4hvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs4hvNV)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_light_max_exponent - if (0 == strcmp(extension, "GL_NV_light_max_exponent")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_multisample_filter_hint - if (0 == strcmp(extension, "GL_NV_multisample_filter_hint")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_occlusion_query - if (0 == strcmp(extension, "GL_NV_occlusion_query")) { - GLH_EXT_NAME(glGenOcclusionQueriesNV) = (PFNGLGENOCCLUSIONQUERIESNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGenOcclusionQueriesNV"); - if (NULL == GLH_EXT_NAME(glGenOcclusionQueriesNV)) - return GL_FALSE; - GLH_EXT_NAME(glDeleteOcclusionQueriesNV) = (PFNGLDELETEOCCLUSIONQUERIESNVPROC)GLH_EXT_GET_PROC_ADDRESS("glDeleteOcclusionQueriesNV"); - if (NULL == GLH_EXT_NAME(glDeleteOcclusionQueriesNV)) - return GL_FALSE; - GLH_EXT_NAME(glIsOcclusionQueryNV) = (PFNGLISOCCLUSIONQUERYNVPROC)GLH_EXT_GET_PROC_ADDRESS("glIsOcclusionQueryNV"); - if (NULL == GLH_EXT_NAME(glIsOcclusionQueryNV)) - return GL_FALSE; - GLH_EXT_NAME(glBeginOcclusionQueryNV) = (PFNGLBEGINOCCLUSIONQUERYNVPROC)GLH_EXT_GET_PROC_ADDRESS("glBeginOcclusionQueryNV"); - if (NULL == GLH_EXT_NAME(glBeginOcclusionQueryNV)) - return GL_FALSE; - GLH_EXT_NAME(glEndOcclusionQueryNV) = (PFNGLENDOCCLUSIONQUERYNVPROC)GLH_EXT_GET_PROC_ADDRESS("glEndOcclusionQueryNV"); - if (NULL == GLH_EXT_NAME(glEndOcclusionQueryNV)) - return GL_FALSE; - GLH_EXT_NAME(glGetOcclusionQueryivNV) = (PFNGLGETOCCLUSIONQUERYIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetOcclusionQueryivNV"); - if (NULL == GLH_EXT_NAME(glGetOcclusionQueryivNV)) - return GL_FALSE; - GLH_EXT_NAME(glGetOcclusionQueryuivNV) = (PFNGLGETOCCLUSIONQUERYUIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetOcclusionQueryuivNV"); - if (NULL == GLH_EXT_NAME(glGetOcclusionQueryuivNV)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_packed_depth_stencil - if (0 == strcmp(extension, "GL_NV_packed_depth_stencil")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_pixel_buffer_object - if (0 == strcmp(extension, "GL_NV_pixel_buffer_object")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_pixel_data_range - if (0 == strcmp(extension, "GL_NV_pixel_data_range")) { - GLH_EXT_NAME(glPixelDataRangeNV) = (PFNGLPIXELDATARANGENVPROC)GLH_EXT_GET_PROC_ADDRESS("glPixelDataRangeNV"); - if (NULL == GLH_EXT_NAME(glPixelDataRangeNV)) - return GL_FALSE; - GLH_EXT_NAME(glFlushPixelDataRangeNV) = (PFNGLFLUSHPIXELDATARANGENVPROC)GLH_EXT_GET_PROC_ADDRESS("glFlushPixelDataRangeNV"); - if (NULL == GLH_EXT_NAME(glFlushPixelDataRangeNV)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_point_sprite - if (0 == strcmp(extension, "GL_NV_point_sprite")) { - GLH_EXT_NAME(glPointParameteriNV) = (PFNGLPOINTPARAMETERINVPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameteriNV"); - if (NULL == GLH_EXT_NAME(glPointParameteriNV)) - return GL_FALSE; - GLH_EXT_NAME(glPointParameterivNV) = (PFNGLPOINTPARAMETERIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameterivNV"); - if (NULL == GLH_EXT_NAME(glPointParameterivNV)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_primitive_restart - if (0 == strcmp(extension, "GL_NV_primitive_restart")) { - GLH_EXT_NAME(glPrimitiveRestartNV) = (PFNGLPRIMITIVERESTARTNVPROC)GLH_EXT_GET_PROC_ADDRESS("glPrimitiveRestartNV"); - if (NULL == GLH_EXT_NAME(glPrimitiveRestartNV)) - return GL_FALSE; - GLH_EXT_NAME(glPrimitiveRestartIndexNV) = (PFNGLPRIMITIVERESTARTINDEXNVPROC)GLH_EXT_GET_PROC_ADDRESS("glPrimitiveRestartIndexNV"); - if (NULL == GLH_EXT_NAME(glPrimitiveRestartIndexNV)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_register_combiners - if (0 == strcmp(extension, "GL_NV_register_combiners")) { - GLH_EXT_NAME(glCombinerParameterfvNV) = (PFNGLCOMBINERPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glCombinerParameterfvNV"); - if (NULL == GLH_EXT_NAME(glCombinerParameterfvNV)) - return GL_FALSE; - GLH_EXT_NAME(glCombinerParameterfNV) = (PFNGLCOMBINERPARAMETERFNVPROC)GLH_EXT_GET_PROC_ADDRESS("glCombinerParameterfNV"); - if (NULL == GLH_EXT_NAME(glCombinerParameterfNV)) - return GL_FALSE; - GLH_EXT_NAME(glCombinerParameterivNV) = (PFNGLCOMBINERPARAMETERIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glCombinerParameterivNV"); - if (NULL == GLH_EXT_NAME(glCombinerParameterivNV)) - return GL_FALSE; - GLH_EXT_NAME(glCombinerParameteriNV) = (PFNGLCOMBINERPARAMETERINVPROC)GLH_EXT_GET_PROC_ADDRESS("glCombinerParameteriNV"); - if (NULL == GLH_EXT_NAME(glCombinerParameteriNV)) - return GL_FALSE; - GLH_EXT_NAME(glCombinerInputNV) = (PFNGLCOMBINERINPUTNVPROC)GLH_EXT_GET_PROC_ADDRESS("glCombinerInputNV"); - if (NULL == GLH_EXT_NAME(glCombinerInputNV)) - return GL_FALSE; - GLH_EXT_NAME(glCombinerOutputNV) = (PFNGLCOMBINEROUTPUTNVPROC)GLH_EXT_GET_PROC_ADDRESS("glCombinerOutputNV"); - if (NULL == GLH_EXT_NAME(glCombinerOutputNV)) - return GL_FALSE; - GLH_EXT_NAME(glFinalCombinerInputNV) = (PFNGLFINALCOMBINERINPUTNVPROC)GLH_EXT_GET_PROC_ADDRESS("glFinalCombinerInputNV"); - if (NULL == GLH_EXT_NAME(glFinalCombinerInputNV)) - return GL_FALSE; - GLH_EXT_NAME(glGetCombinerInputParameterfvNV) = (PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetCombinerInputParameterfvNV"); - if (NULL == GLH_EXT_NAME(glGetCombinerInputParameterfvNV)) - return GL_FALSE; - GLH_EXT_NAME(glGetCombinerInputParameterivNV) = (PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetCombinerInputParameterivNV"); - if (NULL == GLH_EXT_NAME(glGetCombinerInputParameterivNV)) - return GL_FALSE; - GLH_EXT_NAME(glGetCombinerOutputParameterfvNV) = (PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetCombinerOutputParameterfvNV"); - if (NULL == GLH_EXT_NAME(glGetCombinerOutputParameterfvNV)) - return GL_FALSE; - GLH_EXT_NAME(glGetCombinerOutputParameterivNV) = (PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetCombinerOutputParameterivNV"); - if (NULL == GLH_EXT_NAME(glGetCombinerOutputParameterivNV)) - return GL_FALSE; - GLH_EXT_NAME(glGetFinalCombinerInputParameterfvNV) = (PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetFinalCombinerInputParameterfvNV"); - if (NULL == GLH_EXT_NAME(glGetFinalCombinerInputParameterfvNV)) - return GL_FALSE; - GLH_EXT_NAME(glGetFinalCombinerInputParameterivNV) = (PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetFinalCombinerInputParameterivNV"); - if (NULL == GLH_EXT_NAME(glGetFinalCombinerInputParameterivNV)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_register_combiners2 - if (0 == strcmp(extension, "GL_NV_register_combiners2")) { - GLH_EXT_NAME(glCombinerStageParameterfvNV) = (PFNGLCOMBINERSTAGEPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glCombinerStageParameterfvNV"); - if (NULL == GLH_EXT_NAME(glCombinerStageParameterfvNV)) - return GL_FALSE; - GLH_EXT_NAME(glGetCombinerStageParameterfvNV) = (PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetCombinerStageParameterfvNV"); - if (NULL == GLH_EXT_NAME(glGetCombinerStageParameterfvNV)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_stencil_two_side - if (0 == strcmp(extension, "GL_NV_stencil_two_side")) { - GLH_EXT_NAME(glActiveStencilFaceNV) = (PFNGLACTIVESTENCILFACENVPROC)GLH_EXT_GET_PROC_ADDRESS("glActiveStencilFaceNV"); - if (NULL == GLH_EXT_NAME(glActiveStencilFaceNV)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_texgen_reflection - if (0 == strcmp(extension, "GL_NV_texgen_reflection")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_texture_compression_vtc - if (0 == strcmp(extension, "GL_NV_texture_compression_vtc")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_texture_env_combine4 - if (0 == strcmp(extension, "GL_NV_texture_env_combine4")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_texture_expand_normal - if (0 == strcmp(extension, "GL_NV_texture_expand_normal")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_texture_rectangle - if (0 == strcmp(extension, "GL_NV_texture_rectangle")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_texture_shader - if (0 == strcmp(extension, "GL_NV_texture_shader")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_texture_shader2 - if (0 == strcmp(extension, "GL_NV_texture_shader2")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_texture_shader3 - if (0 == strcmp(extension, "GL_NV_texture_shader3")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_vertex_array_range - if (0 == strcmp(extension, "GL_NV_vertex_array_range")) { - GLH_EXT_NAME(glFlushVertexArrayRangeNV) = (PFNGLFLUSHVERTEXARRAYRANGENVPROC)GLH_EXT_GET_PROC_ADDRESS("glFlushVertexArrayRangeNV"); - if (NULL == GLH_EXT_NAME(glFlushVertexArrayRangeNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexArrayRangeNV) = (PFNGLVERTEXARRAYRANGENVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexArrayRangeNV"); - if (NULL == GLH_EXT_NAME(glVertexArrayRangeNV)) - return GL_FALSE; -# ifdef _WIN32 - GLH_EXT_NAME(wglAllocateMemoryNV) = (PFNWGLALLOCATEMEMORYNVPROC)GLH_EXT_GET_PROC_ADDRESS("wglAllocateMemoryNV"); - if (NULL == GLH_EXT_NAME(wglAllocateMemoryNV)) - return GL_FALSE; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXT_NAME(glXAllocateMemoryNV) = (PFNGLXALLOCATEMEMORYNVPROC)GLH_EXT_GET_PROC_ADDRESS("glXAllocateMemoryNV"); - if (NULL == GLH_EXT_NAME(glXAllocateMemoryNV)) - return GL_FALSE; -# endif -# ifdef _WIN32 - GLH_EXT_NAME(wglFreeMemoryNV) = (PFNWGLFREEMEMORYNVPROC)GLH_EXT_GET_PROC_ADDRESS("wglFreeMemoryNV"); - if (NULL == GLH_EXT_NAME(wglFreeMemoryNV)) - return GL_FALSE; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXT_NAME(glXFreeMemoryNV) = (PFNGLXFREEMEMORYNVPROC)GLH_EXT_GET_PROC_ADDRESS("glXFreeMemoryNV"); - if (NULL == GLH_EXT_NAME(glXFreeMemoryNV)) - return GL_FALSE; -# endif - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_vertex_array_range2 - if (0 == strcmp(extension, "GL_NV_vertex_array_range2")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_vertex_program - if (0 == strcmp(extension, "GL_NV_vertex_program")) { - GLH_EXT_NAME(glAreProgramsResidentNV) = (PFNGLAREPROGRAMSRESIDENTNVPROC)GLH_EXT_GET_PROC_ADDRESS("glAreProgramsResidentNV"); - if (NULL == GLH_EXT_NAME(glAreProgramsResidentNV)) - return GL_FALSE; - GLH_EXT_NAME(glBindProgramNV) = (PFNGLBINDPROGRAMNVPROC)GLH_EXT_GET_PROC_ADDRESS("glBindProgramNV"); - if (NULL == GLH_EXT_NAME(glBindProgramNV)) - return GL_FALSE; - GLH_EXT_NAME(glDeleteProgramsNV) = (PFNGLDELETEPROGRAMSNVPROC)GLH_EXT_GET_PROC_ADDRESS("glDeleteProgramsNV"); - if (NULL == GLH_EXT_NAME(glDeleteProgramsNV)) - return GL_FALSE; - GLH_EXT_NAME(glExecuteProgramNV) = (PFNGLEXECUTEPROGRAMNVPROC)GLH_EXT_GET_PROC_ADDRESS("glExecuteProgramNV"); - if (NULL == GLH_EXT_NAME(glExecuteProgramNV)) - return GL_FALSE; - GLH_EXT_NAME(glGenProgramsNV) = (PFNGLGENPROGRAMSNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGenProgramsNV"); - if (NULL == GLH_EXT_NAME(glGenProgramsNV)) - return GL_FALSE; - GLH_EXT_NAME(glGetProgramParameterdvNV) = (PFNGLGETPROGRAMPARAMETERDVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramParameterdvNV"); - if (NULL == GLH_EXT_NAME(glGetProgramParameterdvNV)) - return GL_FALSE; - GLH_EXT_NAME(glGetProgramParameterfvNV) = (PFNGLGETPROGRAMPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramParameterfvNV"); - if (NULL == GLH_EXT_NAME(glGetProgramParameterfvNV)) - return GL_FALSE; - GLH_EXT_NAME(glGetProgramivNV) = (PFNGLGETPROGRAMIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramivNV"); - if (NULL == GLH_EXT_NAME(glGetProgramivNV)) - return GL_FALSE; - GLH_EXT_NAME(glGetProgramStringNV) = (PFNGLGETPROGRAMSTRINGNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramStringNV"); - if (NULL == GLH_EXT_NAME(glGetProgramStringNV)) - return GL_FALSE; - GLH_EXT_NAME(glGetTrackMatrixivNV) = (PFNGLGETTRACKMATRIXIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetTrackMatrixivNV"); - if (NULL == GLH_EXT_NAME(glGetTrackMatrixivNV)) - return GL_FALSE; - GLH_EXT_NAME(glGetVertexAttribdvNV) = (PFNGLGETVERTEXATTRIBDVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribdvNV"); - if (NULL == GLH_EXT_NAME(glGetVertexAttribdvNV)) - return GL_FALSE; - GLH_EXT_NAME(glGetVertexAttribfvNV) = (PFNGLGETVERTEXATTRIBFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribfvNV"); - if (NULL == GLH_EXT_NAME(glGetVertexAttribfvNV)) - return GL_FALSE; - GLH_EXT_NAME(glGetVertexAttribivNV) = (PFNGLGETVERTEXATTRIBIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribivNV"); - if (NULL == GLH_EXT_NAME(glGetVertexAttribivNV)) - return GL_FALSE; - GLH_EXT_NAME(glGetVertexAttribPointervNV) = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribPointervNV"); - if (NULL == GLH_EXT_NAME(glGetVertexAttribPointervNV)) - return GL_FALSE; - GLH_EXT_NAME(glIsProgramNV) = (PFNGLISPROGRAMNVPROC)GLH_EXT_GET_PROC_ADDRESS("glIsProgramNV"); - if (NULL == GLH_EXT_NAME(glIsProgramNV)) - return GL_FALSE; - GLH_EXT_NAME(glLoadProgramNV) = (PFNGLLOADPROGRAMNVPROC)GLH_EXT_GET_PROC_ADDRESS("glLoadProgramNV"); - if (NULL == GLH_EXT_NAME(glLoadProgramNV)) - return GL_FALSE; - GLH_EXT_NAME(glProgramParameter4dNV) = (PFNGLPROGRAMPARAMETER4DNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramParameter4dNV"); - if (NULL == GLH_EXT_NAME(glProgramParameter4dNV)) - return GL_FALSE; - GLH_EXT_NAME(glProgramParameter4dvNV) = (PFNGLPROGRAMPARAMETER4DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramParameter4dvNV"); - if (NULL == GLH_EXT_NAME(glProgramParameter4dvNV)) - return GL_FALSE; - GLH_EXT_NAME(glProgramParameter4fNV) = (PFNGLPROGRAMPARAMETER4FNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramParameter4fNV"); - if (NULL == GLH_EXT_NAME(glProgramParameter4fNV)) - return GL_FALSE; - GLH_EXT_NAME(glProgramParameter4fvNV) = (PFNGLPROGRAMPARAMETER4FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramParameter4fvNV"); - if (NULL == GLH_EXT_NAME(glProgramParameter4fvNV)) - return GL_FALSE; - GLH_EXT_NAME(glProgramParameters4dvNV) = (PFNGLPROGRAMPARAMETERS4DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramParameters4dvNV"); - if (NULL == GLH_EXT_NAME(glProgramParameters4dvNV)) - return GL_FALSE; - GLH_EXT_NAME(glProgramParameters4fvNV) = (PFNGLPROGRAMPARAMETERS4FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramParameters4fvNV"); - if (NULL == GLH_EXT_NAME(glProgramParameters4fvNV)) - return GL_FALSE; - GLH_EXT_NAME(glRequestResidentProgramsNV) = (PFNGLREQUESTRESIDENTPROGRAMSNVPROC)GLH_EXT_GET_PROC_ADDRESS("glRequestResidentProgramsNV"); - if (NULL == GLH_EXT_NAME(glRequestResidentProgramsNV)) - return GL_FALSE; - GLH_EXT_NAME(glTrackMatrixNV) = (PFNGLTRACKMATRIXNVPROC)GLH_EXT_GET_PROC_ADDRESS("glTrackMatrixNV"); - if (NULL == GLH_EXT_NAME(glTrackMatrixNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttribPointerNV) = (PFNGLVERTEXATTRIBPOINTERNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribPointerNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribPointerNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib1dNV) = (PFNGLVERTEXATTRIB1DNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1dNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1dNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib1dvNV) = (PFNGLVERTEXATTRIB1DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1dvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1dvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib1fNV) = (PFNGLVERTEXATTRIB1FNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1fNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1fNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib1fvNV) = (PFNGLVERTEXATTRIB1FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1fvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1fvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib1sNV) = (PFNGLVERTEXATTRIB1SNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1sNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1sNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib1svNV) = (PFNGLVERTEXATTRIB1SVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1svNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1svNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib2dNV) = (PFNGLVERTEXATTRIB2DNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2dNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2dNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib2dvNV) = (PFNGLVERTEXATTRIB2DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2dvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2dvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib2fNV) = (PFNGLVERTEXATTRIB2FNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2fNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2fNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib2fvNV) = (PFNGLVERTEXATTRIB2FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2fvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2fvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib2sNV) = (PFNGLVERTEXATTRIB2SNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2sNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2sNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib2svNV) = (PFNGLVERTEXATTRIB2SVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2svNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2svNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib3dNV) = (PFNGLVERTEXATTRIB3DNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3dNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3dNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib3dvNV) = (PFNGLVERTEXATTRIB3DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3dvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3dvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib3fNV) = (PFNGLVERTEXATTRIB3FNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3fNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3fNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib3fvNV) = (PFNGLVERTEXATTRIB3FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3fvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3fvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib3sNV) = (PFNGLVERTEXATTRIB3SNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3sNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3sNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib3svNV) = (PFNGLVERTEXATTRIB3SVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3svNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3svNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4dNV) = (PFNGLVERTEXATTRIB4DNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4dNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4dNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4dvNV) = (PFNGLVERTEXATTRIB4DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4dvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4dvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4fNV) = (PFNGLVERTEXATTRIB4FNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4fNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4fNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4fvNV) = (PFNGLVERTEXATTRIB4FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4fvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4fvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4sNV) = (PFNGLVERTEXATTRIB4SNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4sNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4sNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4svNV) = (PFNGLVERTEXATTRIB4SVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4svNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4svNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4ubvNV) = (PFNGLVERTEXATTRIB4UBVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4ubvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4ubvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttribs1dvNV) = (PFNGLVERTEXATTRIBS1DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs1dvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs1dvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttribs1fvNV) = (PFNGLVERTEXATTRIBS1FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs1fvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs1fvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttribs1svNV) = (PFNGLVERTEXATTRIBS1SVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs1svNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs1svNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttribs2dvNV) = (PFNGLVERTEXATTRIBS2DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs2dvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs2dvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttribs2fvNV) = (PFNGLVERTEXATTRIBS2FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs2fvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs2fvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttribs2svNV) = (PFNGLVERTEXATTRIBS2SVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs2svNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs2svNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttribs3dvNV) = (PFNGLVERTEXATTRIBS3DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs3dvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs3dvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttribs3fvNV) = (PFNGLVERTEXATTRIBS3FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs3fvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs3fvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttribs3svNV) = (PFNGLVERTEXATTRIBS3SVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs3svNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs3svNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttribs4dvNV) = (PFNGLVERTEXATTRIBS4DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs4dvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs4dvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttribs4fvNV) = (PFNGLVERTEXATTRIBS4FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs4fvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs4fvNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttribs4svNV) = (PFNGLVERTEXATTRIBS4SVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs4svNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs4svNV)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttribs4ubvNV) = (PFNGLVERTEXATTRIBS4UBVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs4ubvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs4ubvNV)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_vertex_program1_1 - if (0 == strcmp(extension, "GL_NV_vertex_program1_1")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_vertex_program2 - if (0 == strcmp(extension, "GL_NV_vertex_program2")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_vertex_program2_option - if (0 == strcmp(extension, "GL_NV_vertex_program2_option")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_NV_vertex_program3 - if (0 == strcmp(extension, "GL_NV_vertex_program3")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_SGIS_generate_mipmap - if (0 == strcmp(extension, "GL_SGIS_generate_mipmap")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_SGIS_texture_lod - if (0 == strcmp(extension, "GL_SGIS_texture_lod")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_SGIX_depth_texture - if (0 == strcmp(extension, "GL_SGIX_depth_texture")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_SGIX_shadow - if (0 == strcmp(extension, "GL_SGIX_shadow")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_WIN_swap_hint - if (0 == strcmp(extension, "GL_WIN_swap_hint")) { - GLH_EXT_NAME(glAddSwapHintRectWIN) = (PFNGLADDSWAPHINTRECTWINPROC)GLH_EXT_GET_PROC_ADDRESS("glAddSwapHintRectWIN"); - if (NULL == GLH_EXT_NAME(glAddSwapHintRectWIN)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef WGL_ARB_buffer_region - if (0 == strcmp(extension, "WGL_ARB_buffer_region")) { -# ifdef _WIN32 - GLH_EXT_NAME(wglCreateBufferRegionARB) = (PFNWGLCREATEBUFFERREGIONARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglCreateBufferRegionARB"); - if (NULL == GLH_EXT_NAME(wglCreateBufferRegionARB)) - return GL_FALSE; -# endif -# ifdef _WIN32 - GLH_EXT_NAME(wglDeleteBufferRegionARB) = (PFNWGLDELETEBUFFERREGIONARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglDeleteBufferRegionARB"); - if (NULL == GLH_EXT_NAME(wglDeleteBufferRegionARB)) - return GL_FALSE; -# endif -# ifdef _WIN32 - GLH_EXT_NAME(wglSaveBufferRegionARB) = (PFNWGLSAVEBUFFERREGIONARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglSaveBufferRegionARB"); - if (NULL == GLH_EXT_NAME(wglSaveBufferRegionARB)) - return GL_FALSE; -# endif -# ifdef _WIN32 - GLH_EXT_NAME(wglRestoreBufferRegionARB) = (PFNWGLRESTOREBUFFERREGIONARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglRestoreBufferRegionARB"); - if (NULL == GLH_EXT_NAME(wglRestoreBufferRegionARB)) - return GL_FALSE; -# endif - - return GL_TRUE; - } -#endif - -#ifdef WGL_ARB_extensions_string - if (0 == strcmp(extension, "WGL_ARB_extensions_string")) { -# ifdef _WIN32 - GLH_EXT_NAME(wglGetExtensionsStringARB) = (PFNWGLGETEXTENSIONSSTRINGARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglGetExtensionsStringARB"); - if (NULL == GLH_EXT_NAME(wglGetExtensionsStringARB)) - return GL_FALSE; -# endif - - return GL_TRUE; - } -#endif - -#ifdef WGL_ARB_pbuffer - if (0 == strcmp(extension, "WGL_ARB_pbuffer")) { -# ifdef _WIN32 - GLH_EXT_NAME(wglCreatePbufferARB) = (PFNWGLCREATEPBUFFERARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglCreatePbufferARB"); - if (NULL == GLH_EXT_NAME(wglCreatePbufferARB)) - return GL_FALSE; -# endif -# ifdef _WIN32 - GLH_EXT_NAME(wglGetPbufferDCARB) = (PFNWGLGETPBUFFERDCARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglGetPbufferDCARB"); - if (NULL == GLH_EXT_NAME(wglGetPbufferDCARB)) - return GL_FALSE; -# endif -# ifdef _WIN32 - GLH_EXT_NAME(wglReleasePbufferDCARB) = (PFNWGLRELEASEPBUFFERDCARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglReleasePbufferDCARB"); - if (NULL == GLH_EXT_NAME(wglReleasePbufferDCARB)) - return GL_FALSE; -# endif -# ifdef _WIN32 - GLH_EXT_NAME(wglDestroyPbufferARB) = (PFNWGLDESTROYPBUFFERARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglDestroyPbufferARB"); - if (NULL == GLH_EXT_NAME(wglDestroyPbufferARB)) - return GL_FALSE; -# endif -# ifdef _WIN32 - GLH_EXT_NAME(wglQueryPbufferARB) = (PFNWGLQUERYPBUFFERARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglQueryPbufferARB"); - if (NULL == GLH_EXT_NAME(wglQueryPbufferARB)) - return GL_FALSE; -# endif - - return GL_TRUE; - } -#endif - -#ifdef WGL_ARB_pixel_format - if (0 == strcmp(extension, "WGL_ARB_pixel_format")) { -# ifdef _WIN32 - GLH_EXT_NAME(wglGetPixelFormatAttribivARB) = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglGetPixelFormatAttribivARB"); - if (NULL == GLH_EXT_NAME(wglGetPixelFormatAttribivARB)) - return GL_FALSE; -# endif -# ifdef _WIN32 - GLH_EXT_NAME(wglGetPixelFormatAttribfvARB) = (PFNWGLGETPIXELFORMATATTRIBFVARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglGetPixelFormatAttribfvARB"); - if (NULL == GLH_EXT_NAME(wglGetPixelFormatAttribfvARB)) - return GL_FALSE; -# endif -# ifdef _WIN32 - GLH_EXT_NAME(wglChoosePixelFormatARB) = (PFNWGLCHOOSEPIXELFORMATARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglChoosePixelFormatARB"); - if (NULL == GLH_EXT_NAME(wglChoosePixelFormatARB)) - return GL_FALSE; -# endif - - return GL_TRUE; - } -#endif - -#ifdef WGL_ARB_render_texture - if (0 == strcmp(extension, "WGL_ARB_render_texture")) { -# ifdef _WIN32 - GLH_EXT_NAME(wglBindTexImageARB) = (PFNWGLBINDTEXIMAGEARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglBindTexImageARB"); - if (NULL == GLH_EXT_NAME(wglBindTexImageARB)) - return GL_FALSE; -# endif -# ifdef _WIN32 - GLH_EXT_NAME(wglReleaseTexImageARB) = (PFNWGLRELEASETEXIMAGEARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglReleaseTexImageARB"); - if (NULL == GLH_EXT_NAME(wglReleaseTexImageARB)) - return GL_FALSE; -# endif -# ifdef _WIN32 - GLH_EXT_NAME(wglSetPbufferAttribARB) = (PFNWGLSETPBUFFERATTRIBARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglSetPbufferAttribARB"); - if (NULL == GLH_EXT_NAME(wglSetPbufferAttribARB)) - return GL_FALSE; -# endif - - return GL_TRUE; - } -#endif - -#ifdef WGL_ATI_pixel_format_float - if (0 == strcmp(extension, "WGL_ATI_pixel_format_float")) { - - return GL_TRUE; - } -#endif - -#ifdef WGL_EXT_extensions_string - if (0 == strcmp(extension, "WGL_EXT_extensions_string")) { -# ifdef _WIN32 - GLH_EXT_NAME(wglGetExtensionsStringEXT) = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)GLH_EXT_GET_PROC_ADDRESS("wglGetExtensionsStringEXT"); - if (NULL == GLH_EXT_NAME(wglGetExtensionsStringEXT)) - return GL_FALSE; -# endif - - return GL_TRUE; - } -#endif - -#ifdef WGL_EXT_swap_control - if (0 == strcmp(extension, "WGL_EXT_swap_control")) { -# ifdef _WIN32 - GLH_EXT_NAME(wglSwapIntervalEXT) = (PFNWGLSWAPINTERVALEXTPROC)GLH_EXT_GET_PROC_ADDRESS("wglSwapIntervalEXT"); - if (NULL == GLH_EXT_NAME(wglSwapIntervalEXT)) - return GL_FALSE; -# endif -# ifdef _WIN32 - GLH_EXT_NAME(wglGetSwapIntervalEXT) = (PFNWGLGETSWAPINTERVALEXTPROC)GLH_EXT_GET_PROC_ADDRESS("wglGetSwapIntervalEXT"); - if (NULL == GLH_EXT_NAME(wglGetSwapIntervalEXT)) - return GL_FALSE; -# endif - - return GL_TRUE; - } -#endif - -#ifdef WGL_NV_float_buffer - if (0 == strcmp(extension, "WGL_NV_float_buffer")) { - - return GL_TRUE; - } -#endif - -#ifdef WGL_NV_render_depth_texture - if (0 == strcmp(extension, "WGL_NV_render_depth_texture")) { - - return GL_TRUE; - } -#endif - -#ifdef WGL_NV_render_texture_rectangle - if (0 == strcmp(extension, "WGL_NV_render_texture_rectangle")) { - - return GL_TRUE; - } -#endif - -#ifdef GLX_NV_float_buffer - if (0 == strcmp(extension, "GLX_NV_float_buffer")) { - - return GL_TRUE; - } -#endif - -#ifdef GL_NVX_conditional_render - if (0 == strcmp(extension, "GL_NVX_conditional_render")) { - GLH_EXT_NAME(glBeginConditionalRenderNVX) = (PFNGLBEGINCONDITIONALRENDERNVXPROC)GLH_EXT_GET_PROC_ADDRESS("glBeginConditionalRenderNVX"); - if (NULL == GLH_EXT_NAME(glBeginConditionalRenderNVX)) - return GL_FALSE; - GLH_EXT_NAME(glEndConditionalRenderNVX) = (PFNGLENDCONDITIONALRENDERNVXPROC)GLH_EXT_GET_PROC_ADDRESS("glEndConditionalRenderNVX"); - if (NULL == GLH_EXT_NAME(glEndConditionalRenderNVX)) - return GL_FALSE; - - return GL_TRUE; - } -#endif - -#ifdef GLX_SGIX_pbuffer - if (0 == strcmp(extension, "GLX_SGIX_pbuffer")) { -# ifdef GLX_VERSION_1_3 - GLH_EXT_NAME(glXCreateGLXPbufferSGIX) = (PFNGLXCREATEGLXPBUFFERSGIXPROC)GLH_EXT_GET_PROC_ADDRESS("glXCreateGLXPbufferSGIX"); - if (NULL == GLH_EXT_NAME(glXCreateGLXPbufferSGIX)) - return GL_FALSE; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXT_NAME(glXDestroyGLXPbufferSGIX) = (PFNGLXDESTROYGLXPBUFFERSGIXPROC)GLH_EXT_GET_PROC_ADDRESS("glXDestroyGLXPbufferSGIX"); - if (NULL == GLH_EXT_NAME(glXDestroyGLXPbufferSGIX)) - return GL_FALSE; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXT_NAME(glXQueryGLXPbufferSGIX) = (PFNGLXQUERYGLXPBUFFERSGIXPROC)GLH_EXT_GET_PROC_ADDRESS("glXQueryGLXPbufferSGIX"); - if (NULL == GLH_EXT_NAME(glXQueryGLXPbufferSGIX)) - return GL_FALSE; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXT_NAME(glXSelectEventSGIX) = (PFNGLXSELECTEVENTSGIXPROC)GLH_EXT_GET_PROC_ADDRESS("glXSelectEventSGIX"); - if (NULL == GLH_EXT_NAME(glXSelectEventSGIX)) - return GL_FALSE; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXT_NAME(glXGetSelectedEventSGIX) = (PFNGLXGETSELECTEDEVENTSGIXPROC)GLH_EXT_GET_PROC_ADDRESS("glXGetSelectedEventSGIX"); - if (NULL == GLH_EXT_NAME(glXGetSelectedEventSGIX)) - return GL_FALSE; -# endif - - return GL_TRUE; - } -#endif - -#ifdef GLX_SGIX_fbconfig - if (0 == strcmp(extension, "GLX_SGIX_fbconfig")) { -# ifdef GLX_VERSION_1_3 - GLH_EXT_NAME(glXGetFBConfigAttribSGIX) = (PFNGLXGETFBCONFIGATTRIBSGIXPROC)GLH_EXT_GET_PROC_ADDRESS("glXGetFBConfigAttribSGIX"); - if (NULL == GLH_EXT_NAME(glXGetFBConfigAttribSGIX)) - return GL_FALSE; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXT_NAME(glXChooseFBConfigSGIX) = (PFNGLXCHOOSEFBCONFIGSGIXPROC)GLH_EXT_GET_PROC_ADDRESS("glXChooseFBConfigSGIX"); - if (NULL == GLH_EXT_NAME(glXChooseFBConfigSGIX)) - return GL_FALSE; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXT_NAME(glXCreateGLXPixmapWithConfigSGIX) = (PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC)GLH_EXT_GET_PROC_ADDRESS("glXCreateGLXPixmapWithConfigSGIX"); - if (NULL == GLH_EXT_NAME(glXCreateGLXPixmapWithConfigSGIX)) - return GL_FALSE; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXT_NAME(glXCreateContextWithConfigSGIX) = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC)GLH_EXT_GET_PROC_ADDRESS("glXCreateContextWithConfigSGIX"); - if (NULL == GLH_EXT_NAME(glXCreateContextWithConfigSGIX)) - return GL_FALSE; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXT_NAME(glXGetVisualFromFBConfigSGIX) = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC)GLH_EXT_GET_PROC_ADDRESS("glXGetVisualFromFBConfigSGIX"); - if (NULL == GLH_EXT_NAME(glXGetVisualFromFBConfigSGIX)) - return GL_FALSE; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXT_NAME(glXGetFBConfigFromVisualSGIX) = (PFNGLXGETFBCONFIGFROMVISUALSGIXPROC)GLH_EXT_GET_PROC_ADDRESS("glXGetFBConfigFromVisualSGIX"); - if (NULL == GLH_EXT_NAME(glXGetFBConfigFromVisualSGIX)) - return GL_FALSE; -# endif - - return GL_TRUE; - } -#endif - - return GL_FALSE; -} -#endif - -#undef GLH_EXT_SINGLE_FILE - -#ifdef __cplusplus -} -#endif - -#endif /* GLH_GENEXT_H */ -#ifndef _WIN32 -#ifdef _WIN32 -#if defined(GL_VERSION_1_2) || defined(GL_VERSION_1_3) || defined(GL_VERSION_1_4) || defined(GL_VERSION_1_5) - /* These routines are prefixed by the preprocessor constant - GLH_CORE_PREFIX to avoid colliding with the OpenGL 1.1 namespace. */ -#define glBlendColor GLH_CORE_NAME(glBlendColor) -#define glBlendEquation GLH_CORE_NAME(glBlendEquation) -#define glDrawRangeElements GLH_CORE_NAME(glDrawRangeElements) -#define glTexImage3D GLH_CORE_NAME(glTexImage3D) -#define glTexSubImage3D GLH_CORE_NAME(glTexSubImage3D) -#define glCopyTexSubImage3D GLH_CORE_NAME(glCopyTexSubImage3D) -#define glMultiTexCoord1d GLH_CORE_NAME(glMultiTexCoord1d) -#define glMultiTexCoord1dv GLH_CORE_NAME(glMultiTexCoord1dv) -#define glMultiTexCoord1f GLH_CORE_NAME(glMultiTexCoord1f) -#define glMultiTexCoord1fv GLH_CORE_NAME(glMultiTexCoord1fv) -#define glMultiTexCoord1i GLH_CORE_NAME(glMultiTexCoord1i) -#define glMultiTexCoord1iv GLH_CORE_NAME(glMultiTexCoord1iv) -#define glMultiTexCoord1s GLH_CORE_NAME(glMultiTexCoord1s) -#define glMultiTexCoord1sv GLH_CORE_NAME(glMultiTexCoord1sv) -#define glMultiTexCoord2d GLH_CORE_NAME(glMultiTexCoord2d) -#define glMultiTexCoord2dv GLH_CORE_NAME(glMultiTexCoord2dv) -#define glMultiTexCoord2f GLH_CORE_NAME(glMultiTexCoord2f) -#define glMultiTexCoord2fv GLH_CORE_NAME(glMultiTexCoord2fv) -#define glMultiTexCoord2i GLH_CORE_NAME(glMultiTexCoord2i) -#define glMultiTexCoord2iv GLH_CORE_NAME(glMultiTexCoord2iv) -#define glMultiTexCoord2s GLH_CORE_NAME(glMultiTexCoord2s) -#define glMultiTexCoord2sv GLH_CORE_NAME(glMultiTexCoord2sv) -#define glMultiTexCoord3d GLH_CORE_NAME(glMultiTexCoord3d) -#define glMultiTexCoord3dv GLH_CORE_NAME(glMultiTexCoord3dv) -#define glMultiTexCoord3f GLH_CORE_NAME(glMultiTexCoord3f) -#define glMultiTexCoord3fv GLH_CORE_NAME(glMultiTexCoord3fv) -#define glMultiTexCoord3i GLH_CORE_NAME(glMultiTexCoord3i) -#define glMultiTexCoord3iv GLH_CORE_NAME(glMultiTexCoord3iv) -#define glMultiTexCoord3s GLH_CORE_NAME(glMultiTexCoord3s) -#define glMultiTexCoord3sv GLH_CORE_NAME(glMultiTexCoord3sv) -#define glMultiTexCoord4d GLH_CORE_NAME(glMultiTexCoord4d) -#define glMultiTexCoord4dv GLH_CORE_NAME(glMultiTexCoord4dv) -#define glMultiTexCoord4f GLH_CORE_NAME(glMultiTexCoord4f) -#define glMultiTexCoord4fv GLH_CORE_NAME(glMultiTexCoord4fv) -#define glMultiTexCoord4i GLH_CORE_NAME(glMultiTexCoord4i) -#define glMultiTexCoord4iv GLH_CORE_NAME(glMultiTexCoord4iv) -#define glMultiTexCoord4s GLH_CORE_NAME(glMultiTexCoord4s) -#define glMultiTexCoord4sv GLH_CORE_NAME(glMultiTexCoord4sv) -#define glActiveTexture GLH_CORE_NAME(glActiveTexture) -#define glClientActiveTexture GLH_CORE_NAME(glClientActiveTexture) -#endif -#endif - -#ifdef _WIN32 -#if defined(GL_VERSION_1_3) || defined(GL_VERSION_1_4) || defined(GL_VERSION_1_5) - /* These routines are prefixed by the preprocessor constant - GLH_CORE_PREFIX to avoid colliding with the OpenGL 1.1 namespace. */ -#define glCompressedTexImage3D GLH_CORE_NAME(glCompressedTexImage3D) -#define glCompressedTexImage2D GLH_CORE_NAME(glCompressedTexImage2D) -#define glCompressedTexImage1D GLH_CORE_NAME(glCompressedTexImage1D) -#define glCompressedTexSubImage3D GLH_CORE_NAME(glCompressedTexSubImage3D) -#define glCompressedTexSubImage2D GLH_CORE_NAME(glCompressedTexSubImage2D) -#define glCompressedTexSubImage1D GLH_CORE_NAME(glCompressedTexSubImage1D) -#define glGetCompressedTexImage GLH_CORE_NAME(glGetCompressedTexImage) -#define glSampleCoverage GLH_CORE_NAME(glSampleCoverage) -#define glLoadTransposeMatrixf GLH_CORE_NAME(glLoadTransposeMatrixf) -#define glLoadTransposeMatrixd GLH_CORE_NAME(glLoadTransposeMatrixd) -#define glMultTransposeMatrixf GLH_CORE_NAME(glMultTransposeMatrixf) -#define glMultTransposeMatrixd GLH_CORE_NAME(glMultTransposeMatrixd) -#endif -#endif - -#ifdef _WIN32 -#if defined(GL_VERSION_1_4) || defined(GL_VERSION_1_5) - /* These routines are prefixed by the preprocessor constant - GLH_CORE_PREFIX to avoid colliding with the OpenGL 1.1 namespace. */ -#define glMultiDrawArrays GLH_CORE_NAME(glMultiDrawArrays) -#define glMultiDrawElements GLH_CORE_NAME(glMultiDrawElements) -#define glPointParameterf GLH_CORE_NAME(glPointParameterf) -#define glPointParameterfv GLH_CORE_NAME(glPointParameterfv) -#define glSecondaryColor3b GLH_CORE_NAME(glSecondaryColor3b) -#define glSecondaryColor3bv GLH_CORE_NAME(glSecondaryColor3bv) -#define glSecondaryColor3d GLH_CORE_NAME(glSecondaryColor3d) -#define glSecondaryColor3dv GLH_CORE_NAME(glSecondaryColor3dv) -#define glSecondaryColor3f GLH_CORE_NAME(glSecondaryColor3f) -#define glSecondaryColor3fv GLH_CORE_NAME(glSecondaryColor3fv) -#define glSecondaryColor3i GLH_CORE_NAME(glSecondaryColor3i) -#define glSecondaryColor3iv GLH_CORE_NAME(glSecondaryColor3iv) -#define glSecondaryColor3s GLH_CORE_NAME(glSecondaryColor3s) -#define glSecondaryColor3sv GLH_CORE_NAME(glSecondaryColor3sv) -#define glSecondaryColor3ub GLH_CORE_NAME(glSecondaryColor3ub) -#define glSecondaryColor3ubv GLH_CORE_NAME(glSecondaryColor3ubv) -#define glSecondaryColor3ui GLH_CORE_NAME(glSecondaryColor3ui) -#define glSecondaryColor3uiv GLH_CORE_NAME(glSecondaryColor3uiv) -#define glSecondaryColor3us GLH_CORE_NAME(glSecondaryColor3us) -#define glSecondaryColor3usv GLH_CORE_NAME(glSecondaryColor3usv) -#define glSecondaryColorPointer GLH_CORE_NAME(glSecondaryColorPointer) -#define glBlendFuncSeparate GLH_CORE_NAME(glBlendFuncSeparate) -#define glWindowPos2d GLH_CORE_NAME(glWindowPos2d) -#define glWindowPos2f GLH_CORE_NAME(glWindowPos2f) -#define glWindowPos2i GLH_CORE_NAME(glWindowPos2i) -#define glWindowPos2s GLH_CORE_NAME(glWindowPos2s) -#define glWindowPos2dv GLH_CORE_NAME(glWindowPos2dv) -#define glWindowPos2fv GLH_CORE_NAME(glWindowPos2fv) -#define glWindowPos2iv GLH_CORE_NAME(glWindowPos2iv) -#define glWindowPos2sv GLH_CORE_NAME(glWindowPos2sv) -#define glWindowPos3d GLH_CORE_NAME(glWindowPos3d) -#define glWindowPos3f GLH_CORE_NAME(glWindowPos3f) -#define glWindowPos3i GLH_CORE_NAME(glWindowPos3i) -#define glWindowPos3s GLH_CORE_NAME(glWindowPos3s) -#define glWindowPos3dv GLH_CORE_NAME(glWindowPos3dv) -#define glWindowPos3fv GLH_CORE_NAME(glWindowPos3fv) -#define glWindowPos3iv GLH_CORE_NAME(glWindowPos3iv) -#define glWindowPos3sv GLH_CORE_NAME(glWindowPos3sv) -#endif -#endif - -#ifdef _WIN32 -#if defined(GL_VERSION_1_5) - /* These routines are prefixed by the preprocessor constant - GLH_CORE_PREFIX to avoid colliding with the OpenGL 1.1 namespace. */ -#define glGenQueries GLH_CORE_NAME(glGenQueries) -#define glDeleteQueries GLH_CORE_NAME(glDeleteQueries) -#define glIsQuery GLH_CORE_NAME(glIsQuery) -#define glBeginQuery GLH_CORE_NAME(glBeginQuery) -#define glEndQuery GLH_CORE_NAME(glEndQuery) -#define glGetQueryiv GLH_CORE_NAME(glGetQueryiv) -#define glGetQueryObjectiv GLH_CORE_NAME(glGetQueryObjectiv) -#define glGetQueryObjectuiv GLH_CORE_NAME(glGetQueryObjectuiv) -#define glBindBuffer GLH_CORE_NAME(glBindBuffer) -#define glDeleteBuffers GLH_CORE_NAME(glDeleteBuffers) -#define glGenBuffers GLH_CORE_NAME(glGenBuffers) -#define glIsBuffer GLH_CORE_NAME(glIsBuffer) -#define glBufferData GLH_CORE_NAME(glBufferData) -#define glBufferSubData GLH_CORE_NAME(glBufferSubData) -#define glGetBufferSubData GLH_CORE_NAME(glGetBufferSubData) -#define glMapBuffer GLH_CORE_NAME(glMapBuffer) -#define glUnmapBuffer GLH_CORE_NAME(glUnmapBuffer) -#define glGetBufferParameteriv GLH_CORE_NAME(glGetBufferParameteriv) -#define glGetBufferPointerv GLH_CORE_NAME(glGetBufferPointerv) -#endif -#endif - -#ifdef GL_ARB_depth_texture -#endif - -#ifdef GL_ARB_fragment_program -#endif - -#ifdef GL_ARB_fragment_program_shadow -#endif - -#ifdef GL_ARB_fragment_shader -#endif - -#ifdef GL_ARB_matrix_palette -#endif - -#ifdef GL_ARB_multisample -#endif - -#ifdef GL_ARB_multitexture -#define glMultiTexCoord1dARB GLH_EXT_NAME(glMultiTexCoord1dARB) -#define glMultiTexCoord1dvARB GLH_EXT_NAME(glMultiTexCoord1dvARB) -#define glMultiTexCoord1fARB GLH_EXT_NAME(glMultiTexCoord1fARB) -#define glMultiTexCoord1fvARB GLH_EXT_NAME(glMultiTexCoord1fvARB) -#define glMultiTexCoord1iARB GLH_EXT_NAME(glMultiTexCoord1iARB) -#define glMultiTexCoord1ivARB GLH_EXT_NAME(glMultiTexCoord1ivARB) -#define glMultiTexCoord1sARB GLH_EXT_NAME(glMultiTexCoord1sARB) -#define glMultiTexCoord1svARB GLH_EXT_NAME(glMultiTexCoord1svARB) -#define glMultiTexCoord2dARB GLH_EXT_NAME(glMultiTexCoord2dARB) -#define glMultiTexCoord2dvARB GLH_EXT_NAME(glMultiTexCoord2dvARB) -#define glMultiTexCoord2fARB GLH_EXT_NAME(glMultiTexCoord2fARB) -#define glMultiTexCoord2fvARB GLH_EXT_NAME(glMultiTexCoord2fvARB) -#define glMultiTexCoord2iARB GLH_EXT_NAME(glMultiTexCoord2iARB) -#define glMultiTexCoord2ivARB GLH_EXT_NAME(glMultiTexCoord2ivARB) -#define glMultiTexCoord2sARB GLH_EXT_NAME(glMultiTexCoord2sARB) -#define glMultiTexCoord2svARB GLH_EXT_NAME(glMultiTexCoord2svARB) -#define glMultiTexCoord3dARB GLH_EXT_NAME(glMultiTexCoord3dARB) -#define glMultiTexCoord3dvARB GLH_EXT_NAME(glMultiTexCoord3dvARB) -#define glMultiTexCoord3fARB GLH_EXT_NAME(glMultiTexCoord3fARB) -#define glMultiTexCoord3fvARB GLH_EXT_NAME(glMultiTexCoord3fvARB) -#define glMultiTexCoord3iARB GLH_EXT_NAME(glMultiTexCoord3iARB) -#define glMultiTexCoord3ivARB GLH_EXT_NAME(glMultiTexCoord3ivARB) -#define glMultiTexCoord3sARB GLH_EXT_NAME(glMultiTexCoord3sARB) -#define glMultiTexCoord3svARB GLH_EXT_NAME(glMultiTexCoord3svARB) -#define glMultiTexCoord4dARB GLH_EXT_NAME(glMultiTexCoord4dARB) -#define glMultiTexCoord4dvARB GLH_EXT_NAME(glMultiTexCoord4dvARB) -#define glMultiTexCoord4fARB GLH_EXT_NAME(glMultiTexCoord4fARB) -#define glMultiTexCoord4fvARB GLH_EXT_NAME(glMultiTexCoord4fvARB) -#define glMultiTexCoord4iARB GLH_EXT_NAME(glMultiTexCoord4iARB) -#define glMultiTexCoord4ivARB GLH_EXT_NAME(glMultiTexCoord4ivARB) -#define glMultiTexCoord4sARB GLH_EXT_NAME(glMultiTexCoord4sARB) -#define glMultiTexCoord4svARB GLH_EXT_NAME(glMultiTexCoord4svARB) -#define glActiveTextureARB GLH_EXT_NAME(glActiveTextureARB) -#define glClientActiveTextureARB GLH_EXT_NAME(glClientActiveTextureARB) -#endif - -#ifdef GL_ARB_occlusion_query -#define glGenQueriesARB GLH_EXT_NAME(glGenQueriesARB) -#define glDeleteQueriesARB GLH_EXT_NAME(glDeleteQueriesARB) -#define glIsQueryARB GLH_EXT_NAME(glIsQueryARB) -#define glBeginQueryARB GLH_EXT_NAME(glBeginQueryARB) -#define glEndQueryARB GLH_EXT_NAME(glEndQueryARB) -#define glGetQueryivARB GLH_EXT_NAME(glGetQueryivARB) -#define glGetQueryObjectivARB GLH_EXT_NAME(glGetQueryObjectivARB) -#define glGetQueryObjectuivARB GLH_EXT_NAME(glGetQueryObjectuivARB) -#endif - -#ifdef GL_ARB_point_parameters -#define glPointParameterfARB GLH_EXT_NAME(glPointParameterfARB) -#define glPointParameterfvARB GLH_EXT_NAME(glPointParameterfvARB) -#endif - -#ifdef GL_ARB_point_sprite -#endif - -#ifdef GL_ARB_shader_objects -#define glDeleteObjectARB GLH_EXT_NAME(glDeleteObjectARB) -#define glGetHandleARB GLH_EXT_NAME(glGetHandleARB) -#define glDetachObjectARB GLH_EXT_NAME(glDetachObjectARB) -#define glCreateShaderObjectARB GLH_EXT_NAME(glCreateShaderObjectARB) -#define glShaderSourceARB GLH_EXT_NAME(glShaderSourceARB) -#define glCompileShaderARB GLH_EXT_NAME(glCompileShaderARB) -#define glCreateProgramObjectARB GLH_EXT_NAME(glCreateProgramObjectARB) -#define glAttachObjectARB GLH_EXT_NAME(glAttachObjectARB) -#define glLinkProgramARB GLH_EXT_NAME(glLinkProgramARB) -#define glUseProgramObjectARB GLH_EXT_NAME(glUseProgramObjectARB) -#define glValidateProgramARB GLH_EXT_NAME(glValidateProgramARB) -#define glUniform1fARB GLH_EXT_NAME(glUniform1fARB) -#define glUniform2fARB GLH_EXT_NAME(glUniform2fARB) -#define glUniform3fARB GLH_EXT_NAME(glUniform3fARB) -#define glUniform4fARB GLH_EXT_NAME(glUniform4fARB) -#define glUniform1iARB GLH_EXT_NAME(glUniform1iARB) -#define glUniform2iARB GLH_EXT_NAME(glUniform2iARB) -#define glUniform3iARB GLH_EXT_NAME(glUniform3iARB) -#define glUniform4iARB GLH_EXT_NAME(glUniform4iARB) -#define glUniform1fvARB GLH_EXT_NAME(glUniform1fvARB) -#define glUniform2fvARB GLH_EXT_NAME(glUniform2fvARB) -#define glUniform3fvARB GLH_EXT_NAME(glUniform3fvARB) -#define glUniform4fvARB GLH_EXT_NAME(glUniform4fvARB) -#define glUniform1ivARB GLH_EXT_NAME(glUniform1ivARB) -#define glUniform2ivARB GLH_EXT_NAME(glUniform2ivARB) -#define glUniform3ivARB GLH_EXT_NAME(glUniform3ivARB) -#define glUniform4ivARB GLH_EXT_NAME(glUniform4ivARB) -#define glUniformMatrix2fvARB GLH_EXT_NAME(glUniformMatrix2fvARB) -#define glUniformMatrix3fvARB GLH_EXT_NAME(glUniformMatrix3fvARB) -#define glUniformMatrix4fvARB GLH_EXT_NAME(glUniformMatrix4fvARB) -#define glGetObjectParameterfvARB GLH_EXT_NAME(glGetObjectParameterfvARB) -#define glGetObjectParameterivARB GLH_EXT_NAME(glGetObjectParameterivARB) -#define glGetInfoLogARB GLH_EXT_NAME(glGetInfoLogARB) -#define glGetAttachedObjectsARB GLH_EXT_NAME(glGetAttachedObjectsARB) -#define glGetUniformLocationARB GLH_EXT_NAME(glGetUniformLocationARB) -#define glGetActiveUniformARB GLH_EXT_NAME(glGetActiveUniformARB) -#define glGetUniformfvARB GLH_EXT_NAME(glGetUniformfvARB) -#define glGetUniformivARB GLH_EXT_NAME(glGetUniformivARB) -#define glGetShaderSourceARB GLH_EXT_NAME(glGetShaderSourceARB) -#endif - -#ifdef GL_ARB_shadow -#endif - -#ifdef GL_ARB_shadow_ambient -#endif - -#ifdef GL_ARB_texture_border_clamp -#endif - -#ifdef GL_ARB_texture_compression -#define glCompressedTexImage3DARB GLH_EXT_NAME(glCompressedTexImage3DARB) -#define glCompressedTexImage2DARB GLH_EXT_NAME(glCompressedTexImage2DARB) -#define glCompressedTexImage1DARB GLH_EXT_NAME(glCompressedTexImage1DARB) -#define glCompressedTexSubImage3DARB GLH_EXT_NAME(glCompressedTexSubImage3DARB) -#define glCompressedTexSubImage2DARB GLH_EXT_NAME(glCompressedTexSubImage2DARB) -#define glCompressedTexSubImage1DARB GLH_EXT_NAME(glCompressedTexSubImage1DARB) -#define glGetCompressedTexImageARB GLH_EXT_NAME(glGetCompressedTexImageARB) -#endif - -#ifdef GL_ARB_texture_cube_map -#endif - -#ifdef GL_ARB_texture_env_add -#endif - -#ifdef GL_ARB_texture_env_combine -#endif - -#ifdef GL_ARB_texture_env_dot3 -#endif - -#ifdef GL_ARB_texture_mirrored_repeat -#endif - -#ifdef GL_ARB_texture_non_power_of_two -#endif - -#ifdef GL_ARB_texture_rectangle -#endif - -#ifdef GL_ARB_transpose_matrix -#define glLoadTransposeMatrixfARB GLH_EXT_NAME(glLoadTransposeMatrixfARB) -#define glLoadTransposeMatrixdARB GLH_EXT_NAME(glLoadTransposeMatrixdARB) -#define glMultTransposeMatrixfARB GLH_EXT_NAME(glMultTransposeMatrixfARB) -#define glMultTransposeMatrixdARB GLH_EXT_NAME(glMultTransposeMatrixdARB) -#endif - -#ifdef GL_ARB_vertex_buffer_object -#define glBindBufferARB GLH_EXT_NAME(glBindBufferARB) -#define glDeleteBuffersARB GLH_EXT_NAME(glDeleteBuffersARB) -#define glGenBuffersARB GLH_EXT_NAME(glGenBuffersARB) -#define glIsBufferARB GLH_EXT_NAME(glIsBufferARB) -#define glBufferDataARB GLH_EXT_NAME(glBufferDataARB) -#define glBufferSubDataARB GLH_EXT_NAME(glBufferSubDataARB) -#define glGetBufferSubDataARB GLH_EXT_NAME(glGetBufferSubDataARB) -#define glMapBufferARB GLH_EXT_NAME(glMapBufferARB) -#define glUnmapBufferARB GLH_EXT_NAME(glUnmapBufferARB) -#define glGetBufferParameterivARB GLH_EXT_NAME(glGetBufferParameterivARB) -#define glGetBufferPointervARB GLH_EXT_NAME(glGetBufferPointervARB) -#endif - -#ifdef GL_ARB_vertex_program -#define glVertexAttrib1sARB GLH_EXT_NAME(glVertexAttrib1sARB) -#define glVertexAttrib1fARB GLH_EXT_NAME(glVertexAttrib1fARB) -#define glVertexAttrib1dARB GLH_EXT_NAME(glVertexAttrib1dARB) -#define glVertexAttrib2sARB GLH_EXT_NAME(glVertexAttrib2sARB) -#define glVertexAttrib2fARB GLH_EXT_NAME(glVertexAttrib2fARB) -#define glVertexAttrib2dARB GLH_EXT_NAME(glVertexAttrib2dARB) -#define glVertexAttrib3sARB GLH_EXT_NAME(glVertexAttrib3sARB) -#define glVertexAttrib3fARB GLH_EXT_NAME(glVertexAttrib3fARB) -#define glVertexAttrib3dARB GLH_EXT_NAME(glVertexAttrib3dARB) -#define glVertexAttrib4sARB GLH_EXT_NAME(glVertexAttrib4sARB) -#define glVertexAttrib4fARB GLH_EXT_NAME(glVertexAttrib4fARB) -#define glVertexAttrib4dARB GLH_EXT_NAME(glVertexAttrib4dARB) -#define glVertexAttrib4NubARB GLH_EXT_NAME(glVertexAttrib4NubARB) -#define glVertexAttrib1svARB GLH_EXT_NAME(glVertexAttrib1svARB) -#define glVertexAttrib1fvARB GLH_EXT_NAME(glVertexAttrib1fvARB) -#define glVertexAttrib1dvARB GLH_EXT_NAME(glVertexAttrib1dvARB) -#define glVertexAttrib2svARB GLH_EXT_NAME(glVertexAttrib2svARB) -#define glVertexAttrib2fvARB GLH_EXT_NAME(glVertexAttrib2fvARB) -#define glVertexAttrib2dvARB GLH_EXT_NAME(glVertexAttrib2dvARB) -#define glVertexAttrib3svARB GLH_EXT_NAME(glVertexAttrib3svARB) -#define glVertexAttrib3fvARB GLH_EXT_NAME(glVertexAttrib3fvARB) -#define glVertexAttrib3dvARB GLH_EXT_NAME(glVertexAttrib3dvARB) -#define glVertexAttrib4bvARB GLH_EXT_NAME(glVertexAttrib4bvARB) -#define glVertexAttrib4svARB GLH_EXT_NAME(glVertexAttrib4svARB) -#define glVertexAttrib4ivARB GLH_EXT_NAME(glVertexAttrib4ivARB) -#define glVertexAttrib4ubvARB GLH_EXT_NAME(glVertexAttrib4ubvARB) -#define glVertexAttrib4usvARB GLH_EXT_NAME(glVertexAttrib4usvARB) -#define glVertexAttrib4uivARB GLH_EXT_NAME(glVertexAttrib4uivARB) -#define glVertexAttrib4fvARB GLH_EXT_NAME(glVertexAttrib4fvARB) -#define glVertexAttrib4dvARB GLH_EXT_NAME(glVertexAttrib4dvARB) -#define glVertexAttrib4NbvARB GLH_EXT_NAME(glVertexAttrib4NbvARB) -#define glVertexAttrib4NsvARB GLH_EXT_NAME(glVertexAttrib4NsvARB) -#define glVertexAttrib4NivARB GLH_EXT_NAME(glVertexAttrib4NivARB) -#define glVertexAttrib4NubvARB GLH_EXT_NAME(glVertexAttrib4NubvARB) -#define glVertexAttrib4NusvARB GLH_EXT_NAME(glVertexAttrib4NusvARB) -#define glVertexAttrib4NuivARB GLH_EXT_NAME(glVertexAttrib4NuivARB) -#define glVertexAttribPointerARB GLH_EXT_NAME(glVertexAttribPointerARB) -#define glEnableVertexAttribArrayARB GLH_EXT_NAME(glEnableVertexAttribArrayARB) -#define glDisableVertexAttribArrayARB GLH_EXT_NAME(glDisableVertexAttribArrayARB) -#define glProgramStringARB GLH_EXT_NAME(glProgramStringARB) -#define glBindProgramARB GLH_EXT_NAME(glBindProgramARB) -#define glDeleteProgramsARB GLH_EXT_NAME(glDeleteProgramsARB) -#define glGenProgramsARB GLH_EXT_NAME(glGenProgramsARB) -#define glProgramEnvParameter4dARB GLH_EXT_NAME(glProgramEnvParameter4dARB) -#define glProgramEnvParameter4dvARB GLH_EXT_NAME(glProgramEnvParameter4dvARB) -#define glProgramEnvParameter4fARB GLH_EXT_NAME(glProgramEnvParameter4fARB) -#define glProgramEnvParameter4fvARB GLH_EXT_NAME(glProgramEnvParameter4fvARB) -#define glProgramLocalParameter4dARB GLH_EXT_NAME(glProgramLocalParameter4dARB) -#define glProgramLocalParameter4dvARB GLH_EXT_NAME(glProgramLocalParameter4dvARB) -#define glProgramLocalParameter4fARB GLH_EXT_NAME(glProgramLocalParameter4fARB) -#define glProgramLocalParameter4fvARB GLH_EXT_NAME(glProgramLocalParameter4fvARB) -#define glGetProgramEnvParameterdvARB GLH_EXT_NAME(glGetProgramEnvParameterdvARB) -#define glGetProgramEnvParameterfvARB GLH_EXT_NAME(glGetProgramEnvParameterfvARB) -#define glGetProgramLocalParameterdvARB GLH_EXT_NAME(glGetProgramLocalParameterdvARB) -#define glGetProgramLocalParameterfvARB GLH_EXT_NAME(glGetProgramLocalParameterfvARB) -#define glGetProgramivARB GLH_EXT_NAME(glGetProgramivARB) -#define glGetProgramStringARB GLH_EXT_NAME(glGetProgramStringARB) -#define glGetVertexAttribdvARB GLH_EXT_NAME(glGetVertexAttribdvARB) -#define glGetVertexAttribfvARB GLH_EXT_NAME(glGetVertexAttribfvARB) -#define glGetVertexAttribivARB GLH_EXT_NAME(glGetVertexAttribivARB) -#define glGetVertexAttribPointervARB GLH_EXT_NAME(glGetVertexAttribPointervARB) -#define glIsProgramARB GLH_EXT_NAME(glIsProgramARB) -#endif - -#ifdef GL_ARB_vertex_shader -#define glBindAttribLocationARB GLH_EXT_NAME(glBindAttribLocationARB) -#define glGetActiveAttribARB GLH_EXT_NAME(glGetActiveAttribARB) -#define glGetAttribLocationARB GLH_EXT_NAME(glGetAttribLocationARB) -#endif - -#ifdef GL_ARB_window_pos -#define glWindowPos2dARB GLH_EXT_NAME(glWindowPos2dARB) -#define glWindowPos2fARB GLH_EXT_NAME(glWindowPos2fARB) -#define glWindowPos2iARB GLH_EXT_NAME(glWindowPos2iARB) -#define glWindowPos2sARB GLH_EXT_NAME(glWindowPos2sARB) -#define glWindowPos2dvARB GLH_EXT_NAME(glWindowPos2dvARB) -#define glWindowPos2fvARB GLH_EXT_NAME(glWindowPos2fvARB) -#define glWindowPos2ivARB GLH_EXT_NAME(glWindowPos2ivARB) -#define glWindowPos2svARB GLH_EXT_NAME(glWindowPos2svARB) -#define glWindowPos3dARB GLH_EXT_NAME(glWindowPos3dARB) -#define glWindowPos3fARB GLH_EXT_NAME(glWindowPos3fARB) -#define glWindowPos3iARB GLH_EXT_NAME(glWindowPos3iARB) -#define glWindowPos3sARB GLH_EXT_NAME(glWindowPos3sARB) -#define glWindowPos3dvARB GLH_EXT_NAME(glWindowPos3dvARB) -#define glWindowPos3fvARB GLH_EXT_NAME(glWindowPos3fvARB) -#define glWindowPos3ivARB GLH_EXT_NAME(glWindowPos3ivARB) -#define glWindowPos3svARB GLH_EXT_NAME(glWindowPos3svARB) -#endif - -#ifdef GL_ATI_draw_buffers -#define glDrawBuffersATI GLH_EXT_NAME(glDrawBuffersATI) -#endif - -#ifdef GL_ATI_texture_float -#endif - -#ifdef GL_EXT_abgr -#endif - -#ifdef GL_EXT_bgra -#endif - -#ifdef GL_EXT_blend_color -#define glBlendColorEXT GLH_EXT_NAME(glBlendColorEXT) -#endif - -#ifdef GL_EXT_blend_equation_separate -#define glBlendEquationSeparateEXT GLH_EXT_NAME(glBlendEquationSeparateEXT) -#endif - -#ifdef GL_EXT_blend_func_separate -#define glBlendFuncSeparateEXT GLH_EXT_NAME(glBlendFuncSeparateEXT) -#endif - -#ifdef GL_EXT_blend_minmax -#define glBlendEquationEXT GLH_EXT_NAME(glBlendEquationEXT) -#endif - -#ifdef GL_EXT_blend_subtract -#endif - -#ifdef GL_EXT_Cg_shader -#endif - -#ifdef GL_EXT_compiled_vertex_array -#define glLockArraysEXT GLH_EXT_NAME(glLockArraysEXT) -#define glUnlockArraysEXT GLH_EXT_NAME(glUnlockArraysEXT) -#endif - -#ifdef GL_EXT_depth_bounds_test -#define glDepthBoundsEXT GLH_EXT_NAME(glDepthBoundsEXT) -#endif - -#ifdef GL_EXT_draw_range_elements -#endif - -#ifdef GL_EXT_fog_coord -#define glFogCoorddEXT GLH_EXT_NAME(glFogCoorddEXT) -#define glFogCoorddvEXT GLH_EXT_NAME(glFogCoorddvEXT) -#define glFogCoordfEXT GLH_EXT_NAME(glFogCoordfEXT) -#define glFogCoordfvEXT GLH_EXT_NAME(glFogCoordfvEXT) -#define glFogCoordPointerEXT GLH_EXT_NAME(glFogCoordPointerEXT) -#endif - -#ifdef GL_EXT_framebuffer_object -#define glIsRenderbufferEXT GLH_EXT_NAME(glIsRenderbufferEXT) -#define glBindRenderbufferEXT GLH_EXT_NAME(glBindRenderbufferEXT) -#define glDeleteRenderbuffersEXT GLH_EXT_NAME(glDeleteRenderbuffersEXT) -#define glGenRenderbuffersEXT GLH_EXT_NAME(glGenRenderbuffersEXT) -#define glRenderbufferStorageEXT GLH_EXT_NAME(glRenderbufferStorageEXT) -#define glGetRenderbufferParameterivEXT GLH_EXT_NAME(glGetRenderbufferParameterivEXT) -#define glIsFramebufferEXT GLH_EXT_NAME(glIsFramebufferEXT) -#define glBindFramebufferEXT GLH_EXT_NAME(glBindFramebufferEXT) -#define glDeleteFramebuffersEXT GLH_EXT_NAME(glDeleteFramebuffersEXT) -#define glGenFramebuffersEXT GLH_EXT_NAME(glGenFramebuffersEXT) -#define glCheckFramebufferStatusEXT GLH_EXT_NAME(glCheckFramebufferStatusEXT) -#define glFramebufferTexture1DEXT GLH_EXT_NAME(glFramebufferTexture1DEXT) -#define glFramebufferTexture2DEXT GLH_EXT_NAME(glFramebufferTexture2DEXT) -#define glFramebufferTexture3DEXT GLH_EXT_NAME(glFramebufferTexture3DEXT) -#define glFramebufferRenderbufferEXT GLH_EXT_NAME(glFramebufferRenderbufferEXT) -#define glGetFramebufferAttachmentParameterivEXT GLH_EXT_NAME(glGetFramebufferAttachmentParameterivEXT) -#define glGenerateMipmapEXT GLH_EXT_NAME(glGenerateMipmapEXT) -#endif - -#ifdef GL_EXT_multi_draw_arrays -#define glMultiDrawArraysEXT GLH_EXT_NAME(glMultiDrawArraysEXT) -#define glMultiDrawElementsEXT GLH_EXT_NAME(glMultiDrawElementsEXT) -#endif - -#ifdef GL_EXT_light_max_exponent -#endif - -#ifdef GL_EXT_packed_pixels -#endif - -#ifdef GL_EXT_paletted_texture -#define glColorSubTableEXT GLH_EXT_NAME(glColorSubTableEXT) -#define glColorTableEXT GLH_EXT_NAME(glColorTableEXT) -#define glGetColorTableEXT GLH_EXT_NAME(glGetColorTableEXT) -#define glGetColorTableParameterfvEXT GLH_EXT_NAME(glGetColorTableParameterfvEXT) -#define glGetColorTableParameterivEXT GLH_EXT_NAME(glGetColorTableParameterivEXT) -#endif - -#ifdef GL_EXT_pixel_buffer_object -#endif - -#ifdef GL_EXT_point_parameters -#define glPointParameterfEXT GLH_EXT_NAME(glPointParameterfEXT) -#define glPointParameterfvEXT GLH_EXT_NAME(glPointParameterfvEXT) -#endif - -#ifdef GL_EXT_rescale_normal -#endif - -#ifdef GL_EXT_secondary_color -#define glSecondaryColor3bEXT GLH_EXT_NAME(glSecondaryColor3bEXT) -#define glSecondaryColor3bvEXT GLH_EXT_NAME(glSecondaryColor3bvEXT) -#define glSecondaryColor3dEXT GLH_EXT_NAME(glSecondaryColor3dEXT) -#define glSecondaryColor3dvEXT GLH_EXT_NAME(glSecondaryColor3dvEXT) -#define glSecondaryColor3fEXT GLH_EXT_NAME(glSecondaryColor3fEXT) -#define glSecondaryColor3fvEXT GLH_EXT_NAME(glSecondaryColor3fvEXT) -#define glSecondaryColor3iEXT GLH_EXT_NAME(glSecondaryColor3iEXT) -#define glSecondaryColor3ivEXT GLH_EXT_NAME(glSecondaryColor3ivEXT) -#define glSecondaryColor3sEXT GLH_EXT_NAME(glSecondaryColor3sEXT) -#define glSecondaryColor3svEXT GLH_EXT_NAME(glSecondaryColor3svEXT) -#define glSecondaryColor3ubEXT GLH_EXT_NAME(glSecondaryColor3ubEXT) -#define glSecondaryColor3ubvEXT GLH_EXT_NAME(glSecondaryColor3ubvEXT) -#define glSecondaryColor3uiEXT GLH_EXT_NAME(glSecondaryColor3uiEXT) -#define glSecondaryColor3uivEXT GLH_EXT_NAME(glSecondaryColor3uivEXT) -#define glSecondaryColor3usEXT GLH_EXT_NAME(glSecondaryColor3usEXT) -#define glSecondaryColor3usvEXT GLH_EXT_NAME(glSecondaryColor3usvEXT) -#define glSecondaryColorPointerEXT GLH_EXT_NAME(glSecondaryColorPointerEXT) -#endif - -#ifdef GL_EXT_separate_specular_color -#endif - -#ifdef GL_EXT_shadow_funcs -#endif - -#ifdef GL_EXT_shared_texture_palette -#endif - -#ifdef GL_EXT_stencil_two_side -#define glActiveStencilFaceEXT GLH_EXT_NAME(glActiveStencilFaceEXT) -#endif - -#ifdef GL_EXT_stencil_wrap -#endif - -#ifdef GL_EXT_texture_compression_s3tc -#endif - -#ifdef GL_EXT_texture_cube_map -#endif - -#ifdef GL_EXT_texture_edge_clamp -#endif - -#ifdef GL_EXT_texture_env_add -#endif - -#ifdef GL_EXT_texture_env_combine -#endif - -#ifdef GL_EXT_texture_env_dot3 -#endif - -#ifdef GL_EXT_texture_filter_anisotropic -#endif - -#ifdef GL_EXT_texture_lod_bias -#endif - -#ifdef GL_EXT_texture_object -#define glAreTexturesResidentEXT GLH_EXT_NAME(glAreTexturesResidentEXT) -#define glBindTextureEXT GLH_EXT_NAME(glBindTextureEXT) -#define glDeleteTexturesEXT GLH_EXT_NAME(glDeleteTexturesEXT) -#define glGenTexturesEXT GLH_EXT_NAME(glGenTexturesEXT) -#define glIsTextureEXT GLH_EXT_NAME(glIsTextureEXT) -#define glPrioritizeTexturesEXT GLH_EXT_NAME(glPrioritizeTexturesEXT) -#endif - -#ifdef GL_EXT_texture_rectangle -#endif - -#ifdef GL_EXT_texture3D -#define glTexImage3DEXT GLH_EXT_NAME(glTexImage3DEXT) -#endif - -#ifdef GL_EXT_vertex_array -#define glArrayElementEXT GLH_EXT_NAME(glArrayElementEXT) -#define glColorPointerEXT GLH_EXT_NAME(glColorPointerEXT) -#define glEdgeFlagPointerEXT GLH_EXT_NAME(glEdgeFlagPointerEXT) -#define glGetPointervEXT GLH_EXT_NAME(glGetPointervEXT) -#define glIndexPointerEXT GLH_EXT_NAME(glIndexPointerEXT) -#define glNormalPointerEXT GLH_EXT_NAME(glNormalPointerEXT) -#define glTexCoordPointerEXT GLH_EXT_NAME(glTexCoordPointerEXT) -#define glVertexPointerEXT GLH_EXT_NAME(glVertexPointerEXT) -#define glDrawArraysEXT GLH_EXT_NAME(glDrawArraysEXT) -#endif - -#ifdef GL_EXT_vertex_weighting -#define glVertexWeightfEXT GLH_EXT_NAME(glVertexWeightfEXT) -#define glVertexWeightfvEXT GLH_EXT_NAME(glVertexWeightfvEXT) -#define glVertexWeightPointerEXT GLH_EXT_NAME(glVertexWeightPointerEXT) -#endif - -#ifdef GL_HP_occlusion_test -#endif - -#ifdef GL_IBM_texture_mirrored_repeat -#endif - -#ifdef GL_NV_blend_square -#endif - -#ifdef GL_NV_copy_depth_to_color -#endif - -#ifdef GL_NV_depth_clamp -#endif - -#ifdef GL_NV_element_array -#define glElementPointerNV GLH_EXT_NAME(glElementPointerNV) -#define glDrawElementArrayNV GLH_EXT_NAME(glDrawElementArrayNV) -#define glDrawRangeElementArrayNV GLH_EXT_NAME(glDrawRangeElementArrayNV) -#define glMultiDrawElementArrayNV GLH_EXT_NAME(glMultiDrawElementArrayNV) -#define glMultiDrawRangeElementArrayNV GLH_EXT_NAME(glMultiDrawRangeElementArrayNV) -#endif - -#ifdef GL_NV_fence -#define glGenFencesNV GLH_EXT_NAME(glGenFencesNV) -#define glDeleteFencesNV GLH_EXT_NAME(glDeleteFencesNV) -#define glSetFenceNV GLH_EXT_NAME(glSetFenceNV) -#define glTestFenceNV GLH_EXT_NAME(glTestFenceNV) -#define glFinishFenceNV GLH_EXT_NAME(glFinishFenceNV) -#define glIsFenceNV GLH_EXT_NAME(glIsFenceNV) -#define glGetFenceivNV GLH_EXT_NAME(glGetFenceivNV) -#endif - -#ifdef GL_NV_float_buffer -#endif - -#ifdef GL_NV_fog_distance -#endif - -#ifdef GL_NV_fragment_program -#define glProgramNamedParameter4fNV GLH_EXT_NAME(glProgramNamedParameter4fNV) -#define glProgramNamedParameter4dNV GLH_EXT_NAME(glProgramNamedParameter4dNV) -#define glProgramNamedParameter4fvNV GLH_EXT_NAME(glProgramNamedParameter4fvNV) -#define glProgramNamedParameter4dvNV GLH_EXT_NAME(glProgramNamedParameter4dvNV) -#define glGetProgramNamedParameterfvNV GLH_EXT_NAME(glGetProgramNamedParameterfvNV) -#define glGetProgramNamedParameterdvNV GLH_EXT_NAME(glGetProgramNamedParameterdvNV) -#endif - -#ifdef GL_NV_fragment_program2 -#endif - -#ifdef GL_NV_half_float -#define glVertex2hNV GLH_EXT_NAME(glVertex2hNV) -#define glVertex2hvNV GLH_EXT_NAME(glVertex2hvNV) -#define glVertex3hNV GLH_EXT_NAME(glVertex3hNV) -#define glVertex3hvNV GLH_EXT_NAME(glVertex3hvNV) -#define glVertex4hNV GLH_EXT_NAME(glVertex4hNV) -#define glVertex4hvNV GLH_EXT_NAME(glVertex4hvNV) -#define glNormal3hNV GLH_EXT_NAME(glNormal3hNV) -#define glNormal3hvNV GLH_EXT_NAME(glNormal3hvNV) -#define glColor3hNV GLH_EXT_NAME(glColor3hNV) -#define glColor3hvNV GLH_EXT_NAME(glColor3hvNV) -#define glColor4hNV GLH_EXT_NAME(glColor4hNV) -#define glColor4hvNV GLH_EXT_NAME(glColor4hvNV) -#define glTexCoord1hNV GLH_EXT_NAME(glTexCoord1hNV) -#define glTexCoord1hvNV GLH_EXT_NAME(glTexCoord1hvNV) -#define glTexCoord2hNV GLH_EXT_NAME(glTexCoord2hNV) -#define glTexCoord2hvNV GLH_EXT_NAME(glTexCoord2hvNV) -#define glTexCoord3hNV GLH_EXT_NAME(glTexCoord3hNV) -#define glTexCoord3hvNV GLH_EXT_NAME(glTexCoord3hvNV) -#define glTexCoord4hNV GLH_EXT_NAME(glTexCoord4hNV) -#define glTexCoord4hvNV GLH_EXT_NAME(glTexCoord4hvNV) -#define glMultiTexCoord1hNV GLH_EXT_NAME(glMultiTexCoord1hNV) -#define glMultiTexCoord1hvNV GLH_EXT_NAME(glMultiTexCoord1hvNV) -#define glMultiTexCoord2hNV GLH_EXT_NAME(glMultiTexCoord2hNV) -#define glMultiTexCoord2hvNV GLH_EXT_NAME(glMultiTexCoord2hvNV) -#define glMultiTexCoord3hNV GLH_EXT_NAME(glMultiTexCoord3hNV) -#define glMultiTexCoord3hvNV GLH_EXT_NAME(glMultiTexCoord3hvNV) -#define glMultiTexCoord4hNV GLH_EXT_NAME(glMultiTexCoord4hNV) -#define glMultiTexCoord4hvNV GLH_EXT_NAME(glMultiTexCoord4hvNV) -#define glFogCoordhNV GLH_EXT_NAME(glFogCoordhNV) -#define glFogCoordhvNV GLH_EXT_NAME(glFogCoordhvNV) -#define glSecondaryColor3hNV GLH_EXT_NAME(glSecondaryColor3hNV) -#define glSecondaryColor3hvNV GLH_EXT_NAME(glSecondaryColor3hvNV) -#define glVertexAttrib1hNV GLH_EXT_NAME(glVertexAttrib1hNV) -#define glVertexAttrib1hvNV GLH_EXT_NAME(glVertexAttrib1hvNV) -#define glVertexAttrib2hNV GLH_EXT_NAME(glVertexAttrib2hNV) -#define glVertexAttrib2hvNV GLH_EXT_NAME(glVertexAttrib2hvNV) -#define glVertexAttrib3hNV GLH_EXT_NAME(glVertexAttrib3hNV) -#define glVertexAttrib3hvNV GLH_EXT_NAME(glVertexAttrib3hvNV) -#define glVertexAttrib4hNV GLH_EXT_NAME(glVertexAttrib4hNV) -#define glVertexAttrib4hvNV GLH_EXT_NAME(glVertexAttrib4hvNV) -#define glVertexAttribs1hvNV GLH_EXT_NAME(glVertexAttribs1hvNV) -#define glVertexAttribs2hvNV GLH_EXT_NAME(glVertexAttribs2hvNV) -#define glVertexAttribs3hvNV GLH_EXT_NAME(glVertexAttribs3hvNV) -#define glVertexAttribs4hvNV GLH_EXT_NAME(glVertexAttribs4hvNV) -#endif - -#ifdef GL_NV_light_max_exponent -#endif - -#ifdef GL_NV_multisample_filter_hint -#endif - -#ifdef GL_NV_occlusion_query -#define glGenOcclusionQueriesNV GLH_EXT_NAME(glGenOcclusionQueriesNV) -#define glDeleteOcclusionQueriesNV GLH_EXT_NAME(glDeleteOcclusionQueriesNV) -#define glIsOcclusionQueryNV GLH_EXT_NAME(glIsOcclusionQueryNV) -#define glBeginOcclusionQueryNV GLH_EXT_NAME(glBeginOcclusionQueryNV) -#define glEndOcclusionQueryNV GLH_EXT_NAME(glEndOcclusionQueryNV) -#define glGetOcclusionQueryivNV GLH_EXT_NAME(glGetOcclusionQueryivNV) -#define glGetOcclusionQueryuivNV GLH_EXT_NAME(glGetOcclusionQueryuivNV) -#endif - -#ifdef GL_NV_packed_depth_stencil -#endif - -#ifdef GL_NV_pixel_buffer_object -#endif - -#ifdef GL_NV_pixel_data_range -#define glPixelDataRangeNV GLH_EXT_NAME(glPixelDataRangeNV) -#define glFlushPixelDataRangeNV GLH_EXT_NAME(glFlushPixelDataRangeNV) -#endif - -#ifdef GL_NV_point_sprite -#define glPointParameteriNV GLH_EXT_NAME(glPointParameteriNV) -#define glPointParameterivNV GLH_EXT_NAME(glPointParameterivNV) -#endif - -#ifdef GL_NV_primitive_restart -#define glPrimitiveRestartNV GLH_EXT_NAME(glPrimitiveRestartNV) -#define glPrimitiveRestartIndexNV GLH_EXT_NAME(glPrimitiveRestartIndexNV) -#endif - -#ifdef GL_NV_register_combiners -#define glCombinerParameterfvNV GLH_EXT_NAME(glCombinerParameterfvNV) -#define glCombinerParameterfNV GLH_EXT_NAME(glCombinerParameterfNV) -#define glCombinerParameterivNV GLH_EXT_NAME(glCombinerParameterivNV) -#define glCombinerParameteriNV GLH_EXT_NAME(glCombinerParameteriNV) -#define glCombinerInputNV GLH_EXT_NAME(glCombinerInputNV) -#define glCombinerOutputNV GLH_EXT_NAME(glCombinerOutputNV) -#define glFinalCombinerInputNV GLH_EXT_NAME(glFinalCombinerInputNV) -#define glGetCombinerInputParameterfvNV GLH_EXT_NAME(glGetCombinerInputParameterfvNV) -#define glGetCombinerInputParameterivNV GLH_EXT_NAME(glGetCombinerInputParameterivNV) -#define glGetCombinerOutputParameterfvNV GLH_EXT_NAME(glGetCombinerOutputParameterfvNV) -#define glGetCombinerOutputParameterivNV GLH_EXT_NAME(glGetCombinerOutputParameterivNV) -#define glGetFinalCombinerInputParameterfvNV GLH_EXT_NAME(glGetFinalCombinerInputParameterfvNV) -#define glGetFinalCombinerInputParameterivNV GLH_EXT_NAME(glGetFinalCombinerInputParameterivNV) -#endif - -#ifdef GL_NV_register_combiners2 -#define glCombinerStageParameterfvNV GLH_EXT_NAME(glCombinerStageParameterfvNV) -#define glGetCombinerStageParameterfvNV GLH_EXT_NAME(glGetCombinerStageParameterfvNV) -#endif - -#ifdef GL_NV_stencil_two_side -#define glActiveStencilFaceNV GLH_EXT_NAME(glActiveStencilFaceNV) -#endif - -#ifdef GL_NV_texgen_reflection -#endif - -#ifdef GL_NV_texture_compression_vtc -#endif - -#ifdef GL_NV_texture_env_combine4 -#endif - -#ifdef GL_NV_texture_expand_normal -#endif - -#ifdef GL_NV_texture_rectangle -#endif - -#ifdef GL_NV_texture_shader -#endif - -#ifdef GL_NV_texture_shader2 -#endif - -#ifdef GL_NV_texture_shader3 -#endif - -#ifdef GL_NV_vertex_array_range -#define glFlushVertexArrayRangeNV GLH_EXT_NAME(glFlushVertexArrayRangeNV) -#define glVertexArrayRangeNV GLH_EXT_NAME(glVertexArrayRangeNV) -# ifdef _WIN32 -#define wglAllocateMemoryNV GLH_EXT_NAME(wglAllocateMemoryNV) -# endif -# ifdef GLX_VERSION_1_3 -#define glXAllocateMemoryNV GLH_EXT_NAME(glXAllocateMemoryNV) -# endif -# ifdef _WIN32 -#define wglFreeMemoryNV GLH_EXT_NAME(wglFreeMemoryNV) -# endif -# ifdef GLX_VERSION_1_3 -#define glXFreeMemoryNV GLH_EXT_NAME(glXFreeMemoryNV) -# endif -#endif - -#ifdef GL_NV_vertex_array_range2 -#endif - -#ifdef GL_NV_vertex_program -#define glAreProgramsResidentNV GLH_EXT_NAME(glAreProgramsResidentNV) -#define glBindProgramNV GLH_EXT_NAME(glBindProgramNV) -#define glDeleteProgramsNV GLH_EXT_NAME(glDeleteProgramsNV) -#define glExecuteProgramNV GLH_EXT_NAME(glExecuteProgramNV) -#define glGenProgramsNV GLH_EXT_NAME(glGenProgramsNV) -#define glGetProgramParameterdvNV GLH_EXT_NAME(glGetProgramParameterdvNV) -#define glGetProgramParameterfvNV GLH_EXT_NAME(glGetProgramParameterfvNV) -#define glGetProgramivNV GLH_EXT_NAME(glGetProgramivNV) -#define glGetProgramStringNV GLH_EXT_NAME(glGetProgramStringNV) -#define glGetTrackMatrixivNV GLH_EXT_NAME(glGetTrackMatrixivNV) -#define glGetVertexAttribdvNV GLH_EXT_NAME(glGetVertexAttribdvNV) -#define glGetVertexAttribfvNV GLH_EXT_NAME(glGetVertexAttribfvNV) -#define glGetVertexAttribivNV GLH_EXT_NAME(glGetVertexAttribivNV) -#define glGetVertexAttribPointervNV GLH_EXT_NAME(glGetVertexAttribPointervNV) -#define glIsProgramNV GLH_EXT_NAME(glIsProgramNV) -#define glLoadProgramNV GLH_EXT_NAME(glLoadProgramNV) -#define glProgramParameter4dNV GLH_EXT_NAME(glProgramParameter4dNV) -#define glProgramParameter4dvNV GLH_EXT_NAME(glProgramParameter4dvNV) -#define glProgramParameter4fNV GLH_EXT_NAME(glProgramParameter4fNV) -#define glProgramParameter4fvNV GLH_EXT_NAME(glProgramParameter4fvNV) -#define glProgramParameters4dvNV GLH_EXT_NAME(glProgramParameters4dvNV) -#define glProgramParameters4fvNV GLH_EXT_NAME(glProgramParameters4fvNV) -#define glRequestResidentProgramsNV GLH_EXT_NAME(glRequestResidentProgramsNV) -#define glTrackMatrixNV GLH_EXT_NAME(glTrackMatrixNV) -#define glVertexAttribPointerNV GLH_EXT_NAME(glVertexAttribPointerNV) -#define glVertexAttrib1dNV GLH_EXT_NAME(glVertexAttrib1dNV) -#define glVertexAttrib1dvNV GLH_EXT_NAME(glVertexAttrib1dvNV) -#define glVertexAttrib1fNV GLH_EXT_NAME(glVertexAttrib1fNV) -#define glVertexAttrib1fvNV GLH_EXT_NAME(glVertexAttrib1fvNV) -#define glVertexAttrib1sNV GLH_EXT_NAME(glVertexAttrib1sNV) -#define glVertexAttrib1svNV GLH_EXT_NAME(glVertexAttrib1svNV) -#define glVertexAttrib2dNV GLH_EXT_NAME(glVertexAttrib2dNV) -#define glVertexAttrib2dvNV GLH_EXT_NAME(glVertexAttrib2dvNV) -#define glVertexAttrib2fNV GLH_EXT_NAME(glVertexAttrib2fNV) -#define glVertexAttrib2fvNV GLH_EXT_NAME(glVertexAttrib2fvNV) -#define glVertexAttrib2sNV GLH_EXT_NAME(glVertexAttrib2sNV) -#define glVertexAttrib2svNV GLH_EXT_NAME(glVertexAttrib2svNV) -#define glVertexAttrib3dNV GLH_EXT_NAME(glVertexAttrib3dNV) -#define glVertexAttrib3dvNV GLH_EXT_NAME(glVertexAttrib3dvNV) -#define glVertexAttrib3fNV GLH_EXT_NAME(glVertexAttrib3fNV) -#define glVertexAttrib3fvNV GLH_EXT_NAME(glVertexAttrib3fvNV) -#define glVertexAttrib3sNV GLH_EXT_NAME(glVertexAttrib3sNV) -#define glVertexAttrib3svNV GLH_EXT_NAME(glVertexAttrib3svNV) -#define glVertexAttrib4dNV GLH_EXT_NAME(glVertexAttrib4dNV) -#define glVertexAttrib4dvNV GLH_EXT_NAME(glVertexAttrib4dvNV) -#define glVertexAttrib4fNV GLH_EXT_NAME(glVertexAttrib4fNV) -#define glVertexAttrib4fvNV GLH_EXT_NAME(glVertexAttrib4fvNV) -#define glVertexAttrib4sNV GLH_EXT_NAME(glVertexAttrib4sNV) -#define glVertexAttrib4svNV GLH_EXT_NAME(glVertexAttrib4svNV) -#define glVertexAttrib4ubvNV GLH_EXT_NAME(glVertexAttrib4ubvNV) -#define glVertexAttribs1dvNV GLH_EXT_NAME(glVertexAttribs1dvNV) -#define glVertexAttribs1fvNV GLH_EXT_NAME(glVertexAttribs1fvNV) -#define glVertexAttribs1svNV GLH_EXT_NAME(glVertexAttribs1svNV) -#define glVertexAttribs2dvNV GLH_EXT_NAME(glVertexAttribs2dvNV) -#define glVertexAttribs2fvNV GLH_EXT_NAME(glVertexAttribs2fvNV) -#define glVertexAttribs2svNV GLH_EXT_NAME(glVertexAttribs2svNV) -#define glVertexAttribs3dvNV GLH_EXT_NAME(glVertexAttribs3dvNV) -#define glVertexAttribs3fvNV GLH_EXT_NAME(glVertexAttribs3fvNV) -#define glVertexAttribs3svNV GLH_EXT_NAME(glVertexAttribs3svNV) -#define glVertexAttribs4dvNV GLH_EXT_NAME(glVertexAttribs4dvNV) -#define glVertexAttribs4fvNV GLH_EXT_NAME(glVertexAttribs4fvNV) -#define glVertexAttribs4svNV GLH_EXT_NAME(glVertexAttribs4svNV) -#define glVertexAttribs4ubvNV GLH_EXT_NAME(glVertexAttribs4ubvNV) -#endif - -#ifdef GL_NV_vertex_program1_1 -#endif - -#ifdef GL_NV_vertex_program2 -#endif - -#ifdef GL_NV_vertex_program2_option -#endif - -#ifdef GL_NV_vertex_program3 -#endif - -#ifdef GL_SGIS_generate_mipmap -#endif - -#ifdef GL_SGIS_texture_lod -#endif - -#ifdef GL_SGIX_depth_texture -#endif - -#ifdef GL_SGIX_shadow -#endif - -#ifdef GL_WIN_swap_hint -#define glAddSwapHintRectWIN GLH_EXT_NAME(glAddSwapHintRectWIN) -#endif - -#ifdef WGL_ARB_buffer_region -# ifdef _WIN32 -#define wglCreateBufferRegionARB GLH_EXT_NAME(wglCreateBufferRegionARB) -# endif -# ifdef _WIN32 -#define wglDeleteBufferRegionARB GLH_EXT_NAME(wglDeleteBufferRegionARB) -# endif -# ifdef _WIN32 -#define wglSaveBufferRegionARB GLH_EXT_NAME(wglSaveBufferRegionARB) -# endif -# ifdef _WIN32 -#define wglRestoreBufferRegionARB GLH_EXT_NAME(wglRestoreBufferRegionARB) -# endif -#endif - -#ifdef WGL_ARB_extensions_string -# ifdef _WIN32 -#define wglGetExtensionsStringARB GLH_EXT_NAME(wglGetExtensionsStringARB) -# endif -#endif - -#ifdef WGL_ARB_pbuffer -# ifdef _WIN32 -#define wglCreatePbufferARB GLH_EXT_NAME(wglCreatePbufferARB) -# endif -# ifdef _WIN32 -#define wglGetPbufferDCARB GLH_EXT_NAME(wglGetPbufferDCARB) -# endif -# ifdef _WIN32 -#define wglReleasePbufferDCARB GLH_EXT_NAME(wglReleasePbufferDCARB) -# endif -# ifdef _WIN32 -#define wglDestroyPbufferARB GLH_EXT_NAME(wglDestroyPbufferARB) -# endif -# ifdef _WIN32 -#define wglQueryPbufferARB GLH_EXT_NAME(wglQueryPbufferARB) -# endif -#endif - -#ifdef WGL_ARB_pixel_format -# ifdef _WIN32 -#define wglGetPixelFormatAttribivARB GLH_EXT_NAME(wglGetPixelFormatAttribivARB) -# endif -# ifdef _WIN32 -#define wglGetPixelFormatAttribfvARB GLH_EXT_NAME(wglGetPixelFormatAttribfvARB) -# endif -# ifdef _WIN32 -#define wglChoosePixelFormatARB GLH_EXT_NAME(wglChoosePixelFormatARB) -# endif -#endif - -#ifdef WGL_ARB_render_texture -# ifdef _WIN32 -#define wglBindTexImageARB GLH_EXT_NAME(wglBindTexImageARB) -# endif -# ifdef _WIN32 -#define wglReleaseTexImageARB GLH_EXT_NAME(wglReleaseTexImageARB) -# endif -# ifdef _WIN32 -#define wglSetPbufferAttribARB GLH_EXT_NAME(wglSetPbufferAttribARB) -# endif -#endif - -#ifdef WGL_ATI_pixel_format_float -#endif - -#ifdef WGL_EXT_extensions_string -# ifdef _WIN32 -#define wglGetExtensionsStringEXT GLH_EXT_NAME(wglGetExtensionsStringEXT) -# endif -#endif - -#ifdef WGL_EXT_swap_control -# ifdef _WIN32 -#define wglSwapIntervalEXT GLH_EXT_NAME(wglSwapIntervalEXT) -# endif -# ifdef _WIN32 -#define wglGetSwapIntervalEXT GLH_EXT_NAME(wglGetSwapIntervalEXT) -# endif -#endif - -#ifdef WGL_NV_float_buffer -#endif - -#ifdef WGL_NV_render_depth_texture -#endif - -#ifdef WGL_NV_render_texture_rectangle -#endif - -#ifdef GLX_NV_float_buffer -#endif - -#ifdef GL_NVX_conditional_render -#define glBeginConditionalRenderNVX GLH_EXT_NAME(glBeginConditionalRenderNVX) -#define glEndConditionalRenderNVX GLH_EXT_NAME(glEndConditionalRenderNVX) -#endif - -#ifdef GLX_SGIX_pbuffer -# ifdef GLX_VERSION_1_3 -#define glXCreateGLXPbufferSGIX GLH_EXT_NAME(glXCreateGLXPbufferSGIX) -# endif -# ifdef GLX_VERSION_1_3 -#define glXDestroyGLXPbufferSGIX GLH_EXT_NAME(glXDestroyGLXPbufferSGIX) -# endif -# ifdef GLX_VERSION_1_3 -#define glXQueryGLXPbufferSGIX GLH_EXT_NAME(glXQueryGLXPbufferSGIX) -# endif -# ifdef GLX_VERSION_1_3 -#define glXSelectEventSGIX GLH_EXT_NAME(glXSelectEventSGIX) -# endif -# ifdef GLX_VERSION_1_3 -#define glXGetSelectedEventSGIX GLH_EXT_NAME(glXGetSelectedEventSGIX) -# endif -#endif - -#ifdef GLX_SGIX_fbconfig -# ifdef GLX_VERSION_1_3 -#define glXGetFBConfigAttribSGIX GLH_EXT_NAME(glXGetFBConfigAttribSGIX) -# endif -# ifdef GLX_VERSION_1_3 -#define glXChooseFBConfigSGIX GLH_EXT_NAME(glXChooseFBConfigSGIX) -# endif -# ifdef GLX_VERSION_1_3 -#define glXCreateGLXPixmapWithConfigSGIX GLH_EXT_NAME(glXCreateGLXPixmapWithConfigSGIX) -# endif -# ifdef GLX_VERSION_1_3 -#define glXCreateContextWithConfigSGIX GLH_EXT_NAME(glXCreateContextWithConfigSGIX) -# endif -# ifdef GLX_VERSION_1_3 -#define glXGetVisualFromFBConfigSGIX GLH_EXT_NAME(glXGetVisualFromFBConfigSGIX) -# endif -# ifdef GLX_VERSION_1_3 -#define glXGetFBConfigFromVisualSGIX GLH_EXT_NAME(glXGetFBConfigFromVisualSGIX) -# endif -#endif - - -#endif diff --git a/ThirdParty/GL/glh/glh_glut.h b/ThirdParty/GL/glh/glh_glut.h deleted file mode 100644 index def9f6ad..00000000 --- a/ThirdParty/GL/glh/glh_glut.h +++ /dev/null @@ -1,861 +0,0 @@ -/* - glh - is a platform-indepenedent C++ OpenGL helper library - - - Copyright (c) 2000 Cass Everitt - Copyright (c) 2000 NVIDIA Corporation - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - * Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - * The names of contributors to this software may not be used - to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - - Cass Everitt - cass@r3.nu -*/ - -#ifndef GLH_GLUT_H -#define GLH_GLUT_H - -// some helper functions and object to -// make writing simple glut programs even easier! :-) - -#ifdef MACOS -#include -#else -#include -#endif - -#include -#include -#include - -namespace glh -{ - - class glut_interactor - { - public: - glut_interactor() { enabled = true; } - - virtual void display() {} - virtual void idle() {} - virtual void keyboard(unsigned char key, int x, int y) {} - virtual void menu_status(int status, int x, int y) {} - virtual void motion(int x, int y) {} - virtual void mouse(int button, int state, int x, int y) {} - virtual void passive_motion(int x, int y) {} - virtual void reshape(int w, int h) {} - virtual void special(int key, int x, int y) {} - virtual void timer(int value) {} - virtual void visibility(int v) {} - - virtual void enable() { enabled = true; } - virtual void disable() { enabled = false; } - - bool enabled; - }; - - std::list interactors; - bool propagate; - - void glut_display_function() - { - propagate = true; - for(std::list::iterator it=interactors.begin(); it != interactors.end() && propagate; it++) - (*it)->display(); - } - - void glut_idle_function() - { - propagate = true; - for(std::list::iterator it=interactors.begin(); it != interactors.end() && propagate; it++) - (*it)->idle(); - } - - void glut_keyboard_function(unsigned char k, int x, int y) - { - propagate = true; - for(std::list::iterator it=interactors.begin(); it != interactors.end() && propagate; it++) - (*it)->keyboard(k, x, y); - } - - void glut_menu_status_function(int status, int x, int y) - { - propagate = true; - for(std::list::iterator it=interactors.begin(); it != interactors.end() && propagate; it++) - (*it)->menu_status(status, x, y); - } - - void glut_motion_function(int x, int y) - { - propagate = true; - for(std::list::iterator it=interactors.begin(); it != interactors.end() && propagate; it++) - (*it)->motion(x, y); - } - - void glut_mouse_function(int button, int state, int x, int y) - { - propagate = true; - for(std::list::iterator it=interactors.begin(); it != interactors.end() && propagate; it++) - (*it)->mouse(button, state, x, y); - } - - void glut_passive_motion_function(int x, int y) - { - propagate = true; - for(std::list::iterator it=interactors.begin(); it != interactors.end() && propagate; it++) - (*it)->passive_motion(x, y); - } - - void glut_reshape_function(int w, int h) - { - propagate = true; - for(std::list::iterator it=interactors.begin(); it != interactors.end() && propagate; it++) - (*it)->reshape(w,h); - } - - void glut_special_function(int k, int x, int y) - { - propagate = true; - for(std::list::iterator it=interactors.begin(); it != interactors.end() && propagate; it++) - (*it)->special(k, x, y); - } - - void glut_timer_function(int v) - { - propagate = true; - for(std::list::iterator it=interactors.begin(); it != interactors.end() && propagate; it++) - (*it)->timer(v); - } - - void glut_visibility_function(int v) - { - propagate = true; - for(std::list::iterator it=interactors.begin(); it != interactors.end() && propagate; it++) - (*it)->visibility(v); - } - - // stop processing the current event - inline void glut_event_processed() - { - propagate = false; - } - - inline void glut_helpers_initialize() - { - glutDisplayFunc(glut_display_function); - glutIdleFunc(0); - glutKeyboardFunc(glut_keyboard_function); - glutMenuStatusFunc(glut_menu_status_function); - glutMotionFunc(glut_motion_function); - glutMouseFunc(glut_mouse_function); - glutPassiveMotionFunc(glut_passive_motion_function); - glutReshapeFunc(glut_reshape_function); - glutSpecialFunc(glut_special_function); - glutVisibilityFunc(glut_visibility_function); - } - - inline void glut_remove_interactor(glut_interactor *gi) - { - std::list::iterator it = - std::find(interactors.begin(), interactors.end(), gi); - if(it != interactors.end()) - interactors.erase(it); - } - - inline void glut_add_interactor(glut_interactor *gi, bool append=true) - { - glut_remove_interactor(gi); - if(append) - interactors.push_back(gi); - else - interactors.push_front(gi); - } - - inline void glut_timer(int msec, int value) - { - glutTimerFunc(msec, glut_timer_function, value); - } - - inline void glut_idle(bool do_idle) - { - glutIdleFunc(do_idle ? glut_idle_function : 0); - } - - class glut_callbacks : public glut_interactor - { - public: - glut_callbacks() : - display_function(0), - idle_function(0), - keyboard_function(0), - menu_status_function(0), - motion_function(0), - mouse_function(0), - passive_motion_function(0), - reshape_function(0), - special_function(0), - timer_function(0), - visibility_function() - {} - - virtual void display() - { if(display_function) display_function(); } - - virtual void idle() - { if(idle_function) idle_function(); } - - virtual void keyboard(unsigned char k, int x, int y) - { if(keyboard_function) keyboard_function(k, x, y); } - - virtual void menu_status(int status, int x, int y) - { if(menu_status_function) menu_status_function(status, x, y); } - - virtual void motion(int x, int y) - { if(motion_function) motion_function(x,y); } - - virtual void mouse(int button, int state, int x, int y) - { if(mouse_function) mouse_function(button, state, x, y); } - - virtual void passive_motion(int x, int y) - { if(passive_motion_function) passive_motion_function(x, y); } - - virtual void reshape(int w, int h) - { if(reshape_function) reshape_function(w, h); } - - virtual void special(int key, int x, int y) - { if(special_function) special_function(key, x, y); } - - virtual void timer(int value) - { if(timer_function) timer_function(value); } - - virtual void visibility(int v) - { if(visibility_function) visibility_function(v); } - - void (* display_function) (); - void (* idle_function) (); - void (* keyboard_function) (unsigned char, int, int); - void (* menu_status_function) (int, int, int); - void (* motion_function) (int, int); - void (* mouse_function) (int, int, int, int); - void (* passive_motion_function) (int, int); - void (* reshape_function) (int, int); - void (* special_function) (int, int, int); - void (* timer_function) (int); - void (* visibility_function) (int); - - }; - - - - class glut_perspective_reshaper : public glut_interactor - { - public: - glut_perspective_reshaper(float infovy = 60.f, float inzNear = .1f, float inzFar = 10.f) - : fovy(infovy), zNear(inzNear), zFar(inzFar), aspect_factor(1) {} - - void reshape(int w, int h) - { - width = w; height = h; - - if(enabled) apply(); - } - - void apply() - { - glViewport(0,0,width,height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - apply_perspective(); - glMatrixMode(GL_MODELVIEW); - } - void apply_perspective() - { - aspect = aspect_factor * float(width)/float(height); - if ( aspect < 1 ) - { - // fovy is a misnomer.. we really mean the fov applies to the - // smaller dimension - float fovx = fovy; - float real_fov = to_degrees(2 * atan(tan(to_radians(fovx/2))/aspect)); - gluPerspective(real_fov, aspect, zNear, zFar); - } - else - gluPerspective(fovy, aspect, zNear, zFar); - } - int width, height; - float fovy, aspect, zNear, zFar; - float aspect_factor; - }; - - // activates/deactivates on a particular mouse button - // and calculates deltas while active - class glut_simple_interactor : public glut_interactor - { - public: - glut_simple_interactor() - { - activate_on = GLUT_LEFT_BUTTON; - active = false; - use_modifiers = true; - modifiers = 0; - width = height = 0; - x0 = y0 = x = y = dx = dy = 0; - } - - virtual void mouse(int button, int state, int X, int Y) - { - if(enabled && button == activate_on && state == GLUT_DOWN && - (! use_modifiers || (modifiers == glutGetModifiers())) ) - { - active = true; - x = x0 = X; - y = y0 = Y; - dx = dy = 0; - } - else if (enabled && button == activate_on && state == GLUT_UP) - { - if(dx == 0 && dy == 0) - update(); - active = false; - dx = dy = 0; - } - } - - virtual void motion(int X, int Y) - { - if(enabled && active) - { - dx = X - x; dy = y - Y; - x = X; y = Y; - update(); - } - } - - void reshape(int w, int h) - { - width = w; height = h; - } - - virtual void apply_transform() = 0; - virtual void apply_inverse_transform() = 0; - virtual matrix4f get_transform() = 0; - virtual matrix4f get_inverse_transform() = 0; - - virtual void update() {} - - int activate_on; - bool use_modifiers; - int modifiers; - bool active; - int x0, y0; - int x, y; - int dx, dy; - int width, height; - }; - - - class glut_pan : public glut_simple_interactor - { - public: - glut_pan() - { - scale = .01f; - invert_increment = false; - parent_rotation = 0; - } - void update() - { - vec3f v(dx, dy, 0); - if(parent_rotation != 0) parent_rotation->mult_vec(v); - - if(invert_increment) - pan -= v * scale; - else - pan += v * scale; - glutPostRedisplay(); - } - - void apply_transform() - { - //cerr << "Applying transform: " << (x - x0) << ", " << (y - y0) << endl; - glTranslatef(pan[0], pan[1], pan[2]); - } - - void apply_inverse_transform() - { - //cerr << "Applying transform: " << (x - x0) << ", " << (y - y0) << endl; - glTranslatef(-pan[0], -pan[1], -pan[2]); - } - - matrix4f get_transform() - { - matrix4f m; - m.make_identity(); - m.set_translate(pan); - return m; - } - - matrix4f get_inverse_transform() - { - matrix4f m; - m.make_identity(); - m.set_translate(-pan); - return m; - } - - - bool invert_increment; - const rotationf * parent_rotation; - vec3f pan; - float scale; - }; - - - class glut_dolly : public glut_simple_interactor - { - public: - glut_dolly() - { - scale = .01f; - invert_increment = false; - parent_rotation = 0; - } - void update() - { - vec3f v(0,0,dy); - if(parent_rotation != 0) parent_rotation->mult_vec(v); - - if(invert_increment) - dolly += v * scale; - else - dolly -= v * scale; - glutPostRedisplay(); - } - - void apply_transform() - { - //cerr << "Applying transform: " << (x - x0) << ", " << (y - y0) << endl; - glTranslatef(dolly[0], dolly[1], dolly[2]); - } - - void apply_inverse_transform() - { - //cerr << "Applying transform: " << (x - x0) << ", " << (y - y0) << endl; - glTranslatef(-dolly[0], -dolly[1], -dolly[2]); - } - - matrix4f get_transform() - { - matrix4f m; - m.make_identity(); - m.set_translate(dolly); - return m; - } - - matrix4f get_inverse_transform() - { - matrix4f m; - m.make_identity(); - m.set_translate(-dolly); - return m; - } - - - bool invert_increment; - const rotationf * parent_rotation; - vec3f dolly; - float scale; - }; - - - class glut_trackball : public glut_simple_interactor - { - public: - glut_trackball() - { - r = rotationf(vec3f(0, 1, 0), 0); - centroid = vec3f(0,0,0); - scale = 1; - invert_increment = false; - parent_rotation = 0; - legacy_mode = false; - } - - void update() - { - if(dx == 0 && dy == 0) - { - incr = rotationf(); - return; - } - - if(legacy_mode) - { - vec3f v(dy, -dx, 0); - float len = v.normalize(); - if(parent_rotation != 0) parent_rotation->mult_vec(v); - //r.mult_dir(vec3f(v), v); - if(invert_increment) - incr.set_value(v, -len * scale * -.01); - else - incr.set_value(v, len * scale * -.01); - } - else - { - float min = width < height ? width : height; - min /= 2.f; - vec3f offset(width/2.f, height/2.f, 0); - vec3f a(x-dx, height - (y+dy), 0); - vec3f b( x, height - y , 0); - a -= offset; - b -= offset; - a /= min; - b /= min; - - a[2] = pow(2.0f, -0.5f * a.length()); - a.normalize(); - b[2] = pow(2.0f, -0.5f * b.length()); - b.normalize(); - - - vec3f axis = a.cross(b); - axis.normalize(); - - float angle = acos(a.dot(b)); - - if(parent_rotation != 0) parent_rotation->mult_vec(axis); - - if(invert_increment) - incr.set_value(axis, -angle * scale); - else - incr.set_value(axis, angle * scale); - - } - - // fixme: shouldn't operator*() preserve 'r' in this case? - if(incr[3] != 0) - r = incr * r; - glutPostRedisplay(); - } - - void increment_rotation() - { - if(active) return; - // fixme: shouldn't operator*() preserve 'r' in this case? - if(incr[3] != 0) - r = incr * r; - glutPostRedisplay(); - } - - void apply_transform() - { - glTranslatef(centroid[0], centroid[1], centroid[2]); - glh_rotate(r); - glTranslatef(-centroid[0], -centroid[1], -centroid[2]); - } - - void apply_inverse_transform() - { - glTranslatef(centroid[0], centroid[1], centroid[2]); - glh_rotate(r.inverse()); - glTranslatef(-centroid[0], -centroid[1], -centroid[2]); - } - - - matrix4f get_transform() - { - matrix4f mt, mr, minvt; - mt.set_translate(centroid); - r.get_value(mr); - minvt.set_translate(-centroid); - return mt * mr * minvt; - } - - matrix4f get_inverse_transform() - { - matrix4f mt, mr, minvt; - mt.set_translate(centroid); - r.inverse().get_value(mr); - minvt.set_translate(-centroid); - return mt * mr * minvt; - } - - bool invert_increment; - const rotationf * parent_rotation; - rotationf r; - vec3f centroid; - float scale; - bool legacy_mode; - rotationf incr; - }; - - - class glut_rotate : public glut_simple_interactor - { - public: - glut_rotate() - { - rotate_x = rotate_y = 0; - scale = 1; - } - void update() - { - rotate_x += dx * scale; - rotate_y += dy * scale; - glutPostRedisplay(); - } - - void apply_transform() - { - glRotatef(rotate_x, 0, 1, 0); - glRotatef(rotate_y, -1, 0, 0); - } - - void apply_inverse_transform() - { - glRotatef(-rotate_y, -1, 0, 0); - glRotatef(-rotate_x, 0, 1, 0); - } - - matrix4f get_transform() - { - rotationf rx(to_radians(rotate_x), 0, 1, 0); - rotationf ry(to_radians(rotate_y), -1, 0, 0); - matrix4f mx, my; - rx.get_value(mx); - ry.get_value(my); - return mx * my; - } - - matrix4f get_inverse_transform() - { - rotationf rx(to_radians(-rotate_x), 0, 1, 0); - rotationf ry(to_radians(-rotate_y), -1, 0, 0); - matrix4f mx, my; - rx.get_value(mx); - ry.get_value(my); - return my * mx; - } - - float rotate_x, rotate_y, scale; - }; - - class glut_mouse_to_keyboard : public glut_simple_interactor - { - public: - glut_mouse_to_keyboard() - { - keyboard_function = 0; - pos_dx_key = neg_dx_key = pos_dy_key = neg_dy_key = 0; - } - void apply_transform() {} - - void apply_inverse_transform() {} - - matrix4f get_transform() {return matrix4f();} - - matrix4f get_inverse_transform() {return matrix4f();} - - void update() - { - if(!keyboard_function) return; - if(dx > 0) - keyboard_function(pos_dx_key, x, y); - else if(dx < 0) - keyboard_function(neg_dx_key, x, y); - if(dy > 0) - keyboard_function(pos_dy_key, x, y); - else if(dy < 0) - keyboard_function(neg_dy_key, x, y); - } - unsigned char pos_dx_key, neg_dx_key, pos_dy_key, neg_dy_key; - void (*keyboard_function)(unsigned char, int, int); - }; - - inline void glut_exit_on_escape(unsigned char k, int x = 0, int y = 0) - { if(k==27) exit(0); } - - struct glut_simple_mouse_interactor : public glut_interactor - { - - public: - glut_simple_mouse_interactor(int num_buttons_to_use=3) - { - configure_buttons(num_buttons_to_use); - camera_mode = false; - } - - void enable() - { - trackball.enable(); - pan.enable(); - dolly.enable(); - } - - void disable() - { - trackball.disable(); - pan.disable(); - dolly.disable(); - } - - void set_camera_mode(bool cam) - { - camera_mode = cam; - if(camera_mode) - { - trackball.invert_increment = true; - pan.invert_increment = true; - dolly.invert_increment = true; - pan.parent_rotation = & trackball.r; - dolly.parent_rotation = & trackball.r; - } - else - { - trackball.invert_increment = false; - pan.invert_increment = false; - dolly.invert_increment = false; - if(pan.parent_rotation == &trackball.r) pan.parent_rotation = 0; - if(dolly.parent_rotation == &trackball.r) dolly.parent_rotation = 0; - } - } - void configure_buttons(int num_buttons_to_use = 3) - { - switch(num_buttons_to_use) - { - case 1: - trackball.activate_on = GLUT_LEFT_BUTTON; - trackball.modifiers = 0; - - pan.activate_on = GLUT_LEFT_BUTTON; - pan.modifiers = GLUT_ACTIVE_SHIFT; - - - dolly.activate_on = GLUT_LEFT_BUTTON; - dolly.modifiers = GLUT_ACTIVE_CTRL; - - break; - - case 2: - trackball.activate_on = GLUT_LEFT_BUTTON; - trackball.modifiers = 0; - - pan.activate_on = GLUT_MIDDLE_BUTTON; - pan.modifiers = 0; - - - dolly.activate_on = GLUT_LEFT_BUTTON; - dolly.modifiers = GLUT_ACTIVE_CTRL; - - break; - - case 3: - default: - trackball.activate_on = GLUT_LEFT_BUTTON; - trackball.modifiers = 0; - - pan.activate_on = GLUT_MIDDLE_BUTTON; - pan.modifiers = 0; - - dolly.activate_on = GLUT_RIGHT_BUTTON; - dolly.modifiers = 0; - - break; - } - } - - virtual void motion(int x, int y) - { - - trackball.motion(x,y); - - pan.motion(x,y); - - dolly.motion(x,y); - } - virtual void mouse(int button, int state, int x, int y) - { - trackball.mouse(button, state, x, y); - pan.mouse(button, state, x, y); - dolly.mouse(button, state, x, y); - } - - virtual void reshape(int x, int y) - { - trackball.reshape(x,y); - pan.reshape(x,y); - dolly.reshape(x,y); - } - - void apply_transform() - { - pan.apply_transform(); - dolly.apply_transform(); - trackball.apply_transform(); - } - - void apply_inverse_transform() - { - trackball.apply_inverse_transform(); - dolly.apply_inverse_transform(); - pan.apply_inverse_transform(); - } - - matrix4f get_transform() - { - return ( pan.get_transform() * - dolly.get_transform() * - trackball.get_transform() ); - } - - matrix4f get_inverse_transform() - { - return ( trackball.get_inverse_transform() * - dolly.get_inverse_transform() * - pan.get_inverse_transform() ); - } - - void set_parent_rotation(rotationf *rp) - { - trackball.parent_rotation = rp; - dolly.parent_rotation = rp; - pan.parent_rotation = rp; - } - - bool camera_mode; - glut_trackball trackball; - glut_pan pan; - glut_dolly dolly; - }; - -} - -#endif diff --git a/ThirdParty/GL/glh/glh_glut2.h b/ThirdParty/GL/glh/glh_glut2.h deleted file mode 100644 index 908a0fcb..00000000 --- a/ThirdParty/GL/glh/glh_glut2.h +++ /dev/null @@ -1,667 +0,0 @@ -/* - glh - is a platform-indepenedent C++ OpenGL helper library - - - Copyright (c) 2000 Cass Everitt - Copyright (c) 2000 NVIDIA Corporation - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - * Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - * The names of contributors to this software may not be used - to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - - Cass Everitt - cass@r3.nu -*/ - -#ifndef GLH_GLUT_H -#define GLH_GLUT_H - -// some helper functions and objects to -// make writing simple glut programs even easier! :-) -#ifndef _WIN32 -#include -#endif -#include -#include - -#ifdef MACOS -#include -#else -#include -#endif - -#include -#include - -namespace glh -{ - - class glut_interactor - { - public: - glut_interactor() { enabled = true; } - - virtual void display() {} - virtual void idle() {} - virtual void keyboard(unsigned char key, int x, int y) {} - virtual void menu_status(int status, int x, int y) {} - virtual void motion(int x, int y) {} - virtual void mouse(int button, int state, int x, int y) {} - virtual void passive_motion(int x, int y) {} - virtual void reshape(int w, int h) {} - virtual void special(int key, int x, int y) {} - virtual void timer(int value) {} - virtual void visibility(int v) {} - - virtual void enable() { enabled = true; } - virtual void disable() { enabled = false; } - - bool enabled; - }; - - std::list interactors; - bool propagate; - - void glut_display_function() - { - propagate = true; - for(std::list::iterator it=interactors.begin(); it != interactors.end() && propagate; it++) - (*it)->display(); - } - - void glut_idle_function() - { - propagate = true; - for(std::list::iterator it=interactors.begin(); it != interactors.end() && propagate; it++) - (*it)->idle(); - } - - void glut_keyboard_function(unsigned char k, int x, int y) - { - propagate = true; - for(std::list::iterator it=interactors.begin(); it != interactors.end() && propagate; it++) - (*it)->keyboard(k, x, y); - } - - void glut_menu_status_function(int status, int x, int y) - { - propagate = true; - for(std::list::iterator it=interactors.begin(); it != interactors.end() && propagate; it++) - (*it)->menu_status(status, x, y); - } - - void glut_motion_function(int x, int y) - { - propagate = true; - for(std::list::iterator it=interactors.begin(); it != interactors.end() && propagate; it++) - (*it)->motion(x, y); - } - - void glut_mouse_function(int button, int state, int x, int y) - { - propagate = true; - for(std::list::iterator it=interactors.begin(); it != interactors.end() && propagate; it++) - (*it)->mouse(button, state, x, y); - } - - void glut_passive_motion_function(int x, int y) - { - propagate = true; - for(std::list::iterator it=interactors.begin(); it != interactors.end() && propagate; it++) - (*it)->passive_motion(x, y); - } - - void glut_reshape_function(int w, int h) - { - propagate = true; - for(std::list::iterator it=interactors.begin(); it != interactors.end() && propagate; it++) - (*it)->reshape(w,h); - } - - void glut_special_function(int k, int x, int y) - { - propagate = true; - for(std::list::iterator it=interactors.begin(); it != interactors.end() && propagate; it++) - (*it)->special(k, x, y); - } - - void glut_timer_function(int v) - { - propagate = true; - for(std::list::iterator it=interactors.begin(); it != interactors.end() && propagate; it++) - (*it)->timer(v); - } - - void glut_visibility_function(int v) - { - propagate = true; - for(std::list::iterator it=interactors.begin(); it != interactors.end() && propagate; it++) - (*it)->visibility(v); - } - - // stop processing the current event - inline void glut_event_processed() - { - propagate = false; - } - - inline void glut_helpers_initialize() - { - glutDisplayFunc(glut_display_function); - glutIdleFunc(0); - glutKeyboardFunc(glut_keyboard_function); - glutMenuStatusFunc(glut_menu_status_function); - glutMotionFunc(glut_motion_function); - glutMouseFunc(glut_mouse_function); - glutPassiveMotionFunc(glut_passive_motion_function); - glutReshapeFunc(glut_reshape_function); - glutSpecialFunc(glut_special_function); - glutVisibilityFunc(glut_visibility_function); - } - - inline void glut_remove_interactor(glut_interactor *gi) - { - if (interactors.empty()) - return; - std::list::iterator it = - std::find(interactors.begin(), interactors.end(), gi); - if(it != interactors.end()) - interactors.erase(it); - } - - inline void glut_add_interactor(glut_interactor *gi, bool append=true) - { - glut_remove_interactor(gi); - if(append) - interactors.push_back(gi); - else - interactors.push_front(gi); - } - - inline void glut_timer(int msec, int value) - { - glutTimerFunc(msec, glut_timer_function, value); - } - - inline void glut_idle(bool do_idle) - { - glutIdleFunc(do_idle ? glut_idle_function : 0); - } - - class glut_callbacks : public glut_interactor - { - public: - glut_callbacks() : - display_function(0), - idle_function(0), - keyboard_function(0), - menu_status_function(0), - motion_function(0), - mouse_function(0), - passive_motion_function(0), - reshape_function(0), - special_function(0), - timer_function(0), - visibility_function() - {} - - virtual void display() - { if(display_function) display_function(); } - - virtual void idle() - { if(idle_function) idle_function(); } - - virtual void keyboard(unsigned char k, int x, int y) - { if(keyboard_function) keyboard_function(k, x, y); } - - virtual void menu_status(int status, int x, int y) - { if(menu_status_function) menu_status_function(status, x, y); } - - virtual void motion(int x, int y) - { if(motion_function) motion_function(x,y); } - - virtual void mouse(int button, int state, int x, int y) - { if(mouse_function) mouse_function(button, state, x, y); } - - virtual void passive_motion(int x, int y) - { if(passive_motion_function) passive_motion_function(x, y); } - - virtual void reshape(int w, int h) - { if(reshape_function) reshape_function(w, h); } - - virtual void special(int key, int x, int y) - { if(special_function) special_function(key, x, y); } - - virtual void timer(int value) - { if(timer_function) timer_function(value); } - - virtual void visibility(int v) - { if(visibility_function) visibility_function(v); } - - void (* display_function) (); - void (* idle_function) (); - void (* keyboard_function) (unsigned char, int, int); - void (* menu_status_function) (int, int, int); - void (* motion_function) (int, int); - void (* mouse_function) (int, int, int, int); - void (* passive_motion_function) (int, int); - void (* reshape_function) (int, int); - void (* special_function) (int, int, int); - void (* timer_function) (int); - void (* visibility_function) (int); - - }; - - - - class glut_perspective_reshaper : public glut_interactor - { - public: - glut_perspective_reshaper(float infovy = 60.f, float inzNear = .1f, float inzFar = 10.f) - : fovy(infovy), zNear(inzNear), zFar(inzFar), aspect_factor(1) {} - - void reshape(int w, int h) - { - width = w; height = h; - - if(enabled) apply(); - } - - void apply() - { - glViewport(0,0,width,height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - apply_projection(); - glMatrixMode(GL_MODELVIEW); - } - - matrix4f get_projection() - { - aspect = aspect_factor * float(width)/float(height); - if ( aspect < 1 ) - { - // fovy is a misnomer.. we really mean the fov applies to the - // smaller dimension - float fovx = fovy; - float real_fov = to_degrees(2 * atan(tan(to_radians(fovx/2))/aspect)); - return perspective(real_fov, aspect, zNear, zFar); - } - else - return perspective(fovy, aspect, zNear, zFar); - } - - void apply_projection() - { - glMultMatrixf(get_projection().m); - } - - matrix4f get_projection_inverse() - { - aspect = aspect_factor * float(width)/float(height); - if ( aspect < 1 ) - { - // fovy is a misnomer.. we really mean the fov applies to the - // smaller dimension - float fovx = fovy; - float real_fov = to_degrees(2 * atan(tan(to_radians(fovx/2))/aspect)); - return perspective_inverse(real_fov, aspect, zNear, zFar); - } - else - return perspective_inverse(fovy, aspect, zNear, zFar); - } - - void apply_projection_inverse() - { - glMultMatrixf(get_projection_inverse().m); - } - - int width, height; - float fovy, aspect, zNear, zFar; - float aspect_factor; - }; - - - // activates/deactivates on particular mouse button/modifier combinations - // and calculates deltas while active - class glut_simple_interactor : public glut_interactor - { - public: - glut_simple_interactor() - { - num_modes = 0; - active = false; - width = height = 0; - x0 = y0 = x = y = dx = dy = 0; - } - - virtual void mouse(int button, int state, int X, int Y) - { - for(int i=0; i < num_modes; i++) - { - if(enabled && button == cond[i].activate_on && state == GLUT_DOWN && - (! cond[i].use_modifiers || (cond[i].modifiers == glutGetModifiers())) ) - { - mode = i; - active = true; - x = x0 = X; - y = y0 = height - Y; - dx = dy = 0; - break; - } - else if (enabled && button == cond[i].activate_on && state == GLUT_UP) - { - if(dx == 0 && dy == 0) - update(); - active = false; - dx = dy = 0; - mode = -1; - break; - } - } - } - - virtual void motion(int X, int Y) - { - if(enabled && active) - { - dx = X - x; dy = (height - Y) - y; - x = X; y = height - Y; - update(); - } - } - - void reshape(int w, int h) - { - width = w; height = h; - } - - virtual void apply_transform() = 0; - virtual void apply_inverse_transform() = 0; - virtual matrix4f get_transform() = 0; - virtual matrix4f get_inverse_transform() = 0; - - virtual void update() {} - - struct activate_condition - { - activate_condition() - { - activate_on = GLUT_LEFT_BUTTON; - use_modifiers = true; - modifiers = 0; - } - int activate_on; - bool use_modifiers; - int modifiers; - }; - - activate_condition cond[2]; - bool active; - int x0, y0; - int x, y; - int dx, dy; - int width, height; - int num_modes; - int mode; - }; - - - class glut_translator : public translator, public glut_simple_interactor - { - public: - - void update() - { - if(mode == 0) - pan(dx, dy); - else if(mode == 1) - dolly(-dy); - glutPostRedisplay(); - } - - void apply_transform() - { - //cerr << "Applying transform: " << (x - x0) << ", " << (y - y0) << endl; - glTranslatef(t[0], t[1], t[2]); - } - - void apply_inverse_transform() - { - //cerr << "Applying transform: " << (x - x0) << ", " << (y - y0) << endl; - glTranslatef(-t[0], -t[1], -t[2]); - } - - matrix4f get_transform() - { - return translator::get_transform(); - } - - matrix4f get_inverse_transform() - { - return translator::get_inverse_transform(); - } - - }; - - - class glut_trackball : public glut_simple_interactor, public trackball - { - public: - - void update() - { - radius = width < height ? width : height; - radius /= 2.f; - offset = vec3f(width/2.f, height/2.f, 0); - rotate(x-dx, y-dy, x, y); - glutPostRedisplay(); - } - - void apply_transform() - { - glTranslatef(centroid[0], centroid[1], centroid[2]); - glh_rotate(r); - glTranslatef(-centroid[0], -centroid[1], -centroid[2]); - } - - void apply_inverse_transform() - { - glTranslatef(centroid[0], centroid[1], centroid[2]); - glh_rotate(r.inverse()); - glTranslatef(-centroid[0], -centroid[1], -centroid[2]); - } - - matrix4f get_transform() - { - return trackball::get_transform(); - } - - matrix4f get_inverse_transform() - { - return trackball::get_inverse_transform(); - } - - }; - - inline void glut_exit_on_escape(unsigned char k, int x = 0, int y = 0) - { if(k==27) exit(0); } - - struct glut_simple_mouse_interactor : public glut_interactor - { - - public: - glut_simple_mouse_interactor(int num_buttons_to_use=3) - { - configure_buttons(num_buttons_to_use); - camera_mode = false; - } - - void enable() - { - trackball.enable(); - translator.enable(); - } - - void disable() - { - trackball.disable(); - translator.disable(); - } - - void set_camera_mode(bool cam) - { - camera_mode = cam; - if(camera_mode) - { - trackball.invert_increment = true; - translator.invert_increment = true; - translator.parent_rotation = & trackball.r; - } - else - { - trackball.invert_increment = false; - translator.invert_increment = false; - if(translator.parent_rotation == &trackball.r) translator.parent_rotation = 0; - } - } - void configure_buttons(int num_buttons_to_use = 3) - { - switch(num_buttons_to_use) - { - case 1: - - trackball.num_modes = 1; - trackball.cond[0].activate_on = GLUT_LEFT_BUTTON; - trackball.cond[0].modifiers = 0; - trackball.cond[0].use_modifiers = true; - - translator.num_modes = 2; - translator.cond[0].activate_on = GLUT_LEFT_BUTTON; - translator.cond[0].modifiers = GLUT_ACTIVE_SHIFT; - translator.cond[0].use_modifiers = true; - translator.cond[1].activate_on = GLUT_LEFT_BUTTON; - translator.cond[1].modifiers = GLUT_ACTIVE_CTRL; - translator.cond[1].use_modifiers = true; - break; - - case 2: - - trackball.num_modes = 1; - trackball.cond[0].activate_on = GLUT_LEFT_BUTTON; - trackball.cond[0].modifiers = 0; - trackball.cond[0].use_modifiers = true; - - translator.num_modes = 2; - translator.cond[0].activate_on = GLUT_MIDDLE_BUTTON; - translator.cond[0].modifiers = 0; - translator.cond[0].use_modifiers = true; - translator.cond[1].activate_on = GLUT_LEFT_BUTTON; - translator.cond[1].modifiers = GLUT_ACTIVE_CTRL; - translator.cond[1].use_modifiers = true; - - break; - - case 3: - default: - - trackball.num_modes = 1; - trackball.cond[0].activate_on = GLUT_LEFT_BUTTON; - trackball.cond[0].modifiers = 0; - trackball.cond[0].use_modifiers = true; - - translator.num_modes = 2; - translator.cond[0].activate_on = GLUT_MIDDLE_BUTTON; - translator.cond[0].modifiers = 0; - translator.cond[0].use_modifiers = true; - translator.cond[1].activate_on = GLUT_RIGHT_BUTTON; - translator.cond[1].modifiers = 0; - translator.cond[1].use_modifiers = true; - - break; - } - } - - virtual void motion(int x, int y) - { - trackball.motion(x,y); - translator.motion(x,y); - } - - virtual void mouse(int button, int state, int x, int y) - { - trackball.mouse(button, state, x, y); - translator.mouse(button, state, x, y); - } - - virtual void reshape(int x, int y) - { - trackball.reshape(x,y); - translator.reshape(x,y); - } - - void apply_transform() - { - translator.apply_transform(); - trackball.apply_transform(); - } - - void apply_inverse_transform() - { - trackball.apply_inverse_transform(); - translator.apply_inverse_transform(); - } - - matrix4f get_transform() - { - return ( translator.get_transform() * - trackball.get_transform() ); - } - - matrix4f get_inverse_transform() - { - return ( trackball.get_inverse_transform() * - translator.get_inverse_transform() ); - } - - void set_parent_rotation(rotationf *rp) - { - trackball.parent_rotation = rp; - translator.parent_rotation = rp; - } - - bool camera_mode; - glut_trackball trackball; - glut_translator translator; - }; - -} - -#endif diff --git a/ThirdParty/GL/glh/glh_glut_callfunc.h b/ThirdParty/GL/glh/glh_glut_callfunc.h deleted file mode 100644 index 52fd7c13..00000000 --- a/ThirdParty/GL/glh/glh_glut_callfunc.h +++ /dev/null @@ -1,85 +0,0 @@ -/* -glh - is a platform-indepenedent C++ OpenGL helper library - - - Copyright (c) 2000 Cass Everitt - Copyright (c) 2000 NVIDIA Corporation - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - * Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - * The names of contributors to this software may not be used - to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - - Cass Everitt - cass@r3.nu -*/ - -#ifndef GLH_GLUT_CALLFUNC_H -#define GLH_GLUT_CALLFUNC_H - -#include - -#ifdef _WIN32 -#define GLH_FUNC extern "C" __declspec(dllexport) -#else -#define GLH_FUNC -#endif - - -namespace glh -{ - - struct library_handle - { -#ifdef _WIN32 - bool init(const char * name) - { - lib = GetModuleHandle(name); - if(lib) return true; - std::string n(name); - n += ".exe"; - lib = GetModuleHandle(n.c_str()); - - return lib != 0; - } - void call_func(const char k, int x, int y) - { - std::string entry_name("key__"); - entry_name += k; - void (*entry)(int, int) = (void (*)(int, int))GetProcAddress(lib, entry_name.c_str()); - if(entry) - (*entry)(x, y); - } - HMODULE lib; -#endif - }; - -} - -#endif diff --git a/ThirdParty/GL/glh/glh_glut_replay.h b/ThirdParty/GL/glh/glh_glut_replay.h deleted file mode 100644 index 0d9d1eae..00000000 --- a/ThirdParty/GL/glh/glh_glut_replay.h +++ /dev/null @@ -1,292 +0,0 @@ -/* - glh - is a platform-indepenedent C++ OpenGL helper library - - - Copyright (c) 2000 Cass Everitt - Copyright (c) 2000 NVIDIA Corporation - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - * Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - * The names of contributors to this software may not be used - to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - - Cass Everitt - cass@r3.nu -*/ - -#ifndef GLH_GLUT_REPLAY_H -#define GLH_GLUT_REPLAY_H - -// a facility for recording and playing back glut events - -#include -#include - -namespace glh -{ - - - struct glut_event - { - enum event_type - { - DISPLAY, IDLE, KEYBOARD, MENU_STATUS, MOTION, MOUSE, - PASSIVE_MOTION, RESHAPE, SPECIAL, TIMER, VISIBILITY - }; - glut_event(event_type t) : type(t) {} - virtual ~glut_event() {} - virtual void dispatch() = 0; - const event_type type; - }; - - struct glut_display_event : public glut_event - { - glut_display_event() : glut_event(DISPLAY) {} - virtual void dispatch() { glut_display_function(); } - }; - - struct glut_idle_event : public glut_event - { - glut_idle_event() : glut_event(IDLE) {} - virtual void dispatch() { glut_idle_function(); } - }; - - struct glut_keyboard_event : public glut_event - { - glut_keyboard_event(unsigned char key, int xpos, int ypos) - : glut_event(KEYBOARD), k(key), x(xpos), y(ypos) - {} - virtual void dispatch() { glut_keyboard_function(k,x,y); } - unsigned char k; - int x, y; - }; - - struct glut_menu_status_event : public glut_event - { - glut_menu_status_event(int status, int xpos, int ypos) - : glut_event(MENU_STATUS), s(status), x(xpos), y(ypos) - {} - virtual void dispatch() { glut_menu_status_function(s,x,y); } - int s, x, y; - }; - - struct glut_motion_event : public glut_event - { - glut_motion_event(int xpos, int ypos) - : glut_event(MOTION), x(xpos), y(ypos) - {} - virtual void dispatch() { glut_motion_function(x,y); } - int x, y; - }; - - struct glut_mouse_event : public glut_event - { - glut_mouse_event(int button, int state, int xpos, int ypos) - : glut_event(MOUSE), b(button), s(state), x(xpos), y(ypos) - {} - virtual void dispatch() { glut_mouse_function(b,s,x,y); } - int b, s, x, y; - }; - - struct glut_passive_motion_event : public glut_event - { - glut_passive_motion_event(int xpos, int ypos) - : glut_event(PASSIVE_MOTION), x(xpos), y(ypos) - {} - virtual void dispatch() { glut_passive_motion_function(x,y); } - int x, y; - }; - - struct glut_reshape_event : public glut_event - { - glut_reshape_event(int width, int height) - : glut_event(RESHAPE), w(width), h(height) - {} - virtual void dispatch() { glut_reshape_function(w,h); } - int w, h; - }; - - struct glut_special_event : public glut_event - { - glut_special_event(int key, int xpos, int ypos) - : glut_event(SPECIAL), k(key), x(xpos), y(ypos) - {} - virtual void dispatch() { glut_special_function(k,x,y); } - int k, x, y; - }; - - struct glut_timer_event : public glut_event - { - glut_timer_event(int value) - : glut_event(TIMER), v(value) - {} - virtual void dispatch() { glut_timer_function(v); } - int v; - }; - - struct glut_visibility_event : public glut_event - { - glut_visibility_event(int visibility) - : glut_event(VISIBILITY), v(visibility) - {} - virtual void dispatch() { glut_visibility_function(v); } - int v; - }; - - - - struct glut_replay : public glut_interactor - { - enum recorder_mode - { - RECORD, PLAY, STOP - }; - - glut_replay() - { - it = event_list.end(); - mode = STOP; - paused = false; - } - - virtual ~glut_replay() - { erase(); } - - virtual void display() - { - if(enabled && RECORD == mode && ! paused) - event_list.push_back(new glut_display_event()); - } - virtual void idle() - { - if(enabled && RECORD == mode && ! paused) - event_list.push_back(new glut_idle_event()); - } - virtual void keyboard(unsigned char key, int x, int y) - { - if(enabled && RECORD == mode && ! paused) - event_list.push_back(new glut_keyboard_event(key,x,y)); - } - virtual void menu_status(int status, int x, int y) - { - if(enabled && RECORD == mode && ! paused) - event_list.push_back(new glut_menu_status_event(status,x,y)); - } - virtual void motion(int x, int y) - { - if(enabled && RECORD == mode && ! paused) - event_list.push_back(new glut_motion_event(x,y)); - } - virtual void mouse(int button, int state, int x, int y) - { - if(enabled && RECORD == mode && ! paused) - event_list.push_back(new glut_mouse_event(button,state,x,y)); - } - virtual void passive_motion(int x, int y) - { - if(enabled && RECORD == mode && ! paused) - event_list.push_back(new glut_passive_motion_event(x,y)); - } - virtual void reshape(int w, int h) - { - if(enabled && RECORD == mode && ! paused) - event_list.push_back(new glut_reshape_event(w,h)); - } - virtual void special(int key, int x, int y) - { - if(enabled) - { - if (key == GLUT_KEY_F6) - { mode = RECORD; glut_event_processed(); erase(); } - else if(key == GLUT_KEY_F7) - { mode = PLAY; glut_event_processed(); glutPostRedisplay(); } - else if(key == GLUT_KEY_F8) - { mode = STOP; glut_event_processed(); } - else if(key == GLUT_KEY_F9) - { paused = !paused; glut_event_processed(); glutPostRedisplay(); } - else if(RECORD == mode) - { event_list.push_back(new glut_special_event(key,x,y)); } - } - } - virtual void timer(int value) - { - if(enabled && RECORD == mode && ! paused) - event_list.push_back(new glut_timer_event(value)); - } - virtual void visibility(int v) - { - if(enabled && RECORD == mode && ! paused) - event_list.push_back(new glut_visibility_event(v)); - } - - - // other methods - - bool playing() { return mode == PLAY; } - - void dispatch_accumulated_events() - { - if(mode == PLAY && ! paused) - { - while(it != event_list.end() && (*it)->type != glut_event::DISPLAY) - { - (*it)->dispatch(); - it++; - } - if(it == event_list.end()) - { - mode = STOP; - it = event_list.begin(); - } - else if ((*it)->type == glut_event::DISPLAY) - { - it++; - } - } - } - - void erase() - { - while(event_list.begin() != event_list.end()) - { - glut_event * e = event_list.back(); - event_list.pop_back(); - delete e; - } - } - - std::list event_list; - std::list::iterator it; - recorder_mode mode; - bool paused; - }; - -} - -#endif diff --git a/ThirdParty/GL/glh/glh_glut_text.h b/ThirdParty/GL/glh/glh_glut_text.h deleted file mode 100644 index aba823ea..00000000 --- a/ThirdParty/GL/glh/glh_glut_text.h +++ /dev/null @@ -1,195 +0,0 @@ -/* -glh - is a platform-indepenedent C++ OpenGL helper library - - - Copyright (c) 2000 Cass Everitt - Copyright (c) 2000 NVIDIA Corporation - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - * Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - * The names of contributors to this software may not be used - to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - - Cass Everitt - cass@r3.nu -*/ - -#ifndef GLH_GLUT_TEXT_H -#define GLH_GLUT_TEXT_H - -#include -#include - -#ifdef MACOS -#include -#else -#include -#endif - -namespace glh -{ - - struct glut_stroke_roman : font - { - glut_stroke_roman() : initialized(false) {} - - virtual ~glut_stroke_roman() { } - - struct glyph - { - float width; - display_list dl; - }; - - - // get font metrics - virtual float get_ascent() - { return 119.05f; } - virtual float get_descent() - { return 33.33f; } - virtual float get_width(int i) - { - if(32 <= i && i <= 127) - { - if(! initialized) init(); - return glyphs[i].width; - } - return 0; - } - - // draw - virtual void render(int i) - { - if(32 <= i && i <= 127) - { - if(! initialized) init(); - glyphs[i].dl.call_list(); - } - } - - virtual void initialize() { if(! initialized) init(); } - - bool initialized; - glyph glyphs[128]; - - private: - - void init() - { - initialized = true; - GLfloat m[16]; - glColorMask(0,0,0,0); - glDepthMask(0); - glStencilMask(0); - for(int i=32; i < 128; i++) - { - glPushMatrix(); - glLoadIdentity(); - - // build display list - glyphs[i].dl.new_list(GL_COMPILE_AND_EXECUTE); - glutStrokeCharacter(GLUT_STROKE_ROMAN, i); - glyphs[i].dl.end_list(); - // get *float* character width (glut only returns integer width) - glGetFloatv(GL_MODELVIEW_MATRIX, m); - glyphs[i].width = m[12]; - - glPopMatrix(); - } - glColorMask(1,1,1,1); - glDepthMask(1); - glStencilMask(1); - } - - }; - - - struct glut_stroke_mono_roman : font - { - glut_stroke_mono_roman() : initialized(false) {} - - virtual ~glut_stroke_mono_roman() { } - - struct glyph - { - display_list dl; - }; - - - // get font metrics - virtual float get_ascent() - { return 119.05f; } - virtual float get_descent() - { return 33.33f; } - virtual float get_width(int i) - { - if(32 <= i && i <= 127) - { - if(! initialized) init(); - return 104.76; - } - return 0; - } - - // draw - virtual void render(int i) - { - if(32 <= i && i <= 127) - { - if(! initialized) init(); - glyphs[i].dl.call_list(); - } - } - - virtual void initialize() { if(! initialized) init(); } - - bool initialized; - glyph glyphs[128]; - - private: - - void init() - { - initialized = true; - for(int i=32; i < 128; i++) - { - // build display list - glyphs[i].dl.new_list(GL_COMPILE); - glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN, i); - glyphs[i].dl.end_list(); - } - } - - }; - - - -} - -#endif diff --git a/ThirdParty/GL/glh/glh_interactors.h b/ThirdParty/GL/glh/glh_interactors.h deleted file mode 100644 index 03e72a3b..00000000 --- a/ThirdParty/GL/glh/glh_interactors.h +++ /dev/null @@ -1,213 +0,0 @@ -/* - glh - is a platform-indepenedent C++ OpenGL helper library - - - Copyright (c) 2000 Cass Everitt - Copyright (c) 2001 NVIDIA Corporation - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - * Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - * The names of contributors to this software may not be used - to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - - Cass Everitt - cass@r3.nu -*/ - -#ifndef GLH_INTERACTORS_H -#define GLH_INTERACTORS_H - -#include - -namespace glh -{ - - class translator - { - public: - translator() - { - scale = .01f; - invert_increment = false; - parent_rotation = 0; - } - - void pan (int dx, int dy) { update(dx, dy, 0); } - void dolly(int dz) { update( 0, 0, dz); } - - void update(int dx, int dy, int dz) - { - vec3f v(dx, dy, dz); - - // apply parent rotation - if(parent_rotation != 0) - parent_rotation->mult_vec(v); - - if(invert_increment) - t -= v * scale; - else - t += v * scale; - } - - - matrix4f get_transform() - { - matrix4f m; - m.set_translate(t); - return m; - } - - matrix4f get_inverse_transform() - { - matrix4f m; - m.set_translate(-t); - return m; - } - - bool invert_increment; - const rotationf * parent_rotation; - vec3f t; - float scale; - }; - - - - class trackball - { - public: - trackball() - { - r = rotationf(vec3f(0, 1, 0), 0); - centroid = vec3f(0,0,0); - scale = -.01f; - invert_increment = false; - parent_rotation = 0; - legacy_mode = false; - } - - void rotate(int x0, int y0, int x1, int y1) - { update(x0, y0, x1, y1); } - - void update(int x0, int y0, int x1, int y1) - { - int dx = x1 - x0; - int dy = y1 - y0; - if(dx == 0 && dy == 0) - { - incr = rotationf(); - return; - } - - if(legacy_mode) - { - vec3f v(dy, -dx, 0); - float len = v.normalize(); - if(parent_rotation != 0) - parent_rotation->mult_vec(v); - //r.mult_dir(vec3f(v), v); - if(invert_increment) - incr.set_value(v, -len * scale); - else - incr.set_value(v, len * scale); - } - else - { - vec3f a(x0, y0, 0); - vec3f b(x1, y1, 0); - a -= offset; - b -= offset; - a /= radius; - b /= radius; - - float tmpscale = 1; - a[2] = pow(2.0f, -0.5f * a.length()); - a.normalize(); - b[2] = pow(2.0f, -0.5f * b.length()); - b.normalize(); - - - - vec3f axis = a.cross(b); - axis.normalize(); - - float angle = acos(a.dot(b)); - - if(parent_rotation != 0) parent_rotation->mult_vec(axis); - - if(invert_increment) - incr.set_value(axis, -angle * tmpscale); - else - incr.set_value(axis, angle * tmpscale); - - } - - // fixme: shouldn't operator*() preserve 'r' in this case? - if(incr[3] != 0) - r = incr * r; - } - - void increment_rotation() - { - // fixme: shouldn't operator*() preserve 'r' in this case? - if(incr[3] != 0) - r = incr * r; - } - - matrix4f get_transform() - { - matrix4f mt, mr, minvt; - mt.set_translate(centroid); - r.get_value(mr); - minvt.set_translate(-centroid); - return mt * mr * minvt; - } - - matrix4f get_inverse_transform() - { - matrix4f mt, mr, minvt; - mt.set_translate(centroid); - r.inverse().get_value(mr); - minvt.set_translate(-centroid); - return mt * mr * minvt; - } - - bool invert_increment; - const rotationf * parent_rotation; - rotationf r; - vec3f centroid; - float scale; - bool legacy_mode; - rotationf incr; - float radius; - vec3f offset; - }; - -} - -#endif diff --git a/ThirdParty/GL/glh/glh_linear.h b/ThirdParty/GL/glh/glh_linear.h deleted file mode 100644 index 422c05f4..00000000 --- a/ThirdParty/GL/glh/glh_linear.h +++ /dev/null @@ -1,1617 +0,0 @@ -/* - glh - is a platform-indepenedent C++ OpenGL helper library - - - Copyright (c) 2000 Cass Everitt - Copyright (c) 2000 NVIDIA Corporation - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - * Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - * The names of contributors to this software may not be used - to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - - Cass Everitt - cass@r3.nu -*/ - -/* -glh_linear.h -*/ - -// Author: Cass W. Everitt - -#ifndef GLH_LINEAR_H -#define GLH_LINEAR_H - -#include -#include -#include - -// only supports float for now... -#define GLH_REAL_IS_FLOAT - -#ifdef GLH_REAL_IS_FLOAT -# define GLH_REAL float -# define GLH_REAL_NAMESPACE ns_float -#endif - -#ifdef _WIN32 -# define TEMPLATE_FUNCTION -#else -# define TEMPLATE_FUNCTION <> -#endif - -#define GLH_QUATERNION_NORMALIZATION_THRESHOLD 64 - -#define GLH_RAD_TO_DEG GLH_REAL(57.2957795130823208767981548141052) -#define GLH_DEG_TO_RAD GLH_REAL(0.0174532925199432957692369076848861) -#define GLH_ZERO GLH_REAL(0.0) -#define GLH_ONE GLH_REAL(1.0) -#define GLH_TWO GLH_REAL(2.0) -#define GLH_EPSILON GLH_REAL(10e-6) -#define GLH_PI GLH_REAL(3.1415926535897932384626433832795) - -#define equivalent(a,b) (((a < b + GLH_EPSILON) && (a > b - GLH_EPSILON)) ? true : false) - -namespace glh -{ - - inline GLH_REAL to_degrees(GLH_REAL radians) { return radians*GLH_RAD_TO_DEG; } - inline GLH_REAL to_radians(GLH_REAL degrees) { return degrees*GLH_DEG_TO_RAD; } - - - template - class vec - { - public: - int size() const { return N; } - - vec(const T & t = T()) - { for(int i = 0; i < N; i++) v[i] = t; } - vec(const T * tp) - { for(int i = 0; i < N; i++) v[i] = tp[i]; } - - const T * get_value() const - { return v; } - - - T dot( const vec & rhs ) const - { - T r = 0; - for(int i = 0; i < N; i++) r += v[i]*rhs.v[i]; - return r; - } - - T length() const - { - T r = 0; - for(int i = 0; i < N; i++) r += v[i]*v[i]; - return T(sqrt(r)); - } - - T square_norm() const - { - T r = 0; - for(int i = 0; i < N; i++) r += v[i]*v[i]; - return r; - } - - void negate() - { for(int i = 0; i < N; i++) v[i] = -v[i]; } - - - T normalize() - { - T sum(0); - for(int i = 0; i < N; i++) - sum += v[i]*v[i]; - sum = T(sqrt(sum)); - if (sum > GLH_EPSILON) - for(int i = 0; i < N; i++) - v[i] /= sum; - return sum; - } - - - vec & set_value( const T * rhs ) - { for(int i = 0; i < N; i++) v[i] = rhs[i]; return *this; } - - T & operator [] ( int i ) - { return v[i]; } - - const T & operator [] ( int i ) const - { return v[i]; } - - vec & operator *= ( T d ) - { for(int i = 0; i < N; i++) v[i] *= d; return *this;} - - vec & operator *= ( const vec & u ) - { for(int i = 0; i < N; i++) v[i] *= u[i]; return *this;} - - vec & operator /= ( T d ) - { if(d == 0) return *this; for(int i = 0; i < N; i++) v[i] /= d; return *this;} - - vec & operator += ( const vec & u ) - { for(int i = 0; i < N; i++) v[i] += u.v[i]; return *this;} - - vec & operator -= ( const vec & u ) - { for(int i = 0; i < N; i++) v[i] -= u.v[i]; return *this;} - - - vec operator - () const - { vec rv = v; rv.negate(); return rv; } - - vec operator + ( const vec &v) const - { vec rt(*this); return rt += v; } - - vec operator - ( const vec &v) const - { vec rt(*this); return rt -= v; } - - vec operator * ( T d) const - { vec rt(*this); return rt *= d; } - - //friend bool operator == TEMPLATE_FUNCTION ( const vec &v1, const vec &v2 ); - //friend bool operator != TEMPLATE_FUNCTION ( const vec &v1, const vec &v2 ); - - - //protected: - T v[N]; - }; - - - - // vector friend operators - - template inline - vec operator * ( const vec & b, T d ) - { - vec rt(b); - return rt *= d; - } - - template inline - vec operator * ( T d, const vec & b ) - { return b*d; } - - template inline - vec operator * ( const vec & b, const vec & d ) - { - vec rt(b); - return rt *= d; - } - - template inline - vec operator / ( const vec & b, T d ) - { vec rt(b); return rt /= d; } - - template inline - vec operator + ( const vec & v1, const vec & v2 ) - { vec rt(v1); return rt += v2; } - - template inline - vec operator - ( const vec & v1, const vec & v2 ) - { vec rt(v1); return rt -= v2; } - - - template inline - bool operator == ( const vec & v1, const vec & v2 ) - { - for(int i = 0; i < N; i++) - if(v1.v[i] != v2.v[i]) - return false; - return true; - } - - template inline - bool operator != ( const vec & v1, const vec & v2 ) - { return !(v1 == v2); } - - - typedef vec<3,unsigned char> vec3ub; - typedef vec<4,unsigned char> vec4ub; - - - - - - namespace GLH_REAL_NAMESPACE - { - typedef GLH_REAL real; - - class line; - class plane; - class matrix4; - class quaternion; - typedef quaternion rotation; - - class vec2 : public vec<2,real> - { - public: - vec2(const real & t = real()) : vec<2,real>(t) - {} - vec2(const vec<2,real> & t) : vec<2,real>(t) - {} - vec2(const real * tp) : vec<2,real>(tp) - {} - - vec2(real x, real y ) - { v[0] = x; v[1] = y; } - - void get_value(real & x, real & y) const - { x = v[0]; y = v[1]; } - - vec2 & set_value( const real & x, const real & y) - { v[0] = x; v[1] = y; return *this; } - - }; - - - class vec3 : public vec<3,real> - { - public: - vec3(const real & t = real()) : vec<3,real>(t) - {} - vec3(const vec<3,real> & t) : vec<3,real>(t) - {} - vec3(const real * tp) : vec<3,real>(tp) - {} - - vec3(real x, real y, real z) - { v[0] = x; v[1] = y; v[2] = z; } - - void get_value(real & x, real & y, real & z) const - { x = v[0]; y = v[1]; z = v[2]; } - - vec3 cross( const vec3 &rhs ) const - { - vec3 rt; - rt.v[0] = v[1]*rhs.v[2]-v[2]*rhs.v[1]; - rt.v[1] = v[2]*rhs.v[0]-v[0]*rhs.v[2]; - rt.v[2] = v[0]*rhs.v[1]-v[1]*rhs.v[0]; - return rt; - } - - vec3 & set_value( const real & x, const real & y, const real & z) - { v[0] = x; v[1] = y; v[2] = z; return *this; } - - }; - - - class vec4 : public vec<4,real> - { - public: - vec4(const real & t = real()) : vec<4,real>(t) - {} - vec4(const vec<4,real> & t) : vec<4,real>(t) - {} - - vec4(const vec<3,real> & t, real fourth) - - { v[0] = t.v[0]; v[1] = t.v[1]; v[2] = t.v[2]; v[3] = fourth; } - vec4(const real * tp) : vec<4,real>(tp) - {} - vec4(real x, real y, real z, real w) - { v[0] = x; v[1] = y; v[2] = z; v[3] = w; } - - void get_value(real & x, real & y, real & z, real & w) const - { x = v[0]; y = v[1]; z = v[2]; w = v[3]; } - - vec4 & set_value( const real & x, const real & y, const real & z, const real & w) - { v[0] = x; v[1] = y; v[2] = z; v[3] = w; return *this; } - }; - - inline - vec3 homogenize(const vec4 & v) - { - vec3 rt; - assert(v.v[3] != GLH_ZERO); - rt.v[0] = v.v[0]/v.v[3]; - rt.v[1] = v.v[1]/v.v[3]; - rt.v[2] = v.v[2]/v.v[3]; - return rt; - } - - - - class line - { - public: - - line() - { set_value(vec3(0,0,0),vec3(0,0,1)); } - - line( const vec3 & p0, const vec3 &p1) - { set_value(p0,p1); } - - void set_value( const vec3 &p0, const vec3 &p1) - { - position = p0; - direction = p1-p0; - direction.normalize(); - } - - bool get_closest_points(const line &line2, - vec3 &pointOnThis, - vec3 &pointOnThat) - { - - // quick check to see if parallel -- if so, quit. - if(fabs(direction.dot(line2.direction)) == 1.0) - return 0; - line l2 = line2; - - // Algorithm: Brian Jean - // - register real u; - register real v; - vec3 Vr = direction; - vec3 Vs = l2.direction; - register real Vr_Dot_Vs = Vr.dot(Vs); - register real detA = real(1.0 - (Vr_Dot_Vs * Vr_Dot_Vs)); - vec3 C = l2.position - position; - register real C_Dot_Vr = C.dot(Vr); - register real C_Dot_Vs = C.dot(Vs); - - u = (C_Dot_Vr - Vr_Dot_Vs * C_Dot_Vs)/detA; - v = (C_Dot_Vr * Vr_Dot_Vs - C_Dot_Vs)/detA; - - pointOnThis = position; - pointOnThis += direction * u; - pointOnThat = l2.position; - pointOnThat += l2.direction * v; - - return 1; - } - - vec3 get_closest_point(const vec3 &point) - { - vec3 np = point - position; - vec3 rp = direction*direction.dot(np)+position; - return rp; - } - - const vec3 & get_position() const {return position;} - - const vec3 & get_direction() const {return direction;} - - //protected: - vec3 position; - vec3 direction; - }; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // matrix - - - class matrix4 - { - - public: - - matrix4() { make_identity(); } - - matrix4( real r ) - { set_value(r); } - - matrix4( real * m ) - { set_value(m); } - - matrix4( real a00, real a01, real a02, real a03, - real a10, real a11, real a12, real a13, - real a20, real a21, real a22, real a23, - real a30, real a31, real a32, real a33 ) - { - element(0,0) = a00; - element(0,1) = a01; - element(0,2) = a02; - element(0,3) = a03; - - element(1,0) = a10; - element(1,1) = a11; - element(1,2) = a12; - element(1,3) = a13; - - element(2,0) = a20; - element(2,1) = a21; - element(2,2) = a22; - element(2,3) = a23; - - element(3,0) = a30; - element(3,1) = a31; - element(3,2) = a32; - element(3,3) = a33; - } - - - void get_value( real * mp ) const - { - int c = 0; - for(int j=0; j < 4; j++) - for(int i=0; i < 4; i++) - mp[c++] = element(i,j); - } - - - const real * get_value() const - { return m; } - - void set_value( real * mp) - { - int c = 0; - for(int j=0; j < 4; j++) - for(int i=0; i < 4; i++) - element(i,j) = mp[c++]; - } - - void set_value( real r ) - { - for(int i=0; i < 4; i++) - for(int j=0; j < 4; j++) - element(i,j) = r; - } - - void make_identity() - { - element(0,0) = 1.0; - element(0,1) = 0.0; - element(0,2) = 0.0; - element(0,3) = 0.0; - - element(1,0) = 0.0; - element(1,1) = 1.0; - element(1,2) = 0.0; - element(1,3) = 0.0; - - element(2,0) = 0.0; - element(2,1) = 0.0; - element(2,2) = 1.0; - element(2,3) = 0.0; - - element(3,0) = 0.0; - element(3,1) = 0.0; - element(3,2) = 0.0; - element(3,3) = 1.0; - } - - - static matrix4 identity() - { - static matrix4 mident ( - 1.0, 0.0, 0.0, 0.0, - 0.0, 1.0, 0.0, 0.0, - 0.0, 0.0, 1.0, 0.0, - 0.0, 0.0, 0.0, 1.0 ); - return mident; - } - - - void set_scale( real s ) - { - element(0,0) = s; - element(1,1) = s; - element(2,2) = s; - } - - void set_scale( const vec3 & s ) - { - element(0,0) = s.v[0]; - element(1,1) = s.v[1]; - element(2,2) = s.v[2]; - } - - - void set_translate( const vec3 & t ) - { - element(0,3) = t.v[0]; - element(1,3) = t.v[1]; - element(2,3) = t.v[2]; - } - - void set_row(int r, const vec4 & t) - { - element(r,0) = t.v[0]; - element(r,1) = t.v[1]; - element(r,2) = t.v[2]; - element(r,3) = t.v[3]; - } - - void set_column(int c, const vec4 & t) - { - element(0,c) = t.v[0]; - element(1,c) = t.v[1]; - element(2,c) = t.v[2]; - element(3,c) = t.v[3]; - } - - - void get_row(int r, vec4 & t) const - { - t.v[0] = element(r,0); - t.v[1] = element(r,1); - t.v[2] = element(r,2); - t.v[3] = element(r,3); - } - - vec4 get_row(int r) const - { - vec4 v; get_row(r, v); - return v; - } - - void get_column(int c, vec4 & t) const - { - t.v[0] = element(0,c); - t.v[1] = element(1,c); - t.v[2] = element(2,c); - t.v[3] = element(3,c); - } - - vec4 get_column(int c) const - { - vec4 v; get_column(c, v); - return v; - } - - matrix4 inverse() const - { - matrix4 minv; - - real r1[8], r2[8], r3[8], r4[8]; - real *s[4], *tmprow; - - s[0] = &r1[0]; - s[1] = &r2[0]; - s[2] = &r3[0]; - s[3] = &r4[0]; - - register int i,j,p,jj; - for(i=0;i<4;i++) - { - for(j=0;j<4;j++) - { - s[i][j] = element(i,j); - if(i==j) s[i][j+4] = 1.0; - else s[i][j+4] = 0.0; - } - } - real scp[4]; - for(i=0;i<4;i++) - { - scp[i] = real(fabs(s[i][0])); - for(j=1;j<4;j++) - if(real(fabs(s[i][j])) > scp[i]) scp[i] = real(fabs(s[i][j])); - if(scp[i] == 0.0) return minv; // singular matrix! - } - - int pivot_to; - real scp_max; - for(i=0;i<4;i++) - { - // select pivot row - pivot_to = i; - scp_max = real(fabs(s[i][i]/scp[i])); - // find out which row should be on top - for(p=i+1;p<4;p++) - if(real(fabs(s[p][i]/scp[p])) > scp_max) - { scp_max = real(fabs(s[p][i]/scp[p])); pivot_to = p; } - // Pivot if necessary - if(pivot_to != i) - { - tmprow = s[i]; - s[i] = s[pivot_to]; - s[pivot_to] = tmprow; - real tmpscp; - tmpscp = scp[i]; - scp[i] = scp[pivot_to]; - scp[pivot_to] = tmpscp; - } - - real mji; - // perform gaussian elimination - for(j=i+1;j<4;j++) - { - mji = s[j][i]/s[i][i]; - s[j][i] = 0.0; - for(jj=i+1;jj<8;jj++) - s[j][jj] -= mji*s[i][jj]; - } - } - if(s[3][3] == 0.0) return minv; // singular matrix! - - // - // Now we have an upper triangular matrix. - // - // x x x x | y y y y - // 0 x x x | y y y y - // 0 0 x x | y y y y - // 0 0 0 x | y y y y - // - // we'll back substitute to get the inverse - // - // 1 0 0 0 | z z z z - // 0 1 0 0 | z z z z - // 0 0 1 0 | z z z z - // 0 0 0 1 | z z z z - // - - real mij; - for(i=3;i>0;i--) - { - for(j=i-1;j > -1; j--) - { - mij = s[j][i]/s[i][i]; - for(jj=j+1;jj<8;jj++) - s[j][jj] -= mij*s[i][jj]; - } - } - - for(i=0;i<4;i++) - for(j=0;j<4;j++) - minv(i,j) = s[i][j+4] / s[i][i]; - - return minv; - } - - - matrix4 transpose() const - { - matrix4 mtrans; - - for(int i=0;i<4;i++) - for(int j=0;j<4;j++) - mtrans(i,j) = element(j,i); - return mtrans; - } - - matrix4 & mult_right( const matrix4 & b ) - { - matrix4 mt(*this); - set_value(real(0)); - - for(int i=0; i < 4; i++) - for(int j=0; j < 4; j++) - for(int c=0; c < 4; c++) - element(i,j) += mt(i,c) * b(c,j); - return *this; - } - - matrix4 & mult_left( const matrix4 & b ) - { - matrix4 mt(*this); - set_value(real(0)); - - for(int i=0; i < 4; i++) - for(int j=0; j < 4; j++) - for(int c=0; c < 4; c++) - element(i,j) += b(i,c) * mt(c,j); - return *this; - } - - // dst = M * src - void mult_matrix_vec( const vec3 &src, vec3 &dst ) const - { - real w = ( - src.v[0] * element(3,0) + - src.v[1] * element(3,1) + - src.v[2] * element(3,2) + - element(3,3) ); - - assert(w != GLH_ZERO); - - dst.v[0] = ( - src.v[0] * element(0,0) + - src.v[1] * element(0,1) + - src.v[2] * element(0,2) + - element(0,3) ) / w; - dst.v[1] = ( - src.v[0] * element(1,0) + - src.v[1] * element(1,1) + - src.v[2] * element(1,2) + - element(1,3) ) / w; - dst.v[2] = ( - src.v[0] * element(2,0) + - src.v[1] * element(2,1) + - src.v[2] * element(2,2) + - element(2,3) ) / w; - } - - void mult_matrix_vec( vec3 & src_and_dst) const - { mult_matrix_vec(vec3(src_and_dst), src_and_dst); } - - - // dst = src * M - void mult_vec_matrix( const vec3 &src, vec3 &dst ) const - { - real w = ( - src.v[0] * element(0,3) + - src.v[1] * element(1,3) + - src.v[2] * element(2,3) + - element(3,3) ); - - assert(w != GLH_ZERO); - - dst.v[0] = ( - src.v[0] * element(0,0) + - src.v[1] * element(1,0) + - src.v[2] * element(2,0) + - element(3,0) ) / w; - dst.v[1] = ( - src.v[0] * element(0,1) + - src.v[1] * element(1,1) + - src.v[2] * element(2,1) + - element(3,1) ) / w; - dst.v[2] = ( - src.v[0] * element(0,2) + - src.v[1] * element(1,2) + - src.v[2] * element(2,2) + - element(3,2) ) / w; - } - - - void mult_vec_matrix( vec3 & src_and_dst) const - { mult_vec_matrix(vec3(src_and_dst), src_and_dst); } - - // dst = M * src - void mult_matrix_vec( const vec4 &src, vec4 &dst ) const - { - dst.v[0] = ( - src.v[0] * element(0,0) + - src.v[1] * element(0,1) + - src.v[2] * element(0,2) + - src.v[3] * element(0,3)); - dst.v[1] = ( - src.v[0] * element(1,0) + - src.v[1] * element(1,1) + - src.v[2] * element(1,2) + - src.v[3] * element(1,3)); - dst.v[2] = ( - src.v[0] * element(2,0) + - src.v[1] * element(2,1) + - src.v[2] * element(2,2) + - src.v[3] * element(2,3)); - dst.v[3] = ( - src.v[0] * element(3,0) + - src.v[1] * element(3,1) + - src.v[2] * element(3,2) + - src.v[3] * element(3,3)); - } - - void mult_matrix_vec( vec4 & src_and_dst) const - { mult_matrix_vec(vec4(src_and_dst), src_and_dst); } - - - // dst = src * M - void mult_vec_matrix( const vec4 &src, vec4 &dst ) const - { - dst.v[0] = ( - src.v[0] * element(0,0) + - src.v[1] * element(1,0) + - src.v[2] * element(2,0) + - src.v[3] * element(3,0)); - dst.v[1] = ( - src.v[0] * element(0,1) + - src.v[1] * element(1,1) + - src.v[2] * element(2,1) + - src.v[3] * element(3,1)); - dst.v[2] = ( - src.v[0] * element(0,2) + - src.v[1] * element(1,2) + - src.v[2] * element(2,2) + - src.v[3] * element(3,2)); - dst.v[3] = ( - src.v[0] * element(0,3) + - src.v[1] * element(1,3) + - src.v[2] * element(2,3) + - src.v[3] * element(3,3)); - } - - - void mult_vec_matrix( vec4 & src_and_dst) const - { mult_vec_matrix(vec4(src_and_dst), src_and_dst); } - - - // dst = M * src - void mult_matrix_dir( const vec3 &src, vec3 &dst ) const - { - dst.v[0] = ( - src.v[0] * element(0,0) + - src.v[1] * element(0,1) + - src.v[2] * element(0,2) ) ; - dst.v[1] = ( - src.v[0] * element(1,0) + - src.v[1] * element(1,1) + - src.v[2] * element(1,2) ) ; - dst.v[2] = ( - src.v[0] * element(2,0) + - src.v[1] * element(2,1) + - src.v[2] * element(2,2) ) ; - } - - - void mult_matrix_dir( vec3 & src_and_dst) const - { mult_matrix_dir(vec3(src_and_dst), src_and_dst); } - - - // dst = src * M - void mult_dir_matrix( const vec3 &src, vec3 &dst ) const - { - dst.v[0] = ( - src.v[0] * element(0,0) + - src.v[1] * element(1,0) + - src.v[2] * element(2,0) ) ; - dst.v[1] = ( - src.v[0] * element(0,1) + - src.v[1] * element(1,1) + - src.v[2] * element(2,1) ) ; - dst.v[2] = ( - src.v[0] * element(0,2) + - src.v[1] * element(1,2) + - src.v[2] * element(2,2) ) ; - } - - - void mult_dir_matrix( vec3 & src_and_dst) const - { mult_dir_matrix(vec3(src_and_dst), src_and_dst); } - - - real & operator () (int row, int col) - { return element(row,col); } - - const real & operator () (int row, int col) const - { return element(row,col); } - - real & element (int row, int col) - { return m[row | (col<<2)]; } - - const real & element (int row, int col) const - { return m[row | (col<<2)]; } - - matrix4 & operator *= ( const matrix4 & mat ) - { - mult_right( mat ); - return *this; - } - - matrix4 & operator *= ( const real & r ) - { - for (int i = 0; i < 4; ++i) - { - element(0,i) *= r; - element(1,i) *= r; - element(2,i) *= r; - element(3,i) *= r; - } - return *this; - } - - matrix4 & operator += ( const matrix4 & mat ) - { - for (int i = 0; i < 4; ++i) - { - element(0,i) += mat.element(0,i); - element(1,i) += mat.element(1,i); - element(2,i) += mat.element(2,i); - element(3,i) += mat.element(3,i); - } - return *this; - } - - friend matrix4 operator * ( const matrix4 & m1, const matrix4 & m2 ); - friend bool operator == ( const matrix4 & m1, const matrix4 & m2 ); - friend bool operator != ( const matrix4 & m1, const matrix4 & m2 ); - - //protected: - real m[16]; - }; - - inline - matrix4 operator * ( const matrix4 & m1, const matrix4 & m2 ) - { - matrix4 product; - - product = m1; - product.mult_right(m2); - - return product; - } - - inline - bool operator ==( const matrix4 &m1, const matrix4 &m2 ) - { - return ( - m1(0,0) == m2(0,0) && - m1(0,1) == m2(0,1) && - m1(0,2) == m2(0,2) && - m1(0,3) == m2(0,3) && - m1(1,0) == m2(1,0) && - m1(1,1) == m2(1,1) && - m1(1,2) == m2(1,2) && - m1(1,3) == m2(1,3) && - m1(2,0) == m2(2,0) && - m1(2,1) == m2(2,1) && - m1(2,2) == m2(2,2) && - m1(2,3) == m2(2,3) && - m1(3,0) == m2(3,0) && - m1(3,1) == m2(3,1) && - m1(3,2) == m2(3,2) && - m1(3,3) == m2(3,3) ); - } - - inline - bool operator != ( const matrix4 & m1, const matrix4 & m2 ) - { return !( m1 == m2 ); } - - - - - - - - - - - - - - class quaternion - { - public: - - quaternion() - { - *this = identity(); - } - - quaternion( const real v[4] ) - { - set_value( v ); - } - - - quaternion( real q0, real q1, real q2, real q3 ) - { - set_value( q0, q1, q2, q3 ); - } - - - quaternion( const matrix4 & m ) - { - set_value( m ); - } - - - quaternion( const vec3 &axis, real radians ) - { - set_value( axis, radians ); - } - - - quaternion( const vec3 &rotateFrom, const vec3 &rotateTo ) - { - set_value( rotateFrom, rotateTo ); - } - - quaternion( const vec3 & from_look, const vec3 & from_up, - const vec3 & to_look, const vec3& to_up) - { - set_value(from_look, from_up, to_look, to_up); - } - - const real * get_value() const - { - return &q[0]; - } - - void get_value( real &q0, real &q1, real &q2, real &q3 ) const - { - q0 = q[0]; - q1 = q[1]; - q2 = q[2]; - q3 = q[3]; - } - - quaternion & set_value( real q0, real q1, real q2, real q3 ) - { - q[0] = q0; - q[1] = q1; - q[2] = q2; - q[3] = q3; - counter = 0; - return *this; - } - - void get_value( vec3 &axis, real &radians ) const - { - radians = real(acos( q[3] ) * GLH_TWO); - if ( radians == GLH_ZERO ) - axis = vec3( 0.0, 0.0, 1.0 ); - else - { - axis.v[0] = q[0]; - axis.v[1] = q[1]; - axis.v[2] = q[2]; - axis.normalize(); - } - } - - void get_value( matrix4 & m ) const - { - real s, xs, ys, zs, wx, wy, wz, xx, xy, xz, yy, yz, zz; - - real norm = q[0] * q[0] + q[1] * q[1] + q[2] * q[2] + q[3] * q[3]; - - s = (equivalent(norm,GLH_ZERO)) ? GLH_ZERO : ( GLH_TWO / norm ); - - xs = q[0] * s; - ys = q[1] * s; - zs = q[2] * s; - - wx = q[3] * xs; - wy = q[3] * ys; - wz = q[3] * zs; - - xx = q[0] * xs; - xy = q[0] * ys; - xz = q[0] * zs; - - yy = q[1] * ys; - yz = q[1] * zs; - zz = q[2] * zs; - - m(0,0) = real( GLH_ONE - ( yy + zz )); - m(1,0) = real ( xy + wz ); - m(2,0) = real ( xz - wy ); - - m(0,1) = real ( xy - wz ); - m(1,1) = real ( GLH_ONE - ( xx + zz )); - m(2,1) = real ( yz + wx ); - - m(0,2) = real ( xz + wy ); - m(1,2) = real ( yz - wx ); - m(2,2) = real ( GLH_ONE - ( xx + yy )); - - m(3,0) = m(3,1) = m(3,2) = m(0,3) = m(1,3) = m(2,3) = GLH_ZERO; - m(3,3) = GLH_ONE; - } - - quaternion & set_value( const real * qp ) - { - memcpy(q,qp,sizeof(real) * 4); - - counter = 0; - return *this; - } - - quaternion & set_value( const matrix4 & m ) - { - real tr, s; - int i, j, k; - const int nxt[3] = { 1, 2, 0 }; - - tr = m(0,0) + m(1,1) + m(2,2); - - if ( tr > GLH_ZERO ) - { - s = real(sqrt( tr + m(3,3) )); - q[3] = real ( s * 0.5 ); - s = real(0.5) / s; - - q[0] = real ( ( m(1,2) - m(2,1) ) * s ); - q[1] = real ( ( m(2,0) - m(0,2) ) * s ); - q[2] = real ( ( m(0,1) - m(1,0) ) * s ); - } - else - { - i = 0; - if ( m(1,1) > m(0,0) ) - i = 1; - - if ( m(2,2) > m(i,i) ) - i = 2; - - j = nxt[i]; - k = nxt[j]; - - s = real(sqrt( ( m(i,j) - ( m(j,j) + m(k,k) )) + GLH_ONE )); - - q[i] = real ( s * 0.5 ); - s = real(0.5 / s); - - q[3] = real ( ( m(j,k) - m(k,j) ) * s ); - q[j] = real ( ( m(i,j) + m(j,i) ) * s ); - q[k] = real ( ( m(i,k) + m(k,i) ) * s ); - } - - counter = 0; - return *this; - } - - quaternion & set_value( const vec3 &axis, real theta ) - { - real sqnorm = axis.square_norm(); - - if (sqnorm <= GLH_EPSILON) - { - // axis too small. - x = y = z = 0.0; - w = 1.0; - } - else - { - theta *= real(0.5); - real sin_theta = real(sin(theta)); - - if (!equivalent(sqnorm,GLH_ONE)) - sin_theta /= real(sqrt(sqnorm)); - x = sin_theta * axis.v[0]; - y = sin_theta * axis.v[1]; - z = sin_theta * axis.v[2]; - w = real(cos(theta)); - } - return *this; - } - - quaternion & set_value( const vec3 & rotateFrom, const vec3 & rotateTo ) - { - vec3 p1, p2; - real alpha; - - p1 = rotateFrom; - p1.normalize(); - p2 = rotateTo; - p2.normalize(); - - alpha = p1.dot(p2); - - if(equivalent(alpha,GLH_ONE)) - { - *this = identity(); - return *this; - } - - // ensures that the anti-parallel case leads to a positive dot - if(equivalent(alpha,-GLH_ONE)) - { - vec3 v; - - if(p1.v[0] != p1.v[1] || p1.v[0] != p1.v[2]) - v = vec3(p1.v[1], p1.v[2], p1.v[0]); - else - v = vec3(-p1.v[0], p1.v[1], p1.v[2]); - - v -= p1 * p1.dot(v); - v.normalize(); - - set_value(v, GLH_PI); - return *this; - } - - p1 = p1.cross(p2); - p1.normalize(); - set_value(p1,real(acos(alpha))); - - counter = 0; - return *this; - } - - quaternion & set_value( const vec3 & from_look, const vec3 & from_up, - const vec3 & to_look, const vec3 & to_up) - { - quaternion r_look = quaternion(from_look, to_look); - - vec3 rotated_from_up(from_up); - r_look.mult_vec(rotated_from_up); - - quaternion r_twist = quaternion(rotated_from_up, to_up); - - *this = r_twist; - *this *= r_look; - return *this; - } - - quaternion & operator *= ( const quaternion & qr ) - { - quaternion ql(*this); - - w = ql.w * qr.w - ql.x * qr.x - ql.y * qr.y - ql.z * qr.z; - x = ql.w * qr.x + ql.x * qr.w + ql.y * qr.z - ql.z * qr.y; - y = ql.w * qr.y + ql.y * qr.w + ql.z * qr.x - ql.x * qr.z; - z = ql.w * qr.z + ql.z * qr.w + ql.x * qr.y - ql.y * qr.x; - - counter += qr.counter; - counter++; - counter_normalize(); - return *this; - } - - void normalize() - { - real rnorm = GLH_ONE / real(sqrt(w * w + x * x + y * y + z * z)); - if (equivalent(rnorm, GLH_ZERO)) - return; - x *= rnorm; - y *= rnorm; - z *= rnorm; - w *= rnorm; - counter = 0; - } - - friend bool operator == ( const quaternion & q1, const quaternion & q2 ); - - friend bool operator != ( const quaternion & q1, const quaternion & q2 ); - - friend quaternion operator * ( const quaternion & q1, const quaternion & q2 ); - - bool equals( const quaternion & r, real tolerance ) const - { - real t; - - t = ( - (q[0]-r.q[0])*(q[0]-r.q[0]) + - (q[1]-r.q[1])*(q[1]-r.q[1]) + - (q[2]-r.q[2])*(q[2]-r.q[2]) + - (q[3]-r.q[3])*(q[3]-r.q[3]) ); - if(t > GLH_EPSILON) - return false; - return 1; - } - - quaternion & conjugate() - { - q[0] *= -GLH_ONE; - q[1] *= -GLH_ONE; - q[2] *= -GLH_ONE; - return *this; - } - - quaternion & invert() - { - return conjugate(); - } - - quaternion inverse() const - { - quaternion r = *this; - return r.invert(); - } - - // - // Quaternion multiplication with cartesian vector - // v' = q*v*q(star) - // - void mult_vec( const vec3 &src, vec3 &dst ) const - { - real v_coef = w * w - x * x - y * y - z * z; - real u_coef = GLH_TWO * (src.v[0] * x + src.v[1] * y + src.v[2] * z); - real c_coef = GLH_TWO * w; - - dst.v[0] = v_coef * src.v[0] + u_coef * x + c_coef * (y * src.v[2] - z * src.v[1]); - dst.v[1] = v_coef * src.v[1] + u_coef * y + c_coef * (z * src.v[0] - x * src.v[2]); - dst.v[2] = v_coef * src.v[2] + u_coef * z + c_coef * (x * src.v[1] - y * src.v[0]); - } - - void mult_vec( vec3 & src_and_dst) const - { - mult_vec(vec3(src_and_dst), src_and_dst); - } - - void scale_angle( real scaleFactor ) - { - vec3 axis; - real radians; - - get_value(axis, radians); - radians *= scaleFactor; - set_value(axis, radians); - } - - static quaternion slerp( const quaternion & p, const quaternion & q, real alpha ) - { - quaternion r; - - real cos_omega = p.x * q.x + p.y * q.y + p.z * q.z + p.w * q.w; - // if B is on opposite hemisphere from A, use -B instead - - int bflip; - if ( ( bflip = (cos_omega < GLH_ZERO)) ) - cos_omega = -cos_omega; - - // complementary interpolation parameter - real beta = GLH_ONE - alpha; - - if(cos_omega >= GLH_ONE - GLH_EPSILON) - return p; - - real omega = real(acos(cos_omega)); - real one_over_sin_omega = GLH_ONE / real(sin(omega)); - - beta = real(sin(omega*beta) * one_over_sin_omega); - alpha = real(sin(omega*alpha) * one_over_sin_omega); - - if (bflip) - alpha = -alpha; - - r.x = beta * p.q[0]+ alpha * q.q[0]; - r.y = beta * p.q[1]+ alpha * q.q[1]; - r.z = beta * p.q[2]+ alpha * q.q[2]; - r.w = beta * p.q[3]+ alpha * q.q[3]; - return r; - } - - static quaternion identity() - { - static quaternion ident( vec3( 0.0, 0.0, 0.0 ), GLH_ONE ); - return ident; - } - - real & operator []( int i ) - { - assert(i < 4); - return q[i]; - } - - const real & operator []( int i ) const - { - assert(i < 4); - return q[i]; - } - - protected: - - void counter_normalize() - { - if (counter > GLH_QUATERNION_NORMALIZATION_THRESHOLD) - normalize(); - } - - union - { - struct - { - real q[4]; - }; - struct - { - real x; - real y; - real z; - real w; - }; - }; - - // renormalization counter - unsigned char counter; - }; - - inline - bool operator == ( const quaternion & q1, const quaternion & q2 ) - { - return (equivalent(q1.x, q2.x) && - equivalent(q1.y, q2.y) && - equivalent(q1.z, q2.z) && - equivalent(q1.w, q2.w) ); - } - - inline - bool operator != ( const quaternion & q1, const quaternion & q2 ) - { - return ! ( q1 == q2 ); - } - - inline - quaternion operator * ( const quaternion & q1, const quaternion & q2 ) - { - quaternion r(q1); - r *= q2; - return r; - } - - - - - - - - - - - class plane - { - public: - - plane() - { - planedistance = 0.0; - planenormal.set_value( 0.0, 0.0, 1.0 ); - } - - - plane( const vec3 &p0, const vec3 &p1, const vec3 &p2 ) - { - vec3 v0 = p1 - p0; - vec3 v1 = p2 - p0; - planenormal = v0.cross(v1); - planenormal.normalize(); - planedistance = p0.dot(planenormal); - } - - plane( const vec3 &normal, real distance ) - { - planedistance = distance; - planenormal = normal; - planenormal.normalize(); - } - - plane( const vec3 &normal, const vec3 &point ) - { - planenormal = normal; - planenormal.normalize(); - planedistance = point.dot(planenormal); - } - - void offset( real d ) - { - planedistance += d; - } - - bool intersect( const line &l, vec3 &intersection ) const - { - vec3 pos, dir; - vec3 pn = planenormal; - real pd = planedistance; - - pos = l.get_position(); - dir = l.get_direction(); - - if(dir.dot(pn) == 0.0) return 0; - pos -= pn*pd; - // now we're talking about a plane passing through the origin - if(pos.dot(pn) < 0.0) pn.negate(); - if(dir.dot(pn) > 0.0) dir.negate(); - vec3 ppos = pn * pos.dot(pn); - pos = (ppos.length()/dir.dot(-pn))*dir; - intersection = l.get_position(); - intersection += pos; - return 1; - } - void transform( const matrix4 &matrix ) - { - matrix4 invtr = matrix.inverse(); - invtr = invtr.transpose(); - - vec3 pntOnplane = planenormal * planedistance; - vec3 newPntOnplane; - vec3 newnormal; - - invtr.mult_dir_matrix(planenormal, newnormal); - matrix.mult_vec_matrix(pntOnplane, newPntOnplane); - - newnormal.normalize(); - planenormal = newnormal; - planedistance = newPntOnplane.dot(planenormal); - } - - bool is_in_half_space( const vec3 &point ) const - { - - if(( point.dot(planenormal) - planedistance) < 0.0) - return 0; - return 1; - } - - - real distance( const vec3 & point ) const - { - return planenormal.dot(point - planenormal*planedistance); - } - - const vec3 &get_normal() const - { - return planenormal; - } - - - real get_distance_from_origin() const - { - return planedistance; - } - - - friend bool operator == ( const plane & p1, const plane & p2 ); - - - friend bool operator != ( const plane & p1, const plane & p2 ); - - //protected: - vec3 planenormal; - real planedistance; - }; - - inline - bool operator == (const plane & p1, const plane & p2 ) - { - return ( p1.planedistance == p2.planedistance && p1.planenormal == p2.planenormal); - } - - inline - bool operator != ( const plane & p1, const plane & p2 ) - { return ! (p1 == p2); } - - - - } // "ns_##GLH_REAL" - - // make common typedefs... -#ifdef GLH_REAL_IS_FLOAT - typedef GLH_REAL_NAMESPACE::vec2 vec2f; - typedef GLH_REAL_NAMESPACE::vec3 vec3f; - typedef GLH_REAL_NAMESPACE::vec4 vec4f; - typedef GLH_REAL_NAMESPACE::quaternion quaternionf; - typedef GLH_REAL_NAMESPACE::quaternion rotationf; - typedef GLH_REAL_NAMESPACE::line linef; - typedef GLH_REAL_NAMESPACE::plane planef; - typedef GLH_REAL_NAMESPACE::matrix4 matrix4f; -#endif - - - - -} // namespace glh - - - -#endif - diff --git a/ThirdParty/GL/glh/glh_mipmaps.h b/ThirdParty/GL/glh/glh_mipmaps.h deleted file mode 100644 index 315d65d7..00000000 --- a/ThirdParty/GL/glh/glh_mipmaps.h +++ /dev/null @@ -1,157 +0,0 @@ -/* - glh - is a platform-indepenedent C++ OpenGL helper library - - - Copyright (c) 2000 Cass Everitt - Copyright (c) 2000, 2001 NVIDIA Corporation - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - * Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - * The names of contributors to this software may not be used - to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - - Cass Everitt - cass@r3.nu -*/ - -/* - gluBuild2DMipmaps cannot build mipmaps for textures whose - "format" it does not recognize. This is primarily because - it infers the number of components and how to average them - from the format. This helper eliminates that problem by - factoring out that functionality. - - Cass Everitt - 1-9-01 - -*/ - -#ifndef GLH_MIPMAPS_H -#define GLH_MIPMAPS_H - -#ifdef _WIN32 -# include -#endif - -#ifdef MACOS -#include -#else -#include -#endif - -namespace glh -{ - - template - class tex_indexer2 - { - public: - tex_indexer2(int width, int height, int tuple_size, T * data) : - w(width), h(height), n(tuple_size), d(data) {} - - T * operator()(int i, int j) - { return d + n * (w * j + i); } - private: - int w, h, n; - T * d; - }; - - template - struct generic_filter - { - typedef T element_type; - - generic_filter(int tuplesize, GLenum gltype) : - gl_type(gltype), tuple_size(tuplesize) {} - - void average( T * out, - const T * a, const T * b, - const T * c, const T * d) - { - for(int i=0; i < tuple_size; i++) - { - double in = double(a[i]) + double(b[i]) + double(c[i]) + double(d[i]); - in /= 4; - out[i] = T(in); - } - } - - const GLenum gl_type; - const int tuple_size; - }; - - // fixme: supports non-square textures! - template - void build_2D_mipmaps( GLenum target, GLenum internal_format, - GLsizei w, GLsizei h, GLenum format, - F filter, const void * vdata) - { - - typedef typename F::element_type DataType; - const DataType * in_data = (const DataType *)vdata; - DataType * data = new DataType [w * h * filter.tuple_size]; - - glTexImage2D(target, 0, internal_format, w, h, 0, format, filter.gl_type, (const DataType *)vdata); - - int level = 1; - if( w >= 2 ) w /= 2; - if( h >= 2 ) h /= 2; - bool done = false; - while(! done) - { - tex_indexer2 bg(w*2, h*2, filter.tuple_size, in_data); - tex_indexer2 sm(w , h , filter.tuple_size, data); - for(int j=0; j < h; j++) - { - int J = j * 2; - for(int i=0; i < w; i++) - { - int I = i*2; - filter.average( sm(i,j), - bg(I , J ), bg(I+1, J ), - bg(I , J+1), bg(I+1, J+1)); - } - } - - glTexImage2D(target, level, internal_format, w, h, 0, format, filter.gl_type, data); - - if(w == 1 && h == 1) done = true; - - if( w >= 2 ) w /= 2; - if( h >= 2 ) h /= 2; - level++; - in_data = data; - } - - delete [] data; - } - -} - -#endif diff --git a/ThirdParty/GL/glh/glh_obs.h b/ThirdParty/GL/glh/glh_obs.h deleted file mode 100644 index 55f868c7..00000000 --- a/ThirdParty/GL/glh/glh_obs.h +++ /dev/null @@ -1,636 +0,0 @@ -/* - glh - is a platform-indepenedent C++ OpenGL helper library - - - Copyright (c) 2000 Cass Everitt - Copyright (c) 2000 NVIDIA Corporation - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - * Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - * The names of contributors to this software may not be used - to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - - Cass Everitt - cass@r3.nu -*/ - -// This is a file for simple GL helper classes... - -#ifndef GLH_OBS_H -#define GLH_OBS_H - -#ifdef _WIN32 -# include -#endif - -#ifdef MACOS -#include -#include -#else -#include -#include -#endif - -#include - -#include - -namespace glh -{ - class display_list - { - public: - // set managed to true if you want the class to cleanup objects in the destructor - display_list(bool managed = false) - : valid(false), manageObjects(managed) {} - - virtual ~display_list() - { - if (manageObjects) - del(); - } - - void call_list() - { if(valid) glCallList(dlist); } - - void new_list(GLenum mode) - { if(!valid) gen(); glNewList(dlist, mode); } - - void end_list() - { glEndList(); } - - void del() - { if(valid) glDeleteLists(dlist, 1); valid = false; } - - bool is_valid() const { return valid; } - - private: - - void gen() { dlist = glGenLists(1); valid=true; } - - bool valid; - bool manageObjects; - GLuint dlist; - }; - - class lazy_build_display_list - { - public: - // set managed to true if you want the class to cleanup objects in the destructor - lazy_build_display_list(void (* builder)() = 0, bool managed = false) - : valid(false), manageObjects(managed), needs_rebuild(true), build_func(builder) {} - - virtual ~lazy_build_display_list() - { - if (manageObjects) - del(); - } - - void set_build_func( void (* builder)()) - { build_func = builder; } - - void call_list() - { - if(! valid) gen(); - if(needs_rebuild) rebuild_list(); - glCallList(dlist); - } - - void del() - { if(valid) glDeleteLists(dlist, 1); valid = false; needs_rebuild = true;} - - bool is_valid() const { return valid; } - - // something changed, so rebuild list before next call_list() - void rebuild() { needs_rebuild = true; } - - private: - - void gen() { dlist = glGenLists(1); valid=true; } - void rebuild_list() - { - glNewList(dlist, GL_COMPILE); - if(build_func) (* build_func)(); // call list building routine - glEndList(); - } - - bool valid; - bool manageObjects; - bool needs_rebuild; - GLuint dlist; - void (* build_func)(); - }; - - - class tex_object - { - public: - // set managed to true if you want the class to cleanup objects in the destructor - tex_object(GLenum tgt, bool managed) - : target(tgt), valid(false), manageObjects(managed) {} - - virtual ~tex_object() - { - if (manageObjects) - del(); - } - - void bind() - { if(!valid) gen(); glBindTexture(target, texture); } - - // convenience methods - -#ifdef __MACOS_DISABLED__ - void parameter(GLenum pname, int i) - { glTexParameteri(target, pname, i); } -#endif - - void parameter(GLenum pname, GLint i) - { glTexParameteri(target, pname, i); } - - void parameter(GLenum pname, GLfloat f) - { glTexParameterf(target, pname, f); } - - void parameter(GLenum pname, GLint * ip) - { glTexParameteriv(target, pname, ip); } - - void parameter(GLenum pname, GLfloat * fp) - { glTexParameterfv(target, pname, fp); } - - void enable() { glEnable(target); } - void disable() { glDisable(target); } - - - void del() - { if(valid) glDeleteTextures(1, &texture); valid = false; } - bool is_valid() const { return valid; } - - void gen() { glGenTextures(1, &texture); valid=true; } - - GLenum target; - bool valid; - bool manageObjects; - GLuint texture; - }; - - class tex_object_1D : public tex_object - { public: tex_object_1D(bool managed = false) : tex_object(GL_TEXTURE_1D, managed) {} }; - - class tex_object_2D : public tex_object - { public: tex_object_2D(bool managed = false) : tex_object(GL_TEXTURE_2D, managed) {} }; - - class tex_object_3D : public tex_object - { public: tex_object_3D(bool managed = false) : tex_object(GL_TEXTURE_3D, managed) {} }; - - -# ifdef GL_ARB_texture_cube_map - class tex_object_cube_map : public tex_object - { public: tex_object_cube_map(bool managed = false) : tex_object(GL_TEXTURE_CUBE_MAP_ARB, managed) {} }; -# elif GL_EXT_texture_cube_map - class tex_object_cube_map : public tex_object - { public: tex_object_cube_map(bool managed = false) : tex_object(GL_TEXTURE_CUBE_MAP_EXT, managed) {} }; -# endif - -#if defined(GL_EXT_texture_rectangle) - class tex_object_rectangle : public tex_object - { public: tex_object_rectangle(bool managed = false) : tex_object(GL_TEXTURE_RECTANGLE_EXT, managed) {} }; -#elif defined(GL_NV_texture_rectangle) - class tex_object_rectangle : public tex_object - { public: tex_object_rectangle(bool managed = false) : tex_object(GL_TEXTURE_RECTANGLE_NV, managed) {} }; -#endif - - -# ifdef GL_NV_vertex_program - class vertex_program_base - { - public: - // set managed to true if you want the class to cleanup objects in the destructor - vertex_program_base(GLenum tgt, bool managed) - : valid(false), manageObjects(managed), target(tgt) {} - - virtual ~vertex_program_base() - { - if (manageObjects) - del(); - } - - void bind() - { if(!valid) gen(); glBindProgramNV(target, program); } - - void unbind() - { glBindProgramNV(target, 0); } - - void load(GLuint size, const GLubyte * prog_text) - { - if(!valid) gen(); - glLoadProgramNV(target, program, size, prog_text); - GLint errpos; - glGetIntegerv(GL_PROGRAM_ERROR_POSITION_NV, &errpos); - if(errpos != -1) - { - fprintf(stderr, "program error:\n"); - int bgn = errpos - 10; - //bgn < 0 ? 0 : bgn; - const char * c = (const char *)(prog_text + bgn); - for(int i = 0; i < 30; i++) - { - if(bgn+i >= int(size-1)) - break; - fprintf(stderr, "%c", *c++); - } - fprintf(stderr, "\n"); - } - } - - void load(GLuint size, const char * prog_text) - { - if(!valid) gen(); - glLoadProgramNV(target, program, size, (const GLubyte *) prog_text); - GLint errpos; - glGetIntegerv(GL_PROGRAM_ERROR_POSITION_NV, &errpos); - if(errpos != -1) - { - fprintf(stderr, "program error:\n"); - int bgn = errpos - 10; - //bgn < 0 ? 0 : bgn; - const char * c = (const char *)(prog_text + bgn); - for(int i = 0; i < 30; i++) - { - if(bgn+i >= int(size-1)) - break; - fprintf(stderr, "%c", *c++); - } - fprintf(stderr, "\n"); - } - } - - void load(const char * prog_text) - { load((GLuint)strlen(prog_text), prog_text); } - - - void del() - { if(valid) glDeleteProgramsNV(1, &program); valid = false; } - - bool is_valid() const { return valid; } - - private: - - void gen() { glGenProgramsNV(1, &program); valid=true; } - - bool valid; - bool manageObjects; - GLenum target; - GLuint program; - }; - - class vertex_program : public vertex_program_base - { - public: - vertex_program(bool managed = false) - : vertex_program_base(GL_VERTEX_PROGRAM_NV, managed) {} - }; - - class vertex_state_program : public vertex_program_base - { - public: - vertex_state_program(bool managed = false) - : vertex_program_base(GL_VERTEX_STATE_PROGRAM_NV, managed) {} - }; - - class lazy_load_vertex_program : public vertex_program_base - { - public: - lazy_load_vertex_program(void (*vp_loader)() = 0, bool managed = false) - : vertex_program_base(GL_VERTEX_PROGRAM_NV, managed), needs_load(true), loader(vp_loader) {} - - void bind() - { - vertex_program_base::bind(); - if(needs_load && loader) - { - (* loader)(); - needs_load = false; - } - } - - void reload() { needs_load = true; } - - private: - bool needs_load; - void (* loader)(); - }; - - -#endif - -# ifdef GL_ARB_vertex_program - class arb_vertex_program_base - { - public: - // set managed to true if you want the class to cleanup objects in the destructor - arb_vertex_program_base(GLenum tgt, bool managed) - : valid(false), manageObjects(managed), target(tgt) {} - - virtual ~arb_vertex_program_base() - { - if (manageObjects) - del(); - } - - void bind() - { if(!valid) gen(); glBindProgramARB(target, program); } - - void unbind() - { glBindProgramARB(target, 0); } - - void load(GLuint size, const GLubyte * prog_text) - { - if(!valid) gen(); - bind(); - glProgramStringARB(target, GL_PROGRAM_FORMAT_ASCII_ARB, size, prog_text); - GLint errpos; - glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errpos); - if(errpos != -1) - { - fprintf(stderr, "program error:\n"); - int bgn = errpos - 10; - //bgn < 0 ? 0 : bgn; - const char * c = (const char *)(prog_text + bgn); - for(int i = 0; i < 30; i++) - { - if(bgn+i >= int(size-1)) - break; - fprintf(stderr, "%c", *c++); - } - fprintf(stderr, "\n"); - } - } - - void load(GLuint size, const char * prog_text) - { - if(!valid) gen(); - bind(); - glProgramStringARB(target, GL_PROGRAM_FORMAT_ASCII_ARB, size, prog_text); - GLint errpos; - glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errpos); - if(errpos != -1) - { - fprintf(stderr, "program error:\n"); - int bgn = errpos - 10; - //bgn < 0 ? 0 : bgn; - const char * c = (const char *)(prog_text + bgn); - for(int i = 0; i < 30; i++) - { - if(bgn+i >= int(size-1)) - break; - fprintf(stderr, "%c", *c++); - } - fprintf(stderr, "\n"); - } - } - - void load(const char * prog_text) - { load((GLuint)strlen(prog_text), prog_text); } - - - void del() { if(valid) glDeleteProgramsARB(1, &program); valid = false; } - - bool is_valid() const { return valid; } - - private: - - void gen() { glGenProgramsARB(1, &program); valid=true; } - - bool valid; - bool manageObjects; - GLenum target; - GLuint program; - }; - - class arb_vertex_program : public arb_vertex_program_base - { - public: - arb_vertex_program(bool managed = false) - : arb_vertex_program_base(GL_VERTEX_PROGRAM_ARB, managed) {} - }; - - class lazy_load_arb_vertex_program : public arb_vertex_program_base - { - public: - lazy_load_arb_vertex_program(void (*vp_loader)() = 0, bool managed = false) - : arb_vertex_program_base(GL_VERTEX_PROGRAM_ARB, managed), needs_load(true), loader(vp_loader) {} - - void bind() - { - arb_vertex_program_base::bind(); - if(needs_load && loader) - { - (* loader)(); - needs_load = false; - } - } - - void reload() { needs_load = true; } - - private: - bool needs_load; - void (* loader)(); - }; - -#endif - -# ifdef GL_NV_fragment_program - - class fragment_program - { - public: - // set managed to true if you want the class to cleanup objects in the destructor - fragment_program(bool managed = false) - : valid(false), manageObjects(managed) {} - - virtual ~fragment_program() - { - if (manageObjects) - del(); - } - - void bind() - { if(!valid) gen(); glBindProgramNV(GL_FRAGMENT_PROGRAM_NV, program); } - - void load(GLuint size, const GLubyte * prog_text) - { - if(!valid) gen(); - glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, program, size, prog_text); - GLint errpos; - glGetIntegerv(GL_PROGRAM_ERROR_POSITION_NV, &errpos); - if(errpos != -1) - { - fprintf(stderr, "program error:\n"); - int bgn = errpos - 10; - //bgn < 0 ? 0 : bgn; - const char * c = (const char *)(prog_text + bgn); - for(int i = 0; i < 30; i++) - { - if(bgn+i >= int(size-1)) - break; - fprintf(stderr, "%c", *c++); - } - fprintf(stderr, "\n"); - } - } - - void load(GLuint size, const char * prog_text) - { - if(!valid) gen(); - glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, program, size, (const GLubyte *) prog_text); - GLint errpos; - glGetIntegerv(GL_PROGRAM_ERROR_POSITION_NV, &errpos); - if(errpos != -1) - { - fprintf(stderr, "program error:\n"); - int bgn = errpos - 10; - - const char * c = (const char *)(prog_text + bgn); - for(int i = 0; i < 30; i++) - { - if(bgn+i >= int(size-1)) - break; - fprintf(stderr, "%c", *c++); - } - fprintf(stderr, "\n"); - } - } - - void load(const char * prog_text) - { load((GLuint)strlen(prog_text), prog_text); } - - void del() - { if(valid) glDeleteProgramsNV(1, &program); valid = false; } - - bool is_valid() const { return valid; } - - GLuint program; - private: - - void gen() { glGenProgramsNV(1, &program); valid=true; } - - bool valid; - bool manageObjects; - }; - - -#endif - -#ifdef GL_ARB_fragment_program - - class arb_fragment_program - { - public: - // set managed to true if you want the class to cleanup objects in the destructor - arb_fragment_program(bool managed = false) - : valid(false), manageObjects(managed) {} - - virtual ~arb_fragment_program() - { - if (manageObjects) - del(); - } - - void bind() - { if(!valid) gen(); glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, program); } - - void load(GLuint size, const GLubyte * prog_text) - { - if(!valid) gen(); - glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, size, prog_text); - //glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, program, size, prog_text); - - GLint errpos; - glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errpos); - if(errpos != -1) - { - fprintf(stderr, "program error:\n"); - int bgn = errpos - 10; - //bgn < 0 ? 0 : bgn; - const char * c = (const char *)(prog_text + bgn); - for(int i = 0; i < 30; i++) - { - if(bgn+i >= int(size-1)) - break; - fprintf(stderr, "%c", *c++); - } - fprintf(stderr, "\n"); - } - } - - void load(GLuint size, const char * prog_text) - { - if(!valid) gen(); - glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, size, prog_text); - //glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, program, size, (const GLubyte *) prog_text); - GLint errpos; - glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errpos); - if(errpos != -1) - { - fprintf(stderr, "program error:\n"); - int bgn = errpos - 10; - - const char * c = (const char *)(prog_text + bgn); - for(int i = 0; i < 30; i++) - { - if(bgn+i >= int(size-1)) - break; - fprintf(stderr, "%c", *c++); - } - fprintf(stderr, "\n"); - } - } - - void load(const char * prog_text) - { load((GLuint)strlen(prog_text), prog_text); } - - void del() - { if(valid) glDeleteProgramsARB(1, &program); valid = false; } - - bool is_valid() const { return valid; } - - GLuint program; - private: - - void gen() { glGenProgramsARB(1, &program); valid=true; } - - bool valid; - bool manageObjects; - }; - - -#endif - -} -#endif diff --git a/ThirdParty/GL/glh/glh_text.h b/ThirdParty/GL/glh/glh_text.h deleted file mode 100644 index bd9bc421..00000000 --- a/ThirdParty/GL/glh/glh_text.h +++ /dev/null @@ -1,197 +0,0 @@ -/* - glh - is a platform-indepenedent C++ OpenGL helper library - - - Copyright (c) 2000 Cass Everitt - Copyright (c) 2000 NVIDIA Corporation - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - * Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - * The names of contributors to this software may not be used - to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - - Cass Everitt - cass@r3.nu -*/ - -#ifndef GLH_TEXT_H -#define GLH_TEXT_H - -#include - -#ifdef _WIN32 -# include -#endif - -#ifdef MACOS -#include -#else -#include -#endif - -#include - -namespace glh -{ - - struct font - { - // build display lists and the like - virtual void initialize() = 0; - // get font metrics - virtual float get_ascent() = 0; - virtual float get_descent() = 0; - virtual float get_width(int i) = 0; - - // draw - virtual void render(int i) = 0; - }; - - inline float string_width(font * f, string text) - { - float w = 0; - for(unsigned int i=0; i < text.size(); i++) - { - w += f->get_width(text[i]); - } - return w; - } - // skip a line - inline void next_line(font * f) - { - glTranslatef(0, - (f->get_ascent() + f->get_descent()), 0); - } - - // renders text horizontally - inline void render_single_line(font * f, string text) - { - glPushMatrix(); - for(unsigned int i=0; i < text.size(); i++) - { - f->render(text[i]); - } - glPopMatrix(); - } - - - // render text on multiple lines (based on newlines) - struct simple_multi_line_text - { - public: - simple_multi_line_text() : f(0), line_spacing(1.1f) {} - - - void render() - { - if(!f) return; - if(dirty) - { - dirty = false; - dl.new_list(GL_COMPILE); - make_render_calls(); - dl.end_list(); - } - dl.call_list(); - } - void get_dimensions(float & width, float & height) - { - if(!f) return; - if(dirty) - { - dirty = false; - dl.new_list(GL_COMPILE); - make_render_calls(); - dl.end_list(); - } - width = w; - height = h; - } - void set_font(font * new_font) - { - dirty = true; - f = new_font; - } - void set_text(const string & new_text) - { - dirty = true; - text = new_text; - } - font * get_font() { return f; } - const string & get_text() { return text; } - private: - // skip a line - void next_line() - { - glTranslatef(0, - (f->get_ascent() + f->get_descent()) * line_spacing, 0); - } - - void make_render_calls() - { - w = h = 0; - float curr_width = 0; - float font_height = f->get_ascent() + f->get_descent(); - int lines = 0; - - if(text.size() != 0) lines++; - - glPushMatrix(); // vertical translation - glPushMatrix(); // horizontal translation - for(unsigned int i=0; i < text.size(); i++) - { - if(text[i] == '\n') - { - lines++; - if(curr_width > w) w = curr_width; - curr_width = 0; - - glPopMatrix(); // back to beginning of line - next_line(); // translate futher down - glPushMatrix(); - } - f->render(text[i]); - curr_width += f->get_width(text[i]); - } - glPopMatrix(); - glPopMatrix(); - if(curr_width > w) w = curr_width; - h = lines * font_height * line_spacing; - } - - font * f; - string text; - display_list dl; - float w, h; - bool dirty; - float line_spacing; - }; - - -} - -#endif From e66afa63196535e52c1d62fe59b5cdc96a7578d5 Mon Sep 17 00:00:00 2001 From: "eddie.cohen" Date: Mon, 7 Oct 2013 15:52:21 +0200 Subject: [PATCH 071/188] Fix compilation on Linux --- Source/Tools/NiViewer/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Tools/NiViewer/Makefile b/Source/Tools/NiViewer/Makefile index dfa56bd6..a2f8a1ac 100644 --- a/Source/Tools/NiViewer/Makefile +++ b/Source/Tools/NiViewer/Makefile @@ -22,7 +22,7 @@ ifeq ("$(OSTYPE)","Darwin") LDFLAGS += -framework OpenGL -framework GLUT else CFLAGS += -DUNIX -DGLX_GLXEXT_LEGACY - USED_LIBS += glut GL + USED_LIBS += glut GLU GL endif LIB_DIRS += ../../../ThirdParty/PSCommon/XnLib/Bin/$(PLATFORM)-$(CFG) From 21644504e71a9a0111e46e90d9e21bd68439eb5a Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Mon, 7 Oct 2013 13:02:00 +0200 Subject: [PATCH 072/188] Fix compilation on OSX --- Source/Tools/NiViewer/NiViewer.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Source/Tools/NiViewer/NiViewer.cpp b/Source/Tools/NiViewer/NiViewer.cpp index 6947b039..37f3d7f4 100644 --- a/Source/Tools/NiViewer/NiViewer.cpp +++ b/Source/Tools/NiViewer/NiViewer.cpp @@ -53,7 +53,11 @@ #include "OpenNI.h" #include "XnLib.h" +#ifdef MACOS +#include +#else #include +#endif #include "Capture.h" #include "Draw.h" From e9a836f25c561780a1a6d8cc0992709a488e1621 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Mon, 7 Oct 2013 14:12:11 +0300 Subject: [PATCH 073/188] Fix harvest script on Windows --- Packaging/Harvest.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Packaging/Harvest.py b/Packaging/Harvest.py index c80ca359..939701d7 100755 --- a/Packaging/Harvest.py +++ b/Packaging/Harvest.py @@ -149,7 +149,6 @@ def copySample(self, samplesDir, targetBinDir, name, isLibrary = False, isGL = F # copy GL headers if self.osName == 'Windows' and isGL: shutil.copytree(os.path.join(self.rootDir, 'ThirdParty', 'GL', 'GL'), os.path.join(sampleTargetDir, 'GL')) - shutil.copytree(os.path.join(self.rootDir, 'ThirdParty', 'GL', 'glh'), os.path.join(sampleTargetDir, 'glh')) # and lib shutil.copy(os.path.join(self.rootDir, 'ThirdParty', 'GL', 'glut32.lib'), sampleTargetDir) shutil.copy(os.path.join(self.rootDir, 'ThirdParty', 'GL', 'glut64.lib'), sampleTargetDir) From 0b8b50e883c598f26d97568079b1838f5f061466 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Mon, 7 Oct 2013 15:23:31 +0300 Subject: [PATCH 074/188] Android: Allow NiViewer to open ONI files --- .../NiViewer.Android/AndroidManifest.xml | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/Source/Tools/NiViewer.Android/AndroidManifest.xml b/Source/Tools/NiViewer.Android/AndroidManifest.xml index 7fc81738..aae3cb24 100644 --- a/Source/Tools/NiViewer.Android/AndroidManifest.xml +++ b/Source/Tools/NiViewer.Android/AndroidManifest.xml @@ -22,7 +22,36 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From dfd1c4a7945530f40197d02adea8f9b2d17e8484 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Wed, 9 Oct 2013 14:15:45 +0300 Subject: [PATCH 075/188] don't try to open devices if non is found --- .../samples/simpleread/SimpleReadActivity.java | 2 ++ .../samples/simpleviewer/SimpleViewerActivity.java | 11 ++++++----- .../android/tools/niviewer/NiViewerActivity.java | 1 + 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Samples/SimpleRead.Android/src/org/openni/android/samples/simpleread/SimpleReadActivity.java b/Samples/SimpleRead.Android/src/org/openni/android/samples/simpleread/SimpleReadActivity.java index 4baa8c06..2b82faf0 100644 --- a/Samples/SimpleRead.Android/src/org/openni/android/samples/simpleread/SimpleReadActivity.java +++ b/Samples/SimpleRead.Android/src/org/openni/android/samples/simpleread/SimpleReadActivity.java @@ -69,7 +69,9 @@ protected void onResume() { List devices = OpenNI.enumerateDevices(); if (devices.isEmpty()) { showAlertAndExit("No OpenNI-compliant device found."); + return; } + uri = devices.get(0).getUri(); mDeviceOpenPending = true; diff --git a/Samples/SimpleViewer.Android/src/org/openni/android/samples/simpleviewer/SimpleViewerActivity.java b/Samples/SimpleViewer.Android/src/org/openni/android/samples/simpleviewer/SimpleViewerActivity.java index 3fbbdbb3..42392b4f 100644 --- a/Samples/SimpleViewer.Android/src/org/openni/android/samples/simpleviewer/SimpleViewerActivity.java +++ b/Samples/SimpleViewer.Android/src/org/openni/android/samples/simpleviewer/SimpleViewerActivity.java @@ -75,12 +75,13 @@ protected void onResume() { List devices = OpenNI.enumerateDevices(); if (devices.isEmpty()) { showAlertAndExit("No OpenNI-compliant device found."); - } else { - uri = devices.get(0).getUri(); + return; + } + + uri = devices.get(0).getUri(); - mDeviceOpenPending = true; - mOpenNIHelper.requestDeviceOpen(uri, this); - } + mDeviceOpenPending = true; + mOpenNIHelper.requestDeviceOpen(uri, this); } private void showAlertAndExit(String message) { diff --git a/Source/Tools/NiViewer.Android/src/org/openni/android/tools/niviewer/NiViewerActivity.java b/Source/Tools/NiViewer.Android/src/org/openni/android/tools/niviewer/NiViewerActivity.java index bfd51d1e..14407498 100644 --- a/Source/Tools/NiViewer.Android/src/org/openni/android/tools/niviewer/NiViewerActivity.java +++ b/Source/Tools/NiViewer.Android/src/org/openni/android/tools/niviewer/NiViewerActivity.java @@ -159,6 +159,7 @@ protected void onResume() { List devices = OpenNI.enumerateDevices(); if (devices.isEmpty()) { showAlertAndExit("No OpenNI-compliant device found."); + return; } uri = devices.get(0).getUri(); } From 46c1f20c12591c52414939d77046b2b3d87c6c4c Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Wed, 9 Oct 2013 15:10:25 +0300 Subject: [PATCH 076/188] NiViewer: use an histogram for IR as well --- Source/Tools/NiViewer/Draw.cpp | 29 ++++++++++++++++++++++++++++- Source/Tools/NiViewer/Draw.h | 1 + Source/Tools/NiViewer/NiViewer.cpp | 2 ++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/Source/Tools/NiViewer/Draw.cpp b/Source/Tools/NiViewer/Draw.cpp index 9bc75b15..40f6ba9d 100644 --- a/Source/Tools/NiViewer/Draw.cpp +++ b/Source/Tools/NiViewer/Draw.cpp @@ -124,6 +124,7 @@ XnUInt8 PalletIntsB [256] = {0}; /* Linear Depth Histogram */ float g_pDepthHist[MAX_DEPTH]; +unsigned short g_nMaxGrayscale16Value = 0; const char* g_DepthDrawColoring[NUM_OF_DEPTH_DRAW_TYPES]; const char* g_ColorDrawColoring[NUM_OF_COLOR_DRAW_TYPES]; @@ -986,6 +987,24 @@ void drawColor(IntRect* pLocation, IntPair* pPointer, int pointerRed, int pointe pDepth = (openni::DepthPixel*)depthMetaData.getData(); } + // create IR histogram + double grayscale16Factor = 1.0; + if (colorMD.getVideoMode().getPixelFormat() == ONI_PIXEL_FORMAT_GRAY16) + { + int nPixelsCount = colorMD.getWidth() * colorMD.getHeight(); + XnUInt16* pPixel = (XnUInt16*)colorMD.getData(); + for (int i = 0; i < nPixelsCount; ++i,++pPixel) + { + if (*pPixel > g_nMaxGrayscale16Value) + g_nMaxGrayscale16Value = *pPixel; + } + + if (g_nMaxGrayscale16Value > 0) + { + grayscale16Factor = 255.0 / g_nMaxGrayscale16Value; + } + } + for (XnUInt16 nY = 0; nY < height; nY++) { XnUInt8* pTexture = TextureMapGetLine(&g_texColor, nY + originY) + originX*4; @@ -1025,6 +1044,8 @@ void drawColor(IntRect* pLocation, IntPair* pPointer, int pointerRed, int pointe } } + XnUInt16* p16; + switch (format) { case openni::PIXEL_FORMAT_RGB888: @@ -1038,7 +1059,8 @@ void drawColor(IntRect* pLocation, IntPair* pPointer, int pointerRed, int pointe pColor+=1; break; case openni::PIXEL_FORMAT_GRAY16: - pTexture[0] = pTexture[1] = pTexture[2] = *((XnUInt16*)pColor) >> 2; + p16 = (XnUInt16*)pColor; + pTexture[0] = pTexture[1] = pTexture[2] = (XnUInt8)((*p16) * grayscale16Factor); pColor+=2; break; default: @@ -1833,3 +1855,8 @@ void setColorDrawing(int nColoring) { g_DrawConfig.Streams.Color.Coloring = (ColorDrawColoringType)nColoring; } + +void resetIRHistogram(int /*dummy*/) +{ + g_nMaxGrayscale16Value = 0; +} diff --git a/Source/Tools/NiViewer/Draw.h b/Source/Tools/NiViewer/Draw.h index a808bcc0..e814d31a 100644 --- a/Source/Tools/NiViewer/Draw.h +++ b/Source/Tools/NiViewer/Draw.h @@ -104,5 +104,6 @@ void windowReshaped(int width, int height); void setDepthDrawing(int nColoring); void setColorDrawing(int nColoring); void setErrorState(const char* strFormat, ...); +void resetIRHistogram(int /*dummy*/); #endif //__DRAW_H__ diff --git a/Source/Tools/NiViewer/NiViewer.cpp b/Source/Tools/NiViewer/NiViewer.cpp index 37f3d7f4..9b2636b7 100644 --- a/Source/Tools/NiViewer/NiViewer.cpp +++ b/Source/Tools/NiViewer/NiViewer.cpp @@ -315,6 +315,7 @@ void createKeyboardMap() { registerKey('p', "Pointer Mode On/Off", togglePointerMode, 0); registerKey('f', "Full Screen On/Off", toggleFullScreen, 0); + registerKey('h', "Reset IR histogram", resetIRHistogram, 0); registerKey('?', "Show/Hide Help screen", toggleHelpScreen, 0); } endKeyboardGroup(); @@ -385,6 +386,7 @@ void createMenu() } } endSubMenu(); + createMenuEntry("Reset IR histogram", resetIRHistogram, 0); createMenuEntry("Pointer Mode On/Off", togglePointerMode, 0); createMenuEntry("Show/Hide Help Screen", toggleHelpScreen, 0); } From e2cf94700885d3c219f46e06a04074a1c50a5d53 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Wed, 9 Oct 2013 15:10:58 +0300 Subject: [PATCH 077/188] NiViewer: draw textures at center of area --- Source/Tools/NiViewer/Draw.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Source/Tools/NiViewer/Draw.cpp b/Source/Tools/NiViewer/Draw.cpp index 40f6ba9d..1bf493c9 100644 --- a/Source/Tools/NiViewer/Draw.cpp +++ b/Source/Tools/NiViewer/Draw.cpp @@ -1679,18 +1679,20 @@ void fixLocation(IntRect* pLocation, int xRes, int yRes) { double resRatio = (double)xRes / yRes; - double locationRatio = (pLocation->uRight - pLocation->uLeft) / (pLocation->uTop - pLocation->uBottom); + double locationRatio = double(pLocation->uRight - pLocation->uLeft) / (pLocation->uTop - pLocation->uBottom); if (locationRatio > resRatio) { // location is wider. use height as reference. double width = (pLocation->uTop - pLocation->uBottom) * resRatio; + pLocation->uLeft += (pLocation->uRight - pLocation->uLeft - width) / 2; pLocation->uRight = (pLocation->uLeft + width); } else if (locationRatio < resRatio) { // res is wider. use width as reference. double height = (pLocation->uRight - pLocation->uLeft) / resRatio; + pLocation->uBottom += (pLocation->uTop - pLocation->uBottom - height) / 2; pLocation->uTop = (pLocation->uBottom + height); } } From 87b8f68435ef7f7c8eae6d156a813acd29490114 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Wed, 9 Oct 2013 15:11:33 +0300 Subject: [PATCH 078/188] NiViewer: create histogram according to actual max depth value and not a constant --- Source/Tools/NiViewer/Draw.cpp | 50 ++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/Source/Tools/NiViewer/Draw.cpp b/Source/Tools/NiViewer/Draw.cpp index 1bf493c9..d9ed66b8 100644 --- a/Source/Tools/NiViewer/Draw.cpp +++ b/Source/Tools/NiViewer/Draw.cpp @@ -49,8 +49,6 @@ // -------------------------------- // Defines // -------------------------------- -#define MAX_DEPTH XN_MAX_UINT16 - #define YUV422_U 0 #define YUV422_Y1 1 #define YUV422_V 2 @@ -122,8 +120,9 @@ XnUInt8 PalletIntsR [256] = {0}; XnUInt8 PalletIntsG [256] = {0}; XnUInt8 PalletIntsB [256] = {0}; -/* Linear Depth Histogram */ -float g_pDepthHist[MAX_DEPTH]; +/* Histograms */ +float* g_pDepthHist = NULL; +int g_nMaxDepth = 0; unsigned short g_nMaxGrayscale16Value = 0; const char* g_DepthDrawColoring[NUM_OF_DEPTH_DRAW_TYPES]; @@ -138,8 +137,6 @@ typedef struct DrawUserInput DrawUserInput g_DrawUserInput; -float g_fMaxDepth = 0; - DrawConfigPreset g_Presets[PRESET_COUNT] = { // NAME, Depth_Type, Transparency Image_Type Arrangement @@ -577,16 +574,25 @@ void toggleHelpScreen(int) void calculateHistogram() { - xnOSMemSet(g_pDepthHist, 0, MAX_DEPTH*sizeof(float)); - int nNumberOfPoints = 0; - - openni::DepthPixel nValue; - openni::VideoStream& depthGen = getDepthStream(); if (!depthGen.isValid() || !getDepthFrame().isValid()) return; + int maxDepthValue = getDepthStream().getMaxPixelValue() + 1; + if (g_pDepthHist == NULL || maxDepthValue > g_nMaxDepth) + { + delete[] g_pDepthHist; + g_pDepthHist = new float[maxDepthValue]; + g_nMaxDepth = maxDepthValue; + } + + xnOSMemSet(g_pDepthHist, 0, g_nMaxDepth*sizeof(float)); + int nNumberOfPoints = 0; + + openni::DepthPixel nValue; + + const openni::DepthPixel* pDepth = (const openni::DepthPixel*)getDepthFrame().getData(); const openni::DepthPixel* pDepthEnd = pDepth + (getDepthFrame().getDataSize() / sizeof(openni::DepthPixel)); @@ -594,7 +600,7 @@ void calculateHistogram() { nValue = *pDepth; - XN_ASSERT(nValue <= MAX_DEPTH); + XN_ASSERT(nValue <= g_nMaxDepth); if (nValue != 0) { @@ -605,12 +611,12 @@ void calculateHistogram() pDepth++; } - XnUInt32 nIndex; - for (nIndex=1; nIndex 0.004) && (fNewColor < 0.996)) @@ -1296,7 +1302,7 @@ void drawPointerMode(IntPair* pPointer) } // Print the scale texts - for (int i=0; iisValid()) { - int maxDepth = 0; - maxDepth = getDepthStream().getMaxPixelValue(); - g_fMaxDepth = maxDepth; - TextureMapInit(&g_texDepth, pDepthMD->getVideoMode().getResolutionX(), pDepthMD->getVideoMode().getResolutionY(), 4, pDepthMD->getWidth(), pDepthMD->getHeight()); fixLocation(&g_DrawConfig.DepthLocation, pDepthMD->getVideoMode().getResolutionX(), pDepthMD->getVideoMode().getResolutionY()); } From 5146634aea39d72985ec0dd2683e2aacc8b275a2 Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Wed, 9 Oct 2013 15:16:54 +0300 Subject: [PATCH 079/188] NiViewer: make help screen nicer --- Source/Tools/NiViewer/Draw.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Tools/NiViewer/Draw.cpp b/Source/Tools/NiViewer/Draw.cpp index d9ed66b8..9dbd648e 100644 --- a/Source/Tools/NiViewer/Draw.cpp +++ b/Source/Tools/NiViewer/Draw.cpp @@ -1617,16 +1617,16 @@ void drawHelpScreen() // print left pane int nXLocation = nXStartLocation; int nYLocation = nYStartLocation; + printHelpGroup(nXLocation, &nYLocation, KEYBOARD_GROUP_GENERAL); printHelpGroup(nXLocation, &nYLocation, KEYBOARD_GROUP_PRESETS); printHelpGroup(nXLocation, &nYLocation, KEYBOARD_GROUP_DISPLAY); - printHelpGroup(nXLocation, &nYLocation, KEYBOARD_GROUP_DEVICE); // print right pane nXLocation = WIN_SIZE_X/2; nYLocation = nYStartLocation; + printHelpGroup(nXLocation, &nYLocation, KEYBOARD_GROUP_DEVICE); printHelpGroup(nXLocation, &nYLocation, KEYBOARD_GROUP_PLAYER); printHelpGroup(nXLocation, &nYLocation, KEYBOARD_GROUP_CAPTURE); - printHelpGroup(nXLocation, &nYLocation, KEYBOARD_GROUP_GENERAL); } void drawUserInput(bool bCursor) From 9d2872b74053ad9ffe47dad7a1c4de61e2a4b16a Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Wed, 9 Oct 2013 17:23:46 +0300 Subject: [PATCH 080/188] OpenNIView: use requested size. Don't override onMeasure(). Instead, draw the texture at the center of the surface. --- .../jni/org_openni_android_OpenNIView.cpp | 19 ++++++++++++++++++- .../src/org/openni/android/OpenNIView.java | 18 ------------------ 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/Wrappers/java/jni/org_openni_android_OpenNIView.cpp b/Wrappers/java/jni/org_openni_android_OpenNIView.cpp index c7a5325a..565f24ac 100644 --- a/Wrappers/java/jni/org_openni_android_OpenNIView.cpp +++ b/Wrappers/java/jni/org_openni_android_OpenNIView.cpp @@ -324,6 +324,23 @@ void OpenNIView::calcDepthHist(VideoFrameRef& frame) void OpenNIView::onDraw() { + int startX = 0; + int startY = 0; + int viewAreaWidth = m_viewWidth; + int viewAreaHeight = m_viewHeight; + + // if view ratio is larger than frame ratio, make width smaller. Otherwise, make height smaller + if (m_xres * viewAreaHeight > m_yres * viewAreaWidth) + { + viewAreaHeight = m_yres * viewAreaWidth / m_xres; + startY = (m_viewHeight - viewAreaHeight) / 2; + } + else + { + viewAreaWidth = m_xres * viewAreaHeight / m_yres; + startX = (m_viewWidth - viewAreaWidth) / 2; + } + glBindTexture(GL_TEXTURE_2D, m_textureId); int rect[4] = {0, m_yres, m_xres, -m_yres}; glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, rect); @@ -332,7 +349,7 @@ void OpenNIView::onDraw() glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_textureWidth, m_textureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_texture); - glDrawTexiOES(0, 0, 0, m_viewWidth, m_viewHeight); + glDrawTexiOES(startX, startY, 0, viewAreaWidth, viewAreaHeight); } void OpenNIView::onSurfaceCreated() diff --git a/Wrappers/java/src/org/openni/android/OpenNIView.java b/Wrappers/java/src/org/openni/android/OpenNIView.java index bd41f4d3..8aa5a554 100644 --- a/Wrappers/java/src/org/openni/android/OpenNIView.java +++ b/Wrappers/java/src/org/openni/android/OpenNIView.java @@ -47,24 +47,6 @@ protected void finalize() throws Throwable { super.finalize(); } - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - int frameWidth = mPrevFrameWidth; - int frameHeight = mPrevFrameHeight; - - int width = getDefaultSize(frameWidth, widthMeasureSpec); - int height = getDefaultSize(frameHeight, heightMeasureSpec); - - if (frameWidth > 0 && frameHeight > 0) { - if (frameWidth * height > width * frameHeight) { - height = width * frameHeight / frameWidth; - } else if (frameWidth * height < width * frameHeight) { - width = height * frameWidth / frameHeight; - } - } - setMeasuredDimension(width, height); - } - public void setAlphaValue(int alpha) { nativeSetAlphaValue(mNativePtr, alpha); requestRender(); From ee22d494b95ba215c1ce345b9e50bfce81d4f81b Mon Sep 17 00:00:00 2001 From: Eddie Cohen Date: Wed, 9 Oct 2013 17:25:03 +0300 Subject: [PATCH 081/188] NiViewer: allow adding more streams and removing them --- .../res/layout/activity_niviewer.xml | 9 + ...vity_simple_viewer.xml => stream_view.xml} | 27 +- .../{simple_viewer.xml => niviewer_menu.xml} | 8 +- .../NiViewer.Android/res/values/strings.xml | 2 + .../tools/niviewer/NiViewerActivity.java | 239 +++------------- .../android/tools/niviewer/StreamView.java | 268 ++++++++++++++++++ 6 files changed, 344 insertions(+), 209 deletions(-) create mode 100644 Source/Tools/NiViewer.Android/res/layout/activity_niviewer.xml rename Source/Tools/NiViewer.Android/res/layout/{activity_simple_viewer.xml => stream_view.xml} (76%) rename Source/Tools/NiViewer.Android/res/menu/{simple_viewer.xml => niviewer_menu.xml} (58%) create mode 100644 Source/Tools/NiViewer.Android/src/org/openni/android/tools/niviewer/StreamView.java diff --git a/Source/Tools/NiViewer.Android/res/layout/activity_niviewer.xml b/Source/Tools/NiViewer.Android/res/layout/activity_niviewer.xml new file mode 100644 index 00000000..d42aa3f5 --- /dev/null +++ b/Source/Tools/NiViewer.Android/res/layout/activity_niviewer.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/Source/Tools/NiViewer.Android/res/layout/activity_simple_viewer.xml b/Source/Tools/NiViewer.Android/res/layout/stream_view.xml similarity index 76% rename from Source/Tools/NiViewer.Android/res/layout/activity_simple_viewer.xml rename to Source/Tools/NiViewer.Android/res/layout/stream_view.xml index 8d64d913..c76d798c 100644 --- a/Source/Tools/NiViewer.Android/res/layout/activity_simple_viewer.xml +++ b/Source/Tools/NiViewer.Android/res/layout/stream_view.xml @@ -1,15 +1,14 @@ + - + android:layout_width="wrap_content" + android:layout_height="wrap_content" > + - +